On Fri, Jul 17, 2026 at 03:00:23PM -0700, Nathan Chen via Devel wrote:
From: Nathan Chen<[email protected]>
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<[email protected]>
---
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 */
IMO we should use QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS as the capability name.
We support machine-wide smmuv3 for some time already so this could be
misleading.
);
@@ -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;
+
No need for this check, if qemu ever reports support for arm-smmuv3 on
different architecture that would be something qemu needs to fix.