mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 01:50:43 +00:00
pcie: Mangle types to match topology
Windows will fail to start drivers for devices with an Endpoint type PCIe capability attached to a Root Complex (code 10 - Device cannot start). The proper type for such a device is Root Complex Integrated Endpoint. Devices don't care which they are, so do this conversion automatically. This allows the Windows driver to load for nec-usb-xhci when attached to pcie.0 of a q35 machine. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0889464a50
commit
eb28cb1bb0
@ -48,6 +48,19 @@ int pcie_cap_init(PCIDevice *dev, uint8_t offset, uint8_t type, uint8_t port)
|
|||||||
|
|
||||||
assert(pci_is_express(dev));
|
assert(pci_is_express(dev));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mangle type to convert Endpoints to Root Complex Integrated Endpoints.
|
||||||
|
* Windows will report Code 10 (device cannot start) for regular Endpoints
|
||||||
|
* on the Root Complex.
|
||||||
|
*/
|
||||||
|
if (pci_bus_is_express(dev->bus) && pci_bus_is_root(dev->bus)) {
|
||||||
|
switch (type) {
|
||||||
|
case PCI_EXP_TYPE_ENDPOINT:
|
||||||
|
type = PCI_EXP_TYPE_RC_END;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pos = pci_add_capability(dev, PCI_CAP_ID_EXP, offset,
|
pos = pci_add_capability(dev, PCI_CAP_ID_EXP, offset,
|
||||||
PCI_EXP_VER2_SIZEOF);
|
PCI_EXP_VER2_SIZEOF);
|
||||||
if (pos < 0) {
|
if (pos < 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user