diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index bea95da444..0fe0d188af 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -1097,10 +1097,14 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
* that don't yet have a corresponding controller in the domain
* config.
*/
- if (hasPCIeRoot)
+ if (qemuDomainIsPSeries(def)) {
+ /* pSeries guests should use PHBs (pci-root controllers) */
+ defaultModel = VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT;
+ } else if (hasPCIeRoot) {
defaultModel = VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT;
- else
+ } else {
defaultModel = VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE;
+ }
for (i = 1; i < addrs->nbuses; i++) {
@@ -2160,7 +2164,13 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
dev.data.controller = def->controllers[contIndex];
/* set connect flags so it will be properly addressed */
qemuDomainFillDevicePCIConnectFlags(def, &dev, qemuCaps, driver);
- if (qemuDomainPCIAddressReserveNextAddr(addrs,
+
+ /* Reserve an address for the controller. pci-root and pcie-root
+ * controllers don't plug into any other PCI controller, hence
+ * they should skip this step */
+ if (bus->model != VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT &&
+ bus->model != VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT &&
+ qemuDomainPCIAddressReserveNextAddr(addrs,
&dev.data.controller->info) < 0) {
goto cleanup;
}
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args
index 1cb583132d..13fed02f80 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-many-buses-2.args
@@ -19,4 +19,4 @@ server,nowait \
-mon chardev=charmonitor,id=monitor,mode=readline \
-boot c \
-device spapr-pci-host-bridge,index=1,id=pci.2 \
--device pci-bridge,chassis_nr=1,id=pci.1,bus=pci.0,addr=0x1
+-device spapr-pci-host-bridge,index=2,id=pci.1
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 6eeca0aab3..35c06ef247 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1767,7 +1767,6 @@ mymain(void)
DO_TEST("pseries-many-buses-2",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
- QEMU_CAPS_DEVICE_PCI_BRIDGE,
QEMU_CAPS_VIRTIO_SCSI);
DO_TEST("pseries-hostdevs-1",
QEMU_CAPS_NODEFCONFIG,
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml
index 75dfabfcab..14f3e36244 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-many-buses-2.xml
@@ -23,10 +23,9 @@
-
-
-
-
+
+
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 05af6b17e2..a948a61d8e 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -686,7 +686,6 @@ mymain(void)
DO_TEST("pseries-many-buses-2",
QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
- QEMU_CAPS_DEVICE_PCI_BRIDGE,
QEMU_CAPS_VIRTIO_SCSI);
DO_TEST("pseries-hostdevs-1",
QEMU_CAPS_NODEFCONFIG,