pSeries guests will soon need the new information;
luckily, we can figure it out automatically most of
the time, so users won't have to bother with it.
---
src/qemu/qemu_domain_address.c | 47 ++++++++++++++++++++--
.../qemuargv2xmldata/qemuargv2xml-pseries-disk.xml | 5 ++-
.../qemuargv2xml-pseries-nvram.xml | 5 ++-
.../qemuxml2xmlout-panic-pseries.xml | 5 ++-
.../qemuxml2xmlout-ppc64-usb-controller-legacy.xml | 5 ++-
.../qemuxml2xmlout-ppc64-usb-controller.xml | 5 ++-
.../qemuxml2xmlout-pseries-nvram.xml | 5 ++-
.../qemuxml2xmlout-pseries-panic-missing.xml | 5 ++-
.../qemuxml2xmlout-pseries-panic-no-address.xml | 5 ++-
9 files changed, 76 insertions(+), 11 deletions(-)
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 20f4ba2..6f7f4ef 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -1845,13 +1845,15 @@ qemuDomainSupportsPCI(virDomainDefPtr def,
static void
-qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont)
+qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont,
+ virDomainDefPtr def)
{
int *modelName = &cont->opts.pciopts.modelName;
/* make sure it's not already set */
if (*modelName != VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_NONE)
return;
+
switch ((virDomainControllerModelPCI)cont->model) {
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE:
*modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PCI_BRIDGE;
@@ -1875,6 +1877,9 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr
cont)
*modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_PXB_PCIE;
break;
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
+ if (qemuDomainMachineIsPSeries(def))
+ *modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE;
+ break;
case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
break;
@@ -1883,6 +1888,29 @@
qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont)
static int
+qemuDomainAddressFindNewIndex(virDomainDefPtr def)
+{
+ int ret = -1;
+ size_t i;
+
+ for (i = 0; i < def->ncontrollers; i++) {
+ virDomainControllerDefPtr cont = def->controllers[i];
+
+ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
+ if (cont->opts.pciopts.idx > ret)
+ ret = cont->opts.pciopts.idx;
+ }
+ }
+
+ ret++;
+ if (ret < 0 || ret > 31)
+ ret = -1;
+
+ return ret;
+}
+
+
+static int
qemuDomainAddressFindNewBusNr(virDomainDefPtr def)
{
/* Try to find a nice default for busNr for a new pci-expander-bus.
@@ -2142,7 +2170,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
* device in qemu) for any controller that doesn't yet
* have it set.
*/
- qemuDomainPCIControllerSetDefaultModelName(cont);
+ qemuDomainPCIControllerSetDefaultModelName(cont, def);
/* set defaults for any other auto-generated config
* options for this controller that haven't been
@@ -2179,9 +2207,22 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
goto cleanup;
}
break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
+ if (!qemuDomainMachineIsPSeries(def))
+ break;
+ if (options->idx == -1)
+ options->idx = qemuDomainAddressFindNewIndex(def);
+ if (options->idx == -1) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("No valid index is available to "
+ "auto-assign to bus %d. Must be "
+ "manually assigned"),
+ addr->bus);
+ goto cleanup;
+ }
+ break;
case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE:
case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT:
- case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST:
break;
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
b/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
index 1bad8ee..601d0f7 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
+++ b/tests/qemuargv2xmldata/qemuargv2xml-pseries-disk.xml
@@ -30,7 +30,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<controller type='scsi' index='0'>
<address type='spapr-vio' reg='0x2000'/>
</controller>
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
b/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
index 7e9f864..7787847 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
+++ b/tests/qemuargv2xmldata/qemuargv2xml-pseries-nvram.xml
@@ -17,7 +17,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<memballoon model='none'/>
<nvram>
<address type='spapr-vio' reg='0x4000'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
index 1ed11ce..7fb49fe 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-panic-pseries.xml
@@ -17,7 +17,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<serial type='pty'>
<target port='0'/>
<address type='spapr-vio' reg='0x30000000'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
index 33e7810..6d3d51e 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller-legacy.xml
@@ -22,7 +22,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x06' function='0x0'/>
</memballoon>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
index 30932e5..659cabe 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-ppc64-usb-controller.xml
@@ -22,7 +22,10 @@
<controller type='usb' index='0' model='pci-ohci'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x06' function='0x0'/>
</memballoon>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
index 713f31c..f89b23b 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-nvram.xml
@@ -17,7 +17,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<memballoon model='none'/>
<nvram>
<address type='spapr-vio' reg='0x4000'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
index 1ed11ce..7fb49fe 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
@@ -17,7 +17,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<serial type='pty'>
<target port='0'/>
<address type='spapr-vio' reg='0x30000000'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
index 1ed11ce..7fb49fe 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-no-address.xml
@@ -17,7 +17,10 @@
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</controller>
- <controller type='pci' index='0' model='pci-root'/>
+ <controller type='pci' index='0' model='pci-root'>
+ <model name='spapr-pci-host-bridge'/>
+ <target index='0'/>
+ </controller>
<serial type='pty'>
<target port='0'/>
<address type='spapr-vio' reg='0x30000000'/>
--
2.7.4