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