gt64120.c 40 KB

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