integratorcp.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. /*
  2. * ARM Integrator CP System emulation.
  3. *
  4. * Copyright (c) 2005-2007 CodeSourcery.
  5. * Written by Paul Brook
  6. *
  7. * This code is licensed under the GPL
  8. */
  9. #include "qemu/osdep.h"
  10. #include "qapi/error.h"
  11. #include "hw/sysbus.h"
  12. #include "migration/vmstate.h"
  13. #include "hw/boards.h"
  14. #include "hw/arm/boot.h"
  15. #include "hw/misc/arm_integrator_debug.h"
  16. #include "hw/net/smc91c111.h"
  17. #include "net/net.h"
  18. #include "exec/address-spaces.h"
  19. #include "system/runstate.h"
  20. #include "system/system.h"
  21. #include "qemu/log.h"
  22. #include "qemu/error-report.h"
  23. #include "hw/char/pl011.h"
  24. #include "hw/hw.h"
  25. #include "hw/irq.h"
  26. #include "hw/sd/sd.h"
  27. #include "qom/object.h"
  28. #include "audio/audio.h"
  29. #include "target/arm/cpu-qom.h"
  30. #define TYPE_INTEGRATOR_CM "integrator_core"
  31. OBJECT_DECLARE_SIMPLE_TYPE(IntegratorCMState, INTEGRATOR_CM)
  32. struct IntegratorCMState {
  33. /*< private >*/
  34. SysBusDevice parent_obj;
  35. /*< public >*/
  36. MemoryRegion iomem;
  37. uint32_t memsz;
  38. MemoryRegion flash;
  39. uint32_t cm_osc;
  40. uint32_t cm_ctrl;
  41. uint32_t cm_lock;
  42. uint32_t cm_auxosc;
  43. uint32_t cm_sdram;
  44. uint32_t cm_init;
  45. uint32_t cm_flags;
  46. uint32_t cm_nvflags;
  47. uint32_t cm_refcnt_offset;
  48. uint32_t int_level;
  49. uint32_t irq_enabled;
  50. uint32_t fiq_enabled;
  51. };
  52. static uint8_t integrator_spd[128] = {
  53. 128, 8, 4, 11, 9, 1, 64, 0, 2, 0xa0, 0xa0, 0, 0, 8, 0, 1,
  54. 0xe, 4, 0x1c, 1, 2, 0x20, 0xc0, 0, 0, 0, 0, 0x30, 0x28, 0x30, 0x28, 0x40
  55. };
  56. static const VMStateDescription vmstate_integratorcm = {
  57. .name = "integratorcm",
  58. .version_id = 1,
  59. .minimum_version_id = 1,
  60. .fields = (const VMStateField[]) {
  61. VMSTATE_UINT32(cm_osc, IntegratorCMState),
  62. VMSTATE_UINT32(cm_ctrl, IntegratorCMState),
  63. VMSTATE_UINT32(cm_lock, IntegratorCMState),
  64. VMSTATE_UINT32(cm_auxosc, IntegratorCMState),
  65. VMSTATE_UINT32(cm_sdram, IntegratorCMState),
  66. VMSTATE_UINT32(cm_init, IntegratorCMState),
  67. VMSTATE_UINT32(cm_flags, IntegratorCMState),
  68. VMSTATE_UINT32(cm_nvflags, IntegratorCMState),
  69. VMSTATE_UINT32(int_level, IntegratorCMState),
  70. VMSTATE_UINT32(irq_enabled, IntegratorCMState),
  71. VMSTATE_UINT32(fiq_enabled, IntegratorCMState),
  72. VMSTATE_END_OF_LIST()
  73. }
  74. };
  75. static uint64_t integratorcm_read(void *opaque, hwaddr offset,
  76. unsigned size)
  77. {
  78. IntegratorCMState *s = opaque;
  79. if (offset >= 0x100 && offset < 0x200) {
  80. /* CM_SPD */
  81. if (offset >= 0x180)
  82. return 0;
  83. return integrator_spd[offset >> 2];
  84. }
  85. switch (offset >> 2) {
  86. case 0: /* CM_ID */
  87. return 0x411a3001;
  88. case 1: /* CM_PROC */
  89. return 0;
  90. case 2: /* CM_OSC */
  91. return s->cm_osc;
  92. case 3: /* CM_CTRL */
  93. return s->cm_ctrl;
  94. case 4: /* CM_STAT */
  95. return 0x00100000;
  96. case 5: /* CM_LOCK */
  97. if (s->cm_lock == 0xa05f) {
  98. return 0x1a05f;
  99. } else {
  100. return s->cm_lock;
  101. }
  102. case 6: /* CM_LMBUSCNT */
  103. /* ??? High frequency timer. */
  104. hw_error("integratorcm_read: CM_LMBUSCNT");
  105. case 7: /* CM_AUXOSC */
  106. return s->cm_auxosc;
  107. case 8: /* CM_SDRAM */
  108. return s->cm_sdram;
  109. case 9: /* CM_INIT */
  110. return s->cm_init;
  111. case 10: /* CM_REFCNT */
  112. /* This register, CM_REFCNT, provides a 32-bit count value.
  113. * The count increments at the fixed reference clock frequency of 24MHz
  114. * and can be used as a real-time counter.
  115. */
  116. return (uint32_t)muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), 24,
  117. 1000) - s->cm_refcnt_offset;
  118. case 12: /* CM_FLAGS */
  119. return s->cm_flags;
  120. case 14: /* CM_NVFLAGS */
  121. return s->cm_nvflags;
  122. case 16: /* CM_IRQ_STAT */
  123. return s->int_level & s->irq_enabled;
  124. case 17: /* CM_IRQ_RSTAT */
  125. return s->int_level;
  126. case 18: /* CM_IRQ_ENSET */
  127. return s->irq_enabled;
  128. case 20: /* CM_SOFT_INTSET */
  129. return s->int_level & 1;
  130. case 24: /* CM_FIQ_STAT */
  131. return s->int_level & s->fiq_enabled;
  132. case 25: /* CM_FIQ_RSTAT */
  133. return s->int_level;
  134. case 26: /* CM_FIQ_ENSET */
  135. return s->fiq_enabled;
  136. case 32: /* CM_VOLTAGE_CTL0 */
  137. case 33: /* CM_VOLTAGE_CTL1 */
  138. case 34: /* CM_VOLTAGE_CTL2 */
  139. case 35: /* CM_VOLTAGE_CTL3 */
  140. /* ??? Voltage control unimplemented. */
  141. return 0;
  142. default:
  143. qemu_log_mask(LOG_UNIMP,
  144. "%s: Unimplemented offset 0x%" HWADDR_PRIX "\n",
  145. __func__, offset);
  146. return 0;
  147. }
  148. }
  149. static void integratorcm_do_remap(IntegratorCMState *s)
  150. {
  151. /* Sync memory region state with CM_CTRL REMAP bit:
  152. * bit 0 => flash at address 0; bit 1 => RAM
  153. */
  154. memory_region_set_enabled(&s->flash, !(s->cm_ctrl & 4));
  155. }
  156. static void integratorcm_set_ctrl(IntegratorCMState *s, uint32_t value)
  157. {
  158. if (value & 8) {
  159. qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
  160. }
  161. if ((s->cm_ctrl ^ value) & 1) {
  162. /* (value & 1) != 0 means the green "MISC LED" is lit.
  163. * We don't have any nice place to display LEDs. printf is a bad
  164. * idea because Linux uses the LED as a heartbeat and the output
  165. * will swamp anything else on the terminal.
  166. */
  167. }
  168. /* Note that the RESET bit [3] always reads as zero */
  169. s->cm_ctrl = (s->cm_ctrl & ~5) | (value & 5);
  170. integratorcm_do_remap(s);
  171. }
  172. static void integratorcm_update(IntegratorCMState *s)
  173. {
  174. /* ??? The CPU irq/fiq is raised when either the core module or base PIC
  175. are active. */
  176. if (s->int_level & (s->irq_enabled | s->fiq_enabled))
  177. hw_error("Core module interrupt\n");
  178. }
  179. static void integratorcm_write(void *opaque, hwaddr offset,
  180. uint64_t value, unsigned size)
  181. {
  182. IntegratorCMState *s = opaque;
  183. switch (offset >> 2) {
  184. case 2: /* CM_OSC */
  185. if (s->cm_lock == 0xa05f)
  186. s->cm_osc = value;
  187. break;
  188. case 3: /* CM_CTRL */
  189. integratorcm_set_ctrl(s, value);
  190. break;
  191. case 5: /* CM_LOCK */
  192. s->cm_lock = value & 0xffff;
  193. break;
  194. case 7: /* CM_AUXOSC */
  195. if (s->cm_lock == 0xa05f)
  196. s->cm_auxosc = value;
  197. break;
  198. case 8: /* CM_SDRAM */
  199. s->cm_sdram = value;
  200. break;
  201. case 9: /* CM_INIT */
  202. /* ??? This can change the memory bus frequency. */
  203. s->cm_init = value;
  204. break;
  205. case 12: /* CM_FLAGSS */
  206. s->cm_flags |= value;
  207. break;
  208. case 13: /* CM_FLAGSC */
  209. s->cm_flags &= ~value;
  210. break;
  211. case 14: /* CM_NVFLAGSS */
  212. s->cm_nvflags |= value;
  213. break;
  214. case 15: /* CM_NVFLAGSS */
  215. s->cm_nvflags &= ~value;
  216. break;
  217. case 18: /* CM_IRQ_ENSET */
  218. s->irq_enabled |= value;
  219. integratorcm_update(s);
  220. break;
  221. case 19: /* CM_IRQ_ENCLR */
  222. s->irq_enabled &= ~value;
  223. integratorcm_update(s);
  224. break;
  225. case 20: /* CM_SOFT_INTSET */
  226. s->int_level |= (value & 1);
  227. integratorcm_update(s);
  228. break;
  229. case 21: /* CM_SOFT_INTCLR */
  230. s->int_level &= ~(value & 1);
  231. integratorcm_update(s);
  232. break;
  233. case 26: /* CM_FIQ_ENSET */
  234. s->fiq_enabled |= value;
  235. integratorcm_update(s);
  236. break;
  237. case 27: /* CM_FIQ_ENCLR */
  238. s->fiq_enabled &= ~value;
  239. integratorcm_update(s);
  240. break;
  241. case 32: /* CM_VOLTAGE_CTL0 */
  242. case 33: /* CM_VOLTAGE_CTL1 */
  243. case 34: /* CM_VOLTAGE_CTL2 */
  244. case 35: /* CM_VOLTAGE_CTL3 */
  245. /* ??? Voltage control unimplemented. */
  246. break;
  247. default:
  248. qemu_log_mask(LOG_UNIMP,
  249. "%s: Unimplemented offset 0x%" HWADDR_PRIX "\n",
  250. __func__, offset);
  251. break;
  252. }
  253. }
  254. /* Integrator/CM control registers. */
  255. static const MemoryRegionOps integratorcm_ops = {
  256. .read = integratorcm_read,
  257. .write = integratorcm_write,
  258. .endianness = DEVICE_NATIVE_ENDIAN,
  259. };
  260. static void integratorcm_init(Object *obj)
  261. {
  262. IntegratorCMState *s = INTEGRATOR_CM(obj);
  263. s->cm_osc = 0x01000048;
  264. /* ??? What should the high bits of this value be? */
  265. s->cm_auxosc = 0x0007feff;
  266. s->cm_sdram = 0x00011122;
  267. memcpy(integrator_spd + 73, "QEMU-MEMORY", 11);
  268. s->cm_init = 0x00000112;
  269. s->cm_refcnt_offset = muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), 24,
  270. 1000);
  271. /* ??? Save/restore. */
  272. }
  273. static void integratorcm_realize(DeviceState *d, Error **errp)
  274. {
  275. IntegratorCMState *s = INTEGRATOR_CM(d);
  276. SysBusDevice *dev = SYS_BUS_DEVICE(d);
  277. if (!memory_region_init_ram(&s->flash, OBJECT(d), "integrator.flash",
  278. 0x100000, errp)) {
  279. return;
  280. }
  281. memory_region_init_io(&s->iomem, OBJECT(d), &integratorcm_ops, s,
  282. "integratorcm", 0x00800000);
  283. sysbus_init_mmio(dev, &s->iomem);
  284. integratorcm_do_remap(s);
  285. if (s->memsz >= 256) {
  286. integrator_spd[31] = 64;
  287. s->cm_sdram |= 0x10;
  288. } else if (s->memsz >= 128) {
  289. integrator_spd[31] = 32;
  290. s->cm_sdram |= 0x0c;
  291. } else if (s->memsz >= 64) {
  292. integrator_spd[31] = 16;
  293. s->cm_sdram |= 0x08;
  294. } else if (s->memsz >= 32) {
  295. integrator_spd[31] = 4;
  296. s->cm_sdram |= 0x04;
  297. } else {
  298. integrator_spd[31] = 2;
  299. }
  300. }
  301. /* Integrator/CP hardware emulation. */
  302. /* Primary interrupt controller. */
  303. #define TYPE_INTEGRATOR_PIC "integrator_pic"
  304. OBJECT_DECLARE_SIMPLE_TYPE(icp_pic_state, INTEGRATOR_PIC)
  305. struct icp_pic_state {
  306. /*< private >*/
  307. SysBusDevice parent_obj;
  308. /*< public >*/
  309. MemoryRegion iomem;
  310. uint32_t level;
  311. uint32_t irq_enabled;
  312. uint32_t fiq_enabled;
  313. qemu_irq parent_irq;
  314. qemu_irq parent_fiq;
  315. };
  316. static const VMStateDescription vmstate_icp_pic = {
  317. .name = "icp_pic",
  318. .version_id = 1,
  319. .minimum_version_id = 1,
  320. .fields = (const VMStateField[]) {
  321. VMSTATE_UINT32(level, icp_pic_state),
  322. VMSTATE_UINT32(irq_enabled, icp_pic_state),
  323. VMSTATE_UINT32(fiq_enabled, icp_pic_state),
  324. VMSTATE_END_OF_LIST()
  325. }
  326. };
  327. static void icp_pic_update(icp_pic_state *s)
  328. {
  329. uint32_t flags;
  330. flags = (s->level & s->irq_enabled);
  331. qemu_set_irq(s->parent_irq, flags != 0);
  332. flags = (s->level & s->fiq_enabled);
  333. qemu_set_irq(s->parent_fiq, flags != 0);
  334. }
  335. static void icp_pic_set_irq(void *opaque, int irq, int level)
  336. {
  337. icp_pic_state *s = (icp_pic_state *)opaque;
  338. if (level)
  339. s->level |= 1 << irq;
  340. else
  341. s->level &= ~(1 << irq);
  342. icp_pic_update(s);
  343. }
  344. static uint64_t icp_pic_read(void *opaque, hwaddr offset,
  345. unsigned size)
  346. {
  347. icp_pic_state *s = (icp_pic_state *)opaque;
  348. switch (offset >> 2) {
  349. case 0: /* IRQ_STATUS */
  350. return s->level & s->irq_enabled;
  351. case 1: /* IRQ_RAWSTAT */
  352. return s->level;
  353. case 2: /* IRQ_ENABLESET */
  354. return s->irq_enabled;
  355. case 4: /* INT_SOFTSET */
  356. return s->level & 1;
  357. case 8: /* FRQ_STATUS */
  358. return s->level & s->fiq_enabled;
  359. case 9: /* FRQ_RAWSTAT */
  360. return s->level;
  361. case 10: /* FRQ_ENABLESET */
  362. return s->fiq_enabled;
  363. case 3: /* IRQ_ENABLECLR */
  364. case 5: /* INT_SOFTCLR */
  365. case 11: /* FRQ_ENABLECLR */
  366. default:
  367. qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
  368. __func__, offset);
  369. return 0;
  370. }
  371. }
  372. static void icp_pic_write(void *opaque, hwaddr offset,
  373. uint64_t value, unsigned size)
  374. {
  375. icp_pic_state *s = (icp_pic_state *)opaque;
  376. switch (offset >> 2) {
  377. case 2: /* IRQ_ENABLESET */
  378. s->irq_enabled |= value;
  379. break;
  380. case 3: /* IRQ_ENABLECLR */
  381. s->irq_enabled &= ~value;
  382. break;
  383. case 4: /* INT_SOFTSET */
  384. if (value & 1)
  385. icp_pic_set_irq(s, 0, 1);
  386. break;
  387. case 5: /* INT_SOFTCLR */
  388. if (value & 1)
  389. icp_pic_set_irq(s, 0, 0);
  390. break;
  391. case 10: /* FRQ_ENABLESET */
  392. s->fiq_enabled |= value;
  393. break;
  394. case 11: /* FRQ_ENABLECLR */
  395. s->fiq_enabled &= ~value;
  396. break;
  397. case 0: /* IRQ_STATUS */
  398. case 1: /* IRQ_RAWSTAT */
  399. case 8: /* FRQ_STATUS */
  400. case 9: /* FRQ_RAWSTAT */
  401. default:
  402. qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
  403. __func__, offset);
  404. return;
  405. }
  406. icp_pic_update(s);
  407. }
  408. static const MemoryRegionOps icp_pic_ops = {
  409. .read = icp_pic_read,
  410. .write = icp_pic_write,
  411. .endianness = DEVICE_NATIVE_ENDIAN,
  412. };
  413. static void icp_pic_init(Object *obj)
  414. {
  415. DeviceState *dev = DEVICE(obj);
  416. icp_pic_state *s = INTEGRATOR_PIC(obj);
  417. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  418. qdev_init_gpio_in(dev, icp_pic_set_irq, 32);
  419. sysbus_init_irq(sbd, &s->parent_irq);
  420. sysbus_init_irq(sbd, &s->parent_fiq);
  421. memory_region_init_io(&s->iomem, obj, &icp_pic_ops, s,
  422. "icp-pic", 0x00800000);
  423. sysbus_init_mmio(sbd, &s->iomem);
  424. }
  425. /* CP control registers. */
  426. #define TYPE_ICP_CONTROL_REGS "icp-ctrl-regs"
  427. OBJECT_DECLARE_SIMPLE_TYPE(ICPCtrlRegsState, ICP_CONTROL_REGS)
  428. struct ICPCtrlRegsState {
  429. /*< private >*/
  430. SysBusDevice parent_obj;
  431. /*< public >*/
  432. MemoryRegion iomem;
  433. qemu_irq mmc_irq;
  434. uint32_t intreg_state;
  435. };
  436. #define ICP_GPIO_MMC_WPROT "mmc-wprot"
  437. #define ICP_GPIO_MMC_CARDIN "mmc-cardin"
  438. #define ICP_INTREG_WPROT (1 << 0)
  439. #define ICP_INTREG_CARDIN (1 << 3)
  440. static const VMStateDescription vmstate_icp_control = {
  441. .name = "icp_control",
  442. .version_id = 1,
  443. .minimum_version_id = 1,
  444. .fields = (const VMStateField[]) {
  445. VMSTATE_UINT32(intreg_state, ICPCtrlRegsState),
  446. VMSTATE_END_OF_LIST()
  447. }
  448. };
  449. static uint64_t icp_control_read(void *opaque, hwaddr offset,
  450. unsigned size)
  451. {
  452. ICPCtrlRegsState *s = opaque;
  453. switch (offset >> 2) {
  454. case 0: /* CP_IDFIELD */
  455. return 0x41034003;
  456. case 1: /* CP_FLASHPROG */
  457. return 0;
  458. case 2: /* CP_INTREG */
  459. return s->intreg_state;
  460. case 3: /* CP_DECODE */
  461. return 0x11;
  462. default:
  463. qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
  464. __func__, offset);
  465. return 0;
  466. }
  467. }
  468. static void icp_control_write(void *opaque, hwaddr offset,
  469. uint64_t value, unsigned size)
  470. {
  471. ICPCtrlRegsState *s = opaque;
  472. switch (offset >> 2) {
  473. case 2: /* CP_INTREG */
  474. s->intreg_state &= ~(value & ICP_INTREG_CARDIN);
  475. qemu_set_irq(s->mmc_irq, !!(s->intreg_state & ICP_INTREG_CARDIN));
  476. break;
  477. case 1: /* CP_FLASHPROG */
  478. case 3: /* CP_DECODE */
  479. /* Nothing interesting implemented yet. */
  480. break;
  481. default:
  482. qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
  483. __func__, offset);
  484. }
  485. }
  486. static const MemoryRegionOps icp_control_ops = {
  487. .read = icp_control_read,
  488. .write = icp_control_write,
  489. .endianness = DEVICE_NATIVE_ENDIAN,
  490. };
  491. static void icp_control_mmc_wprot(void *opaque, int line, int level)
  492. {
  493. ICPCtrlRegsState *s = opaque;
  494. s->intreg_state &= ~ICP_INTREG_WPROT;
  495. if (level) {
  496. s->intreg_state |= ICP_INTREG_WPROT;
  497. }
  498. }
  499. static void icp_control_mmc_cardin(void *opaque, int line, int level)
  500. {
  501. ICPCtrlRegsState *s = opaque;
  502. /* line is released by writing to CP_INTREG */
  503. if (level) {
  504. s->intreg_state |= ICP_INTREG_CARDIN;
  505. qemu_set_irq(s->mmc_irq, 1);
  506. }
  507. }
  508. static void icp_control_init(Object *obj)
  509. {
  510. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  511. ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj);
  512. DeviceState *dev = DEVICE(obj);
  513. memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s,
  514. "icp_ctrl_regs", 0x00800000);
  515. sysbus_init_mmio(sbd, &s->iomem);
  516. qdev_init_gpio_in_named(dev, icp_control_mmc_wprot, ICP_GPIO_MMC_WPROT, 1);
  517. qdev_init_gpio_in_named(dev, icp_control_mmc_cardin,
  518. ICP_GPIO_MMC_CARDIN, 1);
  519. sysbus_init_irq(sbd, &s->mmc_irq);
  520. }
  521. /* Board init. */
  522. static struct arm_boot_info integrator_binfo = {
  523. .loader_start = 0x0,
  524. .board_id = 0x113,
  525. };
  526. static void integratorcp_init(MachineState *machine)
  527. {
  528. ram_addr_t ram_size = machine->ram_size;
  529. Object *cpuobj;
  530. ARMCPU *cpu;
  531. MemoryRegion *address_space_mem = get_system_memory();
  532. MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
  533. qemu_irq pic[32];
  534. DeviceState *dev, *sic, *icp;
  535. DriveInfo *dinfo;
  536. int i;
  537. cpuobj = object_new(machine->cpu_type);
  538. /* By default ARM1176 CPUs have EL3 enabled. This board does not
  539. * currently support EL3 so the CPU EL3 property is disabled before
  540. * realization.
  541. */
  542. if (object_property_find(cpuobj, "has_el3")) {
  543. object_property_set_bool(cpuobj, "has_el3", false, &error_fatal);
  544. }
  545. qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
  546. cpu = ARM_CPU(cpuobj);
  547. /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */
  548. /* ??? RAM should repeat to fill physical memory space. */
  549. /* SDRAM at address zero*/
  550. memory_region_add_subregion(address_space_mem, 0, machine->ram);
  551. /* And again at address 0x80000000 */
  552. memory_region_init_alias(ram_alias, NULL, "ram.alias", machine->ram,
  553. 0, ram_size);
  554. memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
  555. dev = qdev_new(TYPE_INTEGRATOR_CM);
  556. qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
  557. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  558. sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000);
  559. dev = sysbus_create_varargs(TYPE_INTEGRATOR_PIC, 0x14000000,
  560. qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ),
  561. qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_FIQ),
  562. NULL);
  563. for (i = 0; i < 32; i++) {
  564. pic[i] = qdev_get_gpio_in(dev, i);
  565. }
  566. sic = sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]);
  567. sysbus_create_varargs("integrator_pit", 0x13000000,
  568. pic[5], pic[6], pic[7], NULL);
  569. sysbus_create_simple("pl031", 0x15000000, pic[8]);
  570. pl011_create(0x16000000, pic[1], serial_hd(0));
  571. pl011_create(0x17000000, pic[2], serial_hd(1));
  572. icp = sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000,
  573. qdev_get_gpio_in(sic, 3));
  574. sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]);
  575. sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]);
  576. sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0);
  577. dev = sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL);
  578. qdev_connect_gpio_out_named(dev, "card-read-only", 0,
  579. qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_WPROT, 0));
  580. qdev_connect_gpio_out_named(dev, "card-inserted", 0,
  581. qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_CARDIN, 0));
  582. dinfo = drive_get(IF_SD, 0, 0);
  583. if (dinfo) {
  584. DeviceState *card;
  585. card = qdev_new(TYPE_SD_CARD);
  586. qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
  587. &error_fatal);
  588. qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
  589. &error_fatal);
  590. }
  591. dev = qdev_new("pl041");
  592. if (machine->audiodev) {
  593. qdev_prop_set_string(dev, "audiodev", machine->audiodev);
  594. }
  595. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  596. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x1d000000);
  597. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[25]);
  598. if (qemu_find_nic_info("smc91c111", true, NULL)) {
  599. smc91c111_init(0xc8000000, pic[27]);
  600. }
  601. dev = qdev_new("pl110");
  602. object_property_set_link(OBJECT(dev), "framebuffer-memory",
  603. OBJECT(address_space_mem), &error_fatal);
  604. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  605. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0xc0000000);
  606. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[22]);
  607. integrator_binfo.ram_size = ram_size;
  608. arm_load_kernel(cpu, machine, &integrator_binfo);
  609. }
  610. static void integratorcp_machine_init(MachineClass *mc)
  611. {
  612. mc->desc = "ARM Integrator/CP (ARM926EJ-S)";
  613. mc->init = integratorcp_init;
  614. mc->ignore_memory_transaction_failures = true;
  615. mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
  616. mc->default_ram_id = "integrator.ram";
  617. mc->auto_create_sdcard = true;
  618. machine_add_audiodev_property(mc);
  619. }
  620. DEFINE_MACHINE("integratorcp", integratorcp_machine_init)
  621. static const Property core_properties[] = {
  622. DEFINE_PROP_UINT32("memsz", IntegratorCMState, memsz, 0),
  623. };
  624. static void core_class_init(ObjectClass *klass, void *data)
  625. {
  626. DeviceClass *dc = DEVICE_CLASS(klass);
  627. device_class_set_props(dc, core_properties);
  628. dc->realize = integratorcm_realize;
  629. dc->vmsd = &vmstate_integratorcm;
  630. }
  631. static void icp_pic_class_init(ObjectClass *klass, void *data)
  632. {
  633. DeviceClass *dc = DEVICE_CLASS(klass);
  634. dc->vmsd = &vmstate_icp_pic;
  635. }
  636. static void icp_control_class_init(ObjectClass *klass, void *data)
  637. {
  638. DeviceClass *dc = DEVICE_CLASS(klass);
  639. dc->vmsd = &vmstate_icp_control;
  640. }
  641. static const TypeInfo core_info = {
  642. .name = TYPE_INTEGRATOR_CM,
  643. .parent = TYPE_SYS_BUS_DEVICE,
  644. .instance_size = sizeof(IntegratorCMState),
  645. .instance_init = integratorcm_init,
  646. .class_init = core_class_init,
  647. };
  648. static const TypeInfo icp_pic_info = {
  649. .name = TYPE_INTEGRATOR_PIC,
  650. .parent = TYPE_SYS_BUS_DEVICE,
  651. .instance_size = sizeof(icp_pic_state),
  652. .instance_init = icp_pic_init,
  653. .class_init = icp_pic_class_init,
  654. };
  655. static const TypeInfo icp_ctrl_regs_info = {
  656. .name = TYPE_ICP_CONTROL_REGS,
  657. .parent = TYPE_SYS_BUS_DEVICE,
  658. .instance_size = sizeof(ICPCtrlRegsState),
  659. .instance_init = icp_control_init,
  660. .class_init = icp_control_class_init,
  661. };
  662. static void integratorcp_register_types(void)
  663. {
  664. type_register_static(&icp_pic_info);
  665. type_register_static(&core_info);
  666. type_register_static(&icp_ctrl_regs_info);
  667. }
  668. type_init(integratorcp_register_types)