vfio/pci: Fixup v0 PCIe capabilities
Intel 82599 VFs report a PCIe capability version of 0, which is invalid. The earliest version of the PCIe spec used version 1. This causes Windows to fail startup on the device and it will be disabled with error code 10. Our choices are either to drop the PCIe cap on such devices, which has the side effect of likely preventing the guest from discovering any extended capabilities, or performing a fixup to update the capability to the earliest valid version. This implements the latter. Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
7da624e26a
commit
47985727e3
|
@ -1743,6 +1743,18 @@ static int vfio_setup_pcie_cap(VFIOPCIDevice *vdev, int pos, uint8_t size,
|
|||
PCI_EXP_LNKCAP_MLW | PCI_EXP_LNKCAP_SLS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Intel 82599 SR-IOV VFs report an invalid PCIe capability version 0
|
||||
* (Niantic errate #35) causing Windows to error with a Code 10 for the
|
||||
* device on Q35. Fixup any such devices to report version 1. If we
|
||||
* were to remove the capability entirely the guest would lose extended
|
||||
* config space.
|
||||
*/
|
||||
if ((flags & PCI_EXP_FLAGS_VERS) == 0) {
|
||||
vfio_add_emulated_word(vdev, pos + PCI_CAP_FLAGS,
|
||||
1, PCI_EXP_FLAGS_VERS);
|
||||
}
|
||||
|
||||
pos = pci_add_capability(&vdev->pdev, PCI_CAP_ID_EXP, pos, size,
|
||||
errp);
|
||||
if (pos < 0) {
|
||||
|
|
Loading…
Reference in a new issue