Hi Alex, the issue is that the T5 hardware has a bug in it where it reports a 
Pending Interrupt Bit Array Offset of 0x8000 for its SR-IOV Virtual Functions 
instead of the 0x1000 that the hardware actually uses internally.  (There was a 
mistaken <<3 used in the IP Glue Logic for the PCI Configuration Space of the 
VFs.)

  This bug has been fixed in our next chip — unimaginatively enough called T6 — 
but there are no plans to respin the T5 ASIC for this bug.  We've just 
documented it in our T5 Errata and left it at that.

  Prior to this issue that Gabriel is tackling, the mis-reported PBA Offset 
wasn't a problem because no Host Software that we were aware of ever used that 
value.  Apparently the software that Gabriel is using does look at the PBA 
Value and complains that the 0x8000 is outside the BAR4/5 MSI-X range, which is 
itself only 8KB in length.  (Although it's still not clear to me that the 
software in question ever bothers doing anything with the PBA Offset.)

  So I suggested to Gabriel that he follow the Linux kernel model and provide a 
Device Specific "Quirk" which would detect a T5 VF and hard wire the PBA Offset 
to 0x1000 for such devices.

  Please let me know if you'd like any more background information.

Casey

________________________________________
From: Alex Williamson [alex.william...@redhat.com]
Sent: Thursday, June 25, 2015 12:19 PM
To: Gabriel Laupre
Cc: b...@makefile.in; qemu-devel@nongnu.org; m...@redhat.com; 
jb-gnumli...@wisemo.com; Casey Leedom; Michael Boksanyi; Anish Bhatt
Subject: Re: [PATCH] pci : Add pba_offset PCI quirk for Chelsio T5 devices

On Thu, 2015-06-25 at 19:00 +0000, Gabriel Laupre wrote:
> @Bandan
> > Is the array offset guaranteed to always be the same ?
> The returned value depends on the physical function and should be 0x1000 for 
> the T5 series. Therefore this offset is guaranteed to always be the same.
>
> > What are the chances of this getting fixed by a firmware update ? :)
> It isn't a firmware issue, therefore can't be fixed via firmware update. This 
> will be resolved for the next versions.
>
> @Alex
> > Can we detect that the pba_offset is wrong?  Is it a consistent and 
> > obviously incorrect value?
> The pba_offset returned will always be 0x8000 for a virtual function for a T5 
> device. It is obviously too big. It is an hardware problem in the T5 series.


Is the current failure mode that msix_init() fails because pba_offset
(or pba_offset + pba_size) extends outside of the specified BAR?  If the
problem is going to be resolved in the next version, will that be
different PCI device IDs?  Ideally we'd only enable the quirk if we knew
we were in a bogus situation, so we can let new hardware work as it
describes itself if it gets fixed.  Thanks,

Alex

> Also I will need to correct the patch as the virtual function devices are 
> encoded as 0x58xx . This quirk is only related with the virtual functions.
>
> Gabriel
>
> -----Original Message-----
> From: Alex Williamson [mailto:alex.william...@redhat.com]
> Sent: Thursday, June 25, 2015 7:08 AM
> To: Gabriel Laupre
> Cc: qemu-devel@nongnu.org; m...@redhat.com; jb-gnumli...@wisemo.com; 
> b...@makefile.in; Casey Leedom; Michael Boksanyi; Anish Bhatt
> Subject: Re: [PATCH] pci : Add pba_offset PCI quirk for Chelsio T5 devices
>
> 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 <glau...@chelsio.com>
> > ---
> >  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
> >
>
>
>




Reply via email to