A nested SMMU must use iommufd ioctls to communicate with the host-level SMMU instance for 2-stage translation support. Add an iommufd link to the ARM virt-machine, allowing QEMU command to pass in an iommufd object.
Signed-off-by: Nicolin Chen <[email protected]> --- hw/arm/virt.c | 14 ++++++++++++++ include/hw/arm/virt.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 78af2d2195..71093d7c60 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -1404,6 +1404,13 @@ static void create_smmu(const VirtMachineState *vms, object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus), &error_abort); + + if (vms->iommu == VIRT_IOMMU_NESTED_SMMUV3) { + g_assert(vms->iommufd); + object_property_set_link(OBJECT(dev), "iommufd", OBJECT(vms->iommufd), + &error_abort); + object_property_set_bool(OBJECT(dev), "nested", true, &error_abort); + } sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base); for (i = 0; i < NUM_SMMU_IRQS; i++) { @@ -3114,6 +3121,13 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) "Set GIC version. " "Valid values are 2, 3, 4, host and max"); + object_class_property_add_link(oc, "iommufd", TYPE_IOMMUFD_BACKEND, + offsetof(VirtMachineState, iommufd), + object_property_allow_set_link, + OBJ_PROP_LINK_STRONG); + object_class_property_set_description(oc, "iommufd", + "Set the IOMMUFD handler from \"-iommufd\""); + object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu); object_class_property_set_description(oc, "iommu", "Set the IOMMU type. " diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index 7df0813e28..d5cbce1a30 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -36,6 +36,7 @@ #include "hw/arm/boot.h" #include "hw/arm/bsa.h" #include "hw/block/flash.h" +#include "sysemu/iommufd.h" #include "sysemu/kvm.h" #include "hw/intc/arm_gicv3_common.h" #include "qom/object.h" @@ -154,6 +155,7 @@ struct VirtMachineState { bool dtb_randomness; OnOffAuto acpi; VirtGICType gic_version; + IOMMUFDBackend *iommufd; VirtIOMMUType iommu; bool default_bus_bypass_iommu; VirtMSIControllerType msi_controller; -- 2.43.0
