9ae3a8
From b6a8c4f1ada2c7d31bdd2438163f11026a0a0711 Mon Sep 17 00:00:00 2001
9ae3a8
From: Alex Williamson <alex.williamson@redhat.com>
9ae3a8
Date: Fri, 17 Jul 2015 20:46:43 +0200
9ae3a8
Subject: [PATCH 2/5] vfio/pci : Add pba_offset PCI quirk for Chelsio T5
9ae3a8
 devices
9ae3a8
9ae3a8
Message-id: <20150717203953.606.815.stgit@gimli.home>
9ae3a8
Patchwork-id: 67057
9ae3a8
O-Subject: [RHEL7.2 qemu-kvm PATCH] vfio/pci : Add pba_offset PCI quirk for Chelsio T5 devices
9ae3a8
Bugzilla: 1244347
9ae3a8
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
RH-Acked-by: Bandan Das <bsd@redhat.com>
9ae3a8
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
9ae3a8
From: Gabriel Laupre <glaupre@chelsio.com>
9ae3a8
9ae3a8
Upstream: 43302969966bc3a95470bfc300289a83068ef5d9
9ae3a8
9ae3a8
Fix pba_offset initialization value for Chelsio T5 Virtual Function
9ae3a8
device. The T5 hardware has a bug in it where it reports a Pending Interrupt
9ae3a8
Bit Array Offset of 0x8000 for its SR-IOV Virtual Functions instead
9ae3a8
of the 0x1000 that the hardware actually uses internally. As the hardware
9ae3a8
doesn't return the correct pba_offset value, add a quirk to instead
9ae3a8
return a hardcoded value of 0x1000 when a Chelsio T5 VF device is
9ae3a8
detected.
9ae3a8
9ae3a8
This bug has been fixed in the Chelsio's next chip series T6 but there are
9ae3a8
no plans to respin the T5 ASIC for this bug. It is just documented in the
9ae3a8
T5 Errata and left it at that.
9ae3a8
9ae3a8
Signed-off-by: Gabriel Laupre <glaupre@chelsio.com>
9ae3a8
Reviewed-by: Bandan Das <bsd@redhat.com>
9ae3a8
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 hw/misc/vfio.c           | 27 +++++++++++++++++++++++++++
9ae3a8
 include/hw/pci/pci_ids.h |  2 ++
9ae3a8
 2 files changed, 29 insertions(+)
9ae3a8
9ae3a8
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
9ae3a8
index 118489c..36b9832 100644
9ae3a8
--- a/hw/misc/vfio.c
9ae3a8
+++ b/hw/misc/vfio.c
9ae3a8
@@ -2466,6 +2466,33 @@ static int vfio_early_setup_msix(VFIODevice *vdev)
9ae3a8
             vdev->host.function, pos, vdev->msix->table_bar,
9ae3a8
             vdev->msix->table_offset, vdev->msix->entries);
9ae3a8
 
9ae3a8
+    /*
9ae3a8
+     * Test the size of the pba_offset variable and catch if it extends outside
9ae3a8
+     * of the specified BAR. If it is the case, we need to apply a hardware
9ae3a8
+     * specific quirk if the device is known or we have a broken configuration.
9ae3a8
+     */
9ae3a8
+    if (vdev->msix->pba_offset >=
9ae3a8
+        vdev->bars[vdev->msix->pba_bar].size) {
9ae3a8
+
9ae3a8
+        PCIDevice *pdev = &vdev->pdev;
9ae3a8
+        uint16_t vendor = pci_get_word(pdev->config + PCI_VENDOR_ID);
9ae3a8
+        uint16_t device = pci_get_word(pdev->config + PCI_DEVICE_ID);
9ae3a8
+
9ae3a8
+        /*
9ae3a8
+         * Chelsio T5 Virtual Function devices are encoded as 0x58xx for T5
9ae3a8
+         * adapters. The T5 hardware returns an incorrect value of 0x8000 for
9ae3a8
+         * the VF PBA offset while the BAR itself is only 8k. The correct value
9ae3a8
+         * is 0x1000, so we hard code that here.
9ae3a8
+         */
9ae3a8
+        if (vendor == PCI_VENDOR_ID_CHELSIO && (device & 0xff00) == 0x5800) {
9ae3a8
+            vdev->msix->pba_offset = 0x1000;
9ae3a8
+        } else {
9ae3a8
+            error_report("vfio: Hardware reports invalid configuration, "
9ae3a8
+                         "MSIX PBA outside of specified BAR");
9ae3a8
+            return -EINVAL;
9ae3a8
+        }
9ae3a8
+    }
9ae3a8
+
9ae3a8
     return 0;
9ae3a8
 }
9ae3a8
 
9ae3a8
diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h
9ae3a8
index d8dc2f1..3792255 100644
9ae3a8
--- a/include/hw/pci/pci_ids.h
9ae3a8
+++ b/include/hw/pci/pci_ids.h
9ae3a8
@@ -102,6 +102,8 @@
9ae3a8
 #define PCI_VENDOR_ID_ENSONIQ            0x1274
9ae3a8
 #define PCI_DEVICE_ID_ENSONIQ_ES1370     0x5000
9ae3a8
 
9ae3a8
+#define PCI_VENDOR_ID_CHELSIO            0x1425
9ae3a8
+
9ae3a8
 #define PCI_VENDOR_ID_FREESCALE          0x1957
9ae3a8
 #define PCI_DEVICE_ID_MPC8533E           0x0030
9ae3a8
 
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8