[PATCH v10 0/6] qemu: Support HW-accelerated vSMMUs
Hi, This is a follow up to the v9 patchset [0] for supporting multiple hardware-accelerated vSMMU instances. For instance, specifying hostdevs associated with multiple accelerated SMMUs, configured to be routed to pcie-expander-bus controllers in a way where VFIO device to SMMUv3 associations are matched with the host: <devices> ... <controller type='pci' index='1' model='pcie-expander-bus'> <model name='pxb-pcie'/> <target busNr='252'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> </controller> <controller type='pci' index='2' model='pcie-expander-bus'> <model name='pxb-pcie'/> <target busNr='248'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </controller> ... <controller type='pci' index='21' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='21' port='0x0'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </controller> <controller type='pci' index='22' model='pcie-root-port'> <model name='pcie-root-port'/> <target chassis='22' port='0xa8'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> </controller> ... <hostdev mode='subsystem' type='pci' managed='no'> <source> <address domain='0x0009' bus='0x01' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x15' slot='0x00' function='0x0'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='no'> <source> <address domain='0x0019' bus='0x01' slot='0x00' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x16' slot='0x00' function='0x0'/> </hostdev> <iommu model='smmuv3'> <driver pciBus='1' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/> </iommu> <iommu model='smmuv3'> <driver pciBus='2' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/> </iommu> </devices> This would get translated to a qemu command line with the arguments below: -device '{"driver":"pxb-pcie","bus_nr":252,"id":"pci.1","bus":"pcie.0","addr":"0x1"}' \ -device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","addr":"0x2"}' \ -device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.21","bus":"pci.1","addr":"0x0"}' \ -device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.22","bus":"pci.2","addr":"0x0"}' \ -device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel":true,"ats":"on","ril":"off","ssidsize":"20","oas":"44"}' \ -device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1","accel":true,"ats":"on","ril":"off","ssidsize":"20","oas":"44"}' \ -device '{"driver":"vfio-pci","host":"0009:01:00.0","id":"hostdev0","bus":"pci.21","addr":"0x0"}' \ -device '{"driver":"vfio-pci","host":"0019:01:00.0","id":"hostdev1","bus":"pci.22","addr":"0x0"}' \ Two QEMU series implementing auto support for accel SMMUv3 properties are now present in the upstream master branch [1][2]. This Libvirt series leverages the auto support: users can omit SMMUv3 properties ATS, RIL, OAS, and SSIDSIZE on the domain XML, and they will also be omitted on the QEMU command line as a result. With these new QEMU series applied, the feature property values will default to 'auto' to be resolved based on what the host SMMU supports. This series also adds documentation fixes for docs/formatdomain.rst and implements support for QEMU capability checks on device-pluggable accel smmuv3. This series is on Github: https://github.com/NathanChenNVIDIA/libvirt/tree/smmuv3-accel-v10/ Thanks, Nathan [0] https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/W6HJ5... [1] https://lore.kernel.org/all/20260323182454.1416110-1-nathanc@nvidia.com/ [2] https://lore.kernel.org/all/20260608174900.2227340-1-nathanc@nvidia.com/ Changes from v9: - Rename ssidSize to ssidsize - Update docs/formatdomain.rst to mention `since 12.6.0` for accel smmuv3 properties and these properties' hypervisor defaults being used if not specified. - Separate out virDomainIOMMUDefEquals() check for pci_bus into a new fix commit - Include fix commit for `since 11.10.0` for pciBus attribute in docs/formatdomain.rst - Use T:accel to propagate accel=off - Use qemuOnOffAuto() for ats and ril - Add QEMU capabilities checks for device-pluggable smmuv3 and accel smmuv3 Changes from v8: - Changed smmuv3 attribute QEMU CLI values to strings to match QEMU 11.0 Changes from v7: - Remove support for x-vpasid-cap-offset based on feedback pointing out the QEMU feature prefixed with x- is experimental and not to be supported in Libvirt - Implement support for auto SMMUv3 properties. Omitting these properties in the XML omits them on the QEMU command line as well, which results in default auto values being chosen for ATS, RIL, SSIDSIZE, and OAS - Add validation check that only allows enabling accel SMMUv3 features when accel is enabled - Add tests for accel=on but omitting accel SMMUv3 feature properties Changes from v6: - Remove smmuv3 'pasid' attribute - Add smmuv3 'ssidsize' attribute - Add support for 'vpasidCapOffset' element - Modify logic for building accel smmuv3 qemu command line to omit ATS, RIL, accel flags when not needed (enabled/disabled by default in QEMU SMMUv3) Nathan Chen (6): conf: Include check for pci_bus in virDomainIOMMUDefEquals() docs: formatdomain: Include Libvirt version for IOMMU pciBus attribute qemu: Add support for HW-accelerated nested SMMUv3 qemu: introduce QEMU_CAPS_ARM_SMMUV3 qemu: introduce QEMU_CAPS_ARM_SMMUV3_ACCEL tests: qemuxmlconfdata: provide HW-accel smmuv3 sample XML and CLI args docs/formatdomain.rst | 41 ++++- src/conf/domain_conf.c | 80 ++++++++++ src/conf/domain_conf.h | 5 + src/conf/domain_validate.c | 27 +++- src/conf/schemas/domaincommon.rng | 25 +++ src/qemu/qemu_capabilities.c | 14 ++ src/qemu/qemu_capabilities.h | 2 + src/qemu/qemu_command.c | 15 ++ src/qemu/qemu_validate.c | 21 ++- .../caps_10.0.0_aarch64.replies | 79 ++++++---- .../caps_10.2.0_aarch64.replies | 89 +++++++---- .../caps_10.2.0_aarch64.xml | 1 + .../caps_11.0.0_aarch64.replies | 132 ++++++++++++---- .../caps_11.0.0_aarch64.xml | 2 + .../caps_11.1.0_aarch64.replies | 143 ++++++++++++++---- .../caps_11.1.0_aarch64.xml | 2 + .../caps_8.2.0_aarch64.replies | 79 ++++++---- .../caps_8.2.0_armv7l.replies | 79 ++++++---- .../caps_9.2.0_aarch64+hvf.replies | 75 ++++++--- ...uv3-pci-bus-accel-auto.aarch64-latest.args | 38 +++++ ...muv3-pci-bus-accel-auto.aarch64-latest.xml | 63 ++++++++ .../iommu-smmuv3-pci-bus-accel-auto.xml | 53 +++++++ ...u-smmuv3-pci-bus-accel.aarch64-latest.args | 38 +++++ ...mu-smmuv3-pci-bus-accel.aarch64-latest.xml | 63 ++++++++ .../iommu-smmuv3-pci-bus-accel.xml | 53 +++++++ tests/qemuxmlconftest.c | 2 + 26 files changed, 1032 insertions(+), 189 deletions(-) create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml -- 2.43.0
From: Nathan Chen <nathanc@nvidia.com> virDomainIOMMUDefEquals() should check for pci_bus being equal across two virDomainIOMMUDef being compared. Fixes: 4d6419b286af ("qemu: Implement pluggable-device smmuv3") Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- src/conf/domain_conf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 17c4a57cd8..94cfb27c1d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16849,6 +16849,7 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, a->iotlb != b->iotlb || a->aw_bits != b->aw_bits || a->dma_translation != b->dma_translation || + a->pci_bus != b->pci_bus || a->xtsup != b->xtsup || a->pt != b->pt || a->granule != b->granule) -- 2.43.0
From: Nathan Chen <nathanc@nvidia.com> Update formatdomain doc to mention IOMMU pciBus attribute was introduced in Libvirt v11.10.0. Fixes: 4d6419b286af ("qemu: Implement pluggable-device smmuv3") Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- docs/formatdomain.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index a861f9f177..2cc97d2daa 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9424,7 +9424,8 @@ Examples: ``pciBus`` The ``pciBus`` attribute notes the index of the controller that an - IOMMU device is attached to. (QEMU/KVM and ``smmuv3`` model only) + IOMMU device is attached to. + :since:`Since 11.10.0` (QEMU/KVM and ``smmuv3`` model only) In case of ``virtio`` IOMMU device, the ``driver`` element can optionally contain ``granule`` subelement that allows to choose which granule will be -- 2.43.0
From: Nathan Chen <nathanc@nvidia.com> Add support for enabling HW-accelerated nested SMMUv3 via <accel> attribute and its additional attributes for ATS, SSID, RIL, and OAS configuration. Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- docs/formatdomain.rst | 38 +++++++++++++++ src/conf/domain_conf.c | 79 +++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 5 ++ src/conf/domain_validate.c | 27 ++++++++++- src/conf/schemas/domaincommon.rng | 25 ++++++++++ src/qemu/qemu_command.c | 15 ++++++ 6 files changed, 188 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 2cc97d2daa..22076dedc1 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -9427,6 +9427,44 @@ Examples: IOMMU device is attached to. :since:`Since 11.10.0` (QEMU/KVM and ``smmuv3`` model only) + ``accel`` + The ``accel`` attribute with possible values ``on`` and ``off`` can + be used to enable hardware acceleration support for smmuv3 IOMMU + devices. + :since:`Since 12.6.0` (QEMU/KVM and ``smmuv3`` model only) + + ``ats`` + The ``ats`` attribute with possible values ``on`` and ``off`` can be + used to enable reporting Address Translation Services capability to + the guest for smmuv3 IOMMU devices with ``accel`` set to ``on``, if + the host SMMUv3 supports ATS and the associated passthrough device + supports ATS. If ``accel`` is enabled and ``ats`` is not configured, + the hypervisor default value is used. + :since:`Since 12.6.0` (QEMU/KVM and ``smmuv3`` model only) + + ``ril`` + The ``ril`` attribute with possible values ``on`` and ``off`` can be + used to report whether Range Invalidation for IOMMU devices with + ``accel`` set to ``on`` is compatible with host SMMUv3 support. If + ``accel`` is enabled and ``ril`` is not configured, the hypervisor + default value is used. + :since:`Since 12.6.0` (QEMU/KVM and ``smmuv3`` model only) + + ``ssidsize`` + The ``ssidsize`` attribute sets the number of bits used to + represent SubstreamIDs. A value of N allows SSIDs in the range + [0 .. 2^N - 1]. The valid range is 0-20, and a value greater than 0 + is required for enabling PASID support, as doing so advertises PASID + capability to the vIOMMU. If ``accel`` is enabled and ``ssidsize`` is + not configured, the hypervisor default value is used. + :since:`Since 12.6.0` (QEMU/KVM and ``smmuv3`` model only) + + ``oas`` + The ``oas`` attribute sets the output address size in units of bits. + If ``accel`` is enabled and ``oas`` is not configured, the hypervisor + default value is used. + :since:`Since 12.6.0` (QEMU/KVM and ``smmuv3`` model only) + In case of ``virtio`` IOMMU device, the ``driver`` element can optionally contain ``granule`` subelement that allows to choose which granule will be used by default. It is useful when running guests with different page size diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 94cfb27c1d..db44ba9a72 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2863,6 +2863,10 @@ virDomainIOMMUDefNew(void) iommu->pci_bus = -1; + iommu->ssid_size = -1; + + iommu->oas = -1; + return g_steal_pointer(&iommu); } @@ -14746,6 +14750,26 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlopt, &iommu->pci_bus, -1) < 0) return NULL; + if (virXMLPropTristateSwitch(driver, "accel", VIR_XML_PROP_NONE, + &iommu->accel) < 0) + return NULL; + + if (virXMLPropTristateSwitch(driver, "ats", VIR_XML_PROP_NONE, + &iommu->ats) < 0) + return NULL; + + if (virXMLPropTristateSwitch(driver, "ril", VIR_XML_PROP_NONE, + &iommu->ril) < 0) + return NULL; + + if (virXMLPropInt(driver, "ssidsize", 10, VIR_XML_PROP_NONE, + &iommu->ssid_size, -1) < 0) + return NULL; + + if (virXMLPropInt(driver, "oas", 10, VIR_XML_PROP_NONE, + &iommu->oas, -1) < 0) + return NULL; + if ((granule = virXPathNode("./driver/granule", ctxt))) { g_autofree char *mode = virXMLPropString(granule, "mode"); unsigned long long size; @@ -16850,6 +16874,11 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a, a->aw_bits != b->aw_bits || a->dma_translation != b->dma_translation || a->pci_bus != b->pci_bus || + a->accel != b->accel || + a->ats != b->ats || + a->ril != b->ril || + a->ssid_size != b->ssid_size || + a->oas != b->oas || a->xtsup != b->xtsup || a->pt != b->pt || a->granule != b->granule) @@ -22734,6 +22763,36 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUDef *src, dst->pci_bus, src->pci_bus); return false; } + if (src->accel != dst->accel) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device accel value '%1$d' does not match source '%2$d'"), + dst->accel, src->accel); + return false; + } + if (src->ats != dst->ats) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ATS value '%1$d' does not match source '%2$d'"), + dst->ats, src->ats); + return false; + } + if (src->ril != dst->ril) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ril value '%1$d' does not match source '%2$d'"), + dst->ril, src->ril); + return false; + } + if (src->ssid_size != dst->ssid_size) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device ssid_size value '%1$d' does not match source '%2$d'"), + dst->ssid_size, src->ssid_size); + return false; + } + if (src->oas != dst->oas) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target domain IOMMU device oas value '%1$d' does not match source '%2$d'"), + dst->oas, src->oas); + return false; + } if (src->dma_translation != dst->dma_translation) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Target domain IOMMU device dma translation '%1$s' does not match source '%2$s'"), @@ -29204,6 +29263,26 @@ virDomainIOMMUDefFormat(virBuffer *buf, virBufferAsprintf(&driverAttrBuf, " pciBus='%d'", iommu->pci_bus); } + if (iommu->accel != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " accel='%s'", + virTristateSwitchTypeToString(iommu->accel)); + } + if (iommu->ats != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " ats='%s'", + virTristateSwitchTypeToString(iommu->ats)); + } + if (iommu->ril != VIR_TRISTATE_SWITCH_ABSENT) { + virBufferAsprintf(&driverAttrBuf, " ril='%s'", + virTristateSwitchTypeToString(iommu->ril)); + } + if (iommu->ssid_size >= 0) { + virBufferAsprintf(&driverAttrBuf, " ssidsize='%d'", + iommu->ssid_size); + } + if (iommu->oas >= 0) { + virBufferAsprintf(&driverAttrBuf, " oas='%d'", + iommu->oas); + } if (iommu->granule != 0) { if (iommu->granule == -1) { virBufferAddLit(&driverChildBuf, "<granule mode='host'/>\n"); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0c6c79c413..40ea6090f8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3105,6 +3105,11 @@ struct _virDomainIOMMUDef { virTristateSwitch xtsup; virTristateSwitch pt; int granule; /* -1 means 'host', 0 unset, page size in KiB otherwise */ + virTristateSwitch accel; + virTristateSwitch ats; + virTristateSwitch ril; + int ssid_size; + int oas; }; typedef enum { diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 3946f92182..710a891904 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -3203,6 +3203,16 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu) virDomainIOMMUModelTypeToString(iommu->model)); return -1; } + if (iommu->accel != VIR_TRISTATE_SWITCH_ON && + (iommu->ats != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >= 0 || + iommu->oas >= 0)) { + virReportError(VIR_ERR_XML_ERROR, + _("accel must be enabled for iommu model '%1$s' when setting ats, ril, ssidsize, or oas"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } break; case VIR_DOMAIN_IOMMU_MODEL_VIRTIO: if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT || @@ -3210,7 +3220,12 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu) iommu->eim != VIR_TRISTATE_SWITCH_ABSENT || iommu->iotlb != VIR_TRISTATE_SWITCH_ABSENT || iommu->dma_translation != VIR_TRISTATE_SWITCH_ABSENT || - iommu->pci_bus >= 0) { + iommu->pci_bus >= 0 || + iommu->accel != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ats != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >= 0 || + iommu->oas >= 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some additional attributes"), virDomainIOMMUModelTypeToString(iommu->model)); @@ -3233,6 +3248,11 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu) iommu->aw_bits != 0 || iommu->dma_translation != VIR_TRISTATE_SWITCH_ABSENT || iommu->pci_bus >= 0 || + iommu->accel != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ats != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >= 0 || + iommu->oas >= 0 || iommu->granule != 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some additional attributes"), @@ -3245,6 +3265,11 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu) if (iommu->pt != VIR_TRISTATE_SWITCH_ABSENT || iommu->xtsup != VIR_TRISTATE_SWITCH_ABSENT || iommu->pci_bus >= 0 || + iommu->accel != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ats != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ril != VIR_TRISTATE_SWITCH_ABSENT || + iommu->ssid_size >= 0 || + iommu->oas >= 0 || iommu->granule != 0) { virReportError(VIR_ERR_XML_ERROR, _("iommu model '%1$s' doesn't support some additional attributes"), diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 121e4e06a6..c7d7ebc876 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6454,6 +6454,31 @@ <empty/> </element> </optional> + <optional> + <attribute name="accel"> + <ref name="virOnOff"/> + </attribute> + </optional> + <optional> + <attribute name="ats"> + <ref name="virOnOff"/> + </attribute> + </optional> + <optional> + <attribute name="ril"> + <ref name="virOnOff"/> + </attribute> + </optional> + <optional> + <attribute name="ssidsize"> + <data type="int"/> + </attribute> + </optional> + <optional> + <attribute name="oas"> + <data type="int"/> + </attribute> + </optional> </element> </optional> <optional> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e726dc661c..2d5eaa1e80 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6276,6 +6276,8 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *def, { g_autoptr(virJSONValue) props = NULL; g_autofree char *bus = NULL; + g_autofree char *ssidsizeStr = NULL; + g_autofree char *oasStr = NULL; virPCIDeviceAddress addr = { .bus = iommu->pci_bus }; bus = qemuBuildDeviceAddressPCIGetBus(def, &addr); @@ -6286,10 +6288,23 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *def, return NULL; } + if (iommu->ssid_size >= 0) { + ssidsizeStr = g_strdup_printf("%u", iommu->ssid_size); + } + + if (iommu->oas >= 0) { + oasStr = g_strdup_printf("%u", iommu->oas); + } + if (virJSONValueObjectAdd(&props, "s:driver", "arm-smmuv3", "s:primary-bus", bus, "s:id", iommu->info.alias, + "T:accel", iommu->accel, + "S:ats", qemuOnOffAuto(iommu->ats), + "S:ril", qemuOnOffAuto(iommu->ril), + "S:ssidsize", ssidsizeStr, + "S:oas", oasStr, NULL) < 0) return NULL; -- 2.43.0
From: Nathan Chen <nathanc@nvidia.com> The arm-smmuv3 QOM type appears in qom-list-types on ARM QEMU as far back as 8.2 because the type is used for machine-integrated IOMMU (-machine virt,iommu=smmuv3). That reply does not indicate support for a user-pluggable -device arm-smmuv3. User-pluggable SMMUv3 with the smmu_per_bus property was added in QEMU 10.2.0. Probe that property via device-list-properties instead of registering arm-smmuv3 in virQEMUCapsObjectTypes[], so the capability tracks pluggable device support rather than mere QOM visibility. Skip arm-smmuv3 device-list-properties probing on non-ARM targets. In qemu_validate.c, an IOMMU with pci_bus set requires QEMU_CAPS_ARM_SMMUV3; machine-integrated SMMUv3 without pci_bus keeps using QEMU_CAPS_MACHINE_VIRT_IOMMU. Update caps_8.2.0_aarch64, caps_9.2.0_aarch64, caps_10.0.0_aarch64, caps_10.2.0_aarch64, caps_11.0.0_aarch64, caps_8.2.0_armv7l, and caps_11.1.0_aarch64 .replies with the arm-smmuv3 device-list-properties exchange. Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- src/qemu/qemu_capabilities.c | 12 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_validate.c | 9 +- .../caps_10.0.0_aarch64.replies | 79 ++++++---- .../caps_10.2.0_aarch64.replies | 89 +++++++---- .../caps_10.2.0_aarch64.xml | 1 + .../caps_11.0.0_aarch64.replies | 132 ++++++++++++---- .../caps_11.0.0_aarch64.xml | 1 + .../caps_11.1.0_aarch64.replies | 143 ++++++++++++++---- .../caps_11.1.0_aarch64.xml | 1 + .../caps_8.2.0_aarch64.replies | 79 ++++++---- .../caps_8.2.0_armv7l.replies | 79 ++++++---- .../caps_9.2.0_aarch64+hvf.replies | 75 ++++++--- 13 files changed, 514 insertions(+), 187 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index be57dcad8e..c98023bbe2 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -767,6 +767,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 495 */ "blockdev-mirror.target-is-zero", /* QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO */ + "arm-smmuv3.smmu_per_bus", /* QEMU_CAPS_ARM_SMMUV3 */ ); @@ -1643,6 +1644,10 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsAMDIOMMU[] = { { "xtsup", QEMU_CAPS_AMD_IOMMU_XTSUP, NULL }, }; +static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsArmSmmuv3[] = { + { "smmu_per_bus", QEMU_CAPS_ARM_SMMUV3, NULL }, +}; + /* see documentation for virQEMUQAPISchemaPathGet for the query format */ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { { "blockdev-add/arg-type/+file/drop-cache", QEMU_CAPS_MIGRATION_FILE_DROP_CACHE }, @@ -1808,6 +1813,9 @@ static virQEMUCapsDeviceTypeProps virQEMUCapsDeviceProps[] = { { "amd-iommu", virQEMUCapsDevicePropsAMDIOMMU, G_N_ELEMENTS(virQEMUCapsDevicePropsAMDIOMMU), QEMU_CAPS_AMD_IOMMU }, + { "arm-smmuv3", virQEMUCapsDevicePropsArmSmmuv3, + G_N_ELEMENTS(virQEMUCapsDevicePropsArmSmmuv3), + -1 }, { "scsi-block", virQEMUCapsDevicePropsSCSIBlock, G_N_ELEMENTS(virQEMUCapsDevicePropsSCSIBlock), -1 }, @@ -2825,6 +2833,10 @@ virQEMUCapsProbeQMPDeviceProperties(virQEMUCaps *qemuCaps, !virQEMUCapsGet(qemuCaps, device->capsCondition)) continue; + if (STREQ(device->type, "arm-smmuv3") && + !ARCH_IS_ARM(qemuCaps->arch)) + continue; + if (!(qemuprops = qemuMonitorGetDeviceProps(mon, device->type))) return -1; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 3014f3dc5e..c03c32389b 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -741,6 +741,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 495 */ QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO, /* 'blockdev-mirror' supports 'target-is-zero' */ + QEMU_CAPS_ARM_SMMUV3, /* arm-smmuv3.smmu_per_bus */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 439d4b1916..500b8ee680 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -5711,7 +5711,14 @@ qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, virDomainIOMMUModelTypeToString(iommu->model)); return -1; } - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { + if (iommu->pci_bus >= 0) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_ARM_SMMUV3)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("IOMMU device: Setting pciBus for '%1$s' is not supported with this QEMU binary"), + virDomainIOMMUModelTypeToString(iommu->model)); + return -1; + } + } else if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_VIRT_IOMMU)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("IOMMU device: '%1$s' is not supported with this QEMU binary"), virDomainIOMMUModelTypeToString(iommu->model)); diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies index 0448dcaab9..382b76e021 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.replies @@ -32067,17 +32067,44 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-31" } +{ + "return": [ + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "name": "stage", + "type": "str" + } + ], + "id": "libvirt-31" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-32" +} + { "error": { "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-31" + "id": "libvirt-32" } { @@ -32085,7 +32112,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -32093,7 +32120,7 @@ "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -32101,7 +32128,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -32191,7 +32218,7 @@ "type": "bool" } ], - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -32199,7 +32226,7 @@ "arguments": { "typename": "memory-backend-memfd" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -32278,7 +32305,7 @@ "type": "int" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -32286,7 +32313,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -32534,12 +32561,12 @@ "type": "link<irq>" } ], - "id": "libvirt-35" + "id": "libvirt-36" } { "execute": "query-machines", - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -33634,7 +33661,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -33642,7 +33669,7 @@ "arguments": { "typename": "virt-10.0-machine" }, - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -33889,7 +33916,7 @@ "type": "string" } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -33897,7 +33924,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -34016,12 +34043,12 @@ "type": "bool" } ], - "id": "libvirt-38" + "id": "libvirt-39" } { "execute": "query-cpu-definitions", - "id": "libvirt-39" + "id": "libvirt-40" } { @@ -34315,12 +34342,12 @@ "deprecated": false } ], - "id": "libvirt-39" + "id": "libvirt-40" } { "execute": "query-command-line-options", - "id": "libvirt-40" + "id": "libvirt-41" } { @@ -35787,12 +35814,12 @@ "option": "drive" } ], - "id": "libvirt-40" + "id": "libvirt-41" } { "execute": "query-gic-capabilities", - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -35808,7 +35835,7 @@ "kernel": false } ], - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -35819,7 +35846,7 @@ "name": "host" } }, - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -35852,7 +35879,7 @@ } } }, - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -35867,11 +35894,11 @@ } } }, - "id": "libvirt-43" + "id": "libvirt-44" } { - "id": "libvirt-43", + "id": "libvirt-44", "error": { "class": "GenericError", "desc": "Parameter 'model.props.hv-passthrough' is unexpected" diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.replies index 2a5be22ed8..c0cb15aa3a 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.replies @@ -33933,11 +33933,44 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-32" } +{ + "return": [ + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "default-value": false, + "name": "smmu_per_bus", + "description": "on/off", + "type": "bool" + }, + { + "name": "stage", + "type": "str" + } + ], + "id": "libvirt-32" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-33" +} + { "return": [ { @@ -34008,7 +34041,7 @@ "type": "int32" } ], - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -34016,7 +34049,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -34057,7 +34090,7 @@ "type": "int32" } ], - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -34065,7 +34098,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -34159,7 +34192,7 @@ "type": "bool" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -34167,7 +34200,7 @@ "arguments": { "typename": "memory-backend-memfd" }, - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -34236,7 +34269,7 @@ "type": "bool" } ], - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -34244,7 +34277,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -34492,12 +34525,12 @@ "type": "link<irq>" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { "execute": "query-machines", - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -35539,7 +35572,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -35547,7 +35580,7 @@ "arguments": { "typename": "virt-10.2-machine" }, - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -35810,7 +35843,7 @@ "type": "child<cfi.pflash01>" } ], - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -35818,7 +35851,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-39" + "id": "libvirt-40" } { @@ -35943,12 +35976,12 @@ "type": "bool" } ], - "id": "libvirt-39" + "id": "libvirt-40" } { "execute": "query-cpu-definitions", - "id": "libvirt-40" + "id": "libvirt-41" } { @@ -36176,12 +36209,12 @@ "deprecated": false } ], - "id": "libvirt-40" + "id": "libvirt-41" } { "execute": "query-command-line-options", - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -37743,12 +37776,12 @@ "option": "drive" } ], - "id": "libvirt-41" + "id": "libvirt-42" } { "execute": "query-gic-capabilities", - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -37764,7 +37797,7 @@ "kernel": true } ], - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -37775,7 +37808,7 @@ "name": "host" } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -37808,7 +37841,7 @@ } } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -37819,7 +37852,7 @@ "name": "host" } }, - "id": "libvirt-44" + "id": "libvirt-45" } { @@ -37852,7 +37885,7 @@ } } }, - "id": "libvirt-44" + "id": "libvirt-45" } { @@ -37867,11 +37900,11 @@ } } }, - "id": "libvirt-45" + "id": "libvirt-46" } { - "id": "libvirt-45", + "id": "libvirt-46", "error": { "class": "GenericError", "desc": "Parameter 'model.props.hv-passthrough' is unexpected" diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml index df3e2a8275..f637cb6f11 100644 --- a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml @@ -186,6 +186,7 @@ <flag name='iommufd'/> <flag name='uefi-vars'/> <flag name='blockdev-mirror.target-is-zero'/> + <flag name='arm-smmuv3.smmu_per_bus'/> <version>10002000</version> <microcodeVersion>61700287</microcodeVersion> <package>v10.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.replies index fef7dd9730..078716745d 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.replies @@ -33845,11 +33845,87 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-32" } +{ + "return": [ + { + "name": "memory", + "type": "link<memory-region>" + }, + { + "name": "secure-memory", + "type": "link<memory-region>" + }, + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "default-value": false, + "name": "smmu_per_bus", + "description": "on/off", + "type": "bool" + }, + { + "default-value": "44", + "name": "oas", + "description": "Specify Output Address Size (for accel=on). Supported values are 44 or 48 bits. Defaults to 44 bits. oas=auto is not supported.", + "type": "OasMode" + }, + { + "default-value": "on", + "name": "ril", + "description": "Disable range invalidation support (for accel=on). ril=auto is not supported.", + "type": "OnOffAuto" + }, + { + "default-value": 0, + "name": "msi-gpa", + "type": "uint64" + }, + { + "default-value": false, + "name": "accel", + "description": "Enable SMMUv3 accelerator support. Allows host SMMUv3 to be configured in nested mode for vfio-pci dev assignment", + "type": "bool" + }, + { + "name": "stage", + "type": "str" + }, + { + "default-value": "0", + "name": "ssidsize", + "description": "Number of bits used to represent SubstreamIDs (SSIDs). A value of N allows SSIDs in the range [0 .. 2^N - 1]. Valid range is 0-20, where 0 disables SubstreamID support. Defaults to 0. A value greater than 0 is required to enable PASID support. ssidsize=auto is not supported.", + "type": "SsidSizeMode" + }, + { + "default-value": "off", + "name": "ats", + "description": "Enable/disable ATS support (for accel=on). Please ensure host platform has ATS support before enabling this. ats=auto is not supported.", + "type": "OnOffAuto" + } + ], + "id": "libvirt-32" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-33" +} + { "return": [ { @@ -33926,7 +34002,7 @@ "type": "int32" } ], - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -33934,7 +34010,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -33975,7 +34051,7 @@ "type": "int32" } ], - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -33983,7 +34059,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -34077,7 +34153,7 @@ "type": "bool" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -34085,7 +34161,7 @@ "arguments": { "typename": "memory-backend-memfd" }, - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -34154,7 +34230,7 @@ "type": "bool" } ], - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -34162,7 +34238,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -34411,12 +34487,12 @@ "type": "link<irq>" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { "execute": "query-machines", - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -35466,7 +35542,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -35474,7 +35550,7 @@ "arguments": { "typename": "virt-11.0-machine" }, - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -35752,7 +35828,7 @@ "type": "child<cfi.pflash01>" } ], - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -35760,7 +35836,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-39" + "id": "libvirt-40" } { @@ -35890,12 +35966,12 @@ "type": "bool" } ], - "id": "libvirt-39" + "id": "libvirt-40" } { "execute": "query-cpu-definitions", - "id": "libvirt-40" + "id": "libvirt-41" } { @@ -36123,12 +36199,12 @@ "deprecated": false } ], - "id": "libvirt-40" + "id": "libvirt-41" } { "execute": "query-command-line-options", - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -37709,12 +37785,12 @@ "option": "drive" } ], - "id": "libvirt-41" + "id": "libvirt-42" } { "execute": "query-gic-capabilities", - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -37730,7 +37806,7 @@ "kernel": true } ], - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -37741,7 +37817,7 @@ "name": "host" } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -37774,7 +37850,7 @@ } } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -37785,7 +37861,7 @@ "name": "host" } }, - "id": "libvirt-44" + "id": "libvirt-45" } { @@ -37818,7 +37894,7 @@ } } }, - "id": "libvirt-44" + "id": "libvirt-45" } { @@ -37833,11 +37909,11 @@ } } }, - "id": "libvirt-45" + "id": "libvirt-46" } { - "id": "libvirt-45", + "id": "libvirt-46", "error": { "class": "GenericError", "desc": "Parameter 'model.props.hv-passthrough' is unexpected" diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml index 3fdc0d6621..b5f43d9be5 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml @@ -188,6 +188,7 @@ <flag name='uefi-vars'/> <flag name='query-block-flat'/> <flag name='blockdev-mirror.target-is-zero'/> + <flag name='arm-smmuv3.smmu_per_bus'/> <version>11000000</version> <microcodeVersion>61700286</microcodeVersion> <package>v11.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies index 41cd5496c6..c91d77655d 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.replies @@ -33939,11 +33939,98 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-32" } +{ + "return": [ + { + "name": "memory", + "type": "link<memory-region>" + }, + { + "name": "secure-memory", + "type": "link<memory-region>" + }, + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "default-value": false, + "name": "smmu_per_bus", + "description": "on/off", + "type": "bool" + }, + { + "default-value": "auto", + "name": "cmdqv", + "description": "Enable/disable CMDQV support (for accel=on). Valid values are on, off, and auto. Defaults to auto.", + "type": "OnOffAuto" + }, + { + "default-value": "auto", + "name": "ats", + "description": "Enable/disable ATS support (for accel=on). Valid values are on, off, and auto. Defaults to auto. Please ensure host platform supports ATS before setting it to on.", + "type": "OnOffAuto" + }, + { + "default-value": "auto", + "name": "oas", + "description": "Set Output Address Size in bits (for accel=on). Valid values are 44, 48, and auto. Defaults to auto.Please ensure the value does not exceed the maximum Output Address Size supported by the host platform.", + "type": "OasMode" + }, + { + "default-value": "auto", + "name": "ssidsize", + "description": "Set number of bits used to represent SubstreamIDs (SSIDs). Valid values are 0-20 and auto. Defaults to auto. A value of N allows SSIDs in the range [0 .. 2^N - 1]. A value of 0 disables SubstreamID support. A value greater than 0 is required to enable PASID support.Please ensure the value does not exceed the maximum SubstreamID size supported by the host platform.", + "type": "SsidSizeMode" + }, + { + "default-value": "auto", + "name": "ril", + "description": "Enable/disable range invalidation support (for accel=on). Valid values are on, off, and auto. Defaults to auto. Any attempt to turn it 'on' while the host does not support it would fail.", + "type": "OnOffAuto" + }, + { + "default-value": false, + "name": "accel", + "description": "Enable SMMUv3 accelerator support. Allows host SMMUv3 to be configured in nested mode for vfio-pci dev assignment. Please ensure the host SMMUv3 supports nested translation before enabling.", + "type": "bool" + }, + { + "name": "stage", + "type": "str" + }, + { + "default-value": 0, + "name": "msi-gpa", + "type": "uint64" + }, + { + "default-value": 0, + "name": "identifier", + "type": "uint8" + } + ], + "id": "libvirt-32" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-33" +} + { "return": [ { @@ -34020,7 +34107,7 @@ "type": "int32" } ], - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -34028,7 +34115,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -34069,7 +34156,7 @@ "type": "int32" } ], - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -34077,7 +34164,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -34171,7 +34258,7 @@ "type": "bool" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -34179,7 +34266,7 @@ "arguments": { "typename": "memory-backend-memfd" }, - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -34248,7 +34335,7 @@ "type": "bool" } ], - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -34256,7 +34343,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -34511,12 +34598,12 @@ "type": "link<irq>" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { "execute": "query-machines", - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -35555,7 +35642,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -35563,7 +35650,7 @@ "arguments": { "typename": "virt-11.1-machine" }, - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -35841,7 +35928,7 @@ "type": "child<cfi.pflash01>" } ], - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -35849,7 +35936,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-39" + "id": "libvirt-40" } { @@ -35979,12 +36066,12 @@ "type": "bool" } ], - "id": "libvirt-39" + "id": "libvirt-40" } { "execute": "query-cpu-definitions", - "id": "libvirt-40" + "id": "libvirt-41" } { @@ -36212,12 +36299,12 @@ "deprecated": false } ], - "id": "libvirt-40" + "id": "libvirt-41" } { "execute": "query-command-line-options", - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -37810,12 +37897,12 @@ "option": "drive" } ], - "id": "libvirt-41" + "id": "libvirt-42" } { "execute": "query-gic-capabilities", - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -37831,7 +37918,7 @@ "kernel": true } ], - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -37842,7 +37929,7 @@ "name": "host" } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -37875,7 +37962,7 @@ } } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -37886,7 +37973,7 @@ "name": "host" } }, - "id": "libvirt-44" + "id": "libvirt-45" } { @@ -37919,7 +38006,7 @@ } } }, - "id": "libvirt-44" + "id": "libvirt-45" } { @@ -37934,11 +38021,11 @@ } } }, - "id": "libvirt-45" + "id": "libvirt-46" } { - "id": "libvirt-45", + "id": "libvirt-46", "error": { "class": "GenericError", "desc": "Parameter 'model.props.hv-passthrough' is unexpected" diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml index f7dd14a1ad..28bf1aff57 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml @@ -188,6 +188,7 @@ <flag name='uefi-vars'/> <flag name='query-block-flat'/> <flag name='blockdev-mirror.target-is-zero'/> + <flag name='arm-smmuv3.smmu_per_bus'/> <version>11000050</version> <microcodeVersion>61700287</microcodeVersion> <package>v11.0.0-1600-g5611a9268d</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies index 002ca31b9f..c4d0be6029 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies +++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.replies @@ -31157,17 +31157,44 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-32" } +{ + "return": [ + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "name": "stage", + "type": "str" + } + ], + "id": "libvirt-32" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-33" +} + { "error": { "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -31175,7 +31202,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -31183,7 +31210,7 @@ "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -31191,7 +31218,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -31281,7 +31308,7 @@ "type": "bool" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -31289,7 +31316,7 @@ "arguments": { "typename": "memory-backend-memfd" }, - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -31368,7 +31395,7 @@ "type": "int" } ], - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -31376,7 +31403,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -31585,12 +31612,12 @@ "type": "bool" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { "execute": "query-machines", - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -32702,7 +32729,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -32710,7 +32737,7 @@ "arguments": { "typename": "virt-8.2-machine" }, - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -32946,7 +32973,7 @@ "type": "child<cfi.pflash01>" } ], - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -32954,7 +32981,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-39" + "id": "libvirt-40" } { @@ -33067,12 +33094,12 @@ "type": "child<container>" } ], - "id": "libvirt-39" + "id": "libvirt-40" } { "execute": "query-cpu-definitions", - "id": "libvirt-40" + "id": "libvirt-41" } { @@ -33366,12 +33393,12 @@ "deprecated": false } ], - "id": "libvirt-40" + "id": "libvirt-41" } { "execute": "query-command-line-options", - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -34736,12 +34763,12 @@ "option": "drive" } ], - "id": "libvirt-41" + "id": "libvirt-42" } { "execute": "query-gic-capabilities", - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -34757,7 +34784,7 @@ "kernel": false } ], - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -34768,7 +34795,7 @@ "name": "host" } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -34801,7 +34828,7 @@ } } }, - "id": "libvirt-43" + "id": "libvirt-44" } { @@ -34816,11 +34843,11 @@ } } }, - "id": "libvirt-44" + "id": "libvirt-45" } { - "id": "libvirt-44", + "id": "libvirt-45", "error": { "class": "GenericError", "desc": "Parameter 'hv-passthrough' is unexpected" diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies index b8f7b6f68a..51cd48e1d1 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies +++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.replies @@ -31391,17 +31391,44 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-32" } +{ + "return": [ + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "name": "stage", + "type": "str" + } + ], + "id": "libvirt-32" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-33" +} + { "error": { "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -31409,7 +31436,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -31417,7 +31444,7 @@ "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -31425,7 +31452,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -31519,7 +31546,7 @@ "type": "bool" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -31527,7 +31554,7 @@ "arguments": { "typename": "memory-backend-memfd" }, - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -31606,7 +31633,7 @@ "type": "int" } ], - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -31614,7 +31641,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -31756,12 +31783,12 @@ "type": "link<irq>" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { "execute": "query-machines", - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -32819,7 +32846,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -32827,7 +32854,7 @@ "arguments": { "typename": "virt-8.2-machine" }, - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -33063,7 +33090,7 @@ "type": "child<cfi.pflash01>" } ], - "id": "libvirt-38" + "id": "libvirt-39" } { @@ -33071,7 +33098,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-39" + "id": "libvirt-40" } { @@ -33184,12 +33211,12 @@ "type": "child<container>" } ], - "id": "libvirt-39" + "id": "libvirt-40" } { "execute": "query-cpu-definitions", - "id": "libvirt-40" + "id": "libvirt-41" } { @@ -33411,12 +33438,12 @@ "deprecated": false } ], - "id": "libvirt-40" + "id": "libvirt-41" } { "execute": "query-command-line-options", - "id": "libvirt-41" + "id": "libvirt-42" } { @@ -34898,12 +34925,12 @@ "option": "drive" } ], - "id": "libvirt-41" + "id": "libvirt-42" } { "execute": "query-gic-capabilities", - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -34919,7 +34946,7 @@ "kernel": false } ], - "id": "libvirt-42" + "id": "libvirt-43" } { @@ -34930,11 +34957,11 @@ "name": "host" } }, - "id": "libvirt-43" + "id": "libvirt-44" } { - "id": "libvirt-43", + "id": "libvirt-44", "error": { "class": "GenericError", "desc": "The CPU type 'host' requires KVM" @@ -34953,11 +34980,11 @@ } } }, - "id": "libvirt-44" + "id": "libvirt-45" } { - "id": "libvirt-44", + "id": "libvirt-45", "error": { "class": "GenericError", "desc": "The CPU type 'host' requires KVM" diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies index 14b11c5c30..31b13f865b 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies +++ b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.replies @@ -30532,17 +30532,44 @@ { "execute": "device-list-properties", "arguments": { - "typename": "scsi-block" + "typename": "arm-smmuv3" }, "id": "libvirt-28" } +{ + "return": [ + { + "name": "primary-bus", + "type": "link<PCI>" + }, + { + "default-value": 0, + "name": "bus_num", + "type": "uint8" + }, + { + "name": "stage", + "type": "str" + } + ], + "id": "libvirt-28" +} + +{ + "execute": "device-list-properties", + "arguments": { + "typename": "scsi-block" + }, + "id": "libvirt-29" +} + { "error": { "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-28" + "id": "libvirt-29" } { @@ -30550,7 +30577,7 @@ "arguments": { "typename": "scsi-generic" }, - "id": "libvirt-29" + "id": "libvirt-30" } { @@ -30558,7 +30585,7 @@ "class": "DeviceNotFound", "desc": "The libvirt device dump was not collected for this version+device tuple" }, - "id": "libvirt-29" + "id": "libvirt-30" } { @@ -30566,7 +30593,7 @@ "arguments": { "typename": "memory-backend-file" }, - "id": "libvirt-30" + "id": "libvirt-31" } { @@ -30651,7 +30678,7 @@ "type": "bool" } ], - "id": "libvirt-30" + "id": "libvirt-31" } { @@ -30659,7 +30686,7 @@ "arguments": { "typename": "max-arm-cpu" }, - "id": "libvirt-31" + "id": "libvirt-32" } { @@ -30816,12 +30843,12 @@ "type": "link<irq>" } ], - "id": "libvirt-31" + "id": "libvirt-32" } { "execute": "query-machines", - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -31871,7 +31898,7 @@ "default-ram-id": "ram" } ], - "id": "libvirt-32" + "id": "libvirt-33" } { @@ -31879,7 +31906,7 @@ "arguments": { "typename": "virt-9.2-machine" }, - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -32120,7 +32147,7 @@ "type": "child<cfi.pflash01>" } ], - "id": "libvirt-33" + "id": "libvirt-34" } { @@ -32128,7 +32155,7 @@ "arguments": { "typename": "none-machine" }, - "id": "libvirt-34" + "id": "libvirt-35" } { @@ -32246,12 +32273,12 @@ "type": "child<container>" } ], - "id": "libvirt-34" + "id": "libvirt-35" } { "execute": "query-cpu-definitions", - "id": "libvirt-35" + "id": "libvirt-36" } { @@ -32545,12 +32572,12 @@ "deprecated": false } ], - "id": "libvirt-35" + "id": "libvirt-36" } { "execute": "query-command-line-options", - "id": "libvirt-36" + "id": "libvirt-37" } { @@ -33866,12 +33893,12 @@ "option": "drive" } ], - "id": "libvirt-36" + "id": "libvirt-37" } { "execute": "query-gic-capabilities", - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -33887,7 +33914,7 @@ "kernel": false } ], - "id": "libvirt-37" + "id": "libvirt-38" } { @@ -33898,11 +33925,11 @@ "name": "host" } }, - "id": "libvirt-38" + "id": "libvirt-39" } { - "id": "libvirt-38", + "id": "libvirt-39", "error": { "class": "GenericError", "desc": "The CPU type 'host' requires KVM" @@ -33921,11 +33948,11 @@ } } }, - "id": "libvirt-39" + "id": "libvirt-40" } { - "id": "libvirt-39", + "id": "libvirt-40", "error": { "class": "GenericError", "desc": "The CPU type 'host' requires KVM" -- 2.43.0
From: Nathan Chen <nathanc@nvidia.com> The arm-smmuv3 accel device property, used for HW-accelerated nested SMMUv3, was added in QEMU 11.0.0 on top of the pluggable device introduced in 10.2. Probe it alongside smmu_per_bus via device-list-properties. Validate the domain iommu accel attribute in qemu_validate.c when QEMU lacks this capability. Checking accel is sufficient because ats, ril, ssidsize, and oas were introduced in the same QEMU release, and it only makes sense to backport accel, ats, ril, ssidsize, and oas all together. Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_validate.c | 12 ++++++++++++ tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml | 1 + 5 files changed, 17 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c98023bbe2..db146688f6 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -768,6 +768,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 495 */ "blockdev-mirror.target-is-zero", /* QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO */ "arm-smmuv3.smmu_per_bus", /* QEMU_CAPS_ARM_SMMUV3 */ + "arm-smmuv3.accel", /* QEMU_CAPS_ARM_SMMUV3_ACCEL */ ); @@ -1646,6 +1647,7 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsAMDIOMMU[] = { static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsArmSmmuv3[] = { { "smmu_per_bus", QEMU_CAPS_ARM_SMMUV3, NULL }, + { "accel", QEMU_CAPS_ARM_SMMUV3_ACCEL, NULL }, }; /* see documentation for virQEMUQAPISchemaPathGet for the query format */ diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index c03c32389b..4efea95a8d 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -742,6 +742,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 495 */ QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO, /* 'blockdev-mirror' supports 'target-is-zero' */ QEMU_CAPS_ARM_SMMUV3, /* arm-smmuv3.smmu_per_bus */ + QEMU_CAPS_ARM_SMMUV3_ACCEL, /* arm-smmuv3.accel */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 500b8ee680..0c7f2a0fc3 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -5826,6 +5826,18 @@ qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu, return -1; } + /* While QEMU_CAPS_ARM_SMMUV3_ACCEL tracks the .accel attribute of + * arm-smmuv3 it is also a good indicator of .ats, .ril, .ssidsize, and + * .oas attributes as all of them were introduced in the same release, + * and these features are meant to be backported all together. */ + if (iommu->model == VIR_DOMAIN_IOMMU_MODEL_SMMUV3 && + iommu->accel != VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_ARM_SMMUV3_ACCEL)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iommu: accel is not supported with this QEMU binary")); + return -1; + } + if (iommu->granule > 0) { /* QEMU supports only 4KiB, 8KiB, 16KiB and 64KiB granule size */ if (!(iommu->granule == 4 || diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml index b5f43d9be5..097e13fbe6 100644 --- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml @@ -189,6 +189,7 @@ <flag name='query-block-flat'/> <flag name='blockdev-mirror.target-is-zero'/> <flag name='arm-smmuv3.smmu_per_bus'/> + <flag name='arm-smmuv3.accel'/> <version>11000000</version> <microcodeVersion>61700286</microcodeVersion> <package>v11.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml index 28bf1aff57..76d03d3269 100644 --- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml @@ -189,6 +189,7 @@ <flag name='query-block-flat'/> <flag name='blockdev-mirror.target-is-zero'/> <flag name='arm-smmuv3.smmu_per_bus'/> + <flag name='arm-smmuv3.accel'/> <version>11000050</version> <microcodeVersion>61700287</microcodeVersion> <package>v11.0.0-1600-g5611a9268d</package> -- 2.43.0
From: Nathan Chen <nathanc@nvidia.com> Provide sample XML and CLI args for the HW-accel smmuv3 XML schema for virt machine types. Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- ...uv3-pci-bus-accel-auto.aarch64-latest.args | 38 +++++++++++ ...muv3-pci-bus-accel-auto.aarch64-latest.xml | 63 +++++++++++++++++++ .../iommu-smmuv3-pci-bus-accel-auto.xml | 53 ++++++++++++++++ ...u-smmuv3-pci-bus-accel.aarch64-latest.args | 38 +++++++++++ ...mu-smmuv3-pci-bus-accel.aarch64-latest.xml | 63 +++++++++++++++++++ .../iommu-smmuv3-pci-bus-accel.xml | 53 ++++++++++++++++ tests/qemuxmlconftest.c | 2 + 7 files changed, 310 insertions(+) create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args new file mode 100644 index 0000000000..40423e505d --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \ +/usr/bin/qemu-system-aarch64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \ +-machine virt,usb=off,gic-version=2,dump-guest-core=off,memory-backend=mach-virt.ram,acpi=off \ +-accel tcg \ +-m size=1048576k \ +-object '{"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":1073741824}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=@mon-fd@,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"pxb-pcie","bus_nr":252,"id":"pci.1","bus":"pcie.0","addr":"0x1"}' \ +-device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","addr":"0x2"}' \ +-device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bus":"pci.1","addr":"0x0"}' \ +-device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","bus":"pci.2","addr":"0x0"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel":true}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1","accel":true}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:00.0","id":"hostdev0","bus":"pci.3","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:01.0","id":"hostdev1","bus":"pci.4","addr":"0x0"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml new file mode 100644 index 0000000000..08fb17fb6f --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml @@ -0,0 +1,63 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='aarch64' machine='virt'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <gic version='2'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='252'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='2' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='248'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </controller> + <controller type='pci' index='3' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='21' port='0x0'/> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </controller> + <controller type='pci' index='4' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='22' port='0xa8'/> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> + </controller> + <audio id='1' type='none'/> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> + </hostdev> + <memballoon model='none'/> + <iommu model='smmuv3'> + <driver pciBus='1' accel='on'/> + </iommu> + <iommu model='smmuv3'> + <driver pciBus='2' accel='on'/> + </iommu> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml new file mode 100644 index 0000000000..abbc22e291 --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml @@ -0,0 +1,53 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>1048576</memory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='aarch64' machine='virt'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <controller type='usb' model='none'/> + <memballoon model='none'/> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='252'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='2' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='248'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </controller> + <controller type='pci' index='3' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='21' port='0x0'/> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </controller> + <controller type='pci' index='4' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='22' port='0xa8'/> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> + </controller> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> + </hostdev> + <iommu model='smmuv3'> + <driver pciBus='1' accel='on'/> + </iommu> + <iommu model='smmuv3'> + <driver pciBus='2' accel='on'/> + </iommu> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args new file mode 100644 index 0000000000..69ec53784e --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \ +/usr/bin/qemu-system-aarch64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \ +-machine virt,usb=off,gic-version=2,dump-guest-core=off,memory-backend=mach-virt.ram,acpi=off \ +-accel tcg \ +-m size=1048576k \ +-object '{"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":1073741824}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=@mon-fd@,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"pxb-pcie","bus_nr":252,"id":"pci.1","bus":"pcie.0","addr":"0x1"}' \ +-device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","addr":"0x2"}' \ +-device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bus":"pci.1","addr":"0x0"}' \ +-device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","bus":"pci.2","addr":"0x0"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel":true,"ats":"on","ril":"off","ssidsize":"20","oas":"44"}' \ +-device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1","accel":true,"ats":"on","ril":"off","ssidsize":"20","oas":"44"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:00.0","id":"hostdev0","bus":"pci.3","addr":"0x0"}' \ +-device '{"driver":"vfio-pci","host":"0000:06:01.0","id":"hostdev1","bus":"pci.4","addr":"0x0"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml new file mode 100644 index 0000000000..221a4185e5 --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml @@ -0,0 +1,63 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>1048576</memory> + <currentMemory unit='KiB'>1048576</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='aarch64' machine='virt'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <gic version='2'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <controller type='usb' index='0' model='none'/> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='252'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='2' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='248'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </controller> + <controller type='pci' index='3' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='21' port='0x0'/> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </controller> + <controller type='pci' index='4' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='22' port='0xa8'/> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> + </controller> + <audio id='1' type='none'/> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> + </hostdev> + <memballoon model='none'/> + <iommu model='smmuv3'> + <driver pciBus='1' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/> + </iommu> + <iommu model='smmuv3'> + <driver pciBus='2' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/> + </iommu> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml new file mode 100644 index 0000000000..8dbae00540 --- /dev/null +++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml @@ -0,0 +1,53 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>1048576</memory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='aarch64' machine='virt'>hvm</type> + </os> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <controller type='usb' model='none'/> + <memballoon model='none'/> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='252'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='2' model='pcie-expander-bus'> + <model name='pxb-pcie'/> + <target busNr='248'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </controller> + <controller type='pci' index='3' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='21' port='0x0'/> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </controller> + <controller type='pci' index='4' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='22' port='0xa8'/> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> + </controller> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> + </hostdev> + <hostdev mode='subsystem' type='pci' managed='no'> + <source> + <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/> + </source> + <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> + </hostdev> + <iommu model='smmuv3'> + <driver pciBus='1' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/> + </iommu> + <iommu model='smmuv3'> + <driver pciBus='2' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/> + </iommu> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index a1389775b9..99925e6241 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -2988,6 +2988,8 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3", "aarch64"); DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus", "aarch64"); DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus-single", "aarch64"); + DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus-accel", "aarch64"); + DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus-accel-auto", "aarch64"); DO_TEST_CAPS_LATEST("virtio-iommu-x86_64"); DO_TEST_CAPS_ARCH_LATEST("virtio-iommu-aarch64", "aarch64"); DO_TEST_CAPS_LATEST_PARSE_ERROR("virtio-iommu-wrong-machine"); -- 2.43.0
participants (1)
-
Nathan Chen