vexpress.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  1. /*
  2. * ARM Versatile Express emulation.
  3. *
  4. * Copyright (c) 2010 - 2011 B Labs Ltd.
  5. * Copyright (c) 2011 Linaro Limited
  6. * Written by Bahadir Balban, Amit Mahajan, Peter Maydell
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License along
  18. * with this program; if not, see <http://www.gnu.org/licenses/>.
  19. *
  20. * Contributions after 2012-01-13 are licensed under the terms of the
  21. * GNU GPL, version 2 or (at your option) any later version.
  22. */
  23. #include "qemu/osdep.h"
  24. #include "qapi/error.h"
  25. #include "qemu/datadir.h"
  26. #include "hw/sysbus.h"
  27. #include "hw/arm/boot.h"
  28. #include "hw/arm/primecell.h"
  29. #include "hw/net/lan9118.h"
  30. #include "hw/i2c/i2c.h"
  31. #include "net/net.h"
  32. #include "system/system.h"
  33. #include "hw/boards.h"
  34. #include "hw/loader.h"
  35. #include "hw/block/flash.h"
  36. #include "system/device_tree.h"
  37. #include "qemu/error-report.h"
  38. #include <libfdt.h>
  39. #include "hw/char/pl011.h"
  40. #include "hw/cpu/a9mpcore.h"
  41. #include "hw/cpu/a15mpcore.h"
  42. #include "hw/i2c/arm_sbcon_i2c.h"
  43. #include "hw/sd/sd.h"
  44. #include "qobject/qlist.h"
  45. #include "qom/object.h"
  46. #include "audio/audio.h"
  47. #include "target/arm/cpu-qom.h"
  48. #define VEXPRESS_BOARD_ID 0x8e0
  49. #define VEXPRESS_FLASH_SIZE (64 * 1024 * 1024)
  50. #define VEXPRESS_FLASH_SECT_SIZE (256 * 1024)
  51. /* Number of virtio transports to create (0..8; limited by
  52. * number of available IRQ lines).
  53. */
  54. #define NUM_VIRTIO_TRANSPORTS 4
  55. /* Address maps for peripherals:
  56. * the Versatile Express motherboard has two possible maps,
  57. * the "legacy" one (used for A9) and the "Cortex-A Series"
  58. * map (used for newer cores).
  59. * Individual daughterboards can also have different maps for
  60. * their peripherals.
  61. */
  62. enum {
  63. VE_SYSREGS,
  64. VE_SP810,
  65. VE_SERIALPCI,
  66. VE_PL041,
  67. VE_MMCI,
  68. VE_KMI0,
  69. VE_KMI1,
  70. VE_UART0,
  71. VE_UART1,
  72. VE_UART2,
  73. VE_UART3,
  74. VE_WDT,
  75. VE_TIMER01,
  76. VE_TIMER23,
  77. VE_SERIALDVI,
  78. VE_RTC,
  79. VE_COMPACTFLASH,
  80. VE_CLCD,
  81. VE_NORFLASH0,
  82. VE_NORFLASH1,
  83. VE_NORFLASHALIAS,
  84. VE_SRAM,
  85. VE_VIDEORAM,
  86. VE_ETHERNET,
  87. VE_USB,
  88. VE_DAPROM,
  89. VE_VIRTIO,
  90. };
  91. static hwaddr motherboard_legacy_map[] = {
  92. [VE_NORFLASHALIAS] = 0,
  93. /* CS7: 0x10000000 .. 0x10020000 */
  94. [VE_SYSREGS] = 0x10000000,
  95. [VE_SP810] = 0x10001000,
  96. [VE_SERIALPCI] = 0x10002000,
  97. [VE_PL041] = 0x10004000,
  98. [VE_MMCI] = 0x10005000,
  99. [VE_KMI0] = 0x10006000,
  100. [VE_KMI1] = 0x10007000,
  101. [VE_UART0] = 0x10009000,
  102. [VE_UART1] = 0x1000a000,
  103. [VE_UART2] = 0x1000b000,
  104. [VE_UART3] = 0x1000c000,
  105. [VE_WDT] = 0x1000f000,
  106. [VE_TIMER01] = 0x10011000,
  107. [VE_TIMER23] = 0x10012000,
  108. [VE_VIRTIO] = 0x10013000,
  109. [VE_SERIALDVI] = 0x10016000,
  110. [VE_RTC] = 0x10017000,
  111. [VE_COMPACTFLASH] = 0x1001a000,
  112. [VE_CLCD] = 0x1001f000,
  113. /* CS0: 0x40000000 .. 0x44000000 */
  114. [VE_NORFLASH0] = 0x40000000,
  115. /* CS1: 0x44000000 .. 0x48000000 */
  116. [VE_NORFLASH1] = 0x44000000,
  117. /* CS2: 0x48000000 .. 0x4a000000 */
  118. [VE_SRAM] = 0x48000000,
  119. /* CS3: 0x4c000000 .. 0x50000000 */
  120. [VE_VIDEORAM] = 0x4c000000,
  121. [VE_ETHERNET] = 0x4e000000,
  122. [VE_USB] = 0x4f000000,
  123. };
  124. static hwaddr motherboard_aseries_map[] = {
  125. [VE_NORFLASHALIAS] = 0,
  126. /* CS0: 0x08000000 .. 0x0c000000 */
  127. [VE_NORFLASH0] = 0x08000000,
  128. /* CS4: 0x0c000000 .. 0x10000000 */
  129. [VE_NORFLASH1] = 0x0c000000,
  130. /* CS5: 0x10000000 .. 0x14000000 */
  131. /* CS1: 0x14000000 .. 0x18000000 */
  132. [VE_SRAM] = 0x14000000,
  133. /* CS2: 0x18000000 .. 0x1c000000 */
  134. [VE_VIDEORAM] = 0x18000000,
  135. [VE_ETHERNET] = 0x1a000000,
  136. [VE_USB] = 0x1b000000,
  137. /* CS3: 0x1c000000 .. 0x20000000 */
  138. [VE_DAPROM] = 0x1c000000,
  139. [VE_SYSREGS] = 0x1c010000,
  140. [VE_SP810] = 0x1c020000,
  141. [VE_SERIALPCI] = 0x1c030000,
  142. [VE_PL041] = 0x1c040000,
  143. [VE_MMCI] = 0x1c050000,
  144. [VE_KMI0] = 0x1c060000,
  145. [VE_KMI1] = 0x1c070000,
  146. [VE_UART0] = 0x1c090000,
  147. [VE_UART1] = 0x1c0a0000,
  148. [VE_UART2] = 0x1c0b0000,
  149. [VE_UART3] = 0x1c0c0000,
  150. [VE_WDT] = 0x1c0f0000,
  151. [VE_TIMER01] = 0x1c110000,
  152. [VE_TIMER23] = 0x1c120000,
  153. [VE_VIRTIO] = 0x1c130000,
  154. [VE_SERIALDVI] = 0x1c160000,
  155. [VE_RTC] = 0x1c170000,
  156. [VE_COMPACTFLASH] = 0x1c1a0000,
  157. [VE_CLCD] = 0x1c1f0000,
  158. };
  159. /* Structure defining the peculiarities of a specific daughterboard */
  160. typedef struct VEDBoardInfo VEDBoardInfo;
  161. struct VexpressMachineClass {
  162. MachineClass parent;
  163. VEDBoardInfo *daughterboard;
  164. };
  165. struct VexpressMachineState {
  166. MachineState parent;
  167. MemoryRegion vram;
  168. MemoryRegion sram;
  169. MemoryRegion flashalias;
  170. MemoryRegion a15sram;
  171. bool secure;
  172. bool virt;
  173. };
  174. #define TYPE_VEXPRESS_MACHINE "vexpress"
  175. #define TYPE_VEXPRESS_A9_MACHINE MACHINE_TYPE_NAME("vexpress-a9")
  176. #define TYPE_VEXPRESS_A15_MACHINE MACHINE_TYPE_NAME("vexpress-a15")
  177. OBJECT_DECLARE_TYPE(VexpressMachineState, VexpressMachineClass, VEXPRESS_MACHINE)
  178. typedef void DBoardInitFn(VexpressMachineState *machine,
  179. ram_addr_t ram_size,
  180. const char *cpu_type,
  181. qemu_irq *pic);
  182. struct VEDBoardInfo {
  183. struct arm_boot_info bootinfo;
  184. const hwaddr *motherboard_map;
  185. hwaddr loader_start;
  186. const hwaddr gic_cpu_if_addr;
  187. uint32_t proc_id;
  188. uint32_t num_voltage_sensors;
  189. const uint32_t *voltages;
  190. uint32_t num_clocks;
  191. const uint32_t *clocks;
  192. DBoardInitFn *init;
  193. };
  194. static void init_cpus(MachineState *ms, const char *cpu_type,
  195. const char *privdev, hwaddr periphbase,
  196. qemu_irq *pic, bool secure, bool virt)
  197. {
  198. DeviceState *dev;
  199. SysBusDevice *busdev;
  200. int n;
  201. unsigned int smp_cpus = ms->smp.cpus;
  202. /* Create the actual CPUs */
  203. for (n = 0; n < smp_cpus; n++) {
  204. Object *cpuobj = object_new(cpu_type);
  205. if (!secure) {
  206. object_property_set_bool(cpuobj, "has_el3", false, NULL);
  207. }
  208. if (!virt) {
  209. if (object_property_find(cpuobj, "has_el2")) {
  210. object_property_set_bool(cpuobj, "has_el2", false, NULL);
  211. }
  212. }
  213. if (object_property_find(cpuobj, "reset-cbar")) {
  214. object_property_set_int(cpuobj, "reset-cbar", periphbase,
  215. &error_abort);
  216. }
  217. qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
  218. }
  219. /* Create the private peripheral devices (including the GIC);
  220. * this must happen after the CPUs are created because a15mpcore_priv
  221. * wires itself up to the CPU's generic_timer gpio out lines.
  222. */
  223. dev = qdev_new(privdev);
  224. qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
  225. busdev = SYS_BUS_DEVICE(dev);
  226. sysbus_realize_and_unref(busdev, &error_fatal);
  227. sysbus_mmio_map(busdev, 0, periphbase);
  228. /* Interrupts [42:0] are from the motherboard;
  229. * [47:43] are reserved; [63:48] are daughterboard
  230. * peripherals. Note that some documentation numbers
  231. * external interrupts starting from 32 (because there
  232. * are internal interrupts 0..31).
  233. */
  234. for (n = 0; n < 64; n++) {
  235. pic[n] = qdev_get_gpio_in(dev, n);
  236. }
  237. /* Connect the CPUs to the GIC */
  238. for (n = 0; n < smp_cpus; n++) {
  239. DeviceState *cpudev = DEVICE(qemu_get_cpu(n));
  240. sysbus_connect_irq(busdev, n, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
  241. sysbus_connect_irq(busdev, n + smp_cpus,
  242. qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
  243. sysbus_connect_irq(busdev, n + 2 * smp_cpus,
  244. qdev_get_gpio_in(cpudev, ARM_CPU_VIRQ));
  245. sysbus_connect_irq(busdev, n + 3 * smp_cpus,
  246. qdev_get_gpio_in(cpudev, ARM_CPU_VFIQ));
  247. }
  248. }
  249. static void a9_daughterboard_init(VexpressMachineState *vms,
  250. ram_addr_t ram_size,
  251. const char *cpu_type,
  252. qemu_irq *pic)
  253. {
  254. MachineState *machine = MACHINE(vms);
  255. MemoryRegion *sysmem = get_system_memory();
  256. DeviceState *dev;
  257. if (ram_size > 0x40000000) {
  258. /* 1GB is the maximum the address space permits */
  259. error_report("vexpress-a9: cannot model more than 1GB RAM");
  260. exit(1);
  261. }
  262. /*
  263. * RAM is from 0x60000000 upwards. The bottom 64MB of the
  264. * address space should in theory be remappable to various
  265. * things including ROM or RAM; we always map the flash there.
  266. */
  267. memory_region_add_subregion(sysmem, 0x60000000, machine->ram);
  268. /* 0x1e000000 A9MPCore (SCU) private memory region */
  269. init_cpus(machine, cpu_type, TYPE_A9MPCORE_PRIV, 0x1e000000, pic,
  270. vms->secure, vms->virt);
  271. /* Daughterboard peripherals : 0x10020000 .. 0x20000000 */
  272. /* 0x10020000 PL111 CLCD (daughterboard) */
  273. dev = qdev_new("pl111");
  274. object_property_set_link(OBJECT(dev), "framebuffer-memory",
  275. OBJECT(sysmem), &error_fatal);
  276. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  277. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x10020000);
  278. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[44]);
  279. /* 0x10060000 AXI RAM */
  280. /* 0x100e0000 PL341 Dynamic Memory Controller */
  281. /* 0x100e1000 PL354 Static Memory Controller */
  282. /* 0x100e2000 System Configuration Controller */
  283. sysbus_create_simple("sp804", 0x100e4000, pic[48]);
  284. /* 0x100e5000 SP805 Watchdog module */
  285. /* 0x100e6000 BP147 TrustZone Protection Controller */
  286. /* 0x100e9000 PL301 'Fast' AXI matrix */
  287. /* 0x100ea000 PL301 'Slow' AXI matrix */
  288. /* 0x100ec000 TrustZone Address Space Controller */
  289. /* 0x10200000 CoreSight debug APB */
  290. /* 0x1e00a000 PL310 L2 Cache Controller */
  291. sysbus_create_varargs("l2x0", 0x1e00a000, NULL);
  292. }
  293. /* Voltage values for SYS_CFG_VOLT daughterboard registers;
  294. * values are in microvolts.
  295. */
  296. static const uint32_t a9_voltages[] = {
  297. 1000000, /* VD10 : 1.0V : SoC internal logic voltage */
  298. 1000000, /* VD10_S2 : 1.0V : PL310, L2 cache, RAM, non-PL310 logic */
  299. 1000000, /* VD10_S3 : 1.0V : Cortex-A9, cores, MPEs, SCU, PL310 logic */
  300. 1800000, /* VCC1V8 : 1.8V : DDR2 SDRAM, test chip DDR2 I/O supply */
  301. 900000, /* DDR2VTT : 0.9V : DDR2 SDRAM VTT termination voltage */
  302. 3300000, /* VCC3V3 : 3.3V : local board supply for misc external logic */
  303. };
  304. /* Reset values for daughterboard oscillators (in Hz) */
  305. static const uint32_t a9_clocks[] = {
  306. 45000000, /* AMBA AXI ACLK: 45MHz */
  307. 23750000, /* daughterboard CLCD clock: 23.75MHz */
  308. 66670000, /* Test chip reference clock: 66.67MHz */
  309. };
  310. static VEDBoardInfo a9_daughterboard = {
  311. .motherboard_map = motherboard_legacy_map,
  312. .loader_start = 0x60000000,
  313. .gic_cpu_if_addr = 0x1e000100,
  314. .proc_id = 0x0c000191,
  315. .num_voltage_sensors = ARRAY_SIZE(a9_voltages),
  316. .voltages = a9_voltages,
  317. .num_clocks = ARRAY_SIZE(a9_clocks),
  318. .clocks = a9_clocks,
  319. .init = a9_daughterboard_init,
  320. };
  321. static void a15_daughterboard_init(VexpressMachineState *vms,
  322. ram_addr_t ram_size,
  323. const char *cpu_type,
  324. qemu_irq *pic)
  325. {
  326. MachineState *machine = MACHINE(vms);
  327. MemoryRegion *sysmem = get_system_memory();
  328. {
  329. /* We have to use a separate 64 bit variable here to avoid the gcc
  330. * "comparison is always false due to limited range of data type"
  331. * warning if we are on a host where ram_addr_t is 32 bits.
  332. */
  333. uint64_t rsz = ram_size;
  334. if (rsz > (30ULL * 1024 * 1024 * 1024)) {
  335. error_report("vexpress-a15: cannot model more than 30GB RAM");
  336. exit(1);
  337. }
  338. }
  339. /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
  340. memory_region_add_subregion(sysmem, 0x80000000, machine->ram);
  341. /* 0x2c000000 A15MPCore private memory region (GIC) */
  342. init_cpus(machine, cpu_type, TYPE_A15MPCORE_PRIV,
  343. 0x2c000000, pic, vms->secure, vms->virt);
  344. /* A15 daughterboard peripherals: */
  345. /* 0x20000000: CoreSight interfaces: not modelled */
  346. /* 0x2a000000: PL301 AXI interconnect: not modelled */
  347. /* 0x2a420000: SCC: not modelled */
  348. /* 0x2a430000: system counter: not modelled */
  349. /* 0x2b000000: HDLCD controller: not modelled */
  350. /* 0x2b060000: SP805 watchdog: not modelled */
  351. /* 0x2b0a0000: PL341 dynamic memory controller: not modelled */
  352. /* 0x2e000000: system SRAM */
  353. memory_region_init_ram(&vms->a15sram, NULL, "vexpress.a15sram", 0x10000,
  354. &error_fatal);
  355. memory_region_add_subregion(sysmem, 0x2e000000, &vms->a15sram);
  356. /* 0x7ffb0000: DMA330 DMA controller: not modelled */
  357. /* 0x7ffd0000: PL354 static memory controller: not modelled */
  358. }
  359. static const uint32_t a15_voltages[] = {
  360. 900000, /* Vcore: 0.9V : CPU core voltage */
  361. };
  362. static const uint32_t a15_clocks[] = {
  363. 60000000, /* OSCCLK0: 60MHz : CPU_CLK reference */
  364. 0, /* OSCCLK1: reserved */
  365. 0, /* OSCCLK2: reserved */
  366. 0, /* OSCCLK3: reserved */
  367. 40000000, /* OSCCLK4: 40MHz : external AXI master clock */
  368. 23750000, /* OSCCLK5: 23.75MHz : HDLCD PLL reference */
  369. 50000000, /* OSCCLK6: 50MHz : static memory controller clock */
  370. 60000000, /* OSCCLK7: 60MHz : SYSCLK reference */
  371. 40000000, /* OSCCLK8: 40MHz : DDR2 PLL reference */
  372. };
  373. static VEDBoardInfo a15_daughterboard = {
  374. .motherboard_map = motherboard_aseries_map,
  375. .loader_start = 0x80000000,
  376. .gic_cpu_if_addr = 0x2c002000,
  377. .proc_id = 0x14000237,
  378. .num_voltage_sensors = ARRAY_SIZE(a15_voltages),
  379. .voltages = a15_voltages,
  380. .num_clocks = ARRAY_SIZE(a15_clocks),
  381. .clocks = a15_clocks,
  382. .init = a15_daughterboard_init,
  383. };
  384. static int add_virtio_mmio_node(void *fdt, uint32_t acells, uint32_t scells,
  385. hwaddr addr, hwaddr size, uint32_t intc,
  386. int irq)
  387. {
  388. /* Add a virtio_mmio node to the device tree blob:
  389. * virtio_mmio@ADDRESS {
  390. * compatible = "virtio,mmio";
  391. * reg = <ADDRESS, SIZE>;
  392. * interrupt-parent = <&intc>;
  393. * interrupts = <0, irq, 1>;
  394. * }
  395. * (Note that the format of the interrupts property is dependent on the
  396. * interrupt controller that interrupt-parent points to; these are for
  397. * the ARM GIC and indicate an SPI interrupt, rising-edge-triggered.)
  398. */
  399. int rc;
  400. char *nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, addr);
  401. rc = qemu_fdt_add_subnode(fdt, nodename);
  402. rc |= qemu_fdt_setprop_string(fdt, nodename,
  403. "compatible", "virtio,mmio");
  404. rc |= qemu_fdt_setprop_sized_cells(fdt, nodename, "reg",
  405. acells, addr, scells, size);
  406. qemu_fdt_setprop_cells(fdt, nodename, "interrupt-parent", intc);
  407. qemu_fdt_setprop_cells(fdt, nodename, "interrupts", 0, irq, 1);
  408. qemu_fdt_setprop(fdt, nodename, "dma-coherent", NULL, 0);
  409. g_free(nodename);
  410. if (rc) {
  411. return -1;
  412. }
  413. return 0;
  414. }
  415. static uint32_t find_int_controller(void *fdt)
  416. {
  417. /* Find the FDT node corresponding to the interrupt controller
  418. * for virtio-mmio devices. We do this by scanning the fdt for
  419. * a node with the right compatibility, since we know there is
  420. * only one GIC on a vexpress board.
  421. * We return the phandle of the node, or 0 if none was found.
  422. */
  423. const char *compat = "arm,cortex-a9-gic";
  424. int offset;
  425. offset = fdt_node_offset_by_compatible(fdt, -1, compat);
  426. if (offset >= 0) {
  427. return fdt_get_phandle(fdt, offset);
  428. }
  429. return 0;
  430. }
  431. static void vexpress_modify_dtb(const struct arm_boot_info *info, void *fdt)
  432. {
  433. uint32_t acells, scells, intc;
  434. const VEDBoardInfo *daughterboard = (const VEDBoardInfo *)info;
  435. acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells",
  436. NULL, &error_fatal);
  437. scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells",
  438. NULL, &error_fatal);
  439. intc = find_int_controller(fdt);
  440. if (!intc) {
  441. /* Not fatal, we just won't provide virtio. This will
  442. * happen with older device tree blobs.
  443. */
  444. warn_report("couldn't find interrupt controller in "
  445. "dtb; will not include virtio-mmio devices in the dtb");
  446. } else {
  447. int i;
  448. const hwaddr *map = daughterboard->motherboard_map;
  449. /* We iterate backwards here because adding nodes
  450. * to the dtb puts them in last-first.
  451. */
  452. for (i = NUM_VIRTIO_TRANSPORTS - 1; i >= 0; i--) {
  453. add_virtio_mmio_node(fdt, acells, scells,
  454. map[VE_VIRTIO] + 0x200 * i,
  455. 0x200, intc, 40 + i);
  456. }
  457. }
  458. }
  459. /* Open code a private version of pflash registration since we
  460. * need to set non-default device width for VExpress platform.
  461. */
  462. static PFlashCFI01 *ve_pflash_cfi01_register(hwaddr base, const char *name,
  463. DriveInfo *di)
  464. {
  465. DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01);
  466. if (di) {
  467. qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(di));
  468. }
  469. qdev_prop_set_uint32(dev, "num-blocks",
  470. VEXPRESS_FLASH_SIZE / VEXPRESS_FLASH_SECT_SIZE);
  471. qdev_prop_set_uint64(dev, "sector-length", VEXPRESS_FLASH_SECT_SIZE);
  472. qdev_prop_set_uint8(dev, "width", 4);
  473. qdev_prop_set_uint8(dev, "device-width", 2);
  474. qdev_prop_set_bit(dev, "big-endian", false);
  475. qdev_prop_set_uint16(dev, "id0", 0x89);
  476. qdev_prop_set_uint16(dev, "id1", 0x18);
  477. qdev_prop_set_uint16(dev, "id2", 0x00);
  478. qdev_prop_set_uint16(dev, "id3", 0x00);
  479. qdev_prop_set_string(dev, "name", name);
  480. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  481. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
  482. return PFLASH_CFI01(dev);
  483. }
  484. static void vexpress_common_init(MachineState *machine)
  485. {
  486. VexpressMachineState *vms = VEXPRESS_MACHINE(machine);
  487. VexpressMachineClass *vmc = VEXPRESS_MACHINE_GET_CLASS(machine);
  488. VEDBoardInfo *daughterboard = vmc->daughterboard;
  489. DeviceState *dev, *sysctl, *pl041;
  490. qemu_irq pic[64];
  491. uint32_t sys_id;
  492. DriveInfo *dinfo;
  493. PFlashCFI01 *pflash0;
  494. I2CBus *i2c;
  495. ram_addr_t vram_size, sram_size;
  496. MemoryRegion *sysmem = get_system_memory();
  497. const hwaddr *map = daughterboard->motherboard_map;
  498. QList *db_voltage, *db_clock;
  499. int i;
  500. daughterboard->init(vms, machine->ram_size, machine->cpu_type, pic);
  501. /*
  502. * If a bios file was provided, attempt to map it into memory
  503. */
  504. if (machine->firmware) {
  505. char *fn;
  506. int image_size;
  507. if (drive_get(IF_PFLASH, 0, 0)) {
  508. error_report("The contents of the first flash device may be "
  509. "specified with -bios or with -drive if=pflash... "
  510. "but you cannot use both options at once");
  511. exit(1);
  512. }
  513. fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, machine->firmware);
  514. if (!fn) {
  515. error_report("Could not find ROM image '%s'", machine->firmware);
  516. exit(1);
  517. }
  518. image_size = load_image_targphys(fn, map[VE_NORFLASH0],
  519. VEXPRESS_FLASH_SIZE);
  520. g_free(fn);
  521. if (image_size < 0) {
  522. error_report("Could not load ROM image '%s'", machine->firmware);
  523. exit(1);
  524. }
  525. }
  526. /* Motherboard peripherals: the wiring is the same but the
  527. * addresses vary between the legacy and A-Series memory maps.
  528. */
  529. sys_id = 0x1190f500;
  530. sysctl = qdev_new("realview_sysctl");
  531. qdev_prop_set_uint32(sysctl, "sys_id", sys_id);
  532. qdev_prop_set_uint32(sysctl, "proc_id", daughterboard->proc_id);
  533. db_voltage = qlist_new();
  534. for (i = 0; i < daughterboard->num_voltage_sensors; i++) {
  535. qlist_append_int(db_voltage, daughterboard->voltages[i]);
  536. }
  537. qdev_prop_set_array(sysctl, "db-voltage", db_voltage);
  538. db_clock = qlist_new();
  539. for (i = 0; i < daughterboard->num_clocks; i++) {
  540. qlist_append_int(db_clock, daughterboard->clocks[i]);
  541. }
  542. qdev_prop_set_array(sysctl, "db-clock", db_clock);
  543. sysbus_realize_and_unref(SYS_BUS_DEVICE(sysctl), &error_fatal);
  544. sysbus_mmio_map(SYS_BUS_DEVICE(sysctl), 0, map[VE_SYSREGS]);
  545. /* VE_SP810: not modelled */
  546. /* VE_SERIALPCI: not modelled */
  547. pl041 = qdev_new("pl041");
  548. qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512);
  549. if (machine->audiodev) {
  550. qdev_prop_set_string(pl041, "audiodev", machine->audiodev);
  551. }
  552. sysbus_realize_and_unref(SYS_BUS_DEVICE(pl041), &error_fatal);
  553. sysbus_mmio_map(SYS_BUS_DEVICE(pl041), 0, map[VE_PL041]);
  554. sysbus_connect_irq(SYS_BUS_DEVICE(pl041), 0, pic[11]);
  555. dev = sysbus_create_varargs("pl181", map[VE_MMCI], pic[9], pic[10], NULL);
  556. /* Wire up MMC card detect and read-only signals */
  557. qdev_connect_gpio_out_named(dev, "card-read-only", 0,
  558. qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT));
  559. qdev_connect_gpio_out_named(dev, "card-inserted", 0,
  560. qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN));
  561. dinfo = drive_get(IF_SD, 0, 0);
  562. if (dinfo) {
  563. DeviceState *card;
  564. card = qdev_new(TYPE_SD_CARD);
  565. qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
  566. &error_fatal);
  567. qdev_realize_and_unref(card, qdev_get_child_bus(dev, "sd-bus"),
  568. &error_fatal);
  569. }
  570. sysbus_create_simple("pl050_keyboard", map[VE_KMI0], pic[12]);
  571. sysbus_create_simple("pl050_mouse", map[VE_KMI1], pic[13]);
  572. pl011_create(map[VE_UART0], pic[5], serial_hd(0));
  573. pl011_create(map[VE_UART1], pic[6], serial_hd(1));
  574. pl011_create(map[VE_UART2], pic[7], serial_hd(2));
  575. pl011_create(map[VE_UART3], pic[8], serial_hd(3));
  576. sysbus_create_simple("sp804", map[VE_TIMER01], pic[2]);
  577. sysbus_create_simple("sp804", map[VE_TIMER23], pic[3]);
  578. dev = sysbus_create_simple(TYPE_ARM_SBCON_I2C, map[VE_SERIALDVI], NULL);
  579. i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
  580. i2c_slave_create_simple(i2c, "sii9022", 0x39);
  581. sysbus_create_simple("pl031", map[VE_RTC], pic[4]); /* RTC */
  582. /* VE_COMPACTFLASH: not modelled */
  583. dev = qdev_new("pl111");
  584. object_property_set_link(OBJECT(dev), "framebuffer-memory",
  585. OBJECT(sysmem), &error_fatal);
  586. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  587. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, map[VE_CLCD]);
  588. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[14]);
  589. dinfo = drive_get(IF_PFLASH, 0, 0);
  590. pflash0 = ve_pflash_cfi01_register(map[VE_NORFLASH0], "vexpress.flash0",
  591. dinfo);
  592. if (map[VE_NORFLASHALIAS] != -1) {
  593. /* Map flash 0 as an alias into low memory */
  594. MemoryRegion *flash0mem;
  595. flash0mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(pflash0), 0);
  596. memory_region_init_alias(&vms->flashalias, NULL, "vexpress.flashalias",
  597. flash0mem, 0, VEXPRESS_FLASH_SIZE);
  598. memory_region_add_subregion(sysmem, map[VE_NORFLASHALIAS], &vms->flashalias);
  599. }
  600. dinfo = drive_get(IF_PFLASH, 0, 1);
  601. ve_pflash_cfi01_register(map[VE_NORFLASH1], "vexpress.flash1", dinfo);
  602. sram_size = 0x2000000;
  603. memory_region_init_ram(&vms->sram, NULL, "vexpress.sram", sram_size,
  604. &error_fatal);
  605. memory_region_add_subregion(sysmem, map[VE_SRAM], &vms->sram);
  606. vram_size = 0x800000;
  607. memory_region_init_ram(&vms->vram, NULL, "vexpress.vram", vram_size,
  608. &error_fatal);
  609. memory_region_add_subregion(sysmem, map[VE_VIDEORAM], &vms->vram);
  610. /* 0x4e000000 LAN9118 Ethernet */
  611. if (qemu_find_nic_info("lan9118", true, NULL)) {
  612. lan9118_init(map[VE_ETHERNET], pic[15]);
  613. }
  614. /* VE_USB: not modelled */
  615. /* VE_DAPROM: not modelled */
  616. /* Create mmio transports, so the user can create virtio backends
  617. * (which will be automatically plugged in to the transports). If
  618. * no backend is created the transport will just sit harmlessly idle.
  619. */
  620. for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
  621. sysbus_create_simple("virtio-mmio", map[VE_VIRTIO] + 0x200 * i,
  622. pic[40 + i]);
  623. }
  624. daughterboard->bootinfo.ram_size = machine->ram_size;
  625. daughterboard->bootinfo.board_id = VEXPRESS_BOARD_ID;
  626. daughterboard->bootinfo.loader_start = daughterboard->loader_start;
  627. daughterboard->bootinfo.smp_loader_start = map[VE_SRAM];
  628. daughterboard->bootinfo.smp_bootreg_addr = map[VE_SYSREGS] + 0x30;
  629. daughterboard->bootinfo.gic_cpu_if_addr = daughterboard->gic_cpu_if_addr;
  630. daughterboard->bootinfo.modify_dtb = vexpress_modify_dtb;
  631. /* When booting Linux we should be in secure state if the CPU has one. */
  632. daughterboard->bootinfo.secure_boot = vms->secure;
  633. arm_load_kernel(ARM_CPU(first_cpu), machine, &daughterboard->bootinfo);
  634. }
  635. static bool vexpress_get_secure(Object *obj, Error **errp)
  636. {
  637. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  638. return vms->secure;
  639. }
  640. static void vexpress_set_secure(Object *obj, bool value, Error **errp)
  641. {
  642. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  643. vms->secure = value;
  644. }
  645. static bool vexpress_get_virt(Object *obj, Error **errp)
  646. {
  647. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  648. return vms->virt;
  649. }
  650. static void vexpress_set_virt(Object *obj, bool value, Error **errp)
  651. {
  652. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  653. vms->virt = value;
  654. }
  655. static void vexpress_instance_init(Object *obj)
  656. {
  657. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  658. /* EL3 is enabled by default on vexpress */
  659. vms->secure = true;
  660. }
  661. static void vexpress_a15_instance_init(Object *obj)
  662. {
  663. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  664. /*
  665. * For the vexpress-a15, EL2 is by default enabled if EL3 is,
  666. * but can also be specifically set to on or off.
  667. */
  668. vms->virt = true;
  669. }
  670. static void vexpress_a9_instance_init(Object *obj)
  671. {
  672. VexpressMachineState *vms = VEXPRESS_MACHINE(obj);
  673. /* The A9 doesn't have the virt extensions */
  674. vms->virt = false;
  675. }
  676. static void vexpress_class_init(ObjectClass *oc, void *data)
  677. {
  678. MachineClass *mc = MACHINE_CLASS(oc);
  679. mc->desc = "ARM Versatile Express";
  680. mc->init = vexpress_common_init;
  681. mc->max_cpus = 4;
  682. mc->ignore_memory_transaction_failures = true;
  683. mc->default_ram_id = "vexpress.highmem";
  684. machine_add_audiodev_property(mc);
  685. object_class_property_add_bool(oc, "secure", vexpress_get_secure,
  686. vexpress_set_secure);
  687. object_class_property_set_description(oc, "secure",
  688. "Set on/off to enable/disable the ARM "
  689. "Security Extensions (TrustZone)");
  690. }
  691. static void vexpress_a9_class_init(ObjectClass *oc, void *data)
  692. {
  693. static const char * const valid_cpu_types[] = {
  694. ARM_CPU_TYPE_NAME("cortex-a9"),
  695. NULL
  696. };
  697. MachineClass *mc = MACHINE_CLASS(oc);
  698. VexpressMachineClass *vmc = VEXPRESS_MACHINE_CLASS(oc);
  699. mc->desc = "ARM Versatile Express for Cortex-A9";
  700. mc->valid_cpu_types = valid_cpu_types;
  701. vmc->daughterboard = &a9_daughterboard;
  702. }
  703. static void vexpress_a15_class_init(ObjectClass *oc, void *data)
  704. {
  705. static const char * const valid_cpu_types[] = {
  706. ARM_CPU_TYPE_NAME("cortex-a15"),
  707. NULL
  708. };
  709. MachineClass *mc = MACHINE_CLASS(oc);
  710. VexpressMachineClass *vmc = VEXPRESS_MACHINE_CLASS(oc);
  711. mc->desc = "ARM Versatile Express for Cortex-A15";
  712. mc->valid_cpu_types = valid_cpu_types;
  713. vmc->daughterboard = &a15_daughterboard;
  714. object_class_property_add_bool(oc, "virtualization", vexpress_get_virt,
  715. vexpress_set_virt);
  716. object_class_property_set_description(oc, "virtualization",
  717. "Set on/off to enable/disable the ARM "
  718. "Virtualization Extensions "
  719. "(defaults to same as 'secure')");
  720. }
  721. static const TypeInfo vexpress_info = {
  722. .name = TYPE_VEXPRESS_MACHINE,
  723. .parent = TYPE_MACHINE,
  724. .abstract = true,
  725. .instance_size = sizeof(VexpressMachineState),
  726. .instance_init = vexpress_instance_init,
  727. .class_size = sizeof(VexpressMachineClass),
  728. .class_init = vexpress_class_init,
  729. };
  730. static const TypeInfo vexpress_a9_info = {
  731. .name = TYPE_VEXPRESS_A9_MACHINE,
  732. .parent = TYPE_VEXPRESS_MACHINE,
  733. .class_init = vexpress_a9_class_init,
  734. .instance_init = vexpress_a9_instance_init,
  735. };
  736. static const TypeInfo vexpress_a15_info = {
  737. .name = TYPE_VEXPRESS_A15_MACHINE,
  738. .parent = TYPE_VEXPRESS_MACHINE,
  739. .class_init = vexpress_a15_class_init,
  740. .instance_init = vexpress_a15_instance_init,
  741. };
  742. static void vexpress_machine_init(void)
  743. {
  744. type_register_static(&vexpress_info);
  745. type_register_static(&vexpress_a9_info);
  746. type_register_static(&vexpress_a15_info);
  747. }
  748. type_init(vexpress_machine_init);