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));
|
||||
|
||||
/*
|
||||
* 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,
|
||||
PCI_EXP_VER2_SIZEOF);
|
||||
if (pos < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user