Lines Matching +full:- +full:- +full:disable +full:- +full:tpm

2  * ARM mach-virt emulation
23 * + we want to present a very stripped-down minimalist platform,
41 #include "hw/vfio/vfio-calxeda-xgmac.h"
42 #include "hw/vfio/vfio-amd-xgbe.h"
48 #include "system/tpm.h"
57 #include "qemu/error-report.h"
59 #include "hw/pci-host/gpex.h"
60 #include "hw/virtio/virtio-pci.h"
61 #include "hw/core/sysbus-fdt.h"
62 #include "hw/platform-bus.h"
63 #include "hw/qdev-properties.h"
73 #include "qapi/qapi-visit-common.h"
75 #include "standard-headers/linux/input.h"
78 #include "target/arm/cpu-qom.h"
82 #include "hw/mem/pc-dimm.h"
85 #include "hw/uefi/var-service-api.h"
86 #include "hw/virtio/virtio-md-pci.h"
87 #include "hw/virtio/virtio-iommu.h"
89 #include "qemu/guest-random.h"
92 { TYPE_VIRTIO_IOMMU_PCI, "aw-bits", "48" },
98 * TYPE_VIRT_MACHINE is abstract and mc->compat_props g_ptr_array_new()
103 compat_props_add(mc->compat_props, arm_virt_compat, in arm_virt_compat_set()
115 mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " ARM Virtual Machine"; \
118 mc->alias = "virt"; \
197 /* Update the docs for highmem-mmio-size when changing this default */
212 * layout, depending on 'compact-highmem' property. With legacy layout, the
217 * Note that the highmem-mmio-size property will update the high PCIE MMIO size
235 [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */
236 [VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */
237 [VIRT_SMMU] = 74, /* ...to 74 + NUM_SMMU_IRQS - 1 */
238 [VIRT_PLATFORM_BUS] = 112, /* ...to 112 + PLATFORM_BUS_NUM_IRQS -1 */
251 qemu_fdt_setprop_u64(ms->fdt, node, "kaslr-seed", seed.kaslr); in create_randomness()
252 qemu_fdt_setprop(ms->fdt, node, "rng-seed", seed.rng, sizeof(seed.rng)); in create_randomness()
263 CPUARMState *env = &cpu->env; in ns_el2_virt_timer_present()
272 int nb_numa_nodes = ms->numa_state->num_nodes; in create_fdt()
273 void *fdt = create_device_tree(&vms->fdt_size); in create_fdt()
280 ms->fdt = fdt; in create_fdt()
283 qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt"); in create_fdt()
284 qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2); in create_fdt()
285 qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2); in create_fdt()
286 qemu_fdt_setprop_string(fdt, "/", "model", "linux,dummy-virt"); in create_fdt()
292 * - It avoids potential bugs where we forget to mark a DMA in create_fdt()
293 * capable device as being dma-coherent in create_fdt()
294 * - It avoids spurious warnings from the Linux kernel about in create_fdt()
297 qemu_fdt_setprop(fdt, "/", "dma-coherent", NULL, 0); in create_fdt()
301 if (vms->dtb_randomness) { in create_fdt()
305 if (vms->secure) { in create_fdt()
306 qemu_fdt_add_subnode(fdt, "/secure-chosen"); in create_fdt()
307 if (vms->dtb_randomness) { in create_fdt()
308 create_randomness(ms, "/secure-chosen"); in create_fdt()
319 vms->clock_phandle = qemu_fdt_alloc_phandle(fdt); in create_fdt()
320 qemu_fdt_add_subnode(fdt, "/apb-pclk"); in create_fdt()
321 qemu_fdt_setprop_string(fdt, "/apb-pclk", "compatible", "fixed-clock"); in create_fdt()
322 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "#clock-cells", 0x0); in create_fdt()
323 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "clock-frequency", 24000000); in create_fdt()
324 qemu_fdt_setprop_string(fdt, "/apb-pclk", "clock-output-names", in create_fdt()
326 qemu_fdt_setprop_cell(fdt, "/apb-pclk", "phandle", vms->clock_phandle); in create_fdt()
328 if (nb_numa_nodes > 0 && ms->numa_state->have_numa_distance) { in create_fdt()
339 cpu_to_be32(ms->numa_state->nodes[i].distance[j]); in create_fdt()
343 qemu_fdt_add_subnode(fdt, "/distance-map"); in create_fdt()
344 qemu_fdt_setprop_string(fdt, "/distance-map", "compatible", in create_fdt()
345 "numa-distance-map-v1"); in create_fdt()
346 qemu_fdt_setprop(fdt, "/distance-map", "distance-matrix", in create_fdt()
354 /* On real hardware these interrupts are level-triggered. in fdt_add_timer_nodes()
355 * On KVM they were edge-triggered before host kernel version 4.4, in fdt_add_timer_nodes()
356 * and level-triggered afterwards. in fdt_add_timer_nodes()
357 * On emulated QEMU they are level-triggered. in fdt_add_timer_nodes()
361 * pre-4.8 ignore the DT and leave the interrupt configured in fdt_add_timer_nodes()
368 * For backwards-compatibility, virt-2.8 and earlier will continue in fdt_add_timer_nodes()
369 * to say these are edge-triggered, but later machines will report in fdt_add_timer_nodes()
376 if (vms->gic_version == VIRT_GIC_VERSION_2) { in fdt_add_timer_nodes()
379 (1 << MACHINE(vms)->smp.cpus) - 1); in fdt_add_timer_nodes()
382 qemu_fdt_add_subnode(ms->fdt, "/timer"); in fdt_add_timer_nodes()
385 if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) { in fdt_add_timer_nodes()
386 const char compat[] = "arm,armv8-timer\0arm,armv7-timer"; in fdt_add_timer_nodes()
387 qemu_fdt_setprop(ms->fdt, "/timer", "compatible", in fdt_add_timer_nodes()
390 qemu_fdt_setprop_string(ms->fdt, "/timer", "compatible", in fdt_add_timer_nodes()
391 "arm,armv7-timer"); in fdt_add_timer_nodes()
393 qemu_fdt_setprop(ms->fdt, "/timer", "always-on", NULL, 0); in fdt_add_timer_nodes()
394 if (vms->ns_el2_virt_timer_irq) { in fdt_add_timer_nodes()
395 qemu_fdt_setprop_cells(ms->fdt, "/timer", "interrupts", in fdt_add_timer_nodes()
407 qemu_fdt_setprop_cells(ms->fdt, "/timer", "interrupts", in fdt_add_timer_nodes()
425 int smp_cpus = ms->smp.cpus; in fdt_add_cpu_nodes()
429 * On ARM v8 64-bit systems value should be set to 2, in fdt_add_cpu_nodes()
432 * in the system, #address-cells can be set to 1, since in fdt_add_cpu_nodes()
436 * Here we actually don't know whether our system is 32- or 64-bit one. in fdt_add_cpu_nodes()
438 * at least one of them has Aff3 populated, we set #address-cells to 2. in fdt_add_cpu_nodes()
449 qemu_fdt_add_subnode(ms->fdt, "/cpus"); in fdt_add_cpu_nodes()
450 qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", addr_cells); in fdt_add_cpu_nodes()
451 qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0); in fdt_add_cpu_nodes()
453 for (cpu = smp_cpus - 1; cpu >= 0; cpu--) { in fdt_add_cpu_nodes()
458 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_cpu_nodes()
459 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu"); in fdt_add_cpu_nodes()
460 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_cpu_nodes()
461 armcpu->dtb_compatible); in fdt_add_cpu_nodes()
463 if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED && smp_cpus > 1) { in fdt_add_cpu_nodes()
464 qemu_fdt_setprop_string(ms->fdt, nodename, in fdt_add_cpu_nodes()
465 "enable-method", "psci"); in fdt_add_cpu_nodes()
469 qemu_fdt_setprop_u64(ms->fdt, nodename, "reg", in fdt_add_cpu_nodes()
472 qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", in fdt_add_cpu_nodes()
476 if (ms->possible_cpus->cpus[cs->cpu_index].props.has_node_id) { in fdt_add_cpu_nodes()
477 qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id", in fdt_add_cpu_nodes()
478 ms->possible_cpus->cpus[cs->cpu_index].props.node_id); in fdt_add_cpu_nodes()
481 if (!vmc->no_cpu_topology) { in fdt_add_cpu_nodes()
482 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", in fdt_add_cpu_nodes()
483 qemu_fdt_alloc_phandle(ms->fdt)); in fdt_add_cpu_nodes()
489 if (!vmc->no_cpu_topology) { in fdt_add_cpu_nodes()
491 * Add vCPU topology description through fdt node cpu-map. in fdt_add_cpu_nodes()
493 * See Linux Documentation/devicetree/bindings/cpu/cpu-topology.txt in fdt_add_cpu_nodes()
506 qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map"); in fdt_add_cpu_nodes()
508 for (cpu = smp_cpus - 1; cpu >= 0; cpu--) { in fdt_add_cpu_nodes()
512 if (ms->smp.threads > 1) { in fdt_add_cpu_nodes()
514 "/cpus/cpu-map/socket%d/cluster%d/core%d/thread%d", in fdt_add_cpu_nodes()
515 cpu / (ms->smp.clusters * ms->smp.cores * ms->smp.threads), in fdt_add_cpu_nodes()
516 (cpu / (ms->smp.cores * ms->smp.threads)) % ms->smp.clusters, in fdt_add_cpu_nodes()
517 (cpu / ms->smp.threads) % ms->smp.cores, in fdt_add_cpu_nodes()
518 cpu % ms->smp.threads); in fdt_add_cpu_nodes()
521 "/cpus/cpu-map/socket%d/cluster%d/core%d", in fdt_add_cpu_nodes()
522 cpu / (ms->smp.clusters * ms->smp.cores), in fdt_add_cpu_nodes()
523 (cpu / ms->smp.cores) % ms->smp.clusters, in fdt_add_cpu_nodes()
524 cpu % ms->smp.cores); in fdt_add_cpu_nodes()
526 qemu_fdt_add_path(ms->fdt, map_path); in fdt_add_cpu_nodes()
527 qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", cpu_path); in fdt_add_cpu_nodes()
540 vms->msi_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_its_gic_node()
542 vms->memmap[VIRT_GIC_ITS].base); in fdt_add_its_gic_node()
543 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_its_gic_node()
544 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_its_gic_node()
545 "arm,gic-v3-its"); in fdt_add_its_gic_node()
546 qemu_fdt_setprop(ms->fdt, nodename, "msi-controller", NULL, 0); in fdt_add_its_gic_node()
547 qemu_fdt_setprop_cell(ms->fdt, nodename, "#msi-cells", 1); in fdt_add_its_gic_node()
548 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_its_gic_node()
549 2, vms->memmap[VIRT_GIC_ITS].base, in fdt_add_its_gic_node()
550 2, vms->memmap[VIRT_GIC_ITS].size); in fdt_add_its_gic_node()
551 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", vms->msi_phandle); in fdt_add_its_gic_node()
561 vms->memmap[VIRT_GIC_V2M].base); in fdt_add_v2m_gic_node()
562 vms->msi_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_v2m_gic_node()
563 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_v2m_gic_node()
564 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_v2m_gic_node()
565 "arm,gic-v2m-frame"); in fdt_add_v2m_gic_node()
566 qemu_fdt_setprop(ms->fdt, nodename, "msi-controller", NULL, 0); in fdt_add_v2m_gic_node()
567 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_v2m_gic_node()
568 2, vms->memmap[VIRT_GIC_V2M].base, in fdt_add_v2m_gic_node()
569 2, vms->memmap[VIRT_GIC_V2M].size); in fdt_add_v2m_gic_node()
570 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", vms->msi_phandle); in fdt_add_v2m_gic_node()
579 vms->gic_phandle = qemu_fdt_alloc_phandle(ms->fdt); in fdt_add_gic_node()
580 qemu_fdt_setprop_cell(ms->fdt, "/", "interrupt-parent", vms->gic_phandle); in fdt_add_gic_node()
583 vms->memmap[VIRT_GIC_DIST].base); in fdt_add_gic_node()
584 qemu_fdt_add_subnode(ms->fdt, nodename); in fdt_add_gic_node()
585 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 3); in fdt_add_gic_node()
586 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-controller", NULL, 0); in fdt_add_gic_node()
587 qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 0x2); in fdt_add_gic_node()
588 qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 0x2); in fdt_add_gic_node()
589 qemu_fdt_setprop(ms->fdt, nodename, "ranges", NULL, 0); in fdt_add_gic_node()
590 if (vms->gic_version != VIRT_GIC_VERSION_2) { in fdt_add_gic_node()
593 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_gic_node()
594 "arm,gic-v3"); in fdt_add_gic_node()
596 qemu_fdt_setprop_cell(ms->fdt, nodename, in fdt_add_gic_node()
597 "#redistributor-regions", nb_redist_regions); in fdt_add_gic_node()
600 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_gic_node()
601 2, vms->memmap[VIRT_GIC_DIST].base, in fdt_add_gic_node()
602 2, vms->memmap[VIRT_GIC_DIST].size, in fdt_add_gic_node()
603 2, vms->memmap[VIRT_GIC_REDIST].base, in fdt_add_gic_node()
604 2, vms->memmap[VIRT_GIC_REDIST].size); in fdt_add_gic_node()
606 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_gic_node()
607 2, vms->memmap[VIRT_GIC_DIST].base, in fdt_add_gic_node()
608 2, vms->memmap[VIRT_GIC_DIST].size, in fdt_add_gic_node()
609 2, vms->memmap[VIRT_GIC_REDIST].base, in fdt_add_gic_node()
610 2, vms->memmap[VIRT_GIC_REDIST].size, in fdt_add_gic_node()
611 2, vms->memmap[VIRT_HIGH_GIC_REDIST2].base, in fdt_add_gic_node()
612 2, vms->memmap[VIRT_HIGH_GIC_REDIST2].size); in fdt_add_gic_node()
615 if (vms->virt) { in fdt_add_gic_node()
616 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in fdt_add_gic_node()
622 /* 'cortex-a15-gic' means 'GIC v2' */ in fdt_add_gic_node()
623 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", in fdt_add_gic_node()
624 "arm,cortex-a15-gic"); in fdt_add_gic_node()
625 if (!vms->virt) { in fdt_add_gic_node()
626 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_gic_node()
627 2, vms->memmap[VIRT_GIC_DIST].base, in fdt_add_gic_node()
628 2, vms->memmap[VIRT_GIC_DIST].size, in fdt_add_gic_node()
629 2, vms->memmap[VIRT_GIC_CPU].base, in fdt_add_gic_node()
630 2, vms->memmap[VIRT_GIC_CPU].size); in fdt_add_gic_node()
632 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in fdt_add_gic_node()
633 2, vms->memmap[VIRT_GIC_DIST].base, in fdt_add_gic_node()
634 2, vms->memmap[VIRT_GIC_DIST].size, in fdt_add_gic_node()
635 2, vms->memmap[VIRT_GIC_CPU].base, in fdt_add_gic_node()
636 2, vms->memmap[VIRT_GIC_CPU].size, in fdt_add_gic_node()
637 2, vms->memmap[VIRT_GIC_HYP].base, in fdt_add_gic_node()
638 2, vms->memmap[VIRT_GIC_HYP].size, in fdt_add_gic_node()
639 2, vms->memmap[VIRT_GIC_VCPU].base, in fdt_add_gic_node()
640 2, vms->memmap[VIRT_GIC_VCPU].size); in fdt_add_gic_node()
641 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in fdt_add_gic_node()
648 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", vms->gic_phandle); in fdt_add_gic_node()
658 if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) { in fdt_add_pmu_nodes()
663 if (vms->gic_version == VIRT_GIC_VERSION_2) { in fdt_add_pmu_nodes()
666 (1 << MACHINE(vms)->smp.cpus) - 1); in fdt_add_pmu_nodes()
669 qemu_fdt_add_subnode(ms->fdt, "/pmu"); in fdt_add_pmu_nodes()
670 if (arm_feature(&armcpu->env, ARM_FEATURE_V8)) { in fdt_add_pmu_nodes()
671 const char compat[] = "arm,armv8-pmuv3"; in fdt_add_pmu_nodes()
672 qemu_fdt_setprop(ms->fdt, "/pmu", "compatible", in fdt_add_pmu_nodes()
674 qemu_fdt_setprop_cells(ms->fdt, "/pmu", "interrupts", in fdt_add_pmu_nodes()
684 int irq = vms->irqmap[VIRT_ACPI_GED]; in create_acpi_ged()
687 if (ms->ram_slots) { in create_acpi_ged()
691 if (ms->nvdimms_state->is_enabled) { in create_acpi_ged()
696 qdev_prop_set_uint32(dev, "ged-event", event); in create_acpi_ged()
699 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_ACPI_GED].base); in create_acpi_ged()
700 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, vms->memmap[VIRT_PCDIMM_ACPI].base); in create_acpi_ged()
701 sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, qdev_get_gpio_in(vms->gic, irq)); in create_acpi_ged()
711 if (!strcmp(itsclass, "arm-gicv3-its")) { in create_its()
712 if (!vms->tcg_its) { in create_its()
724 object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(vms->gic), in create_its()
727 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base); in create_its()
730 vms->msi_controller = VIRT_MSI_CTRL_ITS; in create_its()
736 int irq = vms->irqmap[VIRT_GIC_V2M]; in create_v2m()
739 dev = qdev_new("arm-gicv2m"); in create_v2m()
740 qdev_prop_set_uint32(dev, "base-spi", irq); in create_v2m()
741 qdev_prop_set_uint32(dev, "num-spi", NUM_GICV2M_SPIS); in create_v2m()
743 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_V2M].base); in create_v2m()
747 qdev_get_gpio_in(vms->gic, irq + i)); in create_v2m()
751 vms->msi_controller = VIRT_MSI_CTRL_GICV2M; in create_v2m()
765 (vms->gic_version != VIRT_GIC_VERSION_2); in gicv3_nmi_present()
775 unsigned int smp_cpus = ms->smp.cpus; in create_gic()
779 if (vms->gic_version == VIRT_GIC_VERSION_2) { in create_gic()
785 switch (vms->gic_version) { in create_gic()
798 vms->gic = qdev_new(gictype); in create_gic()
799 qdev_prop_set_uint32(vms->gic, "revision", revision); in create_gic()
800 qdev_prop_set_uint32(vms->gic, "num-cpu", smp_cpus); in create_gic()
801 /* Note that the num-irq property counts both internal and external in create_gic()
804 qdev_prop_set_uint32(vms->gic, "num-irq", NUM_IRQS + 32); in create_gic()
806 qdev_prop_set_bit(vms->gic, "has-security-extensions", vms->secure); in create_gic()
809 if (vms->gic_version != VIRT_GIC_VERSION_2) { in create_gic()
823 MIN(smp_cpus - redist0_count, redist1_capacity)); in create_gic()
825 qdev_prop_set_array(vms->gic, "redist-region-count", in create_gic()
829 if (vms->tcg_its) { in create_gic()
830 object_property_set_link(OBJECT(vms->gic), "sysmem", in create_gic()
832 qdev_prop_set_bit(vms->gic, "has-lpi", true); in create_gic()
837 qdev_prop_set_bit(vms->gic, "has-virtualization-extensions", in create_gic()
838 vms->virt); in create_gic()
843 qdev_prop_set_bit(vms->gic, "has-nmi", true); in create_gic()
846 gicbusdev = SYS_BUS_DEVICE(vms->gic); in create_gic()
848 sysbus_mmio_map(gicbusdev, 0, vms->memmap[VIRT_GIC_DIST].base); in create_gic()
849 if (vms->gic_version != VIRT_GIC_VERSION_2) { in create_gic()
850 sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_REDIST].base); in create_gic()
853 vms->memmap[VIRT_HIGH_GIC_REDIST2].base); in create_gic()
856 sysbus_mmio_map(gicbusdev, 1, vms->memmap[VIRT_GIC_CPU].base); in create_gic()
857 if (vms->virt) { in create_gic()
858 sysbus_mmio_map(gicbusdev, 2, vms->memmap[VIRT_GIC_HYP].base); in create_gic()
859 sysbus_mmio_map(gicbusdev, 3, vms->memmap[VIRT_GIC_VCPU].base); in create_gic()
886 qdev_get_gpio_in(vms->gic, in create_gic()
890 if (vms->gic_version != VIRT_GIC_VERSION_2) { in create_gic()
891 qemu_irq irq = qdev_get_gpio_in(vms->gic, in create_gic()
893 qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt", in create_gic()
895 } else if (vms->virt) { in create_gic()
896 qemu_irq irq = qdev_get_gpio_in(vms->gic, in create_gic()
901 qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0, in create_gic()
902 qdev_get_gpio_in(vms->gic, intidbase in create_gic()
913 if (vms->gic_version != VIRT_GIC_VERSION_2) { in create_gic()
923 if (vms->gic_version != VIRT_GIC_VERSION_2 && vms->its) { in create_gic()
925 } else if (vms->gic_version == VIRT_GIC_VERSION_2) { in create_gic()
934 hwaddr base = vms->memmap[uart].base; in create_uart()
935 hwaddr size = vms->memmap[uart].size; in create_uart()
936 int irq = vms->irqmap[uart]; in create_uart()
947 sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq)); in create_uart()
950 qemu_fdt_add_subnode(ms->fdt, nodename); in create_uart()
952 qemu_fdt_setprop(ms->fdt, nodename, "compatible", in create_uart()
954 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in create_uart()
956 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in create_uart()
959 qemu_fdt_setprop_cells(ms->fdt, nodename, "clocks", in create_uart()
960 vms->clock_phandle, vms->clock_phandle); in create_uart()
961 qemu_fdt_setprop(ms->fdt, nodename, "clock-names", in create_uart()
965 qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", nodename); in create_uart()
966 qemu_fdt_setprop_string(ms->fdt, "/aliases", "serial0", nodename); in create_uart()
968 qemu_fdt_setprop_string(ms->fdt, "/aliases", "serial1", nodename); in create_uart()
972 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled"); in create_uart()
973 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay"); in create_uart()
975 qemu_fdt_setprop_string(ms->fdt, "/secure-chosen", "stdout-path", in create_uart()
985 hwaddr base = vms->memmap[VIRT_RTC].base; in create_rtc()
986 hwaddr size = vms->memmap[VIRT_RTC].size; in create_rtc()
987 int irq = vms->irqmap[VIRT_RTC]; in create_rtc()
991 sysbus_create_simple("pl031", base, qdev_get_gpio_in(vms->gic, irq)); in create_rtc()
994 qemu_fdt_add_subnode(ms->fdt, nodename); in create_rtc()
995 qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat)); in create_rtc()
996 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in create_rtc()
998 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in create_rtc()
1001 qemu_fdt_setprop_cell(ms->fdt, nodename, "clocks", vms->clock_phandle); in create_rtc()
1002 qemu_fdt_setprop_string(ms->fdt, nodename, "clock-names", "apb_pclk"); in create_rtc()
1011 if (s->acpi_dev) { in virt_powerdown_req()
1012 acpi_send_event(s->acpi_dev, ACPI_POWER_DOWN_STATUS); in virt_powerdown_req()
1022 gpio_key_dev = sysbus_create_simple("gpio-key", -1, in create_gpio_keys()
1026 qemu_fdt_add_subnode(fdt, "/gpio-keys"); in create_gpio_keys()
1027 qemu_fdt_setprop_string(fdt, "/gpio-keys", "compatible", "gpio-keys"); in create_gpio_keys()
1029 qemu_fdt_add_subnode(fdt, "/gpio-keys/poweroff"); in create_gpio_keys()
1030 qemu_fdt_setprop_string(fdt, "/gpio-keys/poweroff", in create_gpio_keys()
1032 qemu_fdt_setprop_cell(fdt, "/gpio-keys/poweroff", "linux,code", in create_gpio_keys()
1034 qemu_fdt_setprop_cells(fdt, "/gpio-keys/poweroff", in create_gpio_keys()
1046 /* gpio-pwr */ in create_secure_gpio_pwr()
1047 gpio_pwr_dev = sysbus_create_simple("gpio-pwr", -1, NULL); in create_secure_gpio_pwr()
1049 /* connect secure pl061 to gpio-pwr */ in create_secure_gpio_pwr()
1055 qemu_fdt_add_subnode(fdt, "/gpio-poweroff"); in create_secure_gpio_pwr()
1056 qemu_fdt_setprop_string(fdt, "/gpio-poweroff", "compatible", in create_secure_gpio_pwr()
1057 "gpio-poweroff"); in create_secure_gpio_pwr()
1058 qemu_fdt_setprop_cells(fdt, "/gpio-poweroff", in create_secure_gpio_pwr()
1060 qemu_fdt_setprop_string(fdt, "/gpio-poweroff", "status", "disabled"); in create_secure_gpio_pwr()
1061 qemu_fdt_setprop_string(fdt, "/gpio-poweroff", "secure-status", in create_secure_gpio_pwr()
1064 qemu_fdt_add_subnode(fdt, "/gpio-restart"); in create_secure_gpio_pwr()
1065 qemu_fdt_setprop_string(fdt, "/gpio-restart", "compatible", in create_secure_gpio_pwr()
1066 "gpio-restart"); in create_secure_gpio_pwr()
1067 qemu_fdt_setprop_cells(fdt, "/gpio-restart", in create_secure_gpio_pwr()
1069 qemu_fdt_setprop_string(fdt, "/gpio-restart", "status", "disabled"); in create_secure_gpio_pwr()
1070 qemu_fdt_setprop_string(fdt, "/gpio-restart", "secure-status", in create_secure_gpio_pwr()
1079 hwaddr base = vms->memmap[gpio].base; in create_gpio_devices()
1080 hwaddr size = vms->memmap[gpio].size; in create_gpio_devices()
1081 int irq = vms->irqmap[gpio]; in create_gpio_devices()
1093 sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq)); in create_gpio_devices()
1095 uint32_t phandle = qemu_fdt_alloc_phandle(ms->fdt); in create_gpio_devices()
1097 qemu_fdt_add_subnode(ms->fdt, nodename); in create_gpio_devices()
1098 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in create_gpio_devices()
1100 qemu_fdt_setprop(ms->fdt, nodename, "compatible", compat, sizeof(compat)); in create_gpio_devices()
1101 qemu_fdt_setprop_cell(ms->fdt, nodename, "#gpio-cells", 2); in create_gpio_devices()
1102 qemu_fdt_setprop(ms->fdt, nodename, "gpio-controller", NULL, 0); in create_gpio_devices()
1103 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in create_gpio_devices()
1106 qemu_fdt_setprop_cell(ms->fdt, nodename, "clocks", vms->clock_phandle); in create_gpio_devices()
1107 qemu_fdt_setprop_string(ms->fdt, nodename, "clock-names", "apb_pclk"); in create_gpio_devices()
1108 qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle", phandle); in create_gpio_devices()
1112 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled"); in create_gpio_devices()
1113 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay"); in create_gpio_devices()
1119 create_gpio_keys(ms->fdt, pl061_dev, phandle); in create_gpio_devices()
1121 create_secure_gpio_pwr(ms->fdt, pl061_dev, phandle); in create_gpio_devices()
1128 hwaddr size = vms->memmap[VIRT_MMIO].size; in create_virtio_devices()
1133 * create a list of virtio-mmio buses with decreasing base addresses. in create_virtio_devices()
1135 * When a -device option is processed from the command line, in create_virtio_devices()
1136 * qbus_find_recursive() picks the next free virtio-mmio bus in forwards in create_virtio_devices()
1137 * order. The upshot is that -device options in increasing command line in create_virtio_devices()
1138 * order are mapped to virtio-mmio buses with decreasing base addresses. in create_virtio_devices()
1142 * the first -device on the command line. (The end-to-end order is a in create_virtio_devices()
1144 * guest kernel's name-to-address assignment strategy.) in create_virtio_devices()
1159 int irq = vms->irqmap[VIRT_MMIO] + i; in create_virtio_devices()
1160 hwaddr base = vms->memmap[VIRT_MMIO].base + i * size; in create_virtio_devices()
1162 sysbus_create_simple("virtio-mmio", base, in create_virtio_devices()
1163 qdev_get_gpio_in(vms->gic, irq)); in create_virtio_devices()
1173 for (i = NUM_VIRTIO_TRANSPORTS - 1; i >= 0; i--) { in create_virtio_devices()
1175 int irq = vms->irqmap[VIRT_MMIO] + i; in create_virtio_devices()
1176 hwaddr base = vms->memmap[VIRT_MMIO].base + i * size; in create_virtio_devices()
1179 qemu_fdt_add_subnode(ms->fdt, nodename); in create_virtio_devices()
1180 qemu_fdt_setprop_string(ms->fdt, nodename, in create_virtio_devices()
1182 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in create_virtio_devices()
1184 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupts", in create_virtio_devices()
1187 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0); in create_virtio_devices()
1204 qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE); in virt_flash_create1()
1206 qdev_prop_set_uint8(dev, "device-width", 2); in virt_flash_create1()
1207 qdev_prop_set_bit(dev, "big-endian", false); in virt_flash_create1()
1221 vms->flash[0] = virt_flash_create1(vms, "virt.flash0", "pflash0"); in virt_flash_create()
1222 vms->flash[1] = virt_flash_create1(vms, "virt.flash1", "pflash1"); in virt_flash_create()
1233 qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE); in virt_flash_map1()
1253 hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2; in virt_flash_map()
1254 hwaddr flashbase = vms->memmap[VIRT_FLASH].base; in virt_flash_map()
1256 virt_flash_map1(vms->flash[0], flashbase, flashsize, in virt_flash_map()
1258 virt_flash_map1(vms->flash[1], flashbase + flashsize, flashsize, in virt_flash_map()
1266 hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2; in virt_flash_fdt()
1267 hwaddr flashbase = vms->memmap[VIRT_FLASH].base; in virt_flash_fdt()
1274 qemu_fdt_add_subnode(ms->fdt, nodename); in virt_flash_fdt()
1275 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash"); in virt_flash_fdt()
1276 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in virt_flash_fdt()
1279 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4); in virt_flash_fdt()
1287 qemu_fdt_add_subnode(ms->fdt, nodename); in virt_flash_fdt()
1288 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash"); in virt_flash_fdt()
1289 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in virt_flash_fdt()
1291 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4); in virt_flash_fdt()
1292 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled"); in virt_flash_fdt()
1293 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay"); in virt_flash_fdt()
1297 qemu_fdt_add_subnode(ms->fdt, nodename); in virt_flash_fdt()
1298 qemu_fdt_setprop_string(ms->fdt, nodename, "compatible", "cfi-flash"); in virt_flash_fdt()
1299 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in virt_flash_fdt()
1301 qemu_fdt_setprop_cell(ms->fdt, nodename, "bank-width", 4); in virt_flash_fdt()
1314 /* Map legacy -drive if=pflash to machine properties */ in virt_firmware_init()
1315 for (i = 0; i < ARRAY_SIZE(vms->flash); i++) { in virt_firmware_init()
1316 pflash_cfi01_legacy_drive(vms->flash[i], in virt_firmware_init()
1322 pflash_blk0 = pflash_cfi01_get_blk(vms->flash[0]); in virt_firmware_init()
1324 bios_name = MACHINE(vms)->firmware; in virt_firmware_init()
1332 "specified with -bios or with -drive if=pflash... " in virt_firmware_init()
1337 /* Fall back to -bios */ in virt_firmware_init()
1344 mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(vms->flash[0]), 0); in virt_firmware_init()
1359 hwaddr base = vms->memmap[VIRT_FW_CFG].base; in create_fw_cfg()
1360 hwaddr size = vms->memmap[VIRT_FW_CFG].size; in create_fw_cfg()
1365 fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)ms->smp.cpus); in create_fw_cfg()
1367 nodename = g_strdup_printf("/fw-cfg@%" PRIx64, base); in create_fw_cfg()
1368 qemu_fdt_add_subnode(ms->fdt, nodename); in create_fw_cfg()
1369 qemu_fdt_setprop_string(ms->fdt, nodename, in create_fw_cfg()
1370 "compatible", "qemu,fw-cfg-mmio"); in create_fw_cfg()
1371 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in create_fw_cfg()
1373 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0); in create_fw_cfg()
1406 qemu_fdt_setprop(ms->fdt, nodename, "interrupt-map", in create_pcie_irq_map()
1409 qemu_fdt_setprop_cells(ms->fdt, nodename, "interrupt-map-mask", in create_pcie_irq_map()
1420 const char compat[] = "arm,smmu-v3"; in create_smmu()
1421 int irq = vms->irqmap[VIRT_SMMU]; in create_smmu()
1423 hwaddr base = vms->memmap[VIRT_SMMU].base; in create_smmu()
1424 hwaddr size = vms->memmap[VIRT_SMMU].size; in create_smmu()
1425 const char irq_names[] = "eventq\0priq\0cmdq-sync\0gerror"; in create_smmu()
1429 if (vms->iommu != VIRT_IOMMU_SMMUV3 || !vms->iommu_phandle) { in create_smmu()
1435 if (!vmc->no_nested_smmu) { in create_smmu()
1438 object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus), in create_smmu()
1444 qdev_get_gpio_in(vms->gic, irq + i)); in create_smmu()
1448 qemu_fdt_add_subnode(ms->fdt, node); in create_smmu()
1449 qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat)); in create_smmu()
1450 qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg", 2, base, 2, size); in create_smmu()
1452 qemu_fdt_setprop_cells(ms->fdt, node, "interrupts", in create_smmu()
1458 qemu_fdt_setprop(ms->fdt, node, "interrupt-names", irq_names, in create_smmu()
1461 qemu_fdt_setprop(ms->fdt, node, "dma-coherent", NULL, 0); in create_smmu()
1463 qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1); in create_smmu()
1465 qemu_fdt_setprop_cell(ms->fdt, node, "phandle", vms->iommu_phandle); in create_smmu()
1471 const char compat[] = "virtio,pci-iommu\0pci1af4,1057"; in create_virtio_iommu_dt_bindings()
1472 uint16_t bdf = vms->virtio_iommu_bdf; in create_virtio_iommu_dt_bindings()
1476 vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt); in create_virtio_iommu_dt_bindings()
1478 node = g_strdup_printf("%s/virtio_iommu@%x,%x", vms->pciehb_nodename, in create_virtio_iommu_dt_bindings()
1480 qemu_fdt_add_subnode(ms->fdt, node); in create_virtio_iommu_dt_bindings()
1481 qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat)); in create_virtio_iommu_dt_bindings()
1482 qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg", in create_virtio_iommu_dt_bindings()
1486 qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1); in create_virtio_iommu_dt_bindings()
1487 qemu_fdt_setprop_cell(ms->fdt, node, "phandle", vms->iommu_phandle); in create_virtio_iommu_dt_bindings()
1490 qemu_fdt_setprop_cells(ms->fdt, vms->pciehb_nodename, "iommu-map", in create_virtio_iommu_dt_bindings()
1491 0x0, vms->iommu_phandle, 0x0, bdf, in create_virtio_iommu_dt_bindings()
1492 bdf + 1, vms->iommu_phandle, bdf + 1, 0xffff - bdf); in create_virtio_iommu_dt_bindings()
1497 hwaddr base_mmio = vms->memmap[VIRT_PCIE_MMIO].base; in create_pcie()
1498 hwaddr size_mmio = vms->memmap[VIRT_PCIE_MMIO].size; in create_pcie()
1499 hwaddr base_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].base; in create_pcie()
1500 hwaddr size_mmio_high = vms->memmap[VIRT_HIGH_PCIE_MMIO].size; in create_pcie()
1501 hwaddr base_pio = vms->memmap[VIRT_PCIE_PIO].base; in create_pcie()
1502 hwaddr size_pio = vms->memmap[VIRT_PCIE_PIO].size; in create_pcie()
1506 int irq = vms->irqmap[VIRT_PCIE]; in create_pcie()
1521 ecam_id = VIRT_ECAM_ID(vms->highmem_ecam); in create_pcie()
1522 base_ecam = vms->memmap[ecam_id].base; in create_pcie()
1523 size_ecam = vms->memmap[ecam_id].size; in create_pcie()
1528 memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam", in create_pcie()
1539 memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio", in create_pcie()
1543 if (vms->highmem_mmio) { in create_pcie()
1547 memory_region_init_alias(high_mmio_alias, OBJECT(dev), "pcie-mmio-high", in create_pcie()
1558 qdev_get_gpio_in(vms->gic, irq + i)); in create_pcie()
1563 pci->bypass_iommu = vms->default_bus_bypass_iommu; in create_pcie()
1564 vms->bus = pci->bus; in create_pcie()
1565 if (vms->bus) { in create_pcie()
1566 pci_init_nic_devices(pci->bus, mc->default_nic); in create_pcie()
1569 nodename = vms->pciehb_nodename = g_strdup_printf("/pcie@%" PRIx64, base); in create_pcie()
1570 qemu_fdt_add_subnode(ms->fdt, nodename); in create_pcie()
1571 qemu_fdt_setprop_string(ms->fdt, nodename, in create_pcie()
1572 "compatible", "pci-host-ecam-generic"); in create_pcie()
1573 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "pci"); in create_pcie()
1574 qemu_fdt_setprop_cell(ms->fdt, nodename, "#address-cells", 3); in create_pcie()
1575 qemu_fdt_setprop_cell(ms->fdt, nodename, "#size-cells", 2); in create_pcie()
1576 qemu_fdt_setprop_cell(ms->fdt, nodename, "linux,pci-domain", 0); in create_pcie()
1577 qemu_fdt_setprop_cells(ms->fdt, nodename, "bus-range", 0, in create_pcie()
1578 nr_pcie_buses - 1); in create_pcie()
1579 qemu_fdt_setprop(ms->fdt, nodename, "dma-coherent", NULL, 0); in create_pcie()
1581 if (vms->msi_phandle) { in create_pcie()
1582 qemu_fdt_setprop_cells(ms->fdt, nodename, "msi-map", in create_pcie()
1583 0, vms->msi_phandle, 0, 0x10000); in create_pcie()
1586 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", in create_pcie()
1589 if (vms->highmem_mmio) { in create_pcie()
1590 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "ranges", in create_pcie()
1599 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "ranges", in create_pcie()
1606 qemu_fdt_setprop_cell(ms->fdt, nodename, "#interrupt-cells", 1); in create_pcie()
1607 create_pcie_irq_map(ms, vms->gic_phandle, irq, nodename); in create_pcie()
1609 if (vms->iommu) { in create_pcie()
1610 vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt); in create_pcie()
1612 switch (vms->iommu) { in create_pcie()
1614 create_smmu(vms, vms->bus); in create_pcie()
1615 qemu_fdt_setprop_cells(ms->fdt, nodename, "iommu-map", in create_pcie()
1616 0x0, vms->iommu_phandle, 0x0, 0x10000); in create_pcie()
1632 dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE); in create_platform_bus()
1634 qdev_prop_set_uint32(dev, "mmio_size", vms->memmap[VIRT_PLATFORM_BUS].size); in create_platform_bus()
1636 vms->platform_bus_dev = dev; in create_platform_bus()
1640 int irq = vms->irqmap[VIRT_PLATFORM_BUS] + i; in create_platform_bus()
1641 sysbus_connect_irq(s, i, qdev_get_gpio_in(vms->gic, irq)); in create_platform_bus()
1645 vms->memmap[VIRT_PLATFORM_BUS].base, in create_platform_bus()
1665 hwaddr base = vms->memmap[VIRT_SECURE_MEM].base; in create_secure_ram()
1666 hwaddr size = vms->memmap[VIRT_SECURE_MEM].size; in create_secure_ram()
1669 memory_region_init_ram(secram, NULL, "virt.secure-ram", size, in create_secure_ram()
1674 qemu_fdt_add_subnode(ms->fdt, nodename); in create_secure_ram()
1675 qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory"); in create_secure_ram()
1676 qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size); in create_secure_ram()
1677 qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled"); in create_secure_ram()
1678 qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay"); in create_secure_ram()
1681 create_tag_ram(secure_tag_sysmem, base, size, "mach-virt.secure-tag"); in create_secure_ram()
1694 *fdt_size = board->fdt_size; in machvirt_dtb()
1695 return ms->fdt; in machvirt_dtb()
1711 smbios_set_defaults("QEMU", product, mc->name); in virt_build_smbios()
1714 mem_array.address = vms->memmap[VIRT_MEM].base; in virt_build_smbios()
1715 mem_array.length = ms->ram_size; in virt_build_smbios()
1723 fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-tables", in virt_build_smbios()
1725 fw_cfg_add_file(vms->fw_cfg, "etc/smbios/smbios-anchor", in virt_build_smbios()
1737 struct arm_boot_info *info = &vms->bootinfo; in virt_machine_done()
1747 if (info->dtb_filename == NULL) { in virt_machine_done()
1748 platform_bus_add_all_fdt_nodes(ms->fdt, "/intc", in virt_machine_done()
1749 vms->memmap[VIRT_PLATFORM_BUS].base, in virt_machine_done()
1750 vms->memmap[VIRT_PLATFORM_BUS].size, in virt_machine_done()
1751 vms->irqmap[VIRT_PLATFORM_BUS]); in virt_machine_done()
1753 if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms, cpu) < 0) { in virt_machine_done()
1757 pci_bus_add_fw_cfg_extra_pci_roots(vms->fw_cfg, vms->bus, in virt_machine_done()
1769 * Adjust MPIDR to make TCG consistent (with 64-bit KVM hosts) in virt_cpu_mp_affinity()
1772 if (vms->gic_version == VIRT_GIC_VERSION_2) { in virt_cpu_mp_affinity()
1785 &vms->highmem_redists, in virt_get_high_memmap_enabled()
1786 &vms->highmem_ecam, in virt_get_high_memmap_enabled()
1787 &vms->highmem_mmio, in virt_get_high_memmap_enabled()
1790 assert(ARRAY_SIZE(extended_memmap) - VIRT_LOWMEMMAP_LAST == in virt_get_high_memmap_enabled()
1792 assert(index - VIRT_LOWMEMMAP_LAST < ARRAY_SIZE(enabled_array)); in virt_get_high_memmap_enabled()
1794 return enabled_array[index - VIRT_LOWMEMMAP_LAST]; in virt_get_high_memmap_enabled()
1809 vms->memmap[i].base = region_base; in virt_set_high_memmap()
1810 vms->memmap[i].size = region_size; in virt_set_high_memmap()
1818 * For each device that doesn't fit, disable it. in virt_set_high_memmap()
1822 if (vms->highmem_compact && !*region_enabled) { in virt_set_high_memmap()
1828 vms->highest_gpa = base - 1; in virt_set_high_memmap()
1839 vms->memmap = extended_memmap; in virt_set_memmap()
1842 vms->memmap[i] = base_memmap[i]; in virt_set_memmap()
1845 if (ms->ram_slots > ACPI_MAX_RAM_SLOTS) { in virt_set_memmap()
1847 ms->ram_slots); in virt_set_memmap()
1855 if (!vms->highmem) { in virt_set_memmap()
1867 ROUND_UP(vms->memmap[VIRT_MEM].base + ms->ram_size, GiB); in virt_set_memmap()
1868 device_memory_size = ms->maxram_size - ms->ram_size + ms->ram_slots * GiB; in virt_set_memmap()
1874 pa_bits, memtop - BIT_ULL(pa_bits)); in virt_set_memmap()
1881 if (base < vms->memmap[VIRT_MEM].base + LEGACY_RAMLIMIT_BYTES) { in virt_set_memmap()
1882 base = vms->memmap[VIRT_MEM].base + LEGACY_RAMLIMIT_BYTES; in virt_set_memmap()
1886 vms->highest_gpa = memtop - 1; in virt_set_memmap()
1904 error_report("gic-version=host requires KVM"); in finalize_gic_version_do()
1908 /* For KVM, gic-version=host means gic-version=max */ in finalize_gic_version_do()
1927 * the end-user requested more than 8 VCPUs we now default in finalize_gic_version_do()
1974 * finalize_gic_version - Determines the final gic_version
1975 * according to the gic-version property
1982 unsigned int max_cpus = MACHINE(vms)->smp.max_cpus; in finalize_gic_version()
2003 accel_name = "KVM with kernel-irqchip=off"; in finalize_gic_version()
2006 if (module_object_class_by_name("arm-gicv3")) { in finalize_gic_version()
2008 if (vms->virt) { in finalize_gic_version()
2022 vms->gic_version = finalize_gic_version_do(accel_name, vms->gic_version, in finalize_gic_version()
2032 int max_cpus = MACHINE(vms)->smp.max_cpus; in virt_cpu_post_init()
2039 "kvm-steal-time", NULL); in virt_cpu_post_init()
2042 hwaddr pvtime_reg_base = vms->memmap[VIRT_PVTIME].base; in virt_cpu_post_init()
2043 hwaddr pvtime_reg_size = vms->memmap[VIRT_PVTIME].size; in virt_cpu_post_init()
2066 assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU)); in virt_cpu_post_init()
2074 + cpu->cpu_index in virt_cpu_post_init()
2079 if (aarch64 && vms->highmem) { in virt_cpu_post_init()
2080 int requested_pa_size = 64 - clz64(vms->highest_gpa); in virt_cpu_post_init()
2106 bool has_ged = !vmc->no_ged; in machvirt_init()
2107 unsigned int smp_cpus = machine->smp.cpus; in machvirt_init()
2108 unsigned int max_cpus = machine->smp.max_cpus; in machvirt_init()
2110 possible_cpus = mc->possible_cpu_arch_ids(machine); in machvirt_init()
2117 if (!vms->memmap) { in machvirt_init()
2127 cpuobj = object_new(possible_cpus->cpus[0].type); in machvirt_init()
2142 if (vms->secure) { in machvirt_init()
2146 * containing the system memory at low priority; any secure-only in machvirt_init()
2150 memory_region_init(secure_sysmem, OBJECT(machine), "secure-memory", in machvirt_init()
2152 memory_region_add_subregion_overlap(secure_sysmem, 0, sysmem, -1); in machvirt_init()
2159 * implement PSCI itself, so disable QEMU's internal implementation in machvirt_init()
2168 if (vms->secure && firmware_loaded) { in machvirt_init()
2169 vms->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED; in machvirt_init()
2170 } else if (vms->virt) { in machvirt_init()
2171 vms->psci_conduit = QEMU_PSCI_CONDUIT_SMC; in machvirt_init()
2173 vms->psci_conduit = QEMU_PSCI_CONDUIT_HVC; in machvirt_init()
2181 if (vms->gic_version == VIRT_GIC_VERSION_2) { in machvirt_init()
2185 if (vms->highmem_redists) { in machvirt_init()
2192 "supported by machine 'mach-virt' (%d)", in machvirt_init()
2194 if (vms->gic_version != VIRT_GIC_VERSION_2 && !vms->highmem_redists) { in machvirt_init()
2195 error_printf("Try 'highmem-redists=on' for more CPUs\n"); in machvirt_init()
2201 if (vms->secure && (kvm_enabled() || hvf_enabled())) { in machvirt_init()
2202 error_report("mach-virt: %s does not support providing " in machvirt_init()
2208 if (vms->virt && (kvm_enabled() || hvf_enabled())) { in machvirt_init()
2209 error_report("mach-virt: %s does not support providing " in machvirt_init()
2215 if (vms->mte && hvf_enabled()) { in machvirt_init()
2216 error_report("mach-virt: %s does not support providing " in machvirt_init()
2224 assert(possible_cpus->len == max_cpus); in machvirt_init()
2225 for (n = 0; n < possible_cpus->len; n++) { in machvirt_init()
2233 cpuobj = object_new(possible_cpus->cpus[n].type); in machvirt_init()
2234 object_property_set_int(cpuobj, "mp-affinity", in machvirt_init()
2235 possible_cpus->cpus[n].arch_id, NULL); in machvirt_init()
2238 cs->cpu_index = n; in machvirt_init()
2240 numa_cpu_pre_plug(&possible_cpus->cpus[cs->cpu_index], DEVICE(cpuobj), in machvirt_init()
2245 if (!vms->secure) { in machvirt_init()
2249 if (!vms->virt && object_property_find(cpuobj, "has_el2")) { in machvirt_init()
2253 if (vmc->kvm_no_adjvtime && in machvirt_init()
2254 object_property_find(cpuobj, "kvm-no-adjvtime")) { in machvirt_init()
2255 object_property_set_bool(cpuobj, "kvm-no-adjvtime", true, NULL); in machvirt_init()
2258 if (vmc->no_kvm_steal_time && in machvirt_init()
2259 object_property_find(cpuobj, "kvm-steal-time")) { in machvirt_init()
2260 object_property_set_bool(cpuobj, "kvm-steal-time", false, NULL); in machvirt_init()
2263 if (vmc->no_tcg_lpa2 && object_property_find(cpuobj, "lpa2")) { in machvirt_init()
2267 if (object_property_find(cpuobj, "reset-cbar")) { in machvirt_init()
2268 object_property_set_int(cpuobj, "reset-cbar", in machvirt_init()
2269 vms->memmap[VIRT_CPUPERIPHS].base, in machvirt_init()
2275 if (vms->secure) { in machvirt_init()
2276 object_property_set_link(cpuobj, "secure-memory", in machvirt_init()
2280 if (vms->mte) { in machvirt_init()
2288 if (!object_property_find(cpuobj, "tag-memory")) { in machvirt_init()
2296 "tag-memory", UINT64_MAX / 32); in machvirt_init()
2298 if (vms->secure) { in machvirt_init()
2301 "secure-tag-memory", in machvirt_init()
2304 /* As with ram, secure-tag takes precedence over tag. */ in machvirt_init()
2306 0, tag_sysmem, -1); in machvirt_init()
2310 object_property_set_link(cpuobj, "tag-memory", in machvirt_init()
2312 if (vms->secure) { in machvirt_init()
2313 object_property_set_link(cpuobj, "secure-tag-memory", in machvirt_init()
2334 vms->ns_el2_virt_timer_irq = ns_el2_virt_timer_present() && in machvirt_init()
2335 !vmc->no_ns_el2_virt_timer_irq; in machvirt_init()
2340 memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, in machvirt_init()
2341 machine->ram); in machvirt_init()
2354 * if a backend is configured explicitly via '-serial <backend>'. in machvirt_init()
2364 * aliases node information and /chosen/stdout-path regardless of in machvirt_init()
2367 * For similar back-compatibility reasons, if UART1 is the secure UART in machvirt_init()
2371 if (!vms->secure) { in machvirt_init()
2375 vms->second_ns_uart_present = true; in machvirt_init()
2380 if (vms->secure) { in machvirt_init()
2384 if (vms->secure) { in machvirt_init()
2389 create_tag_ram(tag_sysmem, vms->memmap[VIRT_MEM].base, in machvirt_init()
2390 machine->ram_size, "mach-virt.tag"); in machvirt_init()
2393 vms->highmem_ecam &= (!firmware_loaded || aarch64); in machvirt_init()
2400 vms->acpi_dev = create_acpi_ged(vms); in machvirt_init()
2405 if (vms->secure && !vmc->no_secure_gpio) { in machvirt_init()
2410 vms->powerdown_notifier.notify = virt_powerdown_req; in machvirt_init()
2411 qemu_register_powerdown_notifier(&vms->powerdown_notifier); in machvirt_init()
2419 vms->fw_cfg = create_fw_cfg(vms, &address_space_memory); in machvirt_init()
2420 rom_set_fw(vms->fw_cfg); in machvirt_init()
2424 if (machine->nvdimms_state->is_enabled) { in machvirt_init()
2427 .address = vms->memmap[VIRT_NVDIMM_ACPI].base, in machvirt_init()
2431 nvdimm_init_acpi_state(machine->nvdimms_state, sysmem, in machvirt_init()
2433 vms->fw_cfg, OBJECT(vms)); in machvirt_init()
2436 vms->bootinfo.ram_size = machine->ram_size; in machvirt_init()
2437 vms->bootinfo.board_id = -1; in machvirt_init()
2438 vms->bootinfo.loader_start = vms->memmap[VIRT_MEM].base; in machvirt_init()
2439 vms->bootinfo.get_dtb = machvirt_dtb; in machvirt_init()
2440 vms->bootinfo.skip_dtb_autoload = true; in machvirt_init()
2441 vms->bootinfo.firmware_loaded = firmware_loaded; in machvirt_init()
2442 vms->bootinfo.psci_conduit = vms->psci_conduit; in machvirt_init()
2443 arm_load_kernel(ARM_CPU(first_cpu), machine, &vms->bootinfo); in machvirt_init()
2445 vms->machine_done.notify = virt_machine_done; in machvirt_init()
2446 qemu_add_machine_init_done_notifier(&vms->machine_done); in machvirt_init()
2453 return vms->secure; in virt_get_secure()
2460 vms->secure = value; in virt_set_secure()
2467 return vms->virt; in virt_get_virt()
2474 vms->virt = value; in virt_set_virt()
2481 return vms->highmem; in virt_get_highmem()
2488 vms->highmem = value; in virt_set_highmem()
2495 return vms->highmem_compact; in virt_get_compact_highmem()
2502 vms->highmem_compact = value; in virt_set_compact_highmem()
2509 return vms->highmem_redists; in virt_get_highmem_redists()
2516 vms->highmem_redists = value; in virt_set_highmem_redists()
2523 return vms->highmem_ecam; in virt_get_highmem_ecam()
2530 vms->highmem_ecam = value; in virt_set_highmem_ecam()
2537 return vms->highmem_mmio; in virt_get_highmem_mmio()
2544 vms->highmem_mmio = value; in virt_set_highmem_mmio()
2567 error_setg(errp, "highmem-mmio-size is not a power of 2"); in virt_set_highmem_mmio_size()
2573 error_setg(errp, "highmem-mmio-size cannot be set to a lower value " in virt_set_highmem_mmio_size()
2586 return vms->its; in virt_get_its()
2593 vms->its = value; in virt_set_its()
2600 return vms->dtb_randomness; in virt_get_dtb_randomness()
2607 vms->dtb_randomness = value; in virt_set_dtb_randomness()
2614 return g_strdup(vms->oem_id); in virt_get_oem_id()
2624 "User specified oem-id value is bigger than 6 bytes in size"); in virt_set_oem_id()
2628 strncpy(vms->oem_id, value, 6); in virt_set_oem_id()
2635 return g_strdup(vms->oem_table_id); in virt_get_oem_table_id()
2646 "User specified oem-table-id value is bigger than 8 bytes in size"); in virt_set_oem_table_id()
2649 strncpy(vms->oem_table_id, value, 8); in virt_set_oem_table_id()
2655 if (vms->acpi == ON_OFF_AUTO_OFF) { in virt_is_acpi_enabled()
2665 OnOffAuto acpi = vms->acpi; in virt_get_acpi()
2675 visit_type_OnOffAuto(v, name, &vms->acpi, errp); in virt_set_acpi()
2682 return vms->ras; in virt_get_ras()
2689 vms->ras = value; in virt_set_ras()
2696 return vms->mte; in virt_get_mte()
2703 vms->mte = value; in virt_set_mte()
2711 switch (vms->gic_version) { in virt_get_gic_version()
2730 vms->gic_version = VIRT_GIC_VERSION_4; in virt_set_gic_version()
2732 vms->gic_version = VIRT_GIC_VERSION_3; in virt_set_gic_version()
2734 vms->gic_version = VIRT_GIC_VERSION_2; in virt_set_gic_version()
2736 vms->gic_version = VIRT_GIC_VERSION_HOST; /* Will probe later */ in virt_set_gic_version()
2738 vms->gic_version = VIRT_GIC_VERSION_MAX; /* Will probe later */ in virt_set_gic_version()
2740 error_setg(errp, "Invalid gic-version value"); in virt_set_gic_version()
2749 switch (vms->iommu) { in virt_get_iommu()
2764 vms->iommu = VIRT_IOMMU_SMMUV3; in virt_set_iommu()
2766 vms->iommu = VIRT_IOMMU_NONE; in virt_set_iommu()
2777 return vms->default_bus_bypass_iommu; in virt_get_default_bus_bypass_iommu()
2785 vms->default_bus_bypass_iommu = value; in virt_set_default_bus_bypass_iommu()
2792 const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms); in virt_cpu_index_to_props()
2794 assert(cpu_index < possible_cpus->len); in virt_cpu_index_to_props()
2795 return possible_cpus->cpus[cpu_index].props; in virt_cpu_index_to_props()
2800 int64_t socket_id = ms->possible_cpus->cpus[idx].props.socket_id; in virt_get_default_cpu_node_id()
2802 return socket_id % ms->numa_state->num_nodes; in virt_get_default_cpu_node_id()
2808 unsigned int max_cpus = ms->smp.max_cpus; in virt_possible_cpu_arch_ids()
2812 if (ms->possible_cpus) { in virt_possible_cpu_arch_ids()
2813 assert(ms->possible_cpus->len == max_cpus); in virt_possible_cpu_arch_ids()
2814 return ms->possible_cpus; in virt_possible_cpu_arch_ids()
2817 ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) + in virt_possible_cpu_arch_ids()
2819 ms->possible_cpus->len = max_cpus; in virt_possible_cpu_arch_ids()
2820 for (n = 0; n < ms->possible_cpus->len; n++) { in virt_possible_cpu_arch_ids()
2821 ms->possible_cpus->cpus[n].type = ms->cpu_type; in virt_possible_cpu_arch_ids()
2822 ms->possible_cpus->cpus[n].arch_id = in virt_possible_cpu_arch_ids()
2825 assert(!mc->smp_props.dies_supported); in virt_possible_cpu_arch_ids()
2826 ms->possible_cpus->cpus[n].props.has_socket_id = true; in virt_possible_cpu_arch_ids()
2827 ms->possible_cpus->cpus[n].props.socket_id = in virt_possible_cpu_arch_ids()
2828 n / (ms->smp.clusters * ms->smp.cores * ms->smp.threads); in virt_possible_cpu_arch_ids()
2829 ms->possible_cpus->cpus[n].props.has_cluster_id = true; in virt_possible_cpu_arch_ids()
2830 ms->possible_cpus->cpus[n].props.cluster_id = in virt_possible_cpu_arch_ids()
2831 (n / (ms->smp.cores * ms->smp.threads)) % ms->smp.clusters; in virt_possible_cpu_arch_ids()
2832 ms->possible_cpus->cpus[n].props.has_core_id = true; in virt_possible_cpu_arch_ids()
2833 ms->possible_cpus->cpus[n].props.core_id = in virt_possible_cpu_arch_ids()
2834 (n / ms->smp.threads) % ms->smp.cores; in virt_possible_cpu_arch_ids()
2835 ms->possible_cpus->cpus[n].props.has_thread_id = true; in virt_possible_cpu_arch_ids()
2836 ms->possible_cpus->cpus[n].props.thread_id = in virt_possible_cpu_arch_ids()
2837 n % ms->smp.threads; in virt_possible_cpu_arch_ids()
2839 return ms->possible_cpus; in virt_possible_cpu_arch_ids()
2849 if (!vms->acpi_dev) { in virt_memory_pre_plug()
2851 "memory hotplug is not enabled: missing acpi-ged device"); in virt_memory_pre_plug()
2855 if (vms->mte) { in virt_memory_pre_plug()
2860 if (is_nvdimm && !ms->nvdimms_state->is_enabled) { in virt_memory_pre_plug()
2861 error_setg(errp, "nvdimm is not enabled: add 'nvdimm=on' to '-M'"); in virt_memory_pre_plug()
2878 nvdimm_plug(ms->nvdimms_state); in virt_memory_plug()
2881 hotplug_handler_plug(HOTPLUG_HANDLER(vms->acpi_dev), in virt_memory_plug()
2899 if (vms->iommu != VIRT_IOMMU_NONE) { in virt_machine_device_pre_plug_cb()
2904 switch (vms->msi_controller) { in virt_machine_device_pre_plug_cb()
2911 base_memmap[VIRT_GIC_ITS].size - 1; in virt_machine_device_pre_plug_cb()
2916 db_end = db_start + base_memmap[VIRT_GIC_V2M].size - 1; in virt_machine_device_pre_plug_cb()
2925 qdev_prop_set_array(dev, "reserved-regions", reserved_regions); in virt_machine_device_pre_plug_cb()
2935 if (vms->platform_bus_dev) { in virt_machine_device_plug_cb()
2939 platform_bus_link_device(PLATFORM_BUS_DEVICE(vms->platform_bus_dev), in virt_machine_device_plug_cb()
2953 vms->iommu = VIRT_IOMMU_VIRTIO; in virt_machine_device_plug_cb()
2954 vms->virtio_iommu_bdf = pci_get_bdf(pdev); in virt_machine_device_plug_cb()
2964 if (!vms->acpi_dev) { in virt_dimm_unplug_request()
2966 "memory hotplug is not enabled: missing acpi-ged device"); in virt_dimm_unplug_request()
2975 hotplug_handler_unplug_request(HOTPLUG_HANDLER(vms->acpi_dev), dev, in virt_dimm_unplug_request()
2985 hotplug_handler_unplug(HOTPLUG_HANDLER(vms->acpi_dev), dev, &local_err); in virt_dimm_unplug()
3039 * for arm64 kvm_type [7-0] encodes the requested number of bits
3053 requested_pa_size = 64 - clz64(vms->highest_gpa); in virt_kvm_type()
3063 error_report("-m and ,maxmem option values " in virt_kvm_type()
3067 return -1; in virt_kvm_type()
3087 int requested_ipa_size = 64 - clz64(vms->highest_gpa); in virt_hvf_get_physical_address_range()
3100 error_report("-m and ,maxmem option values " in virt_hvf_get_physical_address_range()
3104 return -1; in virt_hvf_get_physical_address_range()
3116 ARM_CPU_TYPE_NAME("cortex-a7"), in virt_machine_class_init()
3117 ARM_CPU_TYPE_NAME("cortex-a15"), in virt_machine_class_init()
3119 ARM_CPU_TYPE_NAME("cortex-a35"), in virt_machine_class_init()
3120 ARM_CPU_TYPE_NAME("cortex-a55"), in virt_machine_class_init()
3121 ARM_CPU_TYPE_NAME("cortex-a72"), in virt_machine_class_init()
3122 ARM_CPU_TYPE_NAME("cortex-a76"), in virt_machine_class_init()
3123 ARM_CPU_TYPE_NAME("cortex-a710"), in virt_machine_class_init()
3125 ARM_CPU_TYPE_NAME("neoverse-n1"), in virt_machine_class_init()
3126 ARM_CPU_TYPE_NAME("neoverse-v1"), in virt_machine_class_init()
3127 ARM_CPU_TYPE_NAME("neoverse-n2"), in virt_machine_class_init()
3131 ARM_CPU_TYPE_NAME("cortex-a53"), in virt_machine_class_init()
3132 ARM_CPU_TYPE_NAME("cortex-a57"), in virt_machine_class_init()
3141 mc->init = machvirt_init; in virt_machine_class_init()
3146 mc->max_cpus = 512; in virt_machine_class_init()
3155 mc->block_default_type = IF_VIRTIO; in virt_machine_class_init()
3156 mc->no_cdrom = 1; in virt_machine_class_init()
3157 mc->pci_allow_0_address = true; in virt_machine_class_init()
3158 /* We know we will never create a pre-ARMv7 CPU which needs 1K pages */ in virt_machine_class_init()
3159 mc->minimum_page_bits = 12; in virt_machine_class_init()
3160 mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids; in virt_machine_class_init()
3161 mc->cpu_index_to_instance_props = virt_cpu_index_to_props; in virt_machine_class_init()
3163 mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"); in virt_machine_class_init()
3165 mc->default_cpu_type = ARM_CPU_TYPE_NAME("max"); in virt_machine_class_init()
3167 mc->valid_cpu_types = valid_cpu_types; in virt_machine_class_init()
3168 mc->get_default_cpu_node_id = virt_get_default_cpu_node_id; in virt_machine_class_init()
3169 mc->kvm_type = virt_kvm_type; in virt_machine_class_init()
3170 mc->hvf_get_physical_address_range = virt_hvf_get_physical_address_range; in virt_machine_class_init()
3171 assert(!mc->get_hotplug_handler); in virt_machine_class_init()
3172 mc->get_hotplug_handler = virt_machine_get_hotplug_handler; in virt_machine_class_init()
3173 hc->pre_plug = virt_machine_device_pre_plug_cb; in virt_machine_class_init()
3174 hc->plug = virt_machine_device_plug_cb; in virt_machine_class_init()
3175 hc->unplug_request = virt_machine_device_unplug_request_cb; in virt_machine_class_init()
3176 hc->unplug = virt_machine_device_unplug_cb; in virt_machine_class_init()
3177 mc->nvdimm_supported = true; in virt_machine_class_init()
3178 mc->smp_props.clusters_supported = true; in virt_machine_class_init()
3179 mc->auto_enable_numa_with_memhp = true; in virt_machine_class_init()
3180 mc->auto_enable_numa_with_memdev = true; in virt_machine_class_init()
3182 mc->cpu_cluster_has_numa_boundary = true; in virt_machine_class_init()
3183 mc->default_ram_id = "mach-virt.ram"; in virt_machine_class_init()
3184 mc->default_nic = "virtio-net-pci"; in virt_machine_class_init()
3194 "Set on/off to enable/disable the ARM " in virt_machine_class_init()
3200 "Set on/off to enable/disable emulating a " in virt_machine_class_init()
3207 "Set on/off to enable/disable using " in virt_machine_class_init()
3210 object_class_property_add_bool(oc, "compact-highmem", in virt_machine_class_init()
3213 object_class_property_set_description(oc, "compact-highmem", in virt_machine_class_init()
3214 "Set on/off to enable/disable compact " in virt_machine_class_init()
3217 object_class_property_add_bool(oc, "highmem-redists", in virt_machine_class_init()
3220 object_class_property_set_description(oc, "highmem-redists", in virt_machine_class_init()
3221 "Set on/off to enable/disable high " in virt_machine_class_init()
3225 object_class_property_add_bool(oc, "highmem-ecam", in virt_machine_class_init()
3228 object_class_property_set_description(oc, "highmem-ecam", in virt_machine_class_init()
3229 "Set on/off to enable/disable high " in virt_machine_class_init()
3232 object_class_property_add_bool(oc, "highmem-mmio", in virt_machine_class_init()
3235 object_class_property_set_description(oc, "highmem-mmio", in virt_machine_class_init()
3236 "Set on/off to enable/disable high " in virt_machine_class_init()
3239 object_class_property_add(oc, "highmem-mmio-size", "size", in virt_machine_class_init()
3243 object_class_property_set_description(oc, "highmem-mmio-size", in virt_machine_class_init()
3247 object_class_property_add_str(oc, "gic-version", virt_get_gic_version, in virt_machine_class_init()
3249 object_class_property_set_description(oc, "gic-version", in virt_machine_class_init()
3258 object_class_property_add_bool(oc, "default-bus-bypass-iommu", in virt_machine_class_init()
3261 object_class_property_set_description(oc, "default-bus-bypass-iommu", in virt_machine_class_init()
3262 "Set on/off to enable/disable " in virt_machine_class_init()
3268 … "Set on/off to enable/disable reporting host memory errors " in virt_machine_class_init()
3273 "Set on/off to enable/disable emulating a " in virt_machine_class_init()
3280 "Set on/off to enable/disable " in virt_machine_class_init()
3283 object_class_property_add_bool(oc, "dtb-randomness", in virt_machine_class_init()
3286 object_class_property_set_description(oc, "dtb-randomness", in virt_machine_class_init()
3287 "Set off to disable passing random or " in virt_machine_class_init()
3288 "non-deterministic dtb nodes to guest"); in virt_machine_class_init()
3290 object_class_property_add_bool(oc, "dtb-kaslr-seed", in virt_machine_class_init()
3293 object_class_property_set_description(oc, "dtb-kaslr-seed", in virt_machine_class_init()
3294 "Deprecated synonym of dtb-randomness"); in virt_machine_class_init()
3296 object_class_property_add_str(oc, "x-oem-id", in virt_machine_class_init()
3299 object_class_property_set_description(oc, "x-oem-id", in virt_machine_class_init()
3305 object_class_property_add_str(oc, "x-oem-table-id", in virt_machine_class_init()
3308 object_class_property_set_description(oc, "x-oem-table-id", in virt_machine_class_init()
3324 vms->secure = false; in virt_instance_init()
3327 vms->virt = false; in virt_instance_init()
3330 vms->highmem = true; in virt_instance_init()
3331 vms->highmem_compact = !vmc->no_highmem_compact; in virt_instance_init()
3332 vms->gic_version = VIRT_GIC_VERSION_NOSEL; in virt_instance_init()
3334 vms->highmem_ecam = true; in virt_instance_init()
3335 vms->highmem_mmio = true; in virt_instance_init()
3336 vms->highmem_redists = true; in virt_instance_init()
3339 vms->its = true; in virt_instance_init()
3341 if (vmc->no_tcg_its) { in virt_instance_init()
3342 vms->tcg_its = false; in virt_instance_init()
3344 vms->tcg_its = true; in virt_instance_init()
3348 vms->iommu = VIRT_IOMMU_NONE; in virt_instance_init()
3351 vms->default_bus_bypass_iommu = false; in virt_instance_init()
3354 vms->ras = false; in virt_instance_init()
3357 vms->mte = false; in virt_instance_init()
3359 /* Supply kaslr-seed and rng-seed by default */ in virt_instance_init()
3360 vms->dtb_randomness = true; in virt_instance_init()
3362 vms->irqmap = a15irqmap; in virt_instance_init()
3366 vms->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); in virt_instance_init()
3367 vms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); in virt_instance_init()
3398 compat_props_add(mc->compat_props, hw_compat_10_0, hw_compat_10_0_len); in virt_machine_10_0_options()
3405 compat_props_add(mc->compat_props, hw_compat_9_2, hw_compat_9_2_len); in virt_machine_9_2_options()
3414 compat_props_add(mc->compat_props, hw_compat_9_1, hw_compat_9_1_len); in virt_machine_9_1_options()
3415 /* 9.1 and earlier have only a stage-1 SMMU, not a nested s1+2 one */ in virt_machine_9_1_options()
3416 vmc->no_nested_smmu = true; in virt_machine_9_1_options()
3423 mc->smbios_memory_device_size = 16 * GiB; in virt_machine_9_0_options()
3424 compat_props_add(mc->compat_props, hw_compat_9_0, hw_compat_9_0_len); in virt_machine_9_0_options()
3433 compat_props_add(mc->compat_props, hw_compat_8_2, hw_compat_8_2_len); in virt_machine_8_2_options()
3439 vmc->no_ns_el2_virt_timer_irq = true; in virt_machine_8_2_options()
3446 compat_props_add(mc->compat_props, hw_compat_8_1, hw_compat_8_1_len); in virt_machine_8_1_options()
3453 compat_props_add(mc->compat_props, hw_compat_8_0, hw_compat_8_0_len); in virt_machine_8_0_options()
3460 compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len); in virt_machine_7_2_options()
3469 compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len); in virt_machine_7_1_options()
3471 vmc->no_highmem_compact = true; in virt_machine_7_1_options()
3478 compat_props_add(mc->compat_props, hw_compat_7_0, hw_compat_7_0_len); in virt_machine_7_0_options()
3487 compat_props_add(mc->compat_props, hw_compat_6_2, hw_compat_6_2_len); in virt_machine_6_2_options()
3488 vmc->no_tcg_lpa2 = true; in virt_machine_6_2_options()
3497 compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len); in virt_machine_6_1_options()
3498 mc->smp_props.prefer_sockets = true; in virt_machine_6_1_options()
3499 vmc->no_cpu_topology = true; in virt_machine_6_1_options()
3502 vmc->no_tcg_its = true; in virt_machine_6_1_options()
3509 compat_props_add(mc->compat_props, hw_compat_6_0, hw_compat_6_0_len); in virt_machine_6_0_options()
3518 compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len); in virt_machine_5_2_options()
3519 vmc->no_secure_gpio = true; in virt_machine_5_2_options()
3528 compat_props_add(mc->compat_props, hw_compat_5_1, hw_compat_5_1_len); in virt_machine_5_1_options()
3529 vmc->no_kvm_steal_time = true; in virt_machine_5_1_options()
3538 compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len); in virt_machine_5_0_options()
3539 mc->numa_mem_supported = true; in virt_machine_5_0_options()
3540 vmc->acpi_expose_flash = true; in virt_machine_5_0_options()
3541 mc->auto_enable_numa_with_memdev = false; in virt_machine_5_0_options()
3550 compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len); in virt_machine_4_2_options()
3551 vmc->kvm_no_adjvtime = true; in virt_machine_4_2_options()
3560 compat_props_add(mc->compat_props, hw_compat_4_1, hw_compat_4_1_len); in virt_machine_4_1_options()
3561 vmc->no_ged = true; in virt_machine_4_1_options()
3562 mc->auto_enable_numa_with_memhp = false; in virt_machine_4_1_options()