1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include "qemu/osdep.h"
32#include "qapi/error.h"
33#include "hw/sysbus.h"
34#include "hw/arm/arm.h"
35#include "hw/arm/primecell.h"
36#include "hw/arm/virt.h"
37#include "hw/devices.h"
38#include "net/net.h"
39#include "sysemu/block-backend.h"
40#include "sysemu/device_tree.h"
41#include "sysemu/numa.h"
42#include "sysemu/sysemu.h"
43#include "sysemu/kvm.h"
44#include "hw/boards.h"
45#include "hw/compat.h"
46#include "hw/loader.h"
47#include "exec/address-spaces.h"
48#include "qemu/bitops.h"
49#include "qemu/error-report.h"
50#include "hw/pci-host/gpex.h"
51#include "hw/arm/virt-acpi-build.h"
52#include "hw/arm/sysbus-fdt.h"
53#include "hw/platform-bus.h"
54#include "hw/arm/fdt.h"
55#include "hw/intc/arm_gic.h"
56#include "hw/intc/arm_gicv3_common.h"
57#include "kvm_arm.h"
58#include "hw/smbios/smbios.h"
59#include "qapi/visitor.h"
60#include "standard-headers/linux/input.h"
61
62
63#define NUM_IRQS 256
64
65#define PLATFORM_BUS_NUM_IRQS 64
66
67static ARMPlatformBusSystemParams platform_bus_params;
68
69typedef struct VirtBoardInfo {
70 struct arm_boot_info bootinfo;
71 const char *cpu_model;
72 const MemMapEntry *memmap;
73 const int *irqmap;
74 int smp_cpus;
75 void *fdt;
76 int fdt_size;
77 uint32_t clock_phandle;
78 uint32_t gic_phandle;
79 uint32_t msi_phandle;
80 bool using_psci;
81} VirtBoardInfo;
82
83typedef struct {
84 MachineClass parent;
85 VirtBoardInfo *daughterboard;
86 bool disallow_affinity_adjustment;
87 bool no_its;
88 bool no_pmu;
89} VirtMachineClass;
90
91typedef struct {
92 MachineState parent;
93 bool secure;
94 bool highmem;
95 int32_t gic_version;
96} VirtMachineState;
97
98#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
99#define VIRT_MACHINE(obj) \
100 OBJECT_CHECK(VirtMachineState, (obj), TYPE_VIRT_MACHINE)
101#define VIRT_MACHINE_GET_CLASS(obj) \
102 OBJECT_GET_CLASS(VirtMachineClass, obj, TYPE_VIRT_MACHINE)
103#define VIRT_MACHINE_CLASS(klass) \
104 OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_VIRT_MACHINE)
105
106
107#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
108 static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
109 void *data) \
110 { \
111 MachineClass *mc = MACHINE_CLASS(oc); \
112 virt_machine_##major##_##minor##_options(mc); \
113 mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
114 if (latest) { \
115 mc->alias = "virt"; \
116 } \
117 } \
118 static const TypeInfo machvirt_##major##_##minor##_info = { \
119 .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
120 .parent = TYPE_VIRT_MACHINE, \
121 .instance_init = virt_##major##_##minor##_instance_init, \
122 .class_init = virt_##major##_##minor##_class_init, \
123 }; \
124 static void machvirt_machine_##major##_##minor##_init(void) \
125 { \
126 type_register_static(&machvirt_##major##_##minor##_info); \
127 } \
128 type_init(machvirt_machine_##major##_##minor##_init);
129
130#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
131 DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
132#define DEFINE_VIRT_MACHINE(major, minor) \
133 DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150#define RAMLIMIT_GB 255
151#define RAMLIMIT_BYTES (RAMLIMIT_GB * 1024ULL * 1024 * 1024)
152
153
154
155
156
157
158
159
160
161
162
163
164
165static const MemMapEntry a15memmap[] = {
166
167 [VIRT_FLASH] = { 0, 0x08000000 },
168 [VIRT_CPUPERIPHS] = { 0x08000000, 0x00020000 },
169
170 [VIRT_GIC_DIST] = { 0x08000000, 0x00010000 },
171 [VIRT_GIC_CPU] = { 0x08010000, 0x00010000 },
172 [VIRT_GIC_V2M] = { 0x08020000, 0x00001000 },
173
174 [VIRT_GIC_ITS] = { 0x08080000, 0x00020000 },
175
176 [VIRT_GIC_REDIST] = { 0x080A0000, 0x00F60000 },
177 [VIRT_UART] = { 0x09000000, 0x00001000 },
178 [VIRT_RTC] = { 0x09010000, 0x00001000 },
179 [VIRT_FW_CFG] = { 0x09020000, 0x00000018 },
180 [VIRT_GPIO] = { 0x09030000, 0x00001000 },
181 [VIRT_SECURE_UART] = { 0x09040000, 0x00001000 },
182 [VIRT_MMIO] = { 0x0a000000, 0x00000200 },
183
184 [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
185 [VIRT_SECURE_MEM] = { 0x0e000000, 0x01000000 },
186 [VIRT_PCIE_MMIO] = { 0x10000000, 0x2eff0000 },
187 [VIRT_PCIE_PIO] = { 0x3eff0000, 0x00010000 },
188 [VIRT_PCIE_ECAM] = { 0x3f000000, 0x01000000 },
189 [VIRT_MEM] = { 0x40000000, RAMLIMIT_BYTES },
190
191 [VIRT_PCIE_MMIO_HIGH] = { 0x8000000000ULL, 0x8000000000ULL },
192};
193
194static const int a15irqmap[] = {
195 [VIRT_UART] = 1,
196 [VIRT_RTC] = 2,
197 [VIRT_PCIE] = 3,
198 [VIRT_GPIO] = 7,
199 [VIRT_SECURE_UART] = 8,
200 [VIRT_MMIO] = 16,
201 [VIRT_GIC_V2M] = 48,
202 [VIRT_PLATFORM_BUS] = 112,
203};
204
205static VirtBoardInfo machines[] = {
206 {
207 .cpu_model = "cortex-a15",
208 .memmap = a15memmap,
209 .irqmap = a15irqmap,
210 },
211 {
212 .cpu_model = "cortex-a53",
213 .memmap = a15memmap,
214 .irqmap = a15irqmap,
215 },
216 {
217 .cpu_model = "cortex-a57",
218 .memmap = a15memmap,
219 .irqmap = a15irqmap,
220 },
221 {
222 .cpu_model = "host",
223 .memmap = a15memmap,
224 .irqmap = a15irqmap,
225 },
226};
227
228static VirtBoardInfo *find_machine_info(const char *cpu)
229{
230 int i;
231
232 for (i = 0; i < ARRAY_SIZE(machines); i++) {
233 if (strcmp(cpu, machines[i].cpu_model) == 0) {
234 return &machines[i];
235 }
236 }
237 return NULL;
238}
239
240static void create_fdt(VirtBoardInfo *vbi)
241{
242 void *fdt = create_device_tree(&vbi->fdt_size);
243
244 if (!fdt) {
245 error_report("create_device_tree() failed");
246 exit(1);
247 }
248
249 vbi->fdt = fdt;
250
251
252 qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
253 qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2);
254 qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
255
256
257
258
259
260 qemu_fdt_add_subnode(fdt, "/chosen");
261 qemu_fdt_add_subnode(fdt, "/memory");
262 qemu_fdt_setprop_string(fdt, "/memory", "device_type", "memory");
263
264
265
266
267
268
269 vbi->clock_phandle = qemu_fdt_alloc_phandle(fdt);
270 qemu_fdt_add_subnode(fdt, "/apb-pclk");
271 qemu_fdt_setprop_string(fdt, "/apb-pclk", "compatible", "fixed-clock");
272 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "#clock-cells", 0x0);
273 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "clock-frequency", 24000000);
274 qemu_fdt_setprop_string(fdt, "/apb-pclk", "clock-output-names",
275 "clk24mhz");
276 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "phandle", vbi->clock_phandle);
277
278}
279
280static void fdt_add_psci_node(const VirtBoardInfo *vbi)
281{
282 uint32_t cpu_suspend_fn;
283 uint32_t cpu_off_fn;
284 uint32_t cpu_on_fn;
285 uint32_t migrate_fn;
286 void *fdt = vbi->fdt;
287 ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(0));
288
289 if (!vbi->using_psci) {
290 return;
291 }
292
293 qemu_fdt_add_subnode(fdt, "/psci");
294 if (armcpu->psci_version == 2) {
295 const char comp[] = "arm,psci-0.2\0arm,psci";
296 qemu_fdt_setprop(fdt, "/psci", "compatible", comp, sizeof(comp));
297
298 cpu_off_fn = QEMU_PSCI_0_2_FN_CPU_OFF;
299 if (arm_feature(&armcpu->env, ARM_FEATURE_AARCH64)) {
300 cpu_suspend_fn = QEMU_PSCI_0_2_FN64_CPU_SUSPEND;
301 cpu_on_fn = QEMU_PSCI_0_2_FN64_CPU_ON;
302 migrate_fn = QEMU_PSCI_0_2_FN64_MIGRATE;
303 } else {
304 cpu_suspend_fn = QEMU_PSCI_0_2_FN_CPU_SUSPEND;
305 cpu_on_fn = QEMU_PSCI_0_2_FN_CPU_ON;
306 migrate_fn = QEMU_PSCI_0_2_FN_MIGRATE;
307 }
308 } else {
309 qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci");
310
311 cpu_suspend_fn = QEMU_PSCI_0_1_FN_CPU_SUSPEND;
312 cpu_off_fn = QEMU_PSCI_0_1_FN_CPU_OFF;
313 cpu_on_fn = QEMU_PSCI_0_1_FN_CPU_ON;
314 migrate_fn = QEMU_PSCI_0_1_FN_MIGRATE;
315 }
316
317
318
319
320
321
322 qemu_fdt_setprop_string(fdt, "/psci", "method", "hvc");
323
324 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend", cpu_suspend_fn);
325 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", cpu_off_fn);
326 qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", cpu_on_fn);
327 qemu_fdt_setprop_cell(fdt, "/psci", "migrate", migrate_fn);
328}
329
330static void fdt_add_timer_nodes(const VirtBoardInfo *vbi, int gictype)
331{
332
333
334
335
336 ARMCPU *armcpu;
337 uint32_t irqflags = GIC_FDT_IRQ_FLAGS_EDGE_LO_HI;
338
339 if (gictype == 2) {
340 irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
341 GIC_FDT_IRQ_PPI_CPU_WIDTH,
342 (1 << vbi->smp_cpus) - 1);
343 }
344
345 qemu_fdt_add_subnode(vbi->fdt, "/timer");
346
347 armcpu = ARM_CPU(qemu_get_cpu(0));
348 if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
349 const char compat[] = "arm,armv8-timer\0arm,armv7-timer";
350 qemu_fdt_setprop(vbi->fdt, "/timer", "compatible",
351 compat, sizeof(compat));
352 } else {
353 qemu_fdt_setprop_string(vbi->fdt, "/timer", "compatible",
354 "arm,armv7-timer");
355 }
356 qemu_fdt_setprop(vbi->fdt, "/timer", "always-on", NULL, 0);
357 qemu_fdt_setprop_cells(vbi->fdt, "/timer", "interrupts",
358 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_S_EL1_IRQ, irqflags,
359 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL1_IRQ, irqflags,
360 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_VIRT_IRQ, irqflags,
361 GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL2_IRQ, irqflags);
362}
363
364static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi)
365{
366 int cpu;
367 int addr_cells = 1;
368 unsigned int i;
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383 for (cpu = 0; cpu < vbi->smp_cpus; cpu++) {
384 ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
385
386 if (armcpu->mp_affinity & ARM_AFF3_MASK) {
387 addr_cells = 2;
388 break;
389 }
390 }
391
392 qemu_fdt_add_subnode(vbi->fdt, "/cpus");
393 qemu_fdt_setprop_cell(vbi->fdt, "/cpus", "#address-cells", addr_cells);
394 qemu_fdt_setprop_cell(vbi->fdt, "/cpus", "#size-cells", 0x0);
395
396 for (cpu = vbi->smp_cpus - 1; cpu >= 0; cpu--) {
397 char *nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
398 ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
399
400 qemu_fdt_add_subnode(vbi->fdt, nodename);
401 qemu_fdt_setprop_string(vbi->fdt, nodename, "device_type", "cpu");
402 qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible",
403 armcpu->dtb_compatible);
404
405 if (vbi->using_psci && vbi->smp_cpus > 1) {
406 qemu_fdt_setprop_string(vbi->fdt, nodename,
407 "enable-method", "psci");
408 }
409
410 if (addr_cells == 2) {
411 qemu_fdt_setprop_u64(vbi->fdt, nodename, "reg",
412 armcpu->mp_affinity);
413 } else {
414 qemu_fdt_setprop_cell(vbi->fdt, nodename, "reg",
415 armcpu->mp_affinity);
416 }
417
418 i = numa_get_node_for_cpu(cpu);
419 if (i < nb_numa_nodes) {
420 qemu_fdt_setprop_cell(vbi->fdt, nodename, "numa-node-id", i);
421 }
422
423 g_free(nodename);
424 }
425}
426
427static void fdt_add_its_gic_node(VirtBoardInfo *vbi)
428{
429 vbi->msi_phandle = qemu_fdt_alloc_phandle(vbi->fdt);
430 qemu_fdt_add_subnode(vbi->fdt, "/intc/its");
431 qemu_fdt_setprop_string(vbi->fdt, "/intc/its", "compatible",
432 "arm,gic-v3-its");
433 qemu_fdt_setprop(vbi->fdt, "/intc/its", "msi-controller", NULL, 0);
434 qemu_fdt_setprop_sized_cells(vbi->fdt, "/intc/its", "reg",
435 2, vbi->memmap[VIRT_GIC_ITS].base,
436 2, vbi->memmap[VIRT_GIC_ITS].size);
437 qemu_fdt_setprop_cell(vbi->fdt, "/intc/its", "phandle", vbi->msi_phandle);
438}
439
440static void fdt_add_v2m_gic_node(VirtBoardInfo *vbi)
441{
442 vbi->msi_phandle = qemu_fdt_alloc_phandle(vbi->fdt);
443 qemu_fdt_add_subnode(vbi->fdt, "/intc/v2m");
444 qemu_fdt_setprop_string(vbi->fdt, "/intc/v2m", "compatible",
445 "arm,gic-v2m-frame");
446 qemu_fdt_setprop(vbi->fdt, "/intc/v2m", "msi-controller", NULL, 0);
447 qemu_fdt_setprop_sized_cells(vbi->fdt, "/intc/v2m", "reg",
448 2, vbi->memmap[VIRT_GIC_V2M].base,
449 2, vbi->memmap[VIRT_GIC_V2M].size);
450 qemu_fdt_setprop_cell(vbi->fdt, "/intc/v2m", "phandle", vbi->msi_phandle);
451}
452
453static void fdt_add_gic_node(VirtBoardInfo *vbi, int type)
454{
455 vbi->gic_phandle = qemu_fdt_alloc_phandle(vbi->fdt);
456 qemu_fdt_setprop_cell(vbi->fdt, "/", "interrupt-parent", vbi->gic_phandle);
457
458 qemu_fdt_add_subnode(vbi->fdt, "/intc");
459 qemu_fdt_setprop_cell(vbi->fdt, "/intc", "#interrupt-cells", 3);
460 qemu_fdt_setprop(vbi->fdt, "/intc", "interrupt-controller", NULL, 0);
461 qemu_fdt_setprop_cell(vbi->fdt, "/intc", "#address-cells", 0x2);
462 qemu_fdt_setprop_cell(vbi->fdt, "/intc", "#size-cells", 0x2);
463 qemu_fdt_setprop(vbi->fdt, "/intc", "ranges", NULL, 0);
464 if (type == 3) {
465 qemu_fdt_setprop_string(vbi->fdt, "/intc", "compatible",
466 "arm,gic-v3");
467 qemu_fdt_setprop_sized_cells(vbi->fdt, "/intc", "reg",
468 2, vbi->memmap[VIRT_GIC_DIST].base,
469 2, vbi->memmap[VIRT_GIC_DIST].size,
470 2, vbi->memmap[VIRT_GIC_REDIST].base,
471 2, vbi->memmap[VIRT_GIC_REDIST].size);
472 } else {
473
474 qemu_fdt_setprop_string(vbi->fdt, "/intc", "compatible",
475 "arm,cortex-a15-gic");
476 qemu_fdt_setprop_sized_cells(vbi->fdt, "/intc", "reg",
477 2, vbi->memmap[VIRT_GIC_DIST].base,
478 2, vbi->memmap[VIRT_GIC_DIST].size,
479 2, vbi->memmap[VIRT_GIC_CPU].base,
480 2, vbi->memmap[VIRT_GIC_CPU].size);
481 }
482
483 qemu_fdt_setprop_cell(vbi->fdt, "/intc", "phandle", vbi->gic_phandle);
484}
485
486static void fdt_add_pmu_nodes(const VirtBoardInfo *vbi, int gictype)
487{
488 CPUState *cpu;
489 ARMCPU *armcpu;
490 uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
491
492 CPU_FOREACH(cpu) {
493 armcpu = ARM_CPU(cpu);
494 if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU) ||
495 !kvm_arm_pmu_create(cpu, PPI(VIRTUAL_PMU_IRQ))) {
496 return;
497 }
498 }
499
500 if (gictype == 2) {
501 irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
502 GIC_FDT_IRQ_PPI_CPU_WIDTH,
503 (1 << vbi->smp_cpus) - 1);
504 }
505
506 armcpu = ARM_CPU(qemu_get_cpu(0));
507 qemu_fdt_add_subnode(vbi->fdt, "/pmu");
508 if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) {
509 const char compat[] = "arm,armv8-pmuv3";
510 qemu_fdt_setprop(vbi->fdt, "/pmu", "compatible",
511 compat, sizeof(compat));
512 qemu_fdt_setprop_cells(vbi->fdt, "/pmu", "interrupts",
513 GIC_FDT_IRQ_TYPE_PPI, VIRTUAL_PMU_IRQ, irqflags);
514 }
515}
516
517static void create_its(VirtBoardInfo *vbi, DeviceState *gicdev)
518{
519 const char *itsclass = its_class_name();
520 DeviceState *dev;
521
522 if (!itsclass) {
523
524 return;
525 }
526
527 dev = qdev_create(NULL, itsclass);
528
529 object_property_set_link(OBJECT(dev), OBJECT(gicdev), "parent-gicv3",
530 &error_abort);
531 qdev_init_nofail(dev);
532 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vbi->memmap[VIRT_GIC_ITS].base);
533
534 fdt_add_its_gic_node(vbi);
535}
536
537static void create_v2m(VirtBoardInfo *vbi, qemu_irq *pic)
538{
539 int i;
540 int irq = vbi->irqmap[VIRT_GIC_V2M];
541 DeviceState *dev;
542
543 dev = qdev_create(NULL, "arm-gicv2m");
544 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vbi->memmap[VIRT_GIC_V2M].base);
545 qdev_prop_set_uint32(dev, "base-spi", irq);
546 qdev_prop_set_uint32(dev, "num-spi", NUM_GICV2M_SPIS);
547 qdev_init_nofail(dev);
548
549 for (i = 0; i < NUM_GICV2M_SPIS; i++) {
550 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
551 }
552
553 fdt_add_v2m_gic_node(vbi);
554}
555
556static void create_gic(VirtBoardInfo *vbi, qemu_irq *pic, int type,
557 bool secure, bool no_its)
558{
559
560 DeviceState *gicdev;
561 SysBusDevice *gicbusdev;
562 const char *gictype;
563 int i;
564
565 gictype = (type == 3) ? gicv3_class_name() : gic_class_name();
566
567 gicdev = qdev_create(NULL, gictype);
568 qdev_prop_set_uint32(gicdev, "revision", type);
569 qdev_prop_set_uint32(gicdev, "num-cpu", smp_cpus);
570
571
572
573 qdev_prop_set_uint32(gicdev, "num-irq", NUM_IRQS + 32);
574 if (!kvm_irqchip_in_kernel()) {
575 qdev_prop_set_bit(gicdev, "has-security-extensions", secure);
576 }
577 qdev_init_nofail(gicdev);
578 gicbusdev = SYS_BUS_DEVICE(gicdev);
579 sysbus_mmio_map(gicbusdev, 0, vbi->memmap[VIRT_GIC_DIST].base);
580 if (type == 3) {
581 sysbus_mmio_map(gicbusdev, 1, vbi->memmap[VIRT_GIC_REDIST].base);
582 } else {
583 sysbus_mmio_map(gicbusdev, 1, vbi->memmap[VIRT_GIC_CPU].base);
584 }
585
586
587
588
589
590 for (i = 0; i < smp_cpus; i++) {
591 DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
592 int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
593 int irq;
594
595
596
597 const int timer_irq[] = {
598 [GTIMER_PHYS] = ARCH_TIMER_NS_EL1_IRQ,
599 [GTIMER_VIRT] = ARCH_TIMER_VIRT_IRQ,
600 [GTIMER_HYP] = ARCH_TIMER_NS_EL2_IRQ,
601 [GTIMER_SEC] = ARCH_TIMER_S_EL1_IRQ,
602 };
603
604 for (irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
605 qdev_connect_gpio_out(cpudev, irq,
606 qdev_get_gpio_in(gicdev,
607 ppibase + timer_irq[irq]));
608 }
609
610 sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
611 sysbus_connect_irq(gicbusdev, i + smp_cpus,
612 qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
613 }
614
615 for (i = 0; i < NUM_IRQS; i++) {
616 pic[i] = qdev_get_gpio_in(gicdev, i);
617 }
618
619 fdt_add_gic_node(vbi, type);
620
621 if (type == 3 && !no_its) {
622 create_its(vbi, gicdev);
623 } else if (type == 2) {
624 create_v2m(vbi, pic);
625 }
626}
627
628static void create_uart(const VirtBoardInfo *vbi, qemu_irq *pic, int uart,
629 MemoryRegion *mem, CharDriverState *chr)
630{
631 char *nodename;
632 hwaddr base = vbi->memmap[uart].base;
633 hwaddr size = vbi->memmap[uart].size;
634 int irq = vbi->irqmap[uart];
635 const char compat[] = "arm,pl011\0arm,primecell";
636 const char clocknames[] = "uartclk\0apb_pclk";
637 DeviceState *dev = qdev_create(NULL, "pl011");
638 SysBusDevice *s = SYS_BUS_DEVICE(dev);
639
640 qdev_prop_set_chr(dev, "chardev", chr);
641 qdev_init_nofail(dev);
642 memory_region_add_subregion(mem, base,
643 sysbus_mmio_get_region(s, 0));
644 sysbus_connect_irq(s, 0, pic[irq]);
645
646 nodename = g_strdup_printf("/pl011@%" PRIx64, base);
647 qemu_fdt_add_subnode(vbi->fdt, nodename);
648
649 qemu_fdt_setprop(vbi->fdt, nodename, "compatible",
650 compat, sizeof(compat));
651 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
652 2, base, 2, size);
653 qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupts",
654 GIC_FDT_IRQ_TYPE_SPI, irq,
655 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
656 qemu_fdt_setprop_cells(vbi->fdt, nodename, "clocks",
657 vbi->clock_phandle, vbi->clock_phandle);
658 qemu_fdt_setprop(vbi->fdt, nodename, "clock-names",
659 clocknames, sizeof(clocknames));
660
661 if (uart == VIRT_UART) {
662 qemu_fdt_setprop_string(vbi->fdt, "/chosen", "stdout-path", nodename);
663 } else {
664
665 qemu_fdt_setprop_string(vbi->fdt, nodename, "status", "disabled");
666 qemu_fdt_setprop_string(vbi->fdt, nodename, "secure-status", "okay");
667 }
668
669 g_free(nodename);
670}
671
672static void create_rtc(const VirtBoardInfo *vbi, qemu_irq *pic)
673{
674 char *nodename;
675 hwaddr base = vbi->memmap[VIRT_RTC].base;
676 hwaddr size = vbi->memmap[VIRT_RTC].size;
677 int irq = vbi->irqmap[VIRT_RTC];
678 const char compat[] = "arm,pl031\0arm,primecell";
679
680 sysbus_create_simple("pl031", base, pic[irq]);
681
682 nodename = g_strdup_printf("/pl031@%" PRIx64, base);
683 qemu_fdt_add_subnode(vbi->fdt, nodename);
684 qemu_fdt_setprop(vbi->fdt, nodename, "compatible", compat, sizeof(compat));
685 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
686 2, base, 2, size);
687 qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupts",
688 GIC_FDT_IRQ_TYPE_SPI, irq,
689 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
690 qemu_fdt_setprop_cell(vbi->fdt, nodename, "clocks", vbi->clock_phandle);
691 qemu_fdt_setprop_string(vbi->fdt, nodename, "clock-names", "apb_pclk");
692 g_free(nodename);
693}
694
695static DeviceState *gpio_key_dev;
696static void virt_powerdown_req(Notifier *n, void *opaque)
697{
698
699 qemu_set_irq(qdev_get_gpio_in(gpio_key_dev, 0), 1);
700}
701
702static Notifier virt_system_powerdown_notifier = {
703 .notify = virt_powerdown_req
704};
705
706static void create_gpio(const VirtBoardInfo *vbi, qemu_irq *pic)
707{
708 char *nodename;
709 DeviceState *pl061_dev;
710 hwaddr base = vbi->memmap[VIRT_GPIO].base;
711 hwaddr size = vbi->memmap[VIRT_GPIO].size;
712 int irq = vbi->irqmap[VIRT_GPIO];
713 const char compat[] = "arm,pl061\0arm,primecell";
714
715 pl061_dev = sysbus_create_simple("pl061", base, pic[irq]);
716
717 uint32_t phandle = qemu_fdt_alloc_phandle(vbi->fdt);
718 nodename = g_strdup_printf("/pl061@%" PRIx64, base);
719 qemu_fdt_add_subnode(vbi->fdt, nodename);
720 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
721 2, base, 2, size);
722 qemu_fdt_setprop(vbi->fdt, nodename, "compatible", compat, sizeof(compat));
723 qemu_fdt_setprop_cell(vbi->fdt, nodename, "#gpio-cells", 2);
724 qemu_fdt_setprop(vbi->fdt, nodename, "gpio-controller", NULL, 0);
725 qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupts",
726 GIC_FDT_IRQ_TYPE_SPI, irq,
727 GIC_FDT_IRQ_FLAGS_LEVEL_HI);
728 qemu_fdt_setprop_cell(vbi->fdt, nodename, "clocks", vbi->clock_phandle);
729 qemu_fdt_setprop_string(vbi->fdt, nodename, "clock-names", "apb_pclk");
730 qemu_fdt_setprop_cell(vbi->fdt, nodename, "phandle", phandle);
731
732 gpio_key_dev = sysbus_create_simple("gpio-key", -1,
733 qdev_get_gpio_in(pl061_dev, 3));
734 qemu_fdt_add_subnode(vbi->fdt, "/gpio-keys");
735 qemu_fdt_setprop_string(vbi->fdt, "/gpio-keys", "compatible", "gpio-keys");
736 qemu_fdt_setprop_cell(vbi->fdt, "/gpio-keys", "#size-cells", 0);
737 qemu_fdt_setprop_cell(vbi->fdt, "/gpio-keys", "#address-cells", 1);
738
739 qemu_fdt_add_subnode(vbi->fdt, "/gpio-keys/poweroff");
740 qemu_fdt_setprop_string(vbi->fdt, "/gpio-keys/poweroff",
741 "label", "GPIO Key Poweroff");
742 qemu_fdt_setprop_cell(vbi->fdt, "/gpio-keys/poweroff", "linux,code",
743 KEY_POWER);
744 qemu_fdt_setprop_cells(vbi->fdt, "/gpio-keys/poweroff",
745 "gpios", phandle, 3, 0);
746
747
748 qemu_register_powerdown_notifier(&virt_system_powerdown_notifier);
749
750 g_free(nodename);
751}
752
753static void create_virtio_devices(const VirtBoardInfo *vbi, qemu_irq *pic)
754{
755 int i;
756 hwaddr size = vbi->memmap[VIRT_MMIO].size;
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785 for (i = 0; i < NUM_VIRTIO_TRANSPORTS; i++) {
786 int irq = vbi->irqmap[VIRT_MMIO] + i;
787 hwaddr base = vbi->memmap[VIRT_MMIO].base + i * size;
788
789 sysbus_create_simple("virtio-mmio", base, pic[irq]);
790 }
791
792
793
794
795
796
797
798
799 for (i = NUM_VIRTIO_TRANSPORTS - 1; i >= 0; i--) {
800 char *nodename;
801 int irq = vbi->irqmap[VIRT_MMIO] + i;
802 hwaddr base = vbi->memmap[VIRT_MMIO].base + i * size;
803
804 nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
805 qemu_fdt_add_subnode(vbi->fdt, nodename);
806 qemu_fdt_setprop_string(vbi->fdt, nodename,
807 "compatible", "virtio,mmio");
808 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
809 2, base, 2, size);
810 qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupts",
811 GIC_FDT_IRQ_TYPE_SPI, irq,
812 GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
813 g_free(nodename);
814 }
815}
816
817static void create_one_flash(const char *name, hwaddr flashbase,
818 hwaddr flashsize, const char *file,
819 MemoryRegion *sysmem)
820{
821
822
823
824 DriveInfo *dinfo = drive_get_next(IF_PFLASH);
825 DeviceState *dev = qdev_create(NULL, "cfi.pflash01");
826 SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
827 const uint64_t sectorlength = 256 * 1024;
828
829 if (dinfo) {
830 qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo),
831 &error_abort);
832 }
833
834 qdev_prop_set_uint32(dev, "num-blocks", flashsize / sectorlength);
835 qdev_prop_set_uint64(dev, "sector-length", sectorlength);
836 qdev_prop_set_uint8(dev, "width", 4);
837 qdev_prop_set_uint8(dev, "device-width", 2);
838 qdev_prop_set_bit(dev, "big-endian", false);
839 qdev_prop_set_uint16(dev, "id0", 0x89);
840 qdev_prop_set_uint16(dev, "id1", 0x18);
841 qdev_prop_set_uint16(dev, "id2", 0x00);
842 qdev_prop_set_uint16(dev, "id3", 0x00);
843 qdev_prop_set_string(dev, "name", name);
844 qdev_init_nofail(dev);
845
846 memory_region_add_subregion(sysmem, flashbase,
847 sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
848
849 if (file) {
850 char *fn;
851 int image_size;
852
853 if (drive_get(IF_PFLASH, 0, 0)) {
854 error_report("The contents of the first flash device may be "
855 "specified with -bios or with -drive if=pflash... "
856 "but you cannot use both options at once");
857 exit(1);
858 }
859 fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, file);
860 if (!fn) {
861 error_report("Could not find ROM image '%s'", file);
862 exit(1);
863 }
864 image_size = load_image_mr(fn, sysbus_mmio_get_region(sbd, 0));
865 g_free(fn);
866 if (image_size < 0) {
867 error_report("Could not load ROM image '%s'", file);
868 exit(1);
869 }
870 }
871}
872
873static void create_flash(const VirtBoardInfo *vbi,
874 MemoryRegion *sysmem,
875 MemoryRegion *secure_sysmem)
876{
877
878
879
880
881
882
883
884
885 hwaddr flashsize = vbi->memmap[VIRT_FLASH].size / 2;
886 hwaddr flashbase = vbi->memmap[VIRT_FLASH].base;
887 char *nodename;
888
889 create_one_flash("virt.flash0", flashbase, flashsize,
890 bios_name, secure_sysmem);
891 create_one_flash("virt.flash1", flashbase + flashsize, flashsize,
892 NULL, sysmem);
893
894 if (sysmem == secure_sysmem) {
895
896 nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
897 qemu_fdt_add_subnode(vbi->fdt, nodename);
898 qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible", "cfi-flash");
899 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
900 2, flashbase, 2, flashsize,
901 2, flashbase + flashsize, 2, flashsize);
902 qemu_fdt_setprop_cell(vbi->fdt, nodename, "bank-width", 4);
903 g_free(nodename);
904 } else {
905
906
907
908 nodename = g_strdup_printf("/secflash@%" PRIx64, flashbase);
909 qemu_fdt_add_subnode(vbi->fdt, nodename);
910 qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible", "cfi-flash");
911 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
912 2, flashbase, 2, flashsize);
913 qemu_fdt_setprop_cell(vbi->fdt, nodename, "bank-width", 4);
914 qemu_fdt_setprop_string(vbi->fdt, nodename, "status", "disabled");
915 qemu_fdt_setprop_string(vbi->fdt, nodename, "secure-status", "okay");
916 g_free(nodename);
917
918 nodename = g_strdup_printf("/flash@%" PRIx64, flashbase);
919 qemu_fdt_add_subnode(vbi->fdt, nodename);
920 qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible", "cfi-flash");
921 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
922 2, flashbase + flashsize, 2, flashsize);
923 qemu_fdt_setprop_cell(vbi->fdt, nodename, "bank-width", 4);
924 g_free(nodename);
925 }
926}
927
928static void create_fw_cfg(const VirtBoardInfo *vbi, AddressSpace *as)
929{
930 hwaddr base = vbi->memmap[VIRT_FW_CFG].base;
931 hwaddr size = vbi->memmap[VIRT_FW_CFG].size;
932 FWCfgState *fw_cfg;
933 char *nodename;
934
935 fw_cfg = fw_cfg_init_mem_wide(base + 8, base, 8, base + 16, as);
936 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
937
938 nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base);
939 qemu_fdt_add_subnode(vbi->fdt, nodename);
940 qemu_fdt_setprop_string(vbi->fdt, nodename,
941 "compatible", "qemu,fw-cfg-mmio");
942 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
943 2, base, 2, size);
944 g_free(nodename);
945}
946
947static void create_pcie_irq_map(const VirtBoardInfo *vbi, uint32_t gic_phandle,
948 int first_irq, const char *nodename)
949{
950 int devfn, pin;
951 uint32_t full_irq_map[4 * 4 * 10] = { 0 };
952 uint32_t *irq_map = full_irq_map;
953
954 for (devfn = 0; devfn <= 0x18; devfn += 0x8) {
955 for (pin = 0; pin < 4; pin++) {
956 int irq_type = GIC_FDT_IRQ_TYPE_SPI;
957 int irq_nr = first_irq + ((pin + PCI_SLOT(devfn)) % PCI_NUM_PINS);
958 int irq_level = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
959 int i;
960
961 uint32_t map[] = {
962 devfn << 8, 0, 0,
963 pin + 1,
964 gic_phandle, 0, 0, irq_type, irq_nr, irq_level };
965
966
967 for (i = 0; i < 10; i++) {
968 irq_map[i] = cpu_to_be32(map[i]);
969 }
970 irq_map += 10;
971 }
972 }
973
974 qemu_fdt_setprop(vbi->fdt, nodename, "interrupt-map",
975 full_irq_map, sizeof(full_irq_map));
976
977 qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupt-map-mask",
978 0x1800, 0, 0,
979 0x7 );
980}
981
982static void create_pcie(const VirtBoardInfo *vbi, qemu_irq *pic,
983 bool use_highmem)
984{
985 hwaddr base_mmio = vbi->memmap[VIRT_PCIE_MMIO].base;
986 hwaddr size_mmio = vbi->memmap[VIRT_PCIE_MMIO].size;
987 hwaddr base_mmio_high = vbi->memmap[VIRT_PCIE_MMIO_HIGH].base;
988 hwaddr size_mmio_high = vbi->memmap[VIRT_PCIE_MMIO_HIGH].size;
989 hwaddr base_pio = vbi->memmap[VIRT_PCIE_PIO].base;
990 hwaddr size_pio = vbi->memmap[VIRT_PCIE_PIO].size;
991 hwaddr base_ecam = vbi->memmap[VIRT_PCIE_ECAM].base;
992 hwaddr size_ecam = vbi->memmap[VIRT_PCIE_ECAM].size;
993 hwaddr base = base_mmio;
994 int nr_pcie_buses = size_ecam / PCIE_MMCFG_SIZE_MIN;
995 int irq = vbi->irqmap[VIRT_PCIE];
996 MemoryRegion *mmio_alias;
997 MemoryRegion *mmio_reg;
998 MemoryRegion *ecam_alias;
999 MemoryRegion *ecam_reg;
1000 DeviceState *dev;
1001 char *nodename;
1002 int i;
1003 PCIHostState *pci;
1004
1005 dev = qdev_create(NULL, TYPE_GPEX_HOST);
1006 qdev_init_nofail(dev);
1007
1008
1009 ecam_alias = g_new0(MemoryRegion, 1);
1010 ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
1011 memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam",
1012 ecam_reg, 0, size_ecam);
1013 memory_region_add_subregion(get_system_memory(), base_ecam, ecam_alias);
1014
1015
1016
1017
1018
1019
1020 mmio_alias = g_new0(MemoryRegion, 1);
1021 mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
1022 memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio",
1023 mmio_reg, base_mmio, size_mmio);
1024 memory_region_add_subregion(get_system_memory(), base_mmio, mmio_alias);
1025
1026 if (use_highmem) {
1027
1028 MemoryRegion *high_mmio_alias = g_new0(MemoryRegion, 1);
1029
1030 memory_region_init_alias(high_mmio_alias, OBJECT(dev), "pcie-mmio-high",
1031 mmio_reg, base_mmio_high, size_mmio_high);
1032 memory_region_add_subregion(get_system_memory(), base_mmio_high,
1033 high_mmio_alias);
1034 }
1035
1036
1037 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, base_pio);
1038
1039 for (i = 0; i < GPEX_NUM_IRQS; i++) {
1040 sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
1041 }
1042
1043 pci = PCI_HOST_BRIDGE(dev);
1044 if (pci->bus) {
1045 for (i = 0; i < nb_nics; i++) {
1046 NICInfo *nd = &nd_table[i];
1047
1048 if (!nd->model) {
1049 nd->model = g_strdup("virtio");
1050 }
1051
1052 pci_nic_init_nofail(nd, pci->bus, nd->model, NULL);
1053 }
1054 }
1055
1056 nodename = g_strdup_printf("/pcie@%" PRIx64, base);
1057 qemu_fdt_add_subnode(vbi->fdt, nodename);
1058 qemu_fdt_setprop_string(vbi->fdt, nodename,
1059 "compatible", "pci-host-ecam-generic");
1060 qemu_fdt_setprop_string(vbi->fdt, nodename, "device_type", "pci");
1061 qemu_fdt_setprop_cell(vbi->fdt, nodename, "#address-cells", 3);
1062 qemu_fdt_setprop_cell(vbi->fdt, nodename, "#size-cells", 2);
1063 qemu_fdt_setprop_cells(vbi->fdt, nodename, "bus-range", 0,
1064 nr_pcie_buses - 1);
1065 qemu_fdt_setprop(vbi->fdt, nodename, "dma-coherent", NULL, 0);
1066
1067 if (vbi->msi_phandle) {
1068 qemu_fdt_setprop_cells(vbi->fdt, nodename, "msi-parent",
1069 vbi->msi_phandle);
1070 }
1071
1072 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
1073 2, base_ecam, 2, size_ecam);
1074
1075 if (use_highmem) {
1076 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "ranges",
1077 1, FDT_PCI_RANGE_IOPORT, 2, 0,
1078 2, base_pio, 2, size_pio,
1079 1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
1080 2, base_mmio, 2, size_mmio,
1081 1, FDT_PCI_RANGE_MMIO_64BIT,
1082 2, base_mmio_high,
1083 2, base_mmio_high, 2, size_mmio_high);
1084 } else {
1085 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "ranges",
1086 1, FDT_PCI_RANGE_IOPORT, 2, 0,
1087 2, base_pio, 2, size_pio,
1088 1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
1089 2, base_mmio, 2, size_mmio);
1090 }
1091
1092 qemu_fdt_setprop_cell(vbi->fdt, nodename, "#interrupt-cells", 1);
1093 create_pcie_irq_map(vbi, vbi->gic_phandle, irq, nodename);
1094
1095 g_free(nodename);
1096}
1097
1098static void create_platform_bus(VirtBoardInfo *vbi, qemu_irq *pic)
1099{
1100 DeviceState *dev;
1101 SysBusDevice *s;
1102 int i;
1103 ARMPlatformBusFDTParams *fdt_params = g_new(ARMPlatformBusFDTParams, 1);
1104 MemoryRegion *sysmem = get_system_memory();
1105
1106 platform_bus_params.platform_bus_base = vbi->memmap[VIRT_PLATFORM_BUS].base;
1107 platform_bus_params.platform_bus_size = vbi->memmap[VIRT_PLATFORM_BUS].size;
1108 platform_bus_params.platform_bus_first_irq = vbi->irqmap[VIRT_PLATFORM_BUS];
1109 platform_bus_params.platform_bus_num_irqs = PLATFORM_BUS_NUM_IRQS;
1110
1111 fdt_params->system_params = &platform_bus_params;
1112 fdt_params->binfo = &vbi->bootinfo;
1113 fdt_params->intc = "/intc";
1114
1115
1116
1117
1118 arm_register_platform_bus_fdt_creator(fdt_params);
1119
1120 dev = qdev_create(NULL, TYPE_PLATFORM_BUS_DEVICE);
1121 dev->id = TYPE_PLATFORM_BUS_DEVICE;
1122 qdev_prop_set_uint32(dev, "num_irqs",
1123 platform_bus_params.platform_bus_num_irqs);
1124 qdev_prop_set_uint32(dev, "mmio_size",
1125 platform_bus_params.platform_bus_size);
1126 qdev_init_nofail(dev);
1127 s = SYS_BUS_DEVICE(dev);
1128
1129 for (i = 0; i < platform_bus_params.platform_bus_num_irqs; i++) {
1130 int irqn = platform_bus_params.platform_bus_first_irq + i;
1131 sysbus_connect_irq(s, i, pic[irqn]);
1132 }
1133
1134 memory_region_add_subregion(sysmem,
1135 platform_bus_params.platform_bus_base,
1136 sysbus_mmio_get_region(s, 0));
1137}
1138
1139static void create_secure_ram(VirtBoardInfo *vbi, MemoryRegion *secure_sysmem)
1140{
1141 MemoryRegion *secram = g_new(MemoryRegion, 1);
1142 char *nodename;
1143 hwaddr base = vbi->memmap[VIRT_SECURE_MEM].base;
1144 hwaddr size = vbi->memmap[VIRT_SECURE_MEM].size;
1145
1146 memory_region_init_ram(secram, NULL, "virt.secure-ram", size, &error_fatal);
1147 vmstate_register_ram_global(secram);
1148 memory_region_add_subregion(secure_sysmem, base, secram);
1149
1150 nodename = g_strdup_printf("/secram@%" PRIx64, base);
1151 qemu_fdt_add_subnode(vbi->fdt, nodename);
1152 qemu_fdt_setprop_string(vbi->fdt, nodename, "device_type", "memory");
1153 qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg", 2, base, 2, size);
1154 qemu_fdt_setprop_string(vbi->fdt, nodename, "status", "disabled");
1155 qemu_fdt_setprop_string(vbi->fdt, nodename, "secure-status", "okay");
1156
1157 g_free(nodename);
1158}
1159
1160static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
1161{
1162 const VirtBoardInfo *board = (const VirtBoardInfo *)binfo;
1163
1164 *fdt_size = board->fdt_size;
1165 return board->fdt;
1166}
1167
1168static void virt_build_smbios(VirtGuestInfo *guest_info)
1169{
1170 FWCfgState *fw_cfg = guest_info->fw_cfg;
1171 uint8_t *smbios_tables, *smbios_anchor;
1172 size_t smbios_tables_len, smbios_anchor_len;
1173 const char *product = "QEMU Virtual Machine";
1174
1175 if (!fw_cfg) {
1176 return;
1177 }
1178
1179 if (kvm_enabled()) {
1180 product = "KVM Virtual Machine";
1181 }
1182
1183 smbios_set_defaults("QEMU", product,
1184 "1.0", false, true, SMBIOS_ENTRY_POINT_30);
1185
1186 smbios_get_tables(NULL, 0, &smbios_tables, &smbios_tables_len,
1187 &smbios_anchor, &smbios_anchor_len);
1188
1189 if (smbios_anchor) {
1190 fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-tables",
1191 smbios_tables, smbios_tables_len);
1192 fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-anchor",
1193 smbios_anchor, smbios_anchor_len);
1194 }
1195}
1196
1197static
1198void virt_guest_info_machine_done(Notifier *notifier, void *data)
1199{
1200 VirtGuestInfoState *guest_info_state = container_of(notifier,
1201 VirtGuestInfoState, machine_done);
1202 virt_acpi_setup(&guest_info_state->info);
1203 virt_build_smbios(&guest_info_state->info);
1204}
1205
1206static void machvirt_init(MachineState *machine)
1207{
1208 VirtMachineState *vms = VIRT_MACHINE(machine);
1209 VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(machine);
1210 qemu_irq pic[NUM_IRQS];
1211 MemoryRegion *sysmem = get_system_memory();
1212 MemoryRegion *secure_sysmem = NULL;
1213 int gic_version = vms->gic_version;
1214 int n, virt_max_cpus;
1215 MemoryRegion *ram = g_new(MemoryRegion, 1);
1216 const char *cpu_model = machine->cpu_model;
1217 VirtBoardInfo *vbi;
1218 VirtGuestInfoState *guest_info_state = g_malloc0(sizeof *guest_info_state);
1219 VirtGuestInfo *guest_info = &guest_info_state->info;
1220 char **cpustr;
1221 ObjectClass *oc;
1222 const char *typename;
1223 CPUClass *cc;
1224 Error *err = NULL;
1225 bool firmware_loaded = bios_name || drive_get(IF_PFLASH, 0, 0);
1226 uint8_t clustersz;
1227
1228 if (!cpu_model) {
1229 cpu_model = "cortex-a15";
1230 }
1231
1232
1233
1234
1235 if (!gic_version) {
1236 if (!kvm_enabled()) {
1237 error_report("gic-version=host requires KVM");
1238 exit(1);
1239 }
1240
1241 gic_version = kvm_arm_vgic_probe();
1242 if (!gic_version) {
1243 error_report("Unable to determine GIC version supported by host");
1244 exit(1);
1245 }
1246 }
1247
1248
1249 cpustr = g_strsplit(cpu_model, ",", 2);
1250
1251 vbi = find_machine_info(cpustr[0]);
1252
1253 if (!vbi) {
1254 error_report("mach-virt: CPU %s not supported", cpustr[0]);
1255 exit(1);
1256 }
1257
1258
1259
1260
1261
1262
1263
1264
1265 vbi->using_psci = !(vms->secure && firmware_loaded);
1266
1267
1268
1269
1270 if (gic_version == 3) {
1271 virt_max_cpus = vbi->memmap[VIRT_GIC_REDIST].size / 0x20000;
1272 clustersz = GICV3_TARGETLIST_BITS;
1273 } else {
1274 virt_max_cpus = GIC_NCPU;
1275 clustersz = GIC_TARGETLIST_BITS;
1276 }
1277
1278 if (max_cpus > virt_max_cpus) {
1279 error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
1280 "supported by machine 'mach-virt' (%d)",
1281 max_cpus, virt_max_cpus);
1282 exit(1);
1283 }
1284
1285 vbi->smp_cpus = smp_cpus;
1286
1287 if (machine->ram_size > vbi->memmap[VIRT_MEM].size) {
1288 error_report("mach-virt: cannot model more than %dGB RAM", RAMLIMIT_GB);
1289 exit(1);
1290 }
1291
1292 if (vms->secure) {
1293 if (kvm_enabled()) {
1294 error_report("mach-virt: KVM does not support Security extensions");
1295 exit(1);
1296 }
1297
1298
1299
1300
1301
1302
1303 secure_sysmem = g_new(MemoryRegion, 1);
1304 memory_region_init(secure_sysmem, OBJECT(machine), "secure-memory",
1305 UINT64_MAX);
1306 memory_region_add_subregion_overlap(secure_sysmem, 0, sysmem, -1);
1307 }
1308
1309 create_fdt(vbi);
1310
1311 oc = cpu_class_by_name(TYPE_ARM_CPU, cpustr[0]);
1312 if (!oc) {
1313 error_report("Unable to find CPU definition");
1314 exit(1);
1315 }
1316 typename = object_class_get_name(oc);
1317
1318
1319 cc = CPU_CLASS(oc);
1320 cc->parse_features(typename, cpustr[1], &err);
1321 g_strfreev(cpustr);
1322 if (err) {
1323 error_report_err(err);
1324 exit(1);
1325 }
1326
1327 for (n = 0; n < smp_cpus; n++) {
1328 Object *cpuobj = object_new(typename);
1329 if (!vmc->disallow_affinity_adjustment) {
1330
1331
1332
1333
1334
1335
1336
1337
1338 uint8_t aff1 = n / clustersz;
1339 uint8_t aff0 = n % clustersz;
1340 object_property_set_int(cpuobj, (aff1 << ARM_AFF1_SHIFT) | aff0,
1341 "mp-affinity", NULL);
1342 }
1343
1344 if (!vms->secure) {
1345 object_property_set_bool(cpuobj, false, "has_el3", NULL);
1346 }
1347
1348 if (vbi->using_psci) {
1349 object_property_set_int(cpuobj, QEMU_PSCI_CONDUIT_HVC,
1350 "psci-conduit", NULL);
1351
1352
1353 if (n > 0) {
1354 object_property_set_bool(cpuobj, true,
1355 "start-powered-off", NULL);
1356 }
1357 }
1358
1359 if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
1360 object_property_set_bool(cpuobj, false, "pmu", NULL);
1361 }
1362
1363 if (object_property_find(cpuobj, "reset-cbar", NULL)) {
1364 object_property_set_int(cpuobj, vbi->memmap[VIRT_CPUPERIPHS].base,
1365 "reset-cbar", &error_abort);
1366 }
1367
1368 object_property_set_link(cpuobj, OBJECT(sysmem), "memory",
1369 &error_abort);
1370 if (vms->secure) {
1371 object_property_set_link(cpuobj, OBJECT(secure_sysmem),
1372 "secure-memory", &error_abort);
1373 }
1374
1375 object_property_set_bool(cpuobj, true, "realized", NULL);
1376 }
1377 fdt_add_timer_nodes(vbi, gic_version);
1378 fdt_add_cpu_nodes(vbi);
1379 fdt_add_psci_node(vbi);
1380
1381 memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram",
1382 machine->ram_size);
1383 memory_region_add_subregion(sysmem, vbi->memmap[VIRT_MEM].base, ram);
1384
1385 create_flash(vbi, sysmem, secure_sysmem ? secure_sysmem : sysmem);
1386
1387 create_gic(vbi, pic, gic_version, vms->secure, vmc->no_its);
1388
1389 fdt_add_pmu_nodes(vbi, gic_version);
1390
1391 create_uart(vbi, pic, VIRT_UART, sysmem, serial_hds[0]);
1392
1393 if (vms->secure) {
1394 create_secure_ram(vbi, secure_sysmem);
1395 create_uart(vbi, pic, VIRT_SECURE_UART, secure_sysmem, serial_hds[1]);
1396 }
1397
1398 create_rtc(vbi, pic);
1399
1400 create_pcie(vbi, pic, vms->highmem);
1401
1402 create_gpio(vbi, pic);
1403
1404
1405
1406
1407
1408 create_virtio_devices(vbi, pic);
1409
1410 create_fw_cfg(vbi, &address_space_memory);
1411 rom_set_fw(fw_cfg_find());
1412
1413 guest_info->smp_cpus = smp_cpus;
1414 guest_info->fw_cfg = fw_cfg_find();
1415 guest_info->memmap = vbi->memmap;
1416 guest_info->irqmap = vbi->irqmap;
1417 guest_info->use_highmem = vms->highmem;
1418 guest_info->gic_version = gic_version;
1419 guest_info->no_its = vmc->no_its;
1420 guest_info_state->machine_done.notify = virt_guest_info_machine_done;
1421 qemu_add_machine_init_done_notifier(&guest_info_state->machine_done);
1422
1423 vbi->bootinfo.ram_size = machine->ram_size;
1424 vbi->bootinfo.kernel_filename = machine->kernel_filename;
1425 vbi->bootinfo.kernel_cmdline = machine->kernel_cmdline;
1426 vbi->bootinfo.initrd_filename = machine->initrd_filename;
1427 vbi->bootinfo.nb_cpus = smp_cpus;
1428 vbi->bootinfo.board_id = -1;
1429 vbi->bootinfo.loader_start = vbi->memmap[VIRT_MEM].base;
1430 vbi->bootinfo.get_dtb = machvirt_dtb;
1431 vbi->bootinfo.firmware_loaded = firmware_loaded;
1432 arm_load_kernel(ARM_CPU(first_cpu), &vbi->bootinfo);
1433
1434
1435
1436
1437
1438
1439
1440 create_platform_bus(vbi, pic);
1441}
1442
1443static bool virt_get_secure(Object *obj, Error **errp)
1444{
1445 VirtMachineState *vms = VIRT_MACHINE(obj);
1446
1447 return vms->secure;
1448}
1449
1450static void virt_set_secure(Object *obj, bool value, Error **errp)
1451{
1452 VirtMachineState *vms = VIRT_MACHINE(obj);
1453
1454 vms->secure = value;
1455}
1456
1457static bool virt_get_highmem(Object *obj, Error **errp)
1458{
1459 VirtMachineState *vms = VIRT_MACHINE(obj);
1460
1461 return vms->highmem;
1462}
1463
1464static void virt_set_highmem(Object *obj, bool value, Error **errp)
1465{
1466 VirtMachineState *vms = VIRT_MACHINE(obj);
1467
1468 vms->highmem = value;
1469}
1470
1471static char *virt_get_gic_version(Object *obj, Error **errp)
1472{
1473 VirtMachineState *vms = VIRT_MACHINE(obj);
1474 const char *val = vms->gic_version == 3 ? "3" : "2";
1475
1476 return g_strdup(val);
1477}
1478
1479static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
1480{
1481 VirtMachineState *vms = VIRT_MACHINE(obj);
1482
1483 if (!strcmp(value, "3")) {
1484 vms->gic_version = 3;
1485 } else if (!strcmp(value, "2")) {
1486 vms->gic_version = 2;
1487 } else if (!strcmp(value, "host")) {
1488 vms->gic_version = 0;
1489 } else {
1490 error_setg(errp, "Invalid gic-version value");
1491 error_append_hint(errp, "Valid values are 3, 2, host.\n");
1492 }
1493}
1494
1495static void virt_machine_class_init(ObjectClass *oc, void *data)
1496{
1497 MachineClass *mc = MACHINE_CLASS(oc);
1498
1499 mc->init = machvirt_init;
1500
1501
1502
1503
1504 mc->max_cpus = 255;
1505 mc->has_dynamic_sysbus = true;
1506 mc->block_default_type = IF_VIRTIO;
1507 mc->no_cdrom = 1;
1508 mc->pci_allow_0_address = true;
1509
1510 mc->minimum_page_bits = 12;
1511}
1512
1513static const TypeInfo virt_machine_info = {
1514 .name = TYPE_VIRT_MACHINE,
1515 .parent = TYPE_MACHINE,
1516 .abstract = true,
1517 .instance_size = sizeof(VirtMachineState),
1518 .class_size = sizeof(VirtMachineClass),
1519 .class_init = virt_machine_class_init,
1520};
1521
1522static void machvirt_machine_init(void)
1523{
1524 type_register_static(&virt_machine_info);
1525}
1526type_init(machvirt_machine_init);
1527
1528static void virt_2_8_instance_init(Object *obj)
1529{
1530 VirtMachineState *vms = VIRT_MACHINE(obj);
1531
1532
1533
1534
1535
1536 vms->secure = false;
1537 object_property_add_bool(obj, "secure", virt_get_secure,
1538 virt_set_secure, NULL);
1539 object_property_set_description(obj, "secure",
1540 "Set on/off to enable/disable the ARM "
1541 "Security Extensions (TrustZone)",
1542 NULL);
1543
1544
1545 vms->highmem = true;
1546 object_property_add_bool(obj, "highmem", virt_get_highmem,
1547 virt_set_highmem, NULL);
1548 object_property_set_description(obj, "highmem",
1549 "Set on/off to enable/disable using "
1550 "physical address space above 32 bits",
1551 NULL);
1552
1553 vms->gic_version = 2;
1554 object_property_add_str(obj, "gic-version", virt_get_gic_version,
1555 virt_set_gic_version, NULL);
1556 object_property_set_description(obj, "gic-version",
1557 "Set GIC version. "
1558 "Valid values are 2, 3 and host", NULL);
1559}
1560
1561static void virt_machine_2_8_options(MachineClass *mc)
1562{
1563}
1564DEFINE_VIRT_MACHINE_AS_LATEST(2, 8)
1565
1566#define VIRT_COMPAT_2_7 \
1567 HW_COMPAT_2_7
1568
1569static void virt_2_7_instance_init(Object *obj)
1570{
1571 virt_2_8_instance_init(obj);
1572}
1573
1574static void virt_machine_2_7_options(MachineClass *mc)
1575{
1576 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
1577
1578 virt_machine_2_8_options(mc);
1579 SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_7);
1580
1581 vmc->no_its = true;
1582
1583 mc->minimum_page_bits = 0;
1584}
1585DEFINE_VIRT_MACHINE(2, 7)
1586
1587#define VIRT_COMPAT_2_6 \
1588 HW_COMPAT_2_6
1589
1590static void virt_2_6_instance_init(Object *obj)
1591{
1592 virt_2_7_instance_init(obj);
1593}
1594
1595static void virt_machine_2_6_options(MachineClass *mc)
1596{
1597 VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
1598
1599 virt_machine_2_7_options(mc);
1600 SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_6);
1601 vmc->disallow_affinity_adjustment = true;
1602
1603 vmc->no_pmu = true;
1604}
1605DEFINE_VIRT_MACHINE(2, 6)
1606