2
0

vexpress.c 29 KB

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