On Wed, Oct 01, 2025 at 05:23:46PM -0700, Nathan Chen via Devel wrote:
Introduce support for "smmuv3Dev" IOMMU model and its "parentIdx" driver attribute. The "parentIdx" attribute indicates the index of the controller that a smmuv3Dev IOMMU device is attached to.
Signed-off-by: Nathan Chen <nathanc@nvidia.com> --- docs/formatdomain.rst | 9 +++- src/conf/domain_conf.c | 17 ++++++++ src/conf/domain_conf.h | 2 + src/conf/domain_validate.c | 26 +++++++++-- src/conf/schemas/domaincommon.rng | 6 +++ src/qemu/qemu_command.c | 72 +++++++++++++++++++++++++++++-- src/qemu/qemu_domain_address.c | 2 + src/qemu/qemu_validate.c | 16 +++++++ 8 files changed, 141 insertions(+), 9 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 031f09b7a5..e789e8cf2c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6294,6 +6294,62 @@ qemuBuildBootCommandLine(virCommand *cmd, }
+static virJSONValue * +qemuBuildPCISmmuv3DevDevProps(const virDomainDef *def, + const virDomainIOMMUDef *iommu) +{ + g_autoptr(virJSONValue) props = NULL; + g_autofree char *bus = NULL; + size_t i; + bool contIsPHB = false; + + for (i = 0; i < def->ncontrollers; i++) { + virDomainControllerDef *cont = def->controllers[i]; + if (cont->idx == iommu->parent_idx) { + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { + const char *alias = cont->info.alias; + contIsPHB = virDomainControllerIsPSeriesPHB(cont);
IIUC, PSeries PHB is an ppc64 device, while SMMUv3 is a aarch64 device. Given your validation check in qemu_validate.c, this combination of "IsPHB==true" and SMMUv3 seems like an impossible situation that doesn't need to be chedcked for and thus....
+ + if (!alias) + return NULL; + + if (virDomainDeviceAliasIsUserAlias(alias)) { + if (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT && + iommu->parent_idx <= 0) { + if (qemuDomainSupportsPCIMultibus(def)) + bus = g_strdup("pci.0"); + else + bus = g_strdup("pci"); + } else if (cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) { + bus = g_strdup("pcie.0"); + } + } else { + bus = g_strdup(alias); + } + break; + } + } + } + + if (!bus) + return NULL;
This needs to be calling virReportError I think, since no earlier code path has already blocked this scenario ?
+ + if (contIsPHB && iommu->parent_idx > 0) { + char *temp_bus = g_strdup_printf("%s.0", bus); + g_free(bus); + bus = temp_bus; + }
...this if {} block should be dead code.
+ + if (virJSONValueObjectAdd(&props, + "s:driver", "arm-smmuv3", + "s:primary-bus", bus, + NULL) < 0) + return NULL; + + return g_steal_pointer(&props); +}
With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|