diff mbox

[v2] pci : Add pba_offset PCI quirk for Chelsio T5 devices

Message ID 4985EFDD773FCB459EF7915D2A3621ADC0374C@nice.asicdesigners.com
State New
Headers show

Commit Message

Casey Leedom June 26, 2015, 6:48 p.m. UTC
Looks good to me.

Casey
diff mbox

Patch

--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2252,6 +2252,33 @@  static int vfio_early_setup_msix(VFIOPCIDevice *vdev)
     vdev->msix->pba_offset = pba & ~PCI_MSIX_FLAGS_BIRMASK;
     vdev->msix->entries = (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1;

+    /*
+     * We could be more thorough here, but msix_init() will do further
+     * testing, look for the obviously broken configs and apply any quirks.
+     */
+    if (vdev->msix->table_offset >=
+        vdev->bars[vdev->msix->table_bar].region.size ||
+        vdev->msix->pba_offset >=
+        vdev->bars[vdev->msix->pba_bar].region.size) {
+        PCIDevice *pdev = &vdev->pdev;
+        uint16_t vendor = pci_get_word(pdev->config + PCI_VENDOR_ID);
+        uint16_t device = pci_get_word(pdev->config + PCI_DEVICE_ID);
+
+        /*
+         * Chelsio T5 Virtual Function devices are encoded as 0x58xx for T5
+         * adapters.  The T5 hardware returns an incorrect value of 0x8000
+         * for the VF PBA offset while the BAR itself is only 8K.  The
+         * correct value is 0x1000, so we hard code that here.
+         */
+        if (vendor == PCI_VENDOR_ID_CHELSIO && (device & 0xff00) == 0x5800) {
+            vdev->msix->pba_offset = 0x1000;
+        } else {
+            error_report("vfio: Hardware reports invalid configuration, "
+                         "MSIX data outside of specified BAR");
+            return -EINVAL;
+        }
+    }
+
     trace_vfio_early_setup_msix(vdev->vbasedev.name, pos,
                                 vdev->msix->table_bar,
                                 vdev->msix->table_offset,