The nec-usb-xhci device (which is a USB3 controller) has always
presented itself as a PCI device when plugged into a legacy PCI slot,
and a PCIe device when plugged into a PCIe slot, but libvirt has
always auto-assigned it to a legacy PCI slot.
This patch changes that behavior to auto-assign to a PCIe slot on
systems that have pcie-root (e.g. Q35 and aarch64/virt).
Since we don't yet auto-create pcie-*-port controllers on demand, this
means a config with an nec-xhci USB controller that has no PCI address
assigned will also need to have an otherwise-unused pcie-*-port
controller specified:
<controller type='pci' model='pcie-root-port'/>
<controller type='usb' model='nec-xhci'/>
(this assumes there is an otherwise-unused slot on pcie-root to accept
the pcie-root-port)
---
Change: changed to fit reimplemented
qemuDomainDeviceCalculatePCIConnectFlags()
src/qemu/qemu_domain_address.c | 2 +-
tests/qemuxml2argvdata/qemuxml2argv-autoindex.args | 10 +++----
tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.args | 21 ++++++-------
tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.xml | 2 ++
.../qemuxml2argv-q35-virtio-pci.args | 7 ++---
tests/qemuxml2argvtest.c | 2 ++
.../qemuxml2xmlout-autoindex.xml | 10 +++----
.../qemuxml2xmloutdata/qemuxml2xmlout-q35-pcie.xml | 35 +++++++++-------------
.../qemuxml2xmlout-q35-virtio-pci.xml | 21 +++++--------
tests/qemuxml2xmltest.c | 2 ++
10 files changed, 49 insertions(+), 63 deletions(-)
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 69e530e..5262ad3 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -446,7 +446,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_USB:
switch ((virDomainControllerModelUSB)cont->model) {
case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI:
- return pciFlags;
+ return pcieFlags;
case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-autoindex.args
b/tests/qemuxml2argvdata/qemuxml2argv-autoindex.args
index 43b9661..fc14dc4 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-autoindex.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-autoindex.args
@@ -43,11 +43,11 @@ addr=0x1 \
-device ich9-usb-uhci2,masterbus=usb2.0,firstport=2,bus=pci.2,addr=0x1.0x1 \
-device ich9-usb-uhci3,masterbus=usb2.0,firstport=4,bus=pci.2,addr=0x1.0x2 \
-device ich9-usb-ehci1,id=usb2,bus=pci.2,addr=0x1.0x7 \
--device nec-usb-xhci,id=usb3,bus=pci.2,addr=0x2 \
+-device nec-usb-xhci,id=usb3,bus=pci.5,addr=0x0 \
-device ich9-usb-uhci1,masterbus=usb4.0,firstport=0,bus=pci.2,multifunction=on,\
-addr=0x3 \
--device ich9-usb-uhci2,masterbus=usb4.0,firstport=2,bus=pci.2,addr=0x3.0x1 \
--device ich9-usb-uhci3,masterbus=usb4.0,firstport=4,bus=pci.2,addr=0x3.0x2 \
--device ich9-usb-ehci1,id=usb4,bus=pci.2,addr=0x3.0x7 \
+addr=0x2 \
+-device ich9-usb-uhci2,masterbus=usb4.0,firstport=2,bus=pci.2,addr=0x2.0x1 \
+-device ich9-usb-uhci3,masterbus=usb4.0,firstport=4,bus=pci.2,addr=0x2.0x2 \
+-device ich9-usb-ehci1,id=usb4,bus=pci.2,addr=0x2.0x7 \
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-sata0-0-0 \
-device ide-drive,bus=ide.0,drive=drive-sata0-0-0,id=sata0-0-0
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.args
b/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.args
index d92e0b8..2738749 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.args
@@ -30,15 +30,12 @@ QEMU_AUDIO_DRV=none \
-device ioh3420,port=0x58,chassis=12,id=pci.12,bus=pcie.0,addr=0xb \
-device ioh3420,port=0x60,chassis=13,id=pci.13,bus=pcie.0,addr=0xc \
-device ioh3420,port=0x68,chassis=14,id=pci.14,bus=pcie.0,addr=0xd \
--device ich9-usb-ehci1,id=usb,bus=pcie.0,addr=0x1d.0x7 \
--device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pcie.0,multifunction=on,\
-addr=0x1d \
--device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pcie.0,addr=0x1d.0x1 \
--device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pcie.0,addr=0x1d.0x2 \
+-device ioh3420,port=0x70,chassis=15,id=pci.15,bus=pcie.0,addr=0xe \
+-device nec-usb-xhci,id=usb,bus=pci.8,addr=0x0 \
-device virtio-scsi-pci,id=scsi0,bus=pci.7,addr=0x0 \
-device virtio-serial-pci,id=virtio-serial0,bus=pci.6,addr=0x0 \
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-virtio-disk1 \
--device virtio-blk-pci,bus=pci.8,addr=0x0,drive=drive-virtio-disk1,\
+-device virtio-blk-pci,bus=pci.9,addr=0x0,drive=drive-virtio-disk1,\
id=virtio-disk1 \
-fsdev local,security_model=passthrough,id=fsdev-fs0,path=/export/to/guest \
-device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=/import/from/host,\
@@ -49,13 +46,13 @@ addr=0x0 \
-netdev user,id=hostnet1 \
-device e1000e,netdev=hostnet1,id=net1,mac=00:11:22:33:44:66,bus=pci.5,\
addr=0x0 \
--device virtio-input-host-pci,id=input0,evdev=/dev/input/event1234,bus=pci.11,\
+-device virtio-input-host-pci,id=input0,evdev=/dev/input/event1234,bus=pci.12,\
addr=0x0 \
--device virtio-mouse-pci,id=input1,bus=pci.12,addr=0x0 \
--device virtio-keyboard-pci,id=input2,bus=pci.13,addr=0x0 \
--device virtio-tablet-pci,id=input3,bus=pci.14,addr=0x0 \
+-device virtio-mouse-pci,id=input1,bus=pci.13,addr=0x0 \
+-device virtio-keyboard-pci,id=input2,bus=pci.14,addr=0x0 \
+-device virtio-tablet-pci,id=input3,bus=pci.15,addr=0x0 \
-device virtio-gpu-pci,id=video0,bus=pcie.0,addr=0x1 \
--device virtio-balloon-pci,id=balloon0,bus=pci.9,addr=0x0 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.10,addr=0x0 \
-object rng-random,id=objrng0,filename=/dev/urandom \
-device virtio-rng-pci,rng=objrng0,id=rng0,max-bytes=123,period=1234,\
-bus=pci.10,addr=0x0
+bus=pci.11,addr=0x0
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.xml
b/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.xml
index 39db5f0..b6b971b 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.xml
@@ -29,8 +29,10 @@
<controller type='pci' model='pcie-root-port'/>
<controller type='pci' model='pcie-root-port'/>
<controller type='pci' model='pcie-root-port'/>
+ <controller type='pci' model='pcie-root-port'/>
<controller type='virtio-serial'/>
<controller type='scsi' model='virtio-scsi'/>
+ <controller type='usb' model='nec-xhci'/>
<disk type='block' device='disk'>
<source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='vdb' bus='virtio'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-q35-virtio-pci.args
b/tests/qemuxml2argvdata/qemuxml2argv-q35-virtio-pci.args
index 68d19ca..cada05e 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-q35-virtio-pci.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-q35-virtio-pci.args
@@ -30,11 +30,8 @@ QEMU_AUDIO_DRV=none \
-device ioh3420,port=0x58,chassis=12,id=pci.12,bus=pcie.0,addr=0xb \
-device ioh3420,port=0x60,chassis=13,id=pci.13,bus=pcie.0,addr=0xc \
-device ioh3420,port=0x68,chassis=14,id=pci.14,bus=pcie.0,addr=0xd \
--device ich9-usb-ehci1,id=usb,bus=pcie.0,addr=0x1d.0x7 \
--device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pcie.0,multifunction=on,\
-addr=0x1d \
--device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pcie.0,addr=0x1d.0x1 \
--device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pcie.0,addr=0x1d.0x2 \
+-device ioh3420,port=0x70,chassis=15,id=pci.15,bus=pcie.0,addr=0xe \
+-device nec-usb-xhci,id=usb,bus=pci.4,addr=0x0 \
-device virtio-scsi-pci,id=scsi0,bus=pci.2,addr=0x4 \
-device virtio-serial-pci,id=virtio-serial0,bus=pci.2,addr=0x3 \
-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-virtio-disk1 \
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index fe25237..2779eb3 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1762,6 +1762,7 @@ mymain(void)
QEMU_CAPS_ICH9_AHCI,
QEMU_CAPS_PCI_MULTIFUNCTION,
QEMU_CAPS_ICH9_USB_EHCI1,
+ QEMU_CAPS_NEC_USB_XHCI,
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
/* same XML as q35-pcie, but don't set
* QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY, so virtio devices should
@@ -1787,6 +1788,7 @@ mymain(void)
QEMU_CAPS_ICH9_AHCI,
QEMU_CAPS_PCI_MULTIFUNCTION,
QEMU_CAPS_ICH9_USB_EHCI1,
+ QEMU_CAPS_NEC_USB_XHCI,
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
DO_TEST("pcie-root-port",
QEMU_CAPS_DEVICE_PCI_BRIDGE,
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-autoindex.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-autoindex.xml
index 086a1cf..2a8a44a 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-autoindex.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-autoindex.xml
@@ -126,22 +126,22 @@
<address type='pci' domain='0x0000' bus='0x02'
slot='0x01' function='0x7'/>
</controller>
<controller type='usb' index='3' model='nec-xhci'>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x02' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x05'
slot='0x00' function='0x0'/>
</controller>
<controller type='usb' index='4' model='ich9-uhci1'>
<master startport='0'/>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x03' function='0x0' multifunction='on'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x02' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='4' model='ich9-uhci2'>
<master startport='2'/>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x03' function='0x1'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x02' function='0x1'/>
</controller>
<controller type='usb' index='4' model='ich9-uhci3'>
<master startport='4'/>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x03' function='0x2'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x02' function='0x2'/>
</controller>
<controller type='usb' index='4' model='ich9-ehci1'>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x03' function='0x7'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x02' function='0x7'/>
</controller>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x1f' function='0x2'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-pcie.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-pcie.xml
index 5a23a51..8e727fb 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-pcie.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-pcie.xml
@@ -17,7 +17,7 @@
<disk type='block' device='disk'>
<source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='vdb' bus='virtio'/>
- <address type='pci' domain='0x0000' bus='0x08'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x09'
slot='0x00' function='0x0'/>
</disk>
<controller type='pci' index='0' model='pcie-root'/>
<controller type='pci' index='1'
model='dmi-to-pci-bridge'>
@@ -89,26 +89,19 @@
<target chassis='14' port='0x68'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x0d' function='0x0'/>
</controller>
+ <controller type='pci' index='15'
model='pcie-root-port'>
+ <model name='ioh3420'/>
+ <target chassis='15' port='0x70'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x0e' function='0x0'/>
+ </controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x06'
slot='0x00' function='0x0'/>
</controller>
<controller type='scsi' index='0' model='virtio-scsi'>
<address type='pci' domain='0x0000' bus='0x07'
slot='0x00' function='0x0'/>
</controller>
- <controller type='usb' index='0' model='ich9-ehci1'>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x7'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci1'>
- <master startport='0'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x0' multifunction='on'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci2'>
- <master startport='2'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x1'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci3'>
- <master startport='4'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x2'/>
+ <controller type='usb' index='0' model='nec-xhci'>
+ <address type='pci' domain='0x0000' bus='0x08'
slot='0x00' function='0x0'/>
</controller>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x1f' function='0x2'/>
@@ -130,16 +123,16 @@
</interface>
<input type='passthrough' bus='virtio'>
<source evdev='/dev/input/event1234'/>
- <address type='pci' domain='0x0000' bus='0x0b'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x0c'
slot='0x00' function='0x0'/>
</input>
<input type='mouse' bus='virtio'>
- <address type='pci' domain='0x0000' bus='0x0c'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x0d'
slot='0x00' function='0x0'/>
</input>
<input type='keyboard' bus='virtio'>
- <address type='pci' domain='0x0000' bus='0x0d'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x0e'
slot='0x00' function='0x0'/>
</input>
<input type='tablet' bus='virtio'>
- <address type='pci' domain='0x0000' bus='0x0e'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x0f'
slot='0x00' function='0x0'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
@@ -148,12 +141,12 @@
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</video>
<memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x09'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x0a'
slot='0x00' function='0x0'/>
</memballoon>
<rng model='virtio'>
<rate bytes='123' period='1234'/>
<backend model='random'>/dev/urandom</backend>
- <address type='pci' domain='0x0000' bus='0x0a'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x0b'
slot='0x00' function='0x0'/>
</rng>
</devices>
</domain>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virtio-pci.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virtio-pci.xml
index 22c2c68..c4bd357 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virtio-pci.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virtio-pci.xml
@@ -89,26 +89,19 @@
<target chassis='14' port='0x68'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x0d' function='0x0'/>
</controller>
+ <controller type='pci' index='15'
model='pcie-root-port'>
+ <model name='ioh3420'/>
+ <target chassis='15' port='0x70'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x0e' function='0x0'/>
+ </controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x02'
slot='0x03' function='0x0'/>
</controller>
<controller type='scsi' index='0' model='virtio-scsi'>
<address type='pci' domain='0x0000' bus='0x02'
slot='0x04' function='0x0'/>
</controller>
- <controller type='usb' index='0' model='ich9-ehci1'>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x7'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci1'>
- <master startport='0'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x0' multifunction='on'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci2'>
- <master startport='2'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x1'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci3'>
- <master startport='4'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1d' function='0x2'/>
+ <controller type='usb' index='0' model='nec-xhci'>
+ <address type='pci' domain='0x0000' bus='0x04'
slot='0x00' function='0x0'/>
</controller>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x1f' function='0x2'/>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 53f8ffd..4c2f310 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -714,6 +714,7 @@ mymain(void)
QEMU_CAPS_ICH9_AHCI,
QEMU_CAPS_PCI_MULTIFUNCTION,
QEMU_CAPS_ICH9_USB_EHCI1,
+ QEMU_CAPS_NEC_USB_XHCI,
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
/* same XML as q35-pcie, but don't set
QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY */
@@ -736,6 +737,7 @@ mymain(void)
QEMU_CAPS_ICH9_AHCI,
QEMU_CAPS_PCI_MULTIFUNCTION,
QEMU_CAPS_ICH9_USB_EHCI1,
+ QEMU_CAPS_NEC_USB_XHCI,
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
DO_TEST("pcie-root",
--
2.7.4