gt64120.c 41 KB

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