Skip to content

Commit

Permalink
pcie: Mangle types to match topology
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
awilliam authored and mstsirkin committed Mar 26, 2013
1 parent 0889464 commit eb28cb1
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions hw/pci/pcie.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit eb28cb1

Please sign in to comment.