gt64xxx_pci.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290
  1. /*
  2. * QEMU GT64120 PCI host
  3. *
  4. * Copyright (c) 2006,2007 Aurelien Jarno
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "qemu/osdep.h"
  25. #include "qapi/error.h"
  26. #include "qemu/units.h"
  27. #include "qemu/log.h"
  28. #include "hw/mips/mips.h"
  29. #include "hw/pci/pci.h"
  30. #include "hw/pci/pci_host.h"
  31. #include "hw/southbridge/piix.h"
  32. #include "migration/vmstate.h"
  33. #include "hw/intc/i8259.h"
  34. #include "hw/irq.h"
  35. #include "exec/address-spaces.h"
  36. #include "trace.h"
  37. #define GT_REGS (0x1000 >> 2)
  38. /* CPU Configuration */
  39. #define GT_CPU (0x000 >> 2)
  40. #define GT_MULTI (0x120 >> 2)
  41. /* CPU Address Decode */
  42. #define GT_SCS10LD (0x008 >> 2)
  43. #define GT_SCS10HD (0x010 >> 2)
  44. #define GT_SCS32LD (0x018 >> 2)
  45. #define GT_SCS32HD (0x020 >> 2)
  46. #define GT_CS20LD (0x028 >> 2)
  47. #define GT_CS20HD (0x030 >> 2)
  48. #define GT_CS3BOOTLD (0x038 >> 2)
  49. #define GT_CS3BOOTHD (0x040 >> 2)
  50. #define GT_PCI0IOLD (0x048 >> 2)
  51. #define GT_PCI0IOHD (0x050 >> 2)
  52. #define GT_PCI0M0LD (0x058 >> 2)
  53. #define GT_PCI0M0HD (0x060 >> 2)
  54. #define GT_PCI0M1LD (0x080 >> 2)
  55. #define GT_PCI0M1HD (0x088 >> 2)
  56. #define GT_PCI1IOLD (0x090 >> 2)
  57. #define GT_PCI1IOHD (0x098 >> 2)
  58. #define GT_PCI1M0LD (0x0a0 >> 2)
  59. #define GT_PCI1M0HD (0x0a8 >> 2)
  60. #define GT_PCI1M1LD (0x0b0 >> 2)
  61. #define GT_PCI1M1HD (0x0b8 >> 2)
  62. #define GT_ISD (0x068 >> 2)
  63. #define GT_SCS10AR (0x0d0 >> 2)
  64. #define GT_SCS32AR (0x0d8 >> 2)
  65. #define GT_CS20R (0x0e0 >> 2)
  66. #define GT_CS3BOOTR (0x0e8 >> 2)
  67. #define GT_PCI0IOREMAP (0x0f0 >> 2)
  68. #define GT_PCI0M0REMAP (0x0f8 >> 2)
  69. #define GT_PCI0M1REMAP (0x100 >> 2)
  70. #define GT_PCI1IOREMAP (0x108 >> 2)
  71. #define GT_PCI1M0REMAP (0x110 >> 2)
  72. #define GT_PCI1M1REMAP (0x118 >> 2)
  73. /* CPU Error Report */
  74. #define GT_CPUERR_ADDRLO (0x070 >> 2)
  75. #define GT_CPUERR_ADDRHI (0x078 >> 2)
  76. #define GT_CPUERR_DATALO (0x128 >> 2) /* GT-64120A only */
  77. #define GT_CPUERR_DATAHI (0x130 >> 2) /* GT-64120A only */
  78. #define GT_CPUERR_PARITY (0x138 >> 2) /* GT-64120A only */
  79. /* CPU Sync Barrier */
  80. #define GT_PCI0SYNC (0x0c0 >> 2)
  81. #define GT_PCI1SYNC (0x0c8 >> 2)
  82. /* SDRAM and Device Address Decode */
  83. #define GT_SCS0LD (0x400 >> 2)
  84. #define GT_SCS0HD (0x404 >> 2)
  85. #define GT_SCS1LD (0x408 >> 2)
  86. #define GT_SCS1HD (0x40c >> 2)
  87. #define GT_SCS2LD (0x410 >> 2)
  88. #define GT_SCS2HD (0x414 >> 2)
  89. #define GT_SCS3LD (0x418 >> 2)
  90. #define GT_SCS3HD (0x41c >> 2)
  91. #define GT_CS0LD (0x420 >> 2)
  92. #define GT_CS0HD (0x424 >> 2)
  93. #define GT_CS1LD (0x428 >> 2)
  94. #define GT_CS1HD (0x42c >> 2)
  95. #define GT_CS2LD (0x430 >> 2)
  96. #define GT_CS2HD (0x434 >> 2)
  97. #define GT_CS3LD (0x438 >> 2)
  98. #define GT_CS3HD (0x43c >> 2)
  99. #define GT_BOOTLD (0x440 >> 2)
  100. #define GT_BOOTHD (0x444 >> 2)
  101. #define GT_ADERR (0x470 >> 2)
  102. /* SDRAM Configuration */
  103. #define GT_SDRAM_CFG (0x448 >> 2)
  104. #define GT_SDRAM_OPMODE (0x474 >> 2)
  105. #define GT_SDRAM_BM (0x478 >> 2)
  106. #define GT_SDRAM_ADDRDECODE (0x47c >> 2)
  107. /* SDRAM Parameters */
  108. #define GT_SDRAM_B0 (0x44c >> 2)
  109. #define GT_SDRAM_B1 (0x450 >> 2)
  110. #define GT_SDRAM_B2 (0x454 >> 2)
  111. #define GT_SDRAM_B3 (0x458 >> 2)
  112. /* Device Parameters */
  113. #define GT_DEV_B0 (0x45c >> 2)
  114. #define GT_DEV_B1 (0x460 >> 2)
  115. #define GT_DEV_B2 (0x464 >> 2)
  116. #define GT_DEV_B3 (0x468 >> 2)
  117. #define GT_DEV_BOOT (0x46c >> 2)
  118. /* ECC */
  119. #define GT_ECC_ERRDATALO (0x480 >> 2) /* GT-64120A only */
  120. #define GT_ECC_ERRDATAHI (0x484 >> 2) /* GT-64120A only */
  121. #define GT_ECC_MEM (0x488 >> 2) /* GT-64120A only */
  122. #define GT_ECC_CALC (0x48c >> 2) /* GT-64120A only */
  123. #define GT_ECC_ERRADDR (0x490 >> 2) /* GT-64120A only */
  124. /* DMA Record */
  125. #define GT_DMA0_CNT (0x800 >> 2)
  126. #define GT_DMA1_CNT (0x804 >> 2)
  127. #define GT_DMA2_CNT (0x808 >> 2)
  128. #define GT_DMA3_CNT (0x80c >> 2)
  129. #define GT_DMA0_SA (0x810 >> 2)
  130. #define GT_DMA1_SA (0x814 >> 2)
  131. #define GT_DMA2_SA (0x818 >> 2)
  132. #define GT_DMA3_SA (0x81c >> 2)
  133. #define GT_DMA0_DA (0x820 >> 2)
  134. #define GT_DMA1_DA (0x824 >> 2)
  135. #define GT_DMA2_DA (0x828 >> 2)
  136. #define GT_DMA3_DA (0x82c >> 2)
  137. #define GT_DMA0_NEXT (0x830 >> 2)
  138. #define GT_DMA1_NEXT (0x834 >> 2)
  139. #define GT_DMA2_NEXT (0x838 >> 2)
  140. #define GT_DMA3_NEXT (0x83c >> 2)
  141. #define GT_DMA0_CUR (0x870 >> 2)
  142. #define GT_DMA1_CUR (0x874 >> 2)
  143. #define GT_DMA2_CUR (0x878 >> 2)
  144. #define GT_DMA3_CUR (0x87c >> 2)
  145. /* DMA Channel Control */
  146. #define GT_DMA0_CTRL (0x840 >> 2)
  147. #define GT_DMA1_CTRL (0x844 >> 2)
  148. #define GT_DMA2_CTRL (0x848 >> 2)
  149. #define GT_DMA3_CTRL (0x84c >> 2)
  150. /* DMA Arbiter */
  151. #define GT_DMA_ARB (0x860 >> 2)
  152. /* Timer/Counter */
  153. #define GT_TC0 (0x850 >> 2)
  154. #define GT_TC1 (0x854 >> 2)
  155. #define GT_TC2 (0x858 >> 2)
  156. #define GT_TC3 (0x85c >> 2)
  157. #define GT_TC_CONTROL (0x864 >> 2)
  158. /* PCI Internal */
  159. #define GT_PCI0_CMD (0xc00 >> 2)
  160. #define GT_PCI0_TOR (0xc04 >> 2)
  161. #define GT_PCI0_BS_SCS10 (0xc08 >> 2)
  162. #define GT_PCI0_BS_SCS32 (0xc0c >> 2)
  163. #define GT_PCI0_BS_CS20 (0xc10 >> 2)
  164. #define GT_PCI0_BS_CS3BT (0xc14 >> 2)
  165. #define GT_PCI1_IACK (0xc30 >> 2)
  166. #define GT_PCI0_IACK (0xc34 >> 2)
  167. #define GT_PCI0_BARE (0xc3c >> 2)
  168. #define GT_PCI0_PREFMBR (0xc40 >> 2)
  169. #define GT_PCI0_SCS10_BAR (0xc48 >> 2)
  170. #define GT_PCI0_SCS32_BAR (0xc4c >> 2)
  171. #define GT_PCI0_CS20_BAR (0xc50 >> 2)
  172. #define GT_PCI0_CS3BT_BAR (0xc54 >> 2)
  173. #define GT_PCI0_SSCS10_BAR (0xc58 >> 2)
  174. #define GT_PCI0_SSCS32_BAR (0xc5c >> 2)
  175. #define GT_PCI0_SCS3BT_BAR (0xc64 >> 2)
  176. #define GT_PCI1_CMD (0xc80 >> 2)
  177. #define GT_PCI1_TOR (0xc84 >> 2)
  178. #define GT_PCI1_BS_SCS10 (0xc88 >> 2)
  179. #define GT_PCI1_BS_SCS32 (0xc8c >> 2)
  180. #define GT_PCI1_BS_CS20 (0xc90 >> 2)
  181. #define GT_PCI1_BS_CS3BT (0xc94 >> 2)
  182. #define GT_PCI1_BARE (0xcbc >> 2)
  183. #define GT_PCI1_PREFMBR (0xcc0 >> 2)
  184. #define GT_PCI1_SCS10_BAR (0xcc8 >> 2)
  185. #define GT_PCI1_SCS32_BAR (0xccc >> 2)
  186. #define GT_PCI1_CS20_BAR (0xcd0 >> 2)
  187. #define GT_PCI1_CS3BT_BAR (0xcd4 >> 2)
  188. #define GT_PCI1_SSCS10_BAR (0xcd8 >> 2)
  189. #define GT_PCI1_SSCS32_BAR (0xcdc >> 2)
  190. #define GT_PCI1_SCS3BT_BAR (0xce4 >> 2)
  191. #define GT_PCI1_CFGADDR (0xcf0 >> 2)
  192. #define GT_PCI1_CFGDATA (0xcf4 >> 2)
  193. #define GT_PCI0_CFGADDR (0xcf8 >> 2)
  194. #define GT_PCI0_CFGDATA (0xcfc >> 2)
  195. /* Interrupts */
  196. #define GT_INTRCAUSE (0xc18 >> 2)
  197. #define GT_INTRMASK (0xc1c >> 2)
  198. #define GT_PCI0_ICMASK (0xc24 >> 2)
  199. #define GT_PCI0_SERR0MASK (0xc28 >> 2)
  200. #define GT_CPU_INTSEL (0xc70 >> 2)
  201. #define GT_PCI0_INTSEL (0xc74 >> 2)
  202. #define GT_HINTRCAUSE (0xc98 >> 2)
  203. #define GT_HINTRMASK (0xc9c >> 2)
  204. #define GT_PCI0_HICMASK (0xca4 >> 2)
  205. #define GT_PCI1_SERR1MASK (0xca8 >> 2)
  206. #define PCI_MAPPING_ENTRY(regname) \
  207. hwaddr regname ##_start; \
  208. hwaddr regname ##_length; \
  209. MemoryRegion regname ##_mem
  210. #define TYPE_GT64120_PCI_HOST_BRIDGE "gt64120"
  211. #define GT64120_PCI_HOST_BRIDGE(obj) \
  212. OBJECT_CHECK(GT64120State, (obj), TYPE_GT64120_PCI_HOST_BRIDGE)
  213. typedef struct GT64120State {
  214. PCIHostState parent_obj;
  215. uint32_t regs[GT_REGS];
  216. PCI_MAPPING_ENTRY(PCI0IO);
  217. PCI_MAPPING_ENTRY(PCI0M0);
  218. PCI_MAPPING_ENTRY(PCI0M1);
  219. PCI_MAPPING_ENTRY(ISD);
  220. MemoryRegion pci0_mem;
  221. AddressSpace pci0_mem_as;
  222. } GT64120State;
  223. /* Adjust range to avoid touching space which isn't mappable via PCI */
  224. /*
  225. * XXX: Hardcoded values for Malta: 0x1e000000 - 0x1f100000
  226. * 0x1fc00000 - 0x1fd00000
  227. */
  228. static void check_reserved_space(hwaddr *start, hwaddr *length)
  229. {
  230. hwaddr begin = *start;
  231. hwaddr end = *start + *length;
  232. if (end >= 0x1e000000LL && end < 0x1f100000LL) {
  233. end = 0x1e000000LL;
  234. }
  235. if (begin >= 0x1e000000LL && begin < 0x1f100000LL) {
  236. begin = 0x1f100000LL;
  237. }
  238. if (end >= 0x1fc00000LL && end < 0x1fd00000LL) {
  239. end = 0x1fc00000LL;
  240. }
  241. if (begin >= 0x1fc00000LL && begin < 0x1fd00000LL) {
  242. begin = 0x1fd00000LL;
  243. }
  244. /* XXX: This is broken when a reserved range splits the requested range */
  245. if (end >= 0x1f100000LL && begin < 0x1e000000LL) {
  246. end = 0x1e000000LL;
  247. }
  248. if (end >= 0x1fd00000LL && begin < 0x1fc00000LL) {
  249. end = 0x1fc00000LL;
  250. }
  251. *start = begin;
  252. *length = end - begin;
  253. }
  254. static void gt64120_isd_mapping(GT64120State *s)
  255. {
  256. /* Bits 14:0 of ISD map to bits 35:21 of the start address. */
  257. hwaddr start = ((hwaddr)s->regs[GT_ISD] << 21) & 0xFFFE00000ull;
  258. hwaddr length = 0x1000;
  259. if (s->ISD_length) {
  260. memory_region_del_subregion(get_system_memory(), &s->ISD_mem);
  261. }
  262. check_reserved_space(&start, &length);
  263. length = 0x1000;
  264. /* Map new address */
  265. trace_gt64120_isd_remap(s->ISD_length, s->ISD_start, length, start);
  266. s->ISD_start = start;
  267. s->ISD_length = length;
  268. memory_region_add_subregion(get_system_memory(), s->ISD_start, &s->ISD_mem);
  269. }
  270. static void gt64120_pci_mapping(GT64120State *s)
  271. {
  272. /* Update PCI0IO mapping */
  273. if ((s->regs[GT_PCI0IOLD] & 0x7f) <= s->regs[GT_PCI0IOHD]) {
  274. /* Unmap old IO address */
  275. if (s->PCI0IO_length) {
  276. memory_region_del_subregion(get_system_memory(), &s->PCI0IO_mem);
  277. object_unparent(OBJECT(&s->PCI0IO_mem));
  278. }
  279. /* Map new IO address */
  280. s->PCI0IO_start = s->regs[GT_PCI0IOLD] << 21;
  281. s->PCI0IO_length = ((s->regs[GT_PCI0IOHD] + 1) -
  282. (s->regs[GT_PCI0IOLD] & 0x7f)) << 21;
  283. if (s->PCI0IO_length) {
  284. memory_region_init_alias(&s->PCI0IO_mem, OBJECT(s), "pci0-io",
  285. get_system_io(), 0, s->PCI0IO_length);
  286. memory_region_add_subregion(get_system_memory(), s->PCI0IO_start,
  287. &s->PCI0IO_mem);
  288. }
  289. }
  290. /* Update PCI0M0 mapping */
  291. if ((s->regs[GT_PCI0M0LD] & 0x7f) <= s->regs[GT_PCI0M0HD]) {
  292. /* Unmap old MEM address */
  293. if (s->PCI0M0_length) {
  294. memory_region_del_subregion(get_system_memory(), &s->PCI0M0_mem);
  295. object_unparent(OBJECT(&s->PCI0M0_mem));
  296. }
  297. /* Map new mem address */
  298. s->PCI0M0_start = s->regs[GT_PCI0M0LD] << 21;
  299. s->PCI0M0_length = ((s->regs[GT_PCI0M0HD] + 1) -
  300. (s->regs[GT_PCI0M0LD] & 0x7f)) << 21;
  301. if (s->PCI0M0_length) {
  302. memory_region_init_alias(&s->PCI0M0_mem, OBJECT(s), "pci0-mem0",
  303. &s->pci0_mem, s->PCI0M0_start,
  304. s->PCI0M0_length);
  305. memory_region_add_subregion(get_system_memory(), s->PCI0M0_start,
  306. &s->PCI0M0_mem);
  307. }
  308. }
  309. /* Update PCI0M1 mapping */
  310. if ((s->regs[GT_PCI0M1LD] & 0x7f) <= s->regs[GT_PCI0M1HD]) {
  311. /* Unmap old MEM address */
  312. if (s->PCI0M1_length) {
  313. memory_region_del_subregion(get_system_memory(), &s->PCI0M1_mem);
  314. object_unparent(OBJECT(&s->PCI0M1_mem));
  315. }
  316. /* Map new mem address */
  317. s->PCI0M1_start = s->regs[GT_PCI0M1LD] << 21;
  318. s->PCI0M1_length = ((s->regs[GT_PCI0M1HD] + 1) -
  319. (s->regs[GT_PCI0M1LD] & 0x7f)) << 21;
  320. if (s->PCI0M1_length) {
  321. memory_region_init_alias(&s->PCI0M1_mem, OBJECT(s), "pci0-mem1",
  322. &s->pci0_mem, s->PCI0M1_start,
  323. s->PCI0M1_length);
  324. memory_region_add_subregion(get_system_memory(), s->PCI0M1_start,
  325. &s->PCI0M1_mem);
  326. }
  327. }
  328. }
  329. static int gt64120_post_load(void *opaque, int version_id)
  330. {
  331. GT64120State *s = opaque;
  332. gt64120_isd_mapping(s);
  333. gt64120_pci_mapping(s);
  334. return 0;
  335. }
  336. static const VMStateDescription vmstate_gt64120 = {
  337. .name = "gt64120",
  338. .version_id = 1,
  339. .minimum_version_id = 1,
  340. .post_load = gt64120_post_load,
  341. .fields = (VMStateField[]) {
  342. VMSTATE_UINT32_ARRAY(regs, GT64120State, GT_REGS),
  343. VMSTATE_END_OF_LIST()
  344. }
  345. };
  346. static void gt64120_writel(void *opaque, hwaddr addr,
  347. uint64_t val, unsigned size)
  348. {
  349. GT64120State *s = opaque;
  350. PCIHostState *phb = PCI_HOST_BRIDGE(s);
  351. uint32_t saddr;
  352. if (!(s->regs[GT_CPU] & 0x00001000)) {
  353. val = bswap32(val);
  354. }
  355. saddr = (addr & 0xfff) >> 2;
  356. switch (saddr) {
  357. /* CPU Configuration */
  358. case GT_CPU:
  359. s->regs[GT_CPU] = val;
  360. break;
  361. case GT_MULTI:
  362. /* Read-only register as only one GT64xxx is present on the CPU bus */
  363. break;
  364. /* CPU Address Decode */
  365. case GT_PCI0IOLD:
  366. s->regs[GT_PCI0IOLD] = val & 0x00007fff;
  367. s->regs[GT_PCI0IOREMAP] = val & 0x000007ff;
  368. gt64120_pci_mapping(s);
  369. break;
  370. case GT_PCI0M0LD:
  371. s->regs[GT_PCI0M0LD] = val & 0x00007fff;
  372. s->regs[GT_PCI0M0REMAP] = val & 0x000007ff;
  373. gt64120_pci_mapping(s);
  374. break;
  375. case GT_PCI0M1LD:
  376. s->regs[GT_PCI0M1LD] = val & 0x00007fff;
  377. s->regs[GT_PCI0M1REMAP] = val & 0x000007ff;
  378. gt64120_pci_mapping(s);
  379. break;
  380. case GT_PCI1IOLD:
  381. s->regs[GT_PCI1IOLD] = val & 0x00007fff;
  382. s->regs[GT_PCI1IOREMAP] = val & 0x000007ff;
  383. break;
  384. case GT_PCI1M0LD:
  385. s->regs[GT_PCI1M0LD] = val & 0x00007fff;
  386. s->regs[GT_PCI1M0REMAP] = val & 0x000007ff;
  387. break;
  388. case GT_PCI1M1LD:
  389. s->regs[GT_PCI1M1LD] = val & 0x00007fff;
  390. s->regs[GT_PCI1M1REMAP] = val & 0x000007ff;
  391. break;
  392. case GT_PCI0M0HD:
  393. case GT_PCI0M1HD:
  394. case GT_PCI0IOHD:
  395. s->regs[saddr] = val & 0x0000007f;
  396. gt64120_pci_mapping(s);
  397. break;
  398. case GT_PCI1IOHD:
  399. case GT_PCI1M0HD:
  400. case GT_PCI1M1HD:
  401. s->regs[saddr] = val & 0x0000007f;
  402. break;
  403. case GT_ISD:
  404. s->regs[saddr] = val & 0x00007fff;
  405. gt64120_isd_mapping(s);
  406. break;
  407. case GT_PCI0IOREMAP:
  408. case GT_PCI0M0REMAP:
  409. case GT_PCI0M1REMAP:
  410. case GT_PCI1IOREMAP:
  411. case GT_PCI1M0REMAP:
  412. case GT_PCI1M1REMAP:
  413. s->regs[saddr] = val & 0x000007ff;
  414. break;
  415. /* CPU Error Report */
  416. case GT_CPUERR_ADDRLO:
  417. case GT_CPUERR_ADDRHI:
  418. case GT_CPUERR_DATALO:
  419. case GT_CPUERR_DATAHI:
  420. case GT_CPUERR_PARITY:
  421. /* Read-only registers, do nothing */
  422. qemu_log_mask(LOG_GUEST_ERROR,
  423. "gt64120: Read-only register write "
  424. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  425. saddr << 2, size, size << 1, val);
  426. break;
  427. /* CPU Sync Barrier */
  428. case GT_PCI0SYNC:
  429. case GT_PCI1SYNC:
  430. /* Read-only registers, do nothing */
  431. qemu_log_mask(LOG_GUEST_ERROR,
  432. "gt64120: Read-only register write "
  433. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  434. saddr << 2, size, size << 1, val);
  435. break;
  436. /* SDRAM and Device Address Decode */
  437. case GT_SCS0LD:
  438. case GT_SCS0HD:
  439. case GT_SCS1LD:
  440. case GT_SCS1HD:
  441. case GT_SCS2LD:
  442. case GT_SCS2HD:
  443. case GT_SCS3LD:
  444. case GT_SCS3HD:
  445. case GT_CS0LD:
  446. case GT_CS0HD:
  447. case GT_CS1LD:
  448. case GT_CS1HD:
  449. case GT_CS2LD:
  450. case GT_CS2HD:
  451. case GT_CS3LD:
  452. case GT_CS3HD:
  453. case GT_BOOTLD:
  454. case GT_BOOTHD:
  455. case GT_ADERR:
  456. /* SDRAM Configuration */
  457. case GT_SDRAM_CFG:
  458. case GT_SDRAM_OPMODE:
  459. case GT_SDRAM_BM:
  460. case GT_SDRAM_ADDRDECODE:
  461. /* Accept and ignore SDRAM interleave configuration */
  462. s->regs[saddr] = val;
  463. break;
  464. /* Device Parameters */
  465. case GT_DEV_B0:
  466. case GT_DEV_B1:
  467. case GT_DEV_B2:
  468. case GT_DEV_B3:
  469. case GT_DEV_BOOT:
  470. /* Not implemented */
  471. qemu_log_mask(LOG_UNIMP,
  472. "gt64120: Unimplemented device register write "
  473. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  474. saddr << 2, size, size << 1, val);
  475. break;
  476. /* ECC */
  477. case GT_ECC_ERRDATALO:
  478. case GT_ECC_ERRDATAHI:
  479. case GT_ECC_MEM:
  480. case GT_ECC_CALC:
  481. case GT_ECC_ERRADDR:
  482. /* Read-only registers, do nothing */
  483. qemu_log_mask(LOG_GUEST_ERROR,
  484. "gt64120: Read-only register write "
  485. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  486. saddr << 2, size, size << 1, val);
  487. break;
  488. /* DMA Record */
  489. case GT_DMA0_CNT:
  490. case GT_DMA1_CNT:
  491. case GT_DMA2_CNT:
  492. case GT_DMA3_CNT:
  493. case GT_DMA0_SA:
  494. case GT_DMA1_SA:
  495. case GT_DMA2_SA:
  496. case GT_DMA3_SA:
  497. case GT_DMA0_DA:
  498. case GT_DMA1_DA:
  499. case GT_DMA2_DA:
  500. case GT_DMA3_DA:
  501. case GT_DMA0_NEXT:
  502. case GT_DMA1_NEXT:
  503. case GT_DMA2_NEXT:
  504. case GT_DMA3_NEXT:
  505. case GT_DMA0_CUR:
  506. case GT_DMA1_CUR:
  507. case GT_DMA2_CUR:
  508. case GT_DMA3_CUR:
  509. /* DMA Channel Control */
  510. case GT_DMA0_CTRL:
  511. case GT_DMA1_CTRL:
  512. case GT_DMA2_CTRL:
  513. case GT_DMA3_CTRL:
  514. /* DMA Arbiter */
  515. case GT_DMA_ARB:
  516. /* Not implemented */
  517. qemu_log_mask(LOG_UNIMP,
  518. "gt64120: Unimplemented DMA register write "
  519. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  520. saddr << 2, size, size << 1, val);
  521. break;
  522. /* Timer/Counter */
  523. case GT_TC0:
  524. case GT_TC1:
  525. case GT_TC2:
  526. case GT_TC3:
  527. case GT_TC_CONTROL:
  528. /* Not implemented */
  529. qemu_log_mask(LOG_UNIMP,
  530. "gt64120: Unimplemented timer register write "
  531. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  532. saddr << 2, size, size << 1, val);
  533. break;
  534. /* PCI Internal */
  535. case GT_PCI0_CMD:
  536. case GT_PCI1_CMD:
  537. s->regs[saddr] = val & 0x0401fc0f;
  538. break;
  539. case GT_PCI0_TOR:
  540. case GT_PCI0_BS_SCS10:
  541. case GT_PCI0_BS_SCS32:
  542. case GT_PCI0_BS_CS20:
  543. case GT_PCI0_BS_CS3BT:
  544. case GT_PCI1_IACK:
  545. case GT_PCI0_IACK:
  546. case GT_PCI0_BARE:
  547. case GT_PCI0_PREFMBR:
  548. case GT_PCI0_SCS10_BAR:
  549. case GT_PCI0_SCS32_BAR:
  550. case GT_PCI0_CS20_BAR:
  551. case GT_PCI0_CS3BT_BAR:
  552. case GT_PCI0_SSCS10_BAR:
  553. case GT_PCI0_SSCS32_BAR:
  554. case GT_PCI0_SCS3BT_BAR:
  555. case GT_PCI1_TOR:
  556. case GT_PCI1_BS_SCS10:
  557. case GT_PCI1_BS_SCS32:
  558. case GT_PCI1_BS_CS20:
  559. case GT_PCI1_BS_CS3BT:
  560. case GT_PCI1_BARE:
  561. case GT_PCI1_PREFMBR:
  562. case GT_PCI1_SCS10_BAR:
  563. case GT_PCI1_SCS32_BAR:
  564. case GT_PCI1_CS20_BAR:
  565. case GT_PCI1_CS3BT_BAR:
  566. case GT_PCI1_SSCS10_BAR:
  567. case GT_PCI1_SSCS32_BAR:
  568. case GT_PCI1_SCS3BT_BAR:
  569. case GT_PCI1_CFGADDR:
  570. case GT_PCI1_CFGDATA:
  571. /* not implemented */
  572. qemu_log_mask(LOG_UNIMP,
  573. "gt64120: Unimplemented timer register write "
  574. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  575. saddr << 2, size, size << 1, val);
  576. break;
  577. case GT_PCI0_CFGADDR:
  578. phb->config_reg = val & 0x80fffffc;
  579. break;
  580. case GT_PCI0_CFGDATA:
  581. if (!(s->regs[GT_PCI0_CMD] & 1) && (phb->config_reg & 0x00fff800)) {
  582. val = bswap32(val);
  583. }
  584. if (phb->config_reg & (1u << 31)) {
  585. pci_data_write(phb->bus, phb->config_reg, val, 4);
  586. }
  587. break;
  588. /* Interrupts */
  589. case GT_INTRCAUSE:
  590. /* not really implemented */
  591. s->regs[saddr] = ~(~(s->regs[saddr]) | ~(val & 0xfffffffe));
  592. s->regs[saddr] |= !!(s->regs[saddr] & 0xfffffffe);
  593. trace_gt64120_write("INTRCAUSE", size, val);
  594. break;
  595. case GT_INTRMASK:
  596. s->regs[saddr] = val & 0x3c3ffffe;
  597. trace_gt64120_write("INTRMASK", size, val);
  598. break;
  599. case GT_PCI0_ICMASK:
  600. s->regs[saddr] = val & 0x03fffffe;
  601. trace_gt64120_write("ICMASK", size, val);
  602. break;
  603. case GT_PCI0_SERR0MASK:
  604. s->regs[saddr] = val & 0x0000003f;
  605. trace_gt64120_write("SERR0MASK", size, val);
  606. break;
  607. /* Reserved when only PCI_0 is configured. */
  608. case GT_HINTRCAUSE:
  609. case GT_CPU_INTSEL:
  610. case GT_PCI0_INTSEL:
  611. case GT_HINTRMASK:
  612. case GT_PCI0_HICMASK:
  613. case GT_PCI1_SERR1MASK:
  614. /* not implemented */
  615. break;
  616. /* SDRAM Parameters */
  617. case GT_SDRAM_B0:
  618. case GT_SDRAM_B1:
  619. case GT_SDRAM_B2:
  620. case GT_SDRAM_B3:
  621. /*
  622. * We don't simulate electrical parameters of the SDRAM.
  623. * Accept, but ignore the values.
  624. */
  625. s->regs[saddr] = val;
  626. break;
  627. default:
  628. qemu_log_mask(LOG_GUEST_ERROR,
  629. "gt64120: Illegal register write "
  630. "reg:0x03%x size:%u value:0x%0*" PRIx64 "\n",
  631. saddr << 2, size, size << 1, val);
  632. break;
  633. }
  634. }
  635. static uint64_t gt64120_readl(void *opaque,
  636. hwaddr addr, unsigned size)
  637. {
  638. GT64120State *s = opaque;
  639. PCIHostState *phb = PCI_HOST_BRIDGE(s);
  640. uint32_t val;
  641. uint32_t saddr;
  642. saddr = (addr & 0xfff) >> 2;
  643. switch (saddr) {
  644. /* CPU Configuration */
  645. case GT_MULTI:
  646. /*
  647. * Only one GT64xxx is present on the CPU bus, return
  648. * the initial value.
  649. */
  650. val = s->regs[saddr];
  651. break;
  652. /* CPU Error Report */
  653. case GT_CPUERR_ADDRLO:
  654. case GT_CPUERR_ADDRHI:
  655. case GT_CPUERR_DATALO:
  656. case GT_CPUERR_DATAHI:
  657. case GT_CPUERR_PARITY:
  658. /* Emulated memory has no error, always return the initial values. */
  659. val = s->regs[saddr];
  660. break;
  661. /* CPU Sync Barrier */
  662. case GT_PCI0SYNC:
  663. case GT_PCI1SYNC:
  664. /*
  665. * Reading those register should empty all FIFO on the PCI
  666. * bus, which are not emulated. The return value should be
  667. * a random value that should be ignored.
  668. */
  669. val = 0xc000ffee;
  670. break;
  671. /* ECC */
  672. case GT_ECC_ERRDATALO:
  673. case GT_ECC_ERRDATAHI:
  674. case GT_ECC_MEM:
  675. case GT_ECC_CALC:
  676. case GT_ECC_ERRADDR:
  677. /* Emulated memory has no error, always return the initial values. */
  678. val = s->regs[saddr];
  679. break;
  680. case GT_CPU:
  681. case GT_SCS10LD:
  682. case GT_SCS10HD:
  683. case GT_SCS32LD:
  684. case GT_SCS32HD:
  685. case GT_CS20LD:
  686. case GT_CS20HD:
  687. case GT_CS3BOOTLD:
  688. case GT_CS3BOOTHD:
  689. case GT_SCS10AR:
  690. case GT_SCS32AR:
  691. case GT_CS20R:
  692. case GT_CS3BOOTR:
  693. case GT_PCI0IOLD:
  694. case GT_PCI0M0LD:
  695. case GT_PCI0M1LD:
  696. case GT_PCI1IOLD:
  697. case GT_PCI1M0LD:
  698. case GT_PCI1M1LD:
  699. case GT_PCI0IOHD:
  700. case GT_PCI0M0HD:
  701. case GT_PCI0M1HD:
  702. case GT_PCI1IOHD:
  703. case GT_PCI1M0HD:
  704. case GT_PCI1M1HD:
  705. case GT_PCI0IOREMAP:
  706. case GT_PCI0M0REMAP:
  707. case GT_PCI0M1REMAP:
  708. case GT_PCI1IOREMAP:
  709. case GT_PCI1M0REMAP:
  710. case GT_PCI1M1REMAP:
  711. case GT_ISD:
  712. val = s->regs[saddr];
  713. break;
  714. case GT_PCI0_IACK:
  715. /* Read the IRQ number */
  716. val = pic_read_irq(isa_pic);
  717. break;
  718. /* SDRAM and Device Address Decode */
  719. case GT_SCS0LD:
  720. case GT_SCS0HD:
  721. case GT_SCS1LD:
  722. case GT_SCS1HD:
  723. case GT_SCS2LD:
  724. case GT_SCS2HD:
  725. case GT_SCS3LD:
  726. case GT_SCS3HD:
  727. case GT_CS0LD:
  728. case GT_CS0HD:
  729. case GT_CS1LD:
  730. case GT_CS1HD:
  731. case GT_CS2LD:
  732. case GT_CS2HD:
  733. case GT_CS3LD:
  734. case GT_CS3HD:
  735. case GT_BOOTLD:
  736. case GT_BOOTHD:
  737. case GT_ADERR:
  738. val = s->regs[saddr];
  739. break;
  740. /* SDRAM Configuration */
  741. case GT_SDRAM_CFG:
  742. case GT_SDRAM_OPMODE:
  743. case GT_SDRAM_BM:
  744. case GT_SDRAM_ADDRDECODE:
  745. val = s->regs[saddr];
  746. break;
  747. /* SDRAM Parameters */
  748. case GT_SDRAM_B0:
  749. case GT_SDRAM_B1:
  750. case GT_SDRAM_B2:
  751. case GT_SDRAM_B3:
  752. /*
  753. * We don't simulate electrical parameters of the SDRAM.
  754. * Just return the last written value.
  755. */
  756. val = s->regs[saddr];
  757. break;
  758. /* Device Parameters */
  759. case GT_DEV_B0:
  760. case GT_DEV_B1:
  761. case GT_DEV_B2:
  762. case GT_DEV_B3:
  763. case GT_DEV_BOOT:
  764. val = s->regs[saddr];
  765. break;
  766. /* DMA Record */
  767. case GT_DMA0_CNT:
  768. case GT_DMA1_CNT:
  769. case GT_DMA2_CNT:
  770. case GT_DMA3_CNT:
  771. case GT_DMA0_SA:
  772. case GT_DMA1_SA:
  773. case GT_DMA2_SA:
  774. case GT_DMA3_SA:
  775. case GT_DMA0_DA:
  776. case GT_DMA1_DA:
  777. case GT_DMA2_DA:
  778. case GT_DMA3_DA:
  779. case GT_DMA0_NEXT:
  780. case GT_DMA1_NEXT:
  781. case GT_DMA2_NEXT:
  782. case GT_DMA3_NEXT:
  783. case GT_DMA0_CUR:
  784. case GT_DMA1_CUR:
  785. case GT_DMA2_CUR:
  786. case GT_DMA3_CUR:
  787. val = s->regs[saddr];
  788. break;
  789. /* DMA Channel Control */
  790. case GT_DMA0_CTRL:
  791. case GT_DMA1_CTRL:
  792. case GT_DMA2_CTRL:
  793. case GT_DMA3_CTRL:
  794. val = s->regs[saddr];
  795. break;
  796. /* DMA Arbiter */
  797. case GT_DMA_ARB:
  798. val = s->regs[saddr];
  799. break;
  800. /* Timer/Counter */
  801. case GT_TC0:
  802. case GT_TC1:
  803. case GT_TC2:
  804. case GT_TC3:
  805. case GT_TC_CONTROL:
  806. val = s->regs[saddr];
  807. break;
  808. /* PCI Internal */
  809. case GT_PCI0_CFGADDR:
  810. val = phb->config_reg;
  811. break;
  812. case GT_PCI0_CFGDATA:
  813. if (!(phb->config_reg & (1 << 31))) {
  814. val = 0xffffffff;
  815. } else {
  816. val = pci_data_read(phb->bus, phb->config_reg, 4);
  817. }
  818. if (!(s->regs[GT_PCI0_CMD] & 1) && (phb->config_reg & 0x00fff800)) {
  819. val = bswap32(val);
  820. }
  821. break;
  822. case GT_PCI0_CMD:
  823. case GT_PCI0_TOR:
  824. case GT_PCI0_BS_SCS10:
  825. case GT_PCI0_BS_SCS32:
  826. case GT_PCI0_BS_CS20:
  827. case GT_PCI0_BS_CS3BT:
  828. case GT_PCI1_IACK:
  829. case GT_PCI0_BARE:
  830. case GT_PCI0_PREFMBR:
  831. case GT_PCI0_SCS10_BAR:
  832. case GT_PCI0_SCS32_BAR:
  833. case GT_PCI0_CS20_BAR:
  834. case GT_PCI0_CS3BT_BAR:
  835. case GT_PCI0_SSCS10_BAR:
  836. case GT_PCI0_SSCS32_BAR:
  837. case GT_PCI0_SCS3BT_BAR:
  838. case GT_PCI1_CMD:
  839. case GT_PCI1_TOR:
  840. case GT_PCI1_BS_SCS10:
  841. case GT_PCI1_BS_SCS32:
  842. case GT_PCI1_BS_CS20:
  843. case GT_PCI1_BS_CS3BT:
  844. case GT_PCI1_BARE:
  845. case GT_PCI1_PREFMBR:
  846. case GT_PCI1_SCS10_BAR:
  847. case GT_PCI1_SCS32_BAR:
  848. case GT_PCI1_CS20_BAR:
  849. case GT_PCI1_CS3BT_BAR:
  850. case GT_PCI1_SSCS10_BAR:
  851. case GT_PCI1_SSCS32_BAR:
  852. case GT_PCI1_SCS3BT_BAR:
  853. case GT_PCI1_CFGADDR:
  854. case GT_PCI1_CFGDATA:
  855. val = s->regs[saddr];
  856. break;
  857. /* Interrupts */
  858. case GT_INTRCAUSE:
  859. val = s->regs[saddr];
  860. trace_gt64120_read("INTRCAUSE", size, val);
  861. break;
  862. case GT_INTRMASK:
  863. val = s->regs[saddr];
  864. trace_gt64120_read("INTRMASK", size, val);
  865. break;
  866. case GT_PCI0_ICMASK:
  867. val = s->regs[saddr];
  868. trace_gt64120_read("ICMASK", size, val);
  869. break;
  870. case GT_PCI0_SERR0MASK:
  871. val = s->regs[saddr];
  872. trace_gt64120_read("SERR0MASK", size, val);
  873. break;
  874. /* Reserved when only PCI_0 is configured. */
  875. case GT_HINTRCAUSE:
  876. case GT_CPU_INTSEL:
  877. case GT_PCI0_INTSEL:
  878. case GT_HINTRMASK:
  879. case GT_PCI0_HICMASK:
  880. case GT_PCI1_SERR1MASK:
  881. val = s->regs[saddr];
  882. break;
  883. default:
  884. val = s->regs[saddr];
  885. qemu_log_mask(LOG_GUEST_ERROR,
  886. "gt64120: Illegal register read "
  887. "reg:0x03%x size:%u value:0x%0*x\n",
  888. saddr << 2, size, size << 1, val);
  889. break;
  890. }
  891. if (!(s->regs[GT_CPU] & 0x00001000)) {
  892. val = bswap32(val);
  893. }
  894. return val;
  895. }
  896. static const MemoryRegionOps isd_mem_ops = {
  897. .read = gt64120_readl,
  898. .write = gt64120_writel,
  899. .endianness = DEVICE_NATIVE_ENDIAN,
  900. };
  901. static int gt64120_pci_map_irq(PCIDevice *pci_dev, int irq_num)
  902. {
  903. int slot;
  904. slot = (pci_dev->devfn >> 3);
  905. switch (slot) {
  906. /* PIIX4 USB */
  907. case 10:
  908. return 3;
  909. /* AMD 79C973 Ethernet */
  910. case 11:
  911. return 1;
  912. /* Crystal 4281 Sound */
  913. case 12:
  914. return 2;
  915. /* PCI slot 1 to 4 */
  916. case 18 ... 21:
  917. return ((slot - 18) + irq_num) & 0x03;
  918. /* Unknown device, don't do any translation */
  919. default:
  920. return irq_num;
  921. }
  922. }
  923. static int pci_irq_levels[4];
  924. static void gt64120_pci_set_irq(void *opaque, int irq_num, int level)
  925. {
  926. int i, pic_irq, pic_level;
  927. qemu_irq *pic = opaque;
  928. pci_irq_levels[irq_num] = level;
  929. /* now we change the pic irq level according to the piix irq mappings */
  930. /* XXX: optimize */
  931. pic_irq = piix4_dev->config[PIIX_PIRQCA + irq_num];
  932. if (pic_irq < 16) {
  933. /* The pic level is the logical OR of all the PCI irqs mapped to it. */
  934. pic_level = 0;
  935. for (i = 0; i < 4; i++) {
  936. if (pic_irq == piix4_dev->config[PIIX_PIRQCA + i]) {
  937. pic_level |= pci_irq_levels[i];
  938. }
  939. }
  940. qemu_set_irq(pic[pic_irq], pic_level);
  941. }
  942. }
  943. static void gt64120_reset(DeviceState *dev)
  944. {
  945. GT64120State *s = GT64120_PCI_HOST_BRIDGE(dev);
  946. /* FIXME: Malta specific hw assumptions ahead */
  947. /* CPU Configuration */
  948. #ifdef TARGET_WORDS_BIGENDIAN
  949. s->regs[GT_CPU] = 0x00000000;
  950. #else
  951. s->regs[GT_CPU] = 0x00001000;
  952. #endif
  953. s->regs[GT_MULTI] = 0x00000003;
  954. /* CPU Address decode */
  955. s->regs[GT_SCS10LD] = 0x00000000;
  956. s->regs[GT_SCS10HD] = 0x00000007;
  957. s->regs[GT_SCS32LD] = 0x00000008;
  958. s->regs[GT_SCS32HD] = 0x0000000f;
  959. s->regs[GT_CS20LD] = 0x000000e0;
  960. s->regs[GT_CS20HD] = 0x00000070;
  961. s->regs[GT_CS3BOOTLD] = 0x000000f8;
  962. s->regs[GT_CS3BOOTHD] = 0x0000007f;
  963. s->regs[GT_PCI0IOLD] = 0x00000080;
  964. s->regs[GT_PCI0IOHD] = 0x0000000f;
  965. s->regs[GT_PCI0M0LD] = 0x00000090;
  966. s->regs[GT_PCI0M0HD] = 0x0000001f;
  967. s->regs[GT_ISD] = 0x000000a0;
  968. s->regs[GT_PCI0M1LD] = 0x00000790;
  969. s->regs[GT_PCI0M1HD] = 0x0000001f;
  970. s->regs[GT_PCI1IOLD] = 0x00000100;
  971. s->regs[GT_PCI1IOHD] = 0x0000000f;
  972. s->regs[GT_PCI1M0LD] = 0x00000110;
  973. s->regs[GT_PCI1M0HD] = 0x0000001f;
  974. s->regs[GT_PCI1M1LD] = 0x00000120;
  975. s->regs[GT_PCI1M1HD] = 0x0000002f;
  976. s->regs[GT_SCS10AR] = 0x00000000;
  977. s->regs[GT_SCS32AR] = 0x00000008;
  978. s->regs[GT_CS20R] = 0x000000e0;
  979. s->regs[GT_CS3BOOTR] = 0x000000f8;
  980. s->regs[GT_PCI0IOREMAP] = 0x00000080;
  981. s->regs[GT_PCI0M0REMAP] = 0x00000090;
  982. s->regs[GT_PCI0M1REMAP] = 0x00000790;
  983. s->regs[GT_PCI1IOREMAP] = 0x00000100;
  984. s->regs[GT_PCI1M0REMAP] = 0x00000110;
  985. s->regs[GT_PCI1M1REMAP] = 0x00000120;
  986. /* CPU Error Report */
  987. s->regs[GT_CPUERR_ADDRLO] = 0x00000000;
  988. s->regs[GT_CPUERR_ADDRHI] = 0x00000000;
  989. s->regs[GT_CPUERR_DATALO] = 0xffffffff;
  990. s->regs[GT_CPUERR_DATAHI] = 0xffffffff;
  991. s->regs[GT_CPUERR_PARITY] = 0x000000ff;
  992. /* CPU Sync Barrier */
  993. s->regs[GT_PCI0SYNC] = 0x00000000;
  994. s->regs[GT_PCI1SYNC] = 0x00000000;
  995. /* SDRAM and Device Address Decode */
  996. s->regs[GT_SCS0LD] = 0x00000000;
  997. s->regs[GT_SCS0HD] = 0x00000007;
  998. s->regs[GT_SCS1LD] = 0x00000008;
  999. s->regs[GT_SCS1HD] = 0x0000000f;
  1000. s->regs[GT_SCS2LD] = 0x00000010;
  1001. s->regs[GT_SCS2HD] = 0x00000017;
  1002. s->regs[GT_SCS3LD] = 0x00000018;
  1003. s->regs[GT_SCS3HD] = 0x0000001f;
  1004. s->regs[GT_CS0LD] = 0x000000c0;
  1005. s->regs[GT_CS0HD] = 0x000000c7;
  1006. s->regs[GT_CS1LD] = 0x000000c8;
  1007. s->regs[GT_CS1HD] = 0x000000cf;
  1008. s->regs[GT_CS2LD] = 0x000000d0;
  1009. s->regs[GT_CS2HD] = 0x000000df;
  1010. s->regs[GT_CS3LD] = 0x000000f0;
  1011. s->regs[GT_CS3HD] = 0x000000fb;
  1012. s->regs[GT_BOOTLD] = 0x000000fc;
  1013. s->regs[GT_BOOTHD] = 0x000000ff;
  1014. s->regs[GT_ADERR] = 0xffffffff;
  1015. /* SDRAM Configuration */
  1016. s->regs[GT_SDRAM_CFG] = 0x00000200;
  1017. s->regs[GT_SDRAM_OPMODE] = 0x00000000;
  1018. s->regs[GT_SDRAM_BM] = 0x00000007;
  1019. s->regs[GT_SDRAM_ADDRDECODE] = 0x00000002;
  1020. /* SDRAM Parameters */
  1021. s->regs[GT_SDRAM_B0] = 0x00000005;
  1022. s->regs[GT_SDRAM_B1] = 0x00000005;
  1023. s->regs[GT_SDRAM_B2] = 0x00000005;
  1024. s->regs[GT_SDRAM_B3] = 0x00000005;
  1025. /* ECC */
  1026. s->regs[GT_ECC_ERRDATALO] = 0x00000000;
  1027. s->regs[GT_ECC_ERRDATAHI] = 0x00000000;
  1028. s->regs[GT_ECC_MEM] = 0x00000000;
  1029. s->regs[GT_ECC_CALC] = 0x00000000;
  1030. s->regs[GT_ECC_ERRADDR] = 0x00000000;
  1031. /* Device Parameters */
  1032. s->regs[GT_DEV_B0] = 0x386fffff;
  1033. s->regs[GT_DEV_B1] = 0x386fffff;
  1034. s->regs[GT_DEV_B2] = 0x386fffff;
  1035. s->regs[GT_DEV_B3] = 0x386fffff;
  1036. s->regs[GT_DEV_BOOT] = 0x146fffff;
  1037. /* DMA registers are all zeroed at reset */
  1038. /* Timer/Counter */
  1039. s->regs[GT_TC0] = 0xffffffff;
  1040. s->regs[GT_TC1] = 0x00ffffff;
  1041. s->regs[GT_TC2] = 0x00ffffff;
  1042. s->regs[GT_TC3] = 0x00ffffff;
  1043. s->regs[GT_TC_CONTROL] = 0x00000000;
  1044. /* PCI Internal */
  1045. #ifdef TARGET_WORDS_BIGENDIAN
  1046. s->regs[GT_PCI0_CMD] = 0x00000000;
  1047. #else
  1048. s->regs[GT_PCI0_CMD] = 0x00010001;
  1049. #endif
  1050. s->regs[GT_PCI0_TOR] = 0x0000070f;
  1051. s->regs[GT_PCI0_BS_SCS10] = 0x00fff000;
  1052. s->regs[GT_PCI0_BS_SCS32] = 0x00fff000;
  1053. s->regs[GT_PCI0_BS_CS20] = 0x01fff000;
  1054. s->regs[GT_PCI0_BS_CS3BT] = 0x00fff000;
  1055. s->regs[GT_PCI1_IACK] = 0x00000000;
  1056. s->regs[GT_PCI0_IACK] = 0x00000000;
  1057. s->regs[GT_PCI0_BARE] = 0x0000000f;
  1058. s->regs[GT_PCI0_PREFMBR] = 0x00000040;
  1059. s->regs[GT_PCI0_SCS10_BAR] = 0x00000000;
  1060. s->regs[GT_PCI0_SCS32_BAR] = 0x01000000;
  1061. s->regs[GT_PCI0_CS20_BAR] = 0x1c000000;
  1062. s->regs[GT_PCI0_CS3BT_BAR] = 0x1f000000;
  1063. s->regs[GT_PCI0_SSCS10_BAR] = 0x00000000;
  1064. s->regs[GT_PCI0_SSCS32_BAR] = 0x01000000;
  1065. s->regs[GT_PCI0_SCS3BT_BAR] = 0x1f000000;
  1066. #ifdef TARGET_WORDS_BIGENDIAN
  1067. s->regs[GT_PCI1_CMD] = 0x00000000;
  1068. #else
  1069. s->regs[GT_PCI1_CMD] = 0x00010001;
  1070. #endif
  1071. s->regs[GT_PCI1_TOR] = 0x0000070f;
  1072. s->regs[GT_PCI1_BS_SCS10] = 0x00fff000;
  1073. s->regs[GT_PCI1_BS_SCS32] = 0x00fff000;
  1074. s->regs[GT_PCI1_BS_CS20] = 0x01fff000;
  1075. s->regs[GT_PCI1_BS_CS3BT] = 0x00fff000;
  1076. s->regs[GT_PCI1_BARE] = 0x0000000f;
  1077. s->regs[GT_PCI1_PREFMBR] = 0x00000040;
  1078. s->regs[GT_PCI1_SCS10_BAR] = 0x00000000;
  1079. s->regs[GT_PCI1_SCS32_BAR] = 0x01000000;
  1080. s->regs[GT_PCI1_CS20_BAR] = 0x1c000000;
  1081. s->regs[GT_PCI1_CS3BT_BAR] = 0x1f000000;
  1082. s->regs[GT_PCI1_SSCS10_BAR] = 0x00000000;
  1083. s->regs[GT_PCI1_SSCS32_BAR] = 0x01000000;
  1084. s->regs[GT_PCI1_SCS3BT_BAR] = 0x1f000000;
  1085. s->regs[GT_PCI1_CFGADDR] = 0x00000000;
  1086. s->regs[GT_PCI1_CFGDATA] = 0x00000000;
  1087. s->regs[GT_PCI0_CFGADDR] = 0x00000000;
  1088. /* Interrupt registers are all zeroed at reset */
  1089. gt64120_isd_mapping(s);
  1090. gt64120_pci_mapping(s);
  1091. }
  1092. PCIBus *gt64120_register(qemu_irq *pic)
  1093. {
  1094. GT64120State *d;
  1095. PCIHostState *phb;
  1096. DeviceState *dev;
  1097. dev = qdev_new(TYPE_GT64120_PCI_HOST_BRIDGE);
  1098. d = GT64120_PCI_HOST_BRIDGE(dev);
  1099. phb = PCI_HOST_BRIDGE(dev);
  1100. memory_region_init(&d->pci0_mem, OBJECT(dev), "pci0-mem", 4 * GiB);
  1101. address_space_init(&d->pci0_mem_as, &d->pci0_mem, "pci0-mem");
  1102. phb->bus = pci_register_root_bus(dev, "pci",
  1103. gt64120_pci_set_irq, gt64120_pci_map_irq,
  1104. pic,
  1105. &d->pci0_mem,
  1106. get_system_io(),
  1107. PCI_DEVFN(18, 0), 4, TYPE_PCI_BUS);
  1108. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  1109. memory_region_init_io(&d->ISD_mem, OBJECT(dev), &isd_mem_ops, d,
  1110. "isd-mem", 0x1000);
  1111. pci_create_simple(phb->bus, PCI_DEVFN(0, 0), "gt64120_pci");
  1112. return phb->bus;
  1113. }
  1114. static void gt64120_pci_realize(PCIDevice *d, Error **errp)
  1115. {
  1116. /* FIXME: Malta specific hw assumptions ahead */
  1117. pci_set_word(d->config + PCI_COMMAND, 0);
  1118. pci_set_word(d->config + PCI_STATUS,
  1119. PCI_STATUS_FAST_BACK | PCI_STATUS_DEVSEL_MEDIUM);
  1120. pci_config_set_prog_interface(d->config, 0);
  1121. pci_set_long(d->config + PCI_BASE_ADDRESS_0, 0x00000008);
  1122. pci_set_long(d->config + PCI_BASE_ADDRESS_1, 0x01000008);
  1123. pci_set_long(d->config + PCI_BASE_ADDRESS_2, 0x1c000000);
  1124. pci_set_long(d->config + PCI_BASE_ADDRESS_3, 0x1f000000);
  1125. pci_set_long(d->config + PCI_BASE_ADDRESS_4, 0x14000000);
  1126. pci_set_long(d->config + PCI_BASE_ADDRESS_5, 0x14000001);
  1127. pci_set_byte(d->config + 0x3d, 0x01);
  1128. }
  1129. static void gt64120_pci_class_init(ObjectClass *klass, void *data)
  1130. {
  1131. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  1132. DeviceClass *dc = DEVICE_CLASS(klass);
  1133. k->realize = gt64120_pci_realize;
  1134. k->vendor_id = PCI_VENDOR_ID_MARVELL;
  1135. k->device_id = PCI_DEVICE_ID_MARVELL_GT6412X;
  1136. k->revision = 0x10;
  1137. k->class_id = PCI_CLASS_BRIDGE_HOST;
  1138. /*
  1139. * PCI-facing part of the host bridge, not usable without the
  1140. * host-facing part, which can't be device_add'ed, yet.
  1141. */
  1142. dc->user_creatable = false;
  1143. }
  1144. static const TypeInfo gt64120_pci_info = {
  1145. .name = "gt64120_pci",
  1146. .parent = TYPE_PCI_DEVICE,
  1147. .instance_size = sizeof(PCIDevice),
  1148. .class_init = gt64120_pci_class_init,
  1149. .interfaces = (InterfaceInfo[]) {
  1150. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  1151. { },
  1152. },
  1153. };
  1154. static void gt64120_class_init(ObjectClass *klass, void *data)
  1155. {
  1156. DeviceClass *dc = DEVICE_CLASS(klass);
  1157. set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
  1158. dc->reset = gt64120_reset;
  1159. dc->vmsd = &vmstate_gt64120;
  1160. }
  1161. static const TypeInfo gt64120_info = {
  1162. .name = TYPE_GT64120_PCI_HOST_BRIDGE,
  1163. .parent = TYPE_PCI_HOST_BRIDGE,
  1164. .instance_size = sizeof(GT64120State),
  1165. .class_init = gt64120_class_init,
  1166. };
  1167. static void gt64120_pci_register_types(void)
  1168. {
  1169. type_register_static(&gt64120_info);
  1170. type_register_static(&gt64120_pci_info);
  1171. }
  1172. type_init(gt64120_pci_register_types)