[RFC PATCH 4/5] qemu: Update PXB busNr for nestedSmmuv3 controllers

Nathan Chen via Devel posted 5 patches 1 week, 3 days ago
[RFC PATCH 4/5] qemu: Update PXB busNr for nestedSmmuv3 controllers
Posted by Nathan Chen via Devel 1 week, 3 days ago
Update the PXB controller busNrs to account for devices we attached in the
previous commit, ensuring there are enough VM bus numbers to be assigned for
each device attached downstream from each PXB controller.

Signed-off-by: Nathan Chen <nathanc@nvidia.com>
---
 src/qemu/qemu_domain_address.c | 52 ++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index dee198a7d2..001d1ec0b9 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -2678,6 +2678,23 @@ qemuDomainAddressFindNewTargetIndex(virDomainDef *def)
 }
 
 
+static int
+qemuDomainFindAttachedDevicesBusNr(virDomainDef *def,
+                                   int lowestBusNr,
+                                   unsigned int contIdx)
+{
+    size_t i;
+    for (i = 0; i < def->ncontrollers; i++) {
+        virDomainControllerDef *cont = def->controllers[i];
+        if (cont->info.addr.pci.bus == contIdx && cont->idx != 0)
+            lowestBusNr = qemuDomainFindAttachedDevicesBusNr(def, lowestBusNr - 1, cont->idx);
+        if (lowestBusNr <= 2)
+            return -1;
+    }
+    return lowestBusNr;
+}
+
+
 static int
 qemuDomainAddressFindNewBusNr(virDomainDef *def)
 {
@@ -2725,8 +2742,43 @@ qemuDomainAddressFindNewBusNr(virDomainDef *def)
      */
 
     size_t i;
+    size_t lowestBusNrContIdx = 0;
     int lowestBusNr = 256;
 
+    if (def->iommu && def->iommu->model &&
+        def->iommu->model == VIR_DOMAIN_IOMMU_MODEL_NESTED_SMMUV3) {
+        for (i = 0; i < def->ncontrollers; i++) {
+            virDomainControllerDef *cont = def->controllers[i];
+            if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
+                int thisBusNr = cont->opts.pciopts.busNr;
+                if (thisBusNr >= 0 && thisBusNr < lowestBusNr) {
+                    lowestBusNr = thisBusNr;
+                    lowestBusNrContIdx = i;
+                }
+            }
+        }
+        if (lowestBusNr <= 2)
+            return -1;
+        if (lowestBusNrContIdx == 0) {
+            for (i = 0; i < def->ncontrollers; i++) {
+                if (def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS) {
+                    lowestBusNrContIdx = i;
+                    break;
+                }
+            }
+        } else {
+            for (i = lowestBusNrContIdx + 1; i < def->ncontrollers; i++) {
+                if (def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS) {
+                    lowestBusNrContIdx = i;
+                    break;
+                }
+            }
+        }
+        lowestBusNr = qemuDomainFindAttachedDevicesBusNr(def, lowestBusNr,
+                                                         def->controllers[lowestBusNrContIdx]->idx);
+        return lowestBusNr - 2;
+    }
+
     for (i = 0; i < def->ncontrollers; i++) {
         virDomainControllerDef *cont = def->controllers[i];
 
-- 
2.34.1