2
0

gt64120.c 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  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_update_pci_cfgdata_mapping(GT64120State *s)
  289. {
  290. /* Indexed on MByteSwap bit, see Table 158: PCI_0 Command, Offset: 0xc00 */
  291. static const MemoryRegionOps *pci_host_data_ops[] = {
  292. &pci_host_data_be_ops, &pci_host_data_le_ops
  293. };
  294. PCIHostState *phb = PCI_HOST_BRIDGE(s);
  295. memory_region_transaction_begin();
  296. /*
  297. * The setting of the MByteSwap bit and MWordSwap bit in the PCI Internal
  298. * Command Register determines how data transactions from the CPU to/from
  299. * PCI are handled along with the setting of the Endianness bit in the CPU
  300. * Configuration Register. See:
  301. * - Table 16: 32-bit PCI Transaction Endianness
  302. * - Table 158: PCI_0 Command, Offset: 0xc00
  303. */
  304. if (memory_region_is_mapped(&phb->data_mem)) {
  305. memory_region_del_subregion(&s->ISD_mem, &phb->data_mem);
  306. object_unparent(OBJECT(&phb->data_mem));
  307. }
  308. memory_region_init_io(&phb->data_mem, OBJECT(phb),
  309. pci_host_data_ops[s->regs[GT_PCI0_CMD] & 1],
  310. s, "pci-conf-data", 4);
  311. memory_region_add_subregion_overlap(&s->ISD_mem, GT_PCI0_CFGDATA << 2,
  312. &phb->data_mem, 1);
  313. memory_region_transaction_commit();
  314. }
  315. static void gt64120_pci_mapping(GT64120State *s)
  316. {
  317. memory_region_transaction_begin();
  318. /* Update PCI0IO mapping */
  319. if ((s->regs[GT_PCI0IOLD] & 0x7f) <= s->regs[GT_PCI0IOHD]) {
  320. /* Unmap old IO address */
  321. if (s->PCI0IO_length) {
  322. memory_region_del_subregion(get_system_memory(), &s->PCI0IO_mem);
  323. object_unparent(OBJECT(&s->PCI0IO_mem));
  324. }
  325. /* Map new IO address */
  326. s->PCI0IO_start = s->regs[GT_PCI0IOLD] << 21;
  327. s->PCI0IO_length = ((s->regs[GT_PCI0IOHD] + 1) -
  328. (s->regs[GT_PCI0IOLD] & 0x7f)) << 21;
  329. if (s->PCI0IO_length) {
  330. memory_region_init_alias(&s->PCI0IO_mem, OBJECT(s), "pci0-io",
  331. get_system_io(), 0, s->PCI0IO_length);
  332. memory_region_add_subregion(get_system_memory(), s->PCI0IO_start,
  333. &s->PCI0IO_mem);
  334. }
  335. }
  336. /* Update PCI0M0 mapping */
  337. if ((s->regs[GT_PCI0M0LD] & 0x7f) <= s->regs[GT_PCI0M0HD]) {
  338. /* Unmap old MEM address */
  339. if (s->PCI0M0_length) {
  340. memory_region_del_subregion(get_system_memory(), &s->PCI0M0_mem);
  341. object_unparent(OBJECT(&s->PCI0M0_mem));
  342. }
  343. /* Map new mem address */
  344. s->PCI0M0_start = s->regs[GT_PCI0M0LD] << 21;
  345. s->PCI0M0_length = ((s->regs[GT_PCI0M0HD] + 1) -
  346. (s->regs[GT_PCI0M0LD] & 0x7f)) << 21;
  347. if (s->PCI0M0_length) {
  348. memory_region_init_alias(&s->PCI0M0_mem, OBJECT(s), "pci0-mem0",
  349. &s->pci0_mem, s->PCI0M0_start,
  350. s->PCI0M0_length);
  351. memory_region_add_subregion(get_system_memory(), s->PCI0M0_start,
  352. &s->PCI0M0_mem);
  353. }
  354. }
  355. /* Update PCI0M1 mapping */
  356. if ((s->regs[GT_PCI0M1LD] & 0x7f) <= s->regs[GT_PCI0M1HD]) {
  357. /* Unmap old MEM address */
  358. if (s->PCI0M1_length) {
  359. memory_region_del_subregion(get_system_memory(), &s->PCI0M1_mem);
  360. object_unparent(OBJECT(&s->PCI0M1_mem));
  361. }
  362. /* Map new mem address */
  363. s->PCI0M1_start = s->regs[GT_PCI0M1LD] << 21;
  364. s->PCI0M1_length = ((s->regs[GT_PCI0M1HD] + 1) -
  365. (s->regs[GT_PCI0M1LD] & 0x7f)) << 21;
  366. if (s->PCI0M1_length) {
  367. memory_region_init_alias(&s->PCI0M1_mem, OBJECT(s), "pci0-mem1",
  368. &s->pci0_mem, s->PCI0M1_start,
  369. s->PCI0M1_length);
  370. memory_region_add_subregion(get_system_memory(), s->PCI0M1_start,
  371. &s->PCI0M1_mem);
  372. }
  373. }
  374. memory_region_transaction_commit();
  375. }
  376. static int gt64120_post_load(void *opaque, int version_id)
  377. {
  378. GT64120State *s = opaque;
  379. gt64120_isd_mapping(s);
  380. gt64120_pci_mapping(s);
  381. return 0;
  382. }
  383. static const VMStateDescription vmstate_gt64120 = {
  384. .name = "gt64120",
  385. .version_id = 1,
  386. .minimum_version_id = 1,
  387. .post_load = gt64120_post_load,
  388. .fields = (const VMStateField[]) {
  389. VMSTATE_UINT32_ARRAY(regs, GT64120State, GT_REGS),
  390. VMSTATE_END_OF_LIST()
  391. }
  392. };
  393. static void gt64120_writel(void *opaque, hwaddr addr,
  394. uint64_t val, unsigned size)
  395. {
  396. GT64120State *s = opaque;
  397. uint32_t saddr = addr >> 2;
  398. trace_gt64120_write(addr, val);
  399. if (!(s->regs[GT_CPU] & 0x00001000)) {
  400. val = bswap32(val);
  401. }
  402. switch (saddr) {
  403. /* CPU Configuration */
  404. case GT_CPU:
  405. s->regs[GT_CPU] = val;
  406. break;
  407. case GT_MULTI:
  408. /* Read-only register as only one GT64xxx is present on the CPU bus */
  409. break;
  410. /* CPU Address Decode */
  411. case GT_PCI0IOLD:
  412. s->regs[GT_PCI0IOLD] = val & 0x00007fff;
  413. s->regs[GT_PCI0IOREMAP] = val & 0x000007ff;
  414. gt64120_pci_mapping(s);
  415. break;
  416. case GT_PCI0M0LD:
  417. s->regs[GT_PCI0M0LD] = val & 0x00007fff;
  418. s->regs[GT_PCI0M0REMAP] = val & 0x000007ff;
  419. gt64120_pci_mapping(s);
  420. break;
  421. case GT_PCI0M1LD:
  422. s->regs[GT_PCI0M1LD] = val & 0x00007fff;
  423. s->regs[GT_PCI0M1REMAP] = val & 0x000007ff;
  424. gt64120_pci_mapping(s);
  425. break;
  426. case GT_PCI1IOLD:
  427. s->regs[GT_PCI1IOLD] = val & 0x00007fff;
  428. s->regs[GT_PCI1IOREMAP] = val & 0x000007ff;
  429. break;
  430. case GT_PCI1M0LD:
  431. s->regs[GT_PCI1M0LD] = val & 0x00007fff;
  432. s->regs[GT_PCI1M0REMAP] = val & 0x000007ff;
  433. break;
  434. case GT_PCI1M1LD:
  435. s->regs[GT_PCI1M1LD] = val & 0x00007fff;
  436. s->regs[GT_PCI1M1REMAP] = val & 0x000007ff;
  437. break;
  438. case GT_PCI0M0HD:
  439. case GT_PCI0M1HD:
  440. case GT_PCI0IOHD:
  441. s->regs[saddr] = val & 0x0000007f;
  442. gt64120_pci_mapping(s);
  443. break;
  444. case GT_PCI1IOHD:
  445. case GT_PCI1M0HD:
  446. case GT_PCI1M1HD:
  447. s->regs[saddr] = val & 0x0000007f;
  448. break;
  449. case GT_ISD:
  450. s->regs[saddr] = val & 0x00007fff;
  451. gt64120_isd_mapping(s);
  452. break;
  453. case GT_PCI0IOREMAP:
  454. case GT_PCI0M0REMAP:
  455. case GT_PCI0M1REMAP:
  456. case GT_PCI1IOREMAP:
  457. case GT_PCI1M0REMAP:
  458. case GT_PCI1M1REMAP:
  459. s->regs[saddr] = val & 0x000007ff;
  460. break;
  461. /* CPU Error Report */
  462. case GT_CPUERR_ADDRLO:
  463. case GT_CPUERR_ADDRHI:
  464. case GT_CPUERR_DATALO:
  465. case GT_CPUERR_DATAHI:
  466. case GT_CPUERR_PARITY:
  467. /* Read-only registers, do nothing */
  468. qemu_log_mask(LOG_GUEST_ERROR,
  469. "gt64120: Read-only register write "
  470. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  471. saddr << 2, size, size << 1, val);
  472. break;
  473. /* CPU Sync Barrier */
  474. case GT_PCI0SYNC:
  475. case GT_PCI1SYNC:
  476. /* Read-only registers, do nothing */
  477. qemu_log_mask(LOG_GUEST_ERROR,
  478. "gt64120: Read-only register write "
  479. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  480. saddr << 2, size, size << 1, val);
  481. break;
  482. /* SDRAM and Device Address Decode */
  483. case GT_SCS0LD:
  484. case GT_SCS0HD:
  485. case GT_SCS1LD:
  486. case GT_SCS1HD:
  487. case GT_SCS2LD:
  488. case GT_SCS2HD:
  489. case GT_SCS3LD:
  490. case GT_SCS3HD:
  491. case GT_CS0LD:
  492. case GT_CS0HD:
  493. case GT_CS1LD:
  494. case GT_CS1HD:
  495. case GT_CS2LD:
  496. case GT_CS2HD:
  497. case GT_CS3LD:
  498. case GT_CS3HD:
  499. case GT_BOOTLD:
  500. case GT_BOOTHD:
  501. case GT_ADERR:
  502. /* SDRAM Configuration */
  503. case GT_SDRAM_CFG:
  504. case GT_SDRAM_OPMODE:
  505. case GT_SDRAM_BM:
  506. case GT_SDRAM_ADDRDECODE:
  507. /* Accept and ignore SDRAM interleave configuration */
  508. s->regs[saddr] = val;
  509. break;
  510. /* Device Parameters */
  511. case GT_DEV_B0:
  512. case GT_DEV_B1:
  513. case GT_DEV_B2:
  514. case GT_DEV_B3:
  515. case GT_DEV_BOOT:
  516. /* Not implemented */
  517. qemu_log_mask(LOG_UNIMP,
  518. "gt64120: Unimplemented device register write "
  519. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  520. saddr << 2, size, size << 1, val);
  521. break;
  522. /* ECC */
  523. case GT_ECC_ERRDATALO:
  524. case GT_ECC_ERRDATAHI:
  525. case GT_ECC_MEM:
  526. case GT_ECC_CALC:
  527. case GT_ECC_ERRADDR:
  528. /* Read-only registers, do nothing */
  529. qemu_log_mask(LOG_GUEST_ERROR,
  530. "gt64120: Read-only register write "
  531. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  532. saddr << 2, size, size << 1, val);
  533. break;
  534. /* DMA Record */
  535. case GT_DMA0_CNT:
  536. case GT_DMA1_CNT:
  537. case GT_DMA2_CNT:
  538. case GT_DMA3_CNT:
  539. case GT_DMA0_SA:
  540. case GT_DMA1_SA:
  541. case GT_DMA2_SA:
  542. case GT_DMA3_SA:
  543. case GT_DMA0_DA:
  544. case GT_DMA1_DA:
  545. case GT_DMA2_DA:
  546. case GT_DMA3_DA:
  547. case GT_DMA0_NEXT:
  548. case GT_DMA1_NEXT:
  549. case GT_DMA2_NEXT:
  550. case GT_DMA3_NEXT:
  551. case GT_DMA0_CUR:
  552. case GT_DMA1_CUR:
  553. case GT_DMA2_CUR:
  554. case GT_DMA3_CUR:
  555. /* DMA Channel Control */
  556. case GT_DMA0_CTRL:
  557. case GT_DMA1_CTRL:
  558. case GT_DMA2_CTRL:
  559. case GT_DMA3_CTRL:
  560. /* DMA Arbiter */
  561. case GT_DMA_ARB:
  562. /* Not implemented */
  563. qemu_log_mask(LOG_UNIMP,
  564. "gt64120: Unimplemented DMA register write "
  565. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  566. saddr << 2, size, size << 1, val);
  567. break;
  568. /* Timer/Counter */
  569. case GT_TC0:
  570. case GT_TC1:
  571. case GT_TC2:
  572. case GT_TC3:
  573. case GT_TC_CONTROL:
  574. /* Not implemented */
  575. qemu_log_mask(LOG_UNIMP,
  576. "gt64120: Unimplemented timer register write "
  577. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  578. saddr << 2, size, size << 1, val);
  579. break;
  580. /* PCI Internal */
  581. case GT_PCI0_CMD:
  582. case GT_PCI1_CMD:
  583. s->regs[saddr] = val & 0x0401fc0f;
  584. gt64120_update_pci_cfgdata_mapping(s);
  585. break;
  586. case GT_PCI0_TOR:
  587. case GT_PCI0_BS_SCS10:
  588. case GT_PCI0_BS_SCS32:
  589. case GT_PCI0_BS_CS20:
  590. case GT_PCI0_BS_CS3BT:
  591. case GT_PCI1_IACK:
  592. case GT_PCI0_IACK:
  593. case GT_PCI0_BARE:
  594. case GT_PCI0_PREFMBR:
  595. case GT_PCI0_SCS10_BAR:
  596. case GT_PCI0_SCS32_BAR:
  597. case GT_PCI0_CS20_BAR:
  598. case GT_PCI0_CS3BT_BAR:
  599. case GT_PCI0_SSCS10_BAR:
  600. case GT_PCI0_SSCS32_BAR:
  601. case GT_PCI0_SCS3BT_BAR:
  602. case GT_PCI1_TOR:
  603. case GT_PCI1_BS_SCS10:
  604. case GT_PCI1_BS_SCS32:
  605. case GT_PCI1_BS_CS20:
  606. case GT_PCI1_BS_CS3BT:
  607. case GT_PCI1_BARE:
  608. case GT_PCI1_PREFMBR:
  609. case GT_PCI1_SCS10_BAR:
  610. case GT_PCI1_SCS32_BAR:
  611. case GT_PCI1_CS20_BAR:
  612. case GT_PCI1_CS3BT_BAR:
  613. case GT_PCI1_SSCS10_BAR:
  614. case GT_PCI1_SSCS32_BAR:
  615. case GT_PCI1_SCS3BT_BAR:
  616. case GT_PCI1_CFGADDR:
  617. case GT_PCI1_CFGDATA:
  618. /* not implemented */
  619. qemu_log_mask(LOG_UNIMP,
  620. "gt64120: Unimplemented PCI register write "
  621. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  622. saddr << 2, size, size << 1, val);
  623. break;
  624. case GT_PCI0_CFGADDR:
  625. case GT_PCI0_CFGDATA:
  626. /* Mapped via in gt64120_pci_mapping() */
  627. g_assert_not_reached();
  628. /* Interrupts */
  629. case GT_INTRCAUSE:
  630. /* not really implemented */
  631. s->regs[saddr] = ~(~(s->regs[saddr]) | ~(val & 0xfffffffe));
  632. s->regs[saddr] |= !!(s->regs[saddr] & 0xfffffffe);
  633. trace_gt64120_write_intreg("INTRCAUSE", size, val);
  634. break;
  635. case GT_INTRMASK:
  636. s->regs[saddr] = val & 0x3c3ffffe;
  637. trace_gt64120_write_intreg("INTRMASK", size, val);
  638. break;
  639. case GT_PCI0_ICMASK:
  640. s->regs[saddr] = val & 0x03fffffe;
  641. trace_gt64120_write_intreg("ICMASK", size, val);
  642. break;
  643. case GT_PCI0_SERR0MASK:
  644. s->regs[saddr] = val & 0x0000003f;
  645. trace_gt64120_write_intreg("SERR0MASK", size, val);
  646. break;
  647. /* Reserved when only PCI_0 is configured. */
  648. case GT_HINTRCAUSE:
  649. case GT_CPU_INTSEL:
  650. case GT_PCI0_INTSEL:
  651. case GT_HINTRMASK:
  652. case GT_PCI0_HICMASK:
  653. case GT_PCI1_SERR1MASK:
  654. /* not implemented */
  655. break;
  656. /* SDRAM Parameters */
  657. case GT_SDRAM_B0:
  658. case GT_SDRAM_B1:
  659. case GT_SDRAM_B2:
  660. case GT_SDRAM_B3:
  661. /*
  662. * We don't simulate electrical parameters of the SDRAM.
  663. * Accept, but ignore the values.
  664. */
  665. s->regs[saddr] = val;
  666. break;
  667. default:
  668. qemu_log_mask(LOG_GUEST_ERROR,
  669. "gt64120: Illegal register write "
  670. "reg:0x%03x size:%u value:0x%0*" PRIx64 "\n",
  671. saddr << 2, size, size << 1, val);
  672. break;
  673. }
  674. }
  675. static uint64_t gt64120_readl(void *opaque,
  676. hwaddr addr, unsigned size)
  677. {
  678. GT64120State *s = opaque;
  679. uint32_t val;
  680. uint32_t saddr = addr >> 2;
  681. switch (saddr) {
  682. /* CPU Configuration */
  683. case GT_MULTI:
  684. /*
  685. * Only one GT64xxx is present on the CPU bus, return
  686. * the initial value.
  687. */
  688. val = s->regs[saddr];
  689. break;
  690. /* CPU Error Report */
  691. case GT_CPUERR_ADDRLO:
  692. case GT_CPUERR_ADDRHI:
  693. case GT_CPUERR_DATALO:
  694. case GT_CPUERR_DATAHI:
  695. case GT_CPUERR_PARITY:
  696. /* Emulated memory has no error, always return the initial values. */
  697. val = s->regs[saddr];
  698. break;
  699. /* CPU Sync Barrier */
  700. case GT_PCI0SYNC:
  701. case GT_PCI1SYNC:
  702. /*
  703. * Reading those register should empty all FIFO on the PCI
  704. * bus, which are not emulated. The return value should be
  705. * a random value that should be ignored.
  706. */
  707. val = 0xc000ffee;
  708. break;
  709. /* ECC */
  710. case GT_ECC_ERRDATALO:
  711. case GT_ECC_ERRDATAHI:
  712. case GT_ECC_MEM:
  713. case GT_ECC_CALC:
  714. case GT_ECC_ERRADDR:
  715. /* Emulated memory has no error, always return the initial values. */
  716. val = s->regs[saddr];
  717. break;
  718. case GT_CPU:
  719. case GT_SCS10LD:
  720. case GT_SCS10HD:
  721. case GT_SCS32LD:
  722. case GT_SCS32HD:
  723. case GT_CS20LD:
  724. case GT_CS20HD:
  725. case GT_CS3BOOTLD:
  726. case GT_CS3BOOTHD:
  727. case GT_SCS10AR:
  728. case GT_SCS32AR:
  729. case GT_CS20R:
  730. case GT_CS3BOOTR:
  731. case GT_PCI0IOLD:
  732. case GT_PCI0M0LD:
  733. case GT_PCI0M1LD:
  734. case GT_PCI1IOLD:
  735. case GT_PCI1M0LD:
  736. case GT_PCI1M1LD:
  737. case GT_PCI0IOHD:
  738. case GT_PCI0M0HD:
  739. case GT_PCI0M1HD:
  740. case GT_PCI1IOHD:
  741. case GT_PCI1M0HD:
  742. case GT_PCI1M1HD:
  743. case GT_PCI0IOREMAP:
  744. case GT_PCI0M0REMAP:
  745. case GT_PCI0M1REMAP:
  746. case GT_PCI1IOREMAP:
  747. case GT_PCI1M0REMAP:
  748. case GT_PCI1M1REMAP:
  749. case GT_ISD:
  750. val = s->regs[saddr];
  751. break;
  752. case GT_PCI0_IACK:
  753. /* Read the IRQ number */
  754. val = pic_read_irq(isa_pic);
  755. break;
  756. /* SDRAM and Device Address Decode */
  757. case GT_SCS0LD:
  758. case GT_SCS0HD:
  759. case GT_SCS1LD:
  760. case GT_SCS1HD:
  761. case GT_SCS2LD:
  762. case GT_SCS2HD:
  763. case GT_SCS3LD:
  764. case GT_SCS3HD:
  765. case GT_CS0LD:
  766. case GT_CS0HD:
  767. case GT_CS1LD:
  768. case GT_CS1HD:
  769. case GT_CS2LD:
  770. case GT_CS2HD:
  771. case GT_CS3LD:
  772. case GT_CS3HD:
  773. case GT_BOOTLD:
  774. case GT_BOOTHD:
  775. case GT_ADERR:
  776. val = s->regs[saddr];
  777. break;
  778. /* SDRAM Configuration */
  779. case GT_SDRAM_CFG:
  780. case GT_SDRAM_OPMODE:
  781. case GT_SDRAM_BM:
  782. case GT_SDRAM_ADDRDECODE:
  783. val = s->regs[saddr];
  784. break;
  785. /* SDRAM Parameters */
  786. case GT_SDRAM_B0:
  787. case GT_SDRAM_B1:
  788. case GT_SDRAM_B2:
  789. case GT_SDRAM_B3:
  790. /*
  791. * We don't simulate electrical parameters of the SDRAM.
  792. * Just return the last written value.
  793. */
  794. val = s->regs[saddr];
  795. break;
  796. /* Device Parameters */
  797. case GT_DEV_B0:
  798. case GT_DEV_B1:
  799. case GT_DEV_B2:
  800. case GT_DEV_B3:
  801. case GT_DEV_BOOT:
  802. val = s->regs[saddr];
  803. break;
  804. /* DMA Record */
  805. case GT_DMA0_CNT:
  806. case GT_DMA1_CNT:
  807. case GT_DMA2_CNT:
  808. case GT_DMA3_CNT:
  809. case GT_DMA0_SA:
  810. case GT_DMA1_SA:
  811. case GT_DMA2_SA:
  812. case GT_DMA3_SA:
  813. case GT_DMA0_DA:
  814. case GT_DMA1_DA:
  815. case GT_DMA2_DA:
  816. case GT_DMA3_DA:
  817. case GT_DMA0_NEXT:
  818. case GT_DMA1_NEXT:
  819. case GT_DMA2_NEXT:
  820. case GT_DMA3_NEXT:
  821. case GT_DMA0_CUR:
  822. case GT_DMA1_CUR:
  823. case GT_DMA2_CUR:
  824. case GT_DMA3_CUR:
  825. val = s->regs[saddr];
  826. break;
  827. /* DMA Channel Control */
  828. case GT_DMA0_CTRL:
  829. case GT_DMA1_CTRL:
  830. case GT_DMA2_CTRL:
  831. case GT_DMA3_CTRL:
  832. val = s->regs[saddr];
  833. break;
  834. /* DMA Arbiter */
  835. case GT_DMA_ARB:
  836. val = s->regs[saddr];
  837. break;
  838. /* Timer/Counter */
  839. case GT_TC0:
  840. case GT_TC1:
  841. case GT_TC2:
  842. case GT_TC3:
  843. case GT_TC_CONTROL:
  844. val = s->regs[saddr];
  845. break;
  846. /* PCI Internal */
  847. case GT_PCI0_CFGADDR:
  848. case GT_PCI0_CFGDATA:
  849. /* Mapped via in gt64120_pci_mapping() */
  850. g_assert_not_reached();
  851. case GT_PCI0_CMD:
  852. case GT_PCI0_TOR:
  853. case GT_PCI0_BS_SCS10:
  854. case GT_PCI0_BS_SCS32:
  855. case GT_PCI0_BS_CS20:
  856. case GT_PCI0_BS_CS3BT:
  857. case GT_PCI1_IACK:
  858. case GT_PCI0_BARE:
  859. case GT_PCI0_PREFMBR:
  860. case GT_PCI0_SCS10_BAR:
  861. case GT_PCI0_SCS32_BAR:
  862. case GT_PCI0_CS20_BAR:
  863. case GT_PCI0_CS3BT_BAR:
  864. case GT_PCI0_SSCS10_BAR:
  865. case GT_PCI0_SSCS32_BAR:
  866. case GT_PCI0_SCS3BT_BAR:
  867. case GT_PCI1_CMD:
  868. case GT_PCI1_TOR:
  869. case GT_PCI1_BS_SCS10:
  870. case GT_PCI1_BS_SCS32:
  871. case GT_PCI1_BS_CS20:
  872. case GT_PCI1_BS_CS3BT:
  873. case GT_PCI1_BARE:
  874. case GT_PCI1_PREFMBR:
  875. case GT_PCI1_SCS10_BAR:
  876. case GT_PCI1_SCS32_BAR:
  877. case GT_PCI1_CS20_BAR:
  878. case GT_PCI1_CS3BT_BAR:
  879. case GT_PCI1_SSCS10_BAR:
  880. case GT_PCI1_SSCS32_BAR:
  881. case GT_PCI1_SCS3BT_BAR:
  882. case GT_PCI1_CFGADDR:
  883. case GT_PCI1_CFGDATA:
  884. val = s->regs[saddr];
  885. break;
  886. /* Interrupts */
  887. case GT_INTRCAUSE:
  888. val = s->regs[saddr];
  889. trace_gt64120_read_intreg("INTRCAUSE", size, val);
  890. break;
  891. case GT_INTRMASK:
  892. val = s->regs[saddr];
  893. trace_gt64120_read_intreg("INTRMASK", size, val);
  894. break;
  895. case GT_PCI0_ICMASK:
  896. val = s->regs[saddr];
  897. trace_gt64120_read_intreg("ICMASK", size, val);
  898. break;
  899. case GT_PCI0_SERR0MASK:
  900. val = s->regs[saddr];
  901. trace_gt64120_read_intreg("SERR0MASK", size, val);
  902. break;
  903. /* Reserved when only PCI_0 is configured. */
  904. case GT_HINTRCAUSE:
  905. case GT_CPU_INTSEL:
  906. case GT_PCI0_INTSEL:
  907. case GT_HINTRMASK:
  908. case GT_PCI0_HICMASK:
  909. case GT_PCI1_SERR1MASK:
  910. val = s->regs[saddr];
  911. break;
  912. default:
  913. val = s->regs[saddr];
  914. qemu_log_mask(LOG_GUEST_ERROR,
  915. "gt64120: Illegal register read "
  916. "reg:0x%03x size:%u value:0x%0*x\n",
  917. saddr << 2, size, size << 1, val);
  918. break;
  919. }
  920. if (!(s->regs[GT_CPU] & 0x00001000)) {
  921. val = bswap32(val);
  922. }
  923. trace_gt64120_read(addr, val);
  924. return val;
  925. }
  926. static const MemoryRegionOps isd_mem_ops = {
  927. .read = gt64120_readl,
  928. .write = gt64120_writel,
  929. .endianness = DEVICE_NATIVE_ENDIAN,
  930. .impl = {
  931. .min_access_size = 4,
  932. .max_access_size = 4,
  933. },
  934. };
  935. static void gt64120_reset(DeviceState *dev)
  936. {
  937. GT64120State *s = GT64120_PCI_HOST_BRIDGE(dev);
  938. /* FIXME: Malta specific hw assumptions ahead */
  939. /* CPU Configuration */
  940. s->regs[GT_CPU] = s->cpu_little_endian ? R_GT_CPU_Endianness_MASK : 0;
  941. s->regs[GT_MULTI] = 0x00000003;
  942. /* CPU Address decode */
  943. s->regs[GT_SCS10LD] = 0x00000000;
  944. s->regs[GT_SCS10HD] = 0x00000007;
  945. s->regs[GT_SCS32LD] = 0x00000008;
  946. s->regs[GT_SCS32HD] = 0x0000000f;
  947. s->regs[GT_CS20LD] = 0x000000e0;
  948. s->regs[GT_CS20HD] = 0x00000070;
  949. s->regs[GT_CS3BOOTLD] = 0x000000f8;
  950. s->regs[GT_CS3BOOTHD] = 0x0000007f;
  951. s->regs[GT_PCI0IOLD] = 0x00000080;
  952. s->regs[GT_PCI0IOHD] = 0x0000000f;
  953. s->regs[GT_PCI0M0LD] = 0x00000090;
  954. s->regs[GT_PCI0M0HD] = 0x0000001f;
  955. s->regs[GT_ISD] = 0x000000a0;
  956. s->regs[GT_PCI0M1LD] = 0x00000790;
  957. s->regs[GT_PCI0M1HD] = 0x0000001f;
  958. s->regs[GT_PCI1IOLD] = 0x00000100;
  959. s->regs[GT_PCI1IOHD] = 0x0000000f;
  960. s->regs[GT_PCI1M0LD] = 0x00000110;
  961. s->regs[GT_PCI1M0HD] = 0x0000001f;
  962. s->regs[GT_PCI1M1LD] = 0x00000120;
  963. s->regs[GT_PCI1M1HD] = 0x0000002f;
  964. s->regs[GT_SCS10AR] = 0x00000000;
  965. s->regs[GT_SCS32AR] = 0x00000008;
  966. s->regs[GT_CS20R] = 0x000000e0;
  967. s->regs[GT_CS3BOOTR] = 0x000000f8;
  968. s->regs[GT_PCI0IOREMAP] = 0x00000080;
  969. s->regs[GT_PCI0M0REMAP] = 0x00000090;
  970. s->regs[GT_PCI0M1REMAP] = 0x00000790;
  971. s->regs[GT_PCI1IOREMAP] = 0x00000100;
  972. s->regs[GT_PCI1M0REMAP] = 0x00000110;
  973. s->regs[GT_PCI1M1REMAP] = 0x00000120;
  974. /* CPU Error Report */
  975. s->regs[GT_CPUERR_ADDRLO] = 0x00000000;
  976. s->regs[GT_CPUERR_ADDRHI] = 0x00000000;
  977. s->regs[GT_CPUERR_DATALO] = 0xffffffff;
  978. s->regs[GT_CPUERR_DATAHI] = 0xffffffff;
  979. s->regs[GT_CPUERR_PARITY] = 0x000000ff;
  980. /* CPU Sync Barrier */
  981. s->regs[GT_PCI0SYNC] = 0x00000000;
  982. s->regs[GT_PCI1SYNC] = 0x00000000;
  983. /* SDRAM and Device Address Decode */
  984. s->regs[GT_SCS0LD] = 0x00000000;
  985. s->regs[GT_SCS0HD] = 0x00000007;
  986. s->regs[GT_SCS1LD] = 0x00000008;
  987. s->regs[GT_SCS1HD] = 0x0000000f;
  988. s->regs[GT_SCS2LD] = 0x00000010;
  989. s->regs[GT_SCS2HD] = 0x00000017;
  990. s->regs[GT_SCS3LD] = 0x00000018;
  991. s->regs[GT_SCS3HD] = 0x0000001f;
  992. s->regs[GT_CS0LD] = 0x000000c0;
  993. s->regs[GT_CS0HD] = 0x000000c7;
  994. s->regs[GT_CS1LD] = 0x000000c8;
  995. s->regs[GT_CS1HD] = 0x000000cf;
  996. s->regs[GT_CS2LD] = 0x000000d0;
  997. s->regs[GT_CS2HD] = 0x000000df;
  998. s->regs[GT_CS3LD] = 0x000000f0;
  999. s->regs[GT_CS3HD] = 0x000000fb;
  1000. s->regs[GT_BOOTLD] = 0x000000fc;
  1001. s->regs[GT_BOOTHD] = 0x000000ff;
  1002. s->regs[GT_ADERR] = 0xffffffff;
  1003. /* SDRAM Configuration */
  1004. s->regs[GT_SDRAM_CFG] = 0x00000200;
  1005. s->regs[GT_SDRAM_OPMODE] = 0x00000000;
  1006. s->regs[GT_SDRAM_BM] = 0x00000007;
  1007. s->regs[GT_SDRAM_ADDRDECODE] = 0x00000002;
  1008. /* SDRAM Parameters */
  1009. s->regs[GT_SDRAM_B0] = 0x00000005;
  1010. s->regs[GT_SDRAM_B1] = 0x00000005;
  1011. s->regs[GT_SDRAM_B2] = 0x00000005;
  1012. s->regs[GT_SDRAM_B3] = 0x00000005;
  1013. /* ECC */
  1014. s->regs[GT_ECC_ERRDATALO] = 0x00000000;
  1015. s->regs[GT_ECC_ERRDATAHI] = 0x00000000;
  1016. s->regs[GT_ECC_MEM] = 0x00000000;
  1017. s->regs[GT_ECC_CALC] = 0x00000000;
  1018. s->regs[GT_ECC_ERRADDR] = 0x00000000;
  1019. /* Device Parameters */
  1020. s->regs[GT_DEV_B0] = 0x386fffff;
  1021. s->regs[GT_DEV_B1] = 0x386fffff;
  1022. s->regs[GT_DEV_B2] = 0x386fffff;
  1023. s->regs[GT_DEV_B3] = 0x386fffff;
  1024. s->regs[GT_DEV_BOOT] = 0x146fffff;
  1025. /* DMA registers are all zeroed at reset */
  1026. /* Timer/Counter */
  1027. s->regs[GT_TC0] = 0xffffffff;
  1028. s->regs[GT_TC1] = 0x00ffffff;
  1029. s->regs[GT_TC2] = 0x00ffffff;
  1030. s->regs[GT_TC3] = 0x00ffffff;
  1031. s->regs[GT_TC_CONTROL] = 0x00000000;
  1032. /* PCI Internal */
  1033. s->regs[GT_PCI0_CMD] = s->cpu_little_endian ? R_GT_PCI0_CMD_ByteSwap_MASK : 0;
  1034. s->regs[GT_PCI0_TOR] = 0x0000070f;
  1035. s->regs[GT_PCI0_BS_SCS10] = 0x00fff000;
  1036. s->regs[GT_PCI0_BS_SCS32] = 0x00fff000;
  1037. s->regs[GT_PCI0_BS_CS20] = 0x01fff000;
  1038. s->regs[GT_PCI0_BS_CS3BT] = 0x00fff000;
  1039. s->regs[GT_PCI1_IACK] = 0x00000000;
  1040. s->regs[GT_PCI0_IACK] = 0x00000000;
  1041. s->regs[GT_PCI0_BARE] = 0x0000000f;
  1042. s->regs[GT_PCI0_PREFMBR] = 0x00000040;
  1043. s->regs[GT_PCI0_SCS10_BAR] = 0x00000000;
  1044. s->regs[GT_PCI0_SCS32_BAR] = 0x01000000;
  1045. s->regs[GT_PCI0_CS20_BAR] = 0x1c000000;
  1046. s->regs[GT_PCI0_CS3BT_BAR] = 0x1f000000;
  1047. s->regs[GT_PCI0_SSCS10_BAR] = 0x00000000;
  1048. s->regs[GT_PCI0_SSCS32_BAR] = 0x01000000;
  1049. s->regs[GT_PCI0_SCS3BT_BAR] = 0x1f000000;
  1050. s->regs[GT_PCI1_CMD] = s->cpu_little_endian ? R_GT_PCI1_CMD_ByteSwap_MASK : 0;
  1051. s->regs[GT_PCI1_TOR] = 0x0000070f;
  1052. s->regs[GT_PCI1_BS_SCS10] = 0x00fff000;
  1053. s->regs[GT_PCI1_BS_SCS32] = 0x00fff000;
  1054. s->regs[GT_PCI1_BS_CS20] = 0x01fff000;
  1055. s->regs[GT_PCI1_BS_CS3BT] = 0x00fff000;
  1056. s->regs[GT_PCI1_BARE] = 0x0000000f;
  1057. s->regs[GT_PCI1_PREFMBR] = 0x00000040;
  1058. s->regs[GT_PCI1_SCS10_BAR] = 0x00000000;
  1059. s->regs[GT_PCI1_SCS32_BAR] = 0x01000000;
  1060. s->regs[GT_PCI1_CS20_BAR] = 0x1c000000;
  1061. s->regs[GT_PCI1_CS3BT_BAR] = 0x1f000000;
  1062. s->regs[GT_PCI1_SSCS10_BAR] = 0x00000000;
  1063. s->regs[GT_PCI1_SSCS32_BAR] = 0x01000000;
  1064. s->regs[GT_PCI1_SCS3BT_BAR] = 0x1f000000;
  1065. s->regs[GT_PCI1_CFGADDR] = 0x00000000;
  1066. s->regs[GT_PCI1_CFGDATA] = 0x00000000;
  1067. s->regs[GT_PCI0_CFGADDR] = 0x00000000;
  1068. /* Interrupt registers are all zeroed at reset */
  1069. gt64120_isd_mapping(s);
  1070. gt64120_pci_mapping(s);
  1071. gt64120_update_pci_cfgdata_mapping(s);
  1072. }
  1073. static void gt64120_realize(DeviceState *dev, Error **errp)
  1074. {
  1075. GT64120State *s = GT64120_PCI_HOST_BRIDGE(dev);
  1076. PCIHostState *phb = PCI_HOST_BRIDGE(dev);
  1077. memory_region_init_io(&s->ISD_mem, OBJECT(dev), &isd_mem_ops, s,
  1078. "gt64120-isd", 0x1000);
  1079. memory_region_init(&s->pci0_mem, OBJECT(dev), "pci0-mem", 4 * GiB);
  1080. address_space_init(&s->pci0_mem_as, &s->pci0_mem, "pci0-mem");
  1081. phb->bus = pci_root_bus_new(dev, "pci",
  1082. &s->pci0_mem,
  1083. get_system_io(),
  1084. PCI_DEVFN(18, 0), TYPE_PCI_BUS);
  1085. pci_create_simple(phb->bus, PCI_DEVFN(0, 0), "gt64120_pci");
  1086. memory_region_init_io(&phb->conf_mem, OBJECT(phb),
  1087. &pci_host_conf_le_ops,
  1088. s, "pci-conf-idx", 4);
  1089. memory_region_add_subregion_overlap(&s->ISD_mem, GT_PCI0_CFGADDR << 2,
  1090. &phb->conf_mem, 1);
  1091. /*
  1092. * The whole address space decoded by the GT-64120A doesn't generate
  1093. * exception when accessing invalid memory. Create an empty slot to
  1094. * emulate this feature.
  1095. */
  1096. empty_slot_init("GT64120", 0, 0x20000000);
  1097. }
  1098. static void gt64120_pci_realize(PCIDevice *d, Error **errp)
  1099. {
  1100. /* Values from chapter 17.16 "PCI Configuration" */
  1101. pci_set_long(d->wmask + PCI_BASE_ADDRESS_0, 0xfffff008); /* SCS[1:0] */
  1102. pci_set_long(d->wmask + PCI_BASE_ADDRESS_1, 0xfffff008); /* SCS[3:2] */
  1103. pci_set_long(d->wmask + PCI_BASE_ADDRESS_2, 0xfffff008); /* CS[2:0] */
  1104. pci_set_long(d->wmask + PCI_BASE_ADDRESS_3, 0xfffff008); /* CS[3], BootCS */
  1105. pci_set_long(d->wmask + PCI_BASE_ADDRESS_4, 0xfffff000); /* ISD MMIO */
  1106. pci_set_long(d->wmask + PCI_BASE_ADDRESS_5, 0xfffff001); /* ISD I/O */
  1107. }
  1108. static void gt64120_pci_reset_hold(Object *obj, ResetType type)
  1109. {
  1110. PCIDevice *d = PCI_DEVICE(obj);
  1111. /* Values from chapter 17.16 "PCI Configuration" */
  1112. pci_set_word(d->config + PCI_COMMAND, 0);
  1113. pci_set_word(d->config + PCI_STATUS,
  1114. PCI_STATUS_FAST_BACK | PCI_STATUS_DEVSEL_MEDIUM);
  1115. pci_config_set_prog_interface(d->config, 0);
  1116. pci_set_long(d->config + PCI_BASE_ADDRESS_0, 0x00000008);
  1117. pci_set_long(d->config + PCI_BASE_ADDRESS_1, 0x01000008);
  1118. pci_set_long(d->config + PCI_BASE_ADDRESS_2, 0x1c000000);
  1119. pci_set_long(d->config + PCI_BASE_ADDRESS_3, 0x1f000000);
  1120. pci_set_long(d->config + PCI_BASE_ADDRESS_4, 0x14000000);
  1121. pci_set_long(d->config + PCI_BASE_ADDRESS_5, 0x14000001);
  1122. pci_set_byte(d->config + 0x3d, 0x01);
  1123. }
  1124. static void gt64120_pci_class_init(ObjectClass *klass, void *data)
  1125. {
  1126. PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
  1127. DeviceClass *dc = DEVICE_CLASS(klass);
  1128. ResettableClass *rc = RESETTABLE_CLASS(klass);
  1129. rc->phases.hold = gt64120_pci_reset_hold;
  1130. k->realize = gt64120_pci_realize;
  1131. k->vendor_id = PCI_VENDOR_ID_MARVELL;
  1132. k->device_id = PCI_DEVICE_ID_MARVELL_GT6412X;
  1133. k->revision = 0x10;
  1134. k->class_id = PCI_CLASS_BRIDGE_HOST;
  1135. /*
  1136. * PCI-facing part of the host bridge, not usable without the
  1137. * host-facing part, which can't be device_add'ed, yet.
  1138. */
  1139. dc->user_creatable = false;
  1140. }
  1141. static const TypeInfo gt64120_pci_info = {
  1142. .name = "gt64120_pci",
  1143. .parent = TYPE_PCI_DEVICE,
  1144. .instance_size = sizeof(PCIDevice),
  1145. .class_init = gt64120_pci_class_init,
  1146. .interfaces = (InterfaceInfo[]) {
  1147. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  1148. { },
  1149. },
  1150. };
  1151. static const Property gt64120_properties[] = {
  1152. DEFINE_PROP_BOOL("cpu-little-endian", GT64120State,
  1153. cpu_little_endian, false),
  1154. };
  1155. static void gt64120_class_init(ObjectClass *klass, void *data)
  1156. {
  1157. DeviceClass *dc = DEVICE_CLASS(klass);
  1158. set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
  1159. device_class_set_props(dc, gt64120_properties);
  1160. dc->realize = gt64120_realize;
  1161. device_class_set_legacy_reset(dc, gt64120_reset);
  1162. dc->vmsd = &vmstate_gt64120;
  1163. }
  1164. static const TypeInfo gt64120_info = {
  1165. .name = TYPE_GT64120_PCI_HOST_BRIDGE,
  1166. .parent = TYPE_PCI_HOST_BRIDGE,
  1167. .instance_size = sizeof(GT64120State),
  1168. .class_init = gt64120_class_init,
  1169. };
  1170. static void gt64120_pci_register_types(void)
  1171. {
  1172. type_register_static(&gt64120_info);
  1173. type_register_static(&gt64120_pci_info);
  1174. }
  1175. type_init(gt64120_pci_register_types)