[PATCH] qemu-kvm: device assignment: add 82599 PCIe Cap struct quirk

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



commit f9c29774d2174df6ffc20becec20928948198914
changed the PCIe Capability structure version check
from if > 2 fail, to if ==1, size=x, if ==2, size=y,
else fail.
Turns out the 82599's VF has an errata where it's
PCIe Cap struct version is 0, which now fails device assignment
due to the else fallout, where before, it would blissfully work.

Add a quirk if version=0, & intel-82599, set size to version 2 struct.

Signed-off-by: Donald_Dutile <ddutile@xxxxxxxxxx>
---
 hw/device-assignment.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index 288f80c..ed2a883 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -1261,12 +1261,20 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev)
 
     if ((pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_EXP, 0))) {
         uint8_t version, size;
-        uint16_t type, devctl, lnkcap, lnksta;
+        uint16_t type, devctl, lnkcap, lnksta, vendor, device;
         uint32_t devcap;
 
+        vendor = pci_get_word(pci_dev->config + PCI_VENDOR_ID);
+        device = pci_get_word(pci_dev->config + PCI_DEVICE_ID);
         version = pci_get_byte(pci_dev->config + pos + PCI_EXP_FLAGS);
         version &= PCI_EXP_FLAGS_VERS;
-        if (version == 1) {
+        if (version == 0 && vendor == 0x8086 && device == 0x10ed) {
+            /* 
+             * quirk for Intel 82599 VF with invalid PCIe capability version,
+             * should really be version 2 (same as PF)
+             */
+            size = 0x3c;
+        } else if (version == 1) {
             size = 0x14;
         } else if (version == 2) {
             /*
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux