From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41644) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z87pL-0005Bq-Fo for qemu-devel@nongnu.org; Thu, 25 Jun 2015 10:08:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z87pI-0003xM-6x for qemu-devel@nongnu.org; Thu, 25 Jun 2015 10:08:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39708) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z87pI-0003xG-1X for qemu-devel@nongnu.org; Thu, 25 Jun 2015 10:08:24 -0400 Message-ID: <1435241301.3700.353.camel@redhat.com> From: Alex Williamson Date: Thu, 25 Jun 2015 08:08:21 -0600 In-Reply-To: <1435197842-26505-1-git-send-email-glaupre@chelsio.com> References: <1435197842-26505-1-git-send-email-glaupre@chelsio.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] pci : Add pba_offset PCI quirk for Chelsio T5 devices List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gabriel Laupre Cc: jb-gnumlists@wisemo.com, leedom@chelsio.com, mst@redhat.com, qemu-devel@nongnu.org, anish@chelsio.com, mboksanyi@chelsio.com, bsd@makefile.in On Wed, 2015-06-24 at 19:04 -0700, Gabriel Laupre wrote: > Fix pba_offset initialization value for Chelsio T5 devices. The > hardware doesn't return the correct pba_offset value, so add a > quirk to instead return a hardcoded value of 0x1000 when a Chelsio > T5 device is detected. > > Signed-off-by: Gabriel Laupre > --- > hw/vfio/pci.c | 12 ++++++++++++ > include/hw/pci/pci_ids.h | 3 +++ > 2 files changed, 15 insertions(+) > > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index e0e339a..8a4c7cd 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2220,6 +2220,9 @@ static int vfio_early_setup_msix(VFIOPCIDevice *vdev) > uint16_t ctrl; > uint32_t table, pba; > int fd = vdev->vbasedev.fd; > + 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); > > pos = pci_find_capability(&vdev->pdev, PCI_CAP_ID_MSIX); > if (!pos) { > @@ -2252,6 +2255,15 @@ 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; > > + /* Quirk to set the pba_offset value for Chelsio T5 > + * devices. Since hardware does not return value correctly, > + * we override with a hardcoded value instead. > + */ > + if (vendor == PCI_VENDOR_ID_CHELSIO && > + (device & 0xf000) == PCI_DEVICE_ID_CHELSIO_T5_SERIES) { > + vdev->msix->pba_offset = 0x1000; > + } Wow, so we're writing off a whole 1/16th of the Chelsio device ID space as broken? Can we detect that the pba_offset is wrong? Is it a consistent and obviously incorrect value? Thanks, Alex > + > trace_vfio_early_setup_msix(vdev->vbasedev.name, pos, > vdev->msix->table_bar, > vdev->msix->table_offset, > diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h > index 49c062b..9f649da 100644 > --- a/include/hw/pci/pci_ids.h > +++ b/include/hw/pci/pci_ids.h > @@ -114,6 +114,9 @@ > #define PCI_VENDOR_ID_ENSONIQ 0x1274 > #define PCI_DEVICE_ID_ENSONIQ_ES1370 0x5000 > > +#define PCI_VENDOR_ID_CHELSIO 0x1425 > +#define PCI_DEVICE_ID_CHELSIO_T5_SERIES 0x5000 > + > #define PCI_VENDOR_ID_FREESCALE 0x1957 > #define PCI_DEVICE_ID_MPC8533E 0x0030 >