On Thu, May 30, 2019 at 08:25:39PM +0200, Mark Kettenis wrote:
> I started implementing MSI-X support for arm64 adn tried to use re(4)
> for testing.  This failed miserably and when I tried to use MSI-X with
> re(4) on amd64 I noticed it didn't work either.
> 
> Turns out the Realtek hardware doesn't support 64-bit access to MSI-X
> table.  Reads return 0xffffffffffffffff and writes get ignored.
> Looking at the relevant documentation I noticed that the message
> address is actually split into two 32-bit "DWORD" entries.  Which in
> turn suggests that the Realtek folks have the standard on their side...
> 
> Diff below fixes the issue.  I did already add a "MAU32" define for
> this, even though it wasn't quite right ;).  I also took the
> opportunity to add the "function mask" bit that we'll probably need in
> the future if we start being clever with using multiple vectors and
> ave a need to guarantee atomicity of making changes to the MSI-X
> config.
> 
> ok?

I had wondered about the MAU32 define when I was looking at MSI-X
suspend/resume.  Anyway, this makes sense to me and works with mcx(4),
so ok jmatthew@

> 
> 
> Index: dev/pci/pcireg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/pcireg.h,v
> retrieving revision 1.56
> diff -u -p -r1.56 pcireg.h
> --- dev/pci/pcireg.h  3 Aug 2018 22:18:13 -0000       1.56
> +++ dev/pci/pcireg.h  30 May 2019 18:06:39 -0000
> @@ -617,6 +617,7 @@ typedef u_int8_t pci_revision_t;
>   * Extended Message Signaled Interrups; access via capability pointer.
>   */
>  #define PCI_MSIX_MC_MSIXE    0x80000000
> +#define PCI_MSIX_MC_FM               0x40000000
>  #define PCI_MSIX_MC_TBLSZ_MASK       0x07ff0000
>  #define PCI_MSIX_MC_TBLSZ_SHIFT      16
>  #define PCI_MSIX_MC_TBLSZ(reg)       \
> @@ -626,7 +627,7 @@ typedef u_int8_t pci_revision_t;
>  #define  PCI_MSIX_TABLE_OFF  ~(PCI_MSIX_TABLE_BIR)
>  
>  #define PCI_MSIX_MA(i)               ((i) * 16 + 0)
> -#define PCI_MSIX_MAU32(i)    ((i) * 16 + 0)
> +#define PCI_MSIX_MAU32(i)    ((i) * 16 + 4)
>  #define PCI_MSIX_MD(i)               ((i) * 16 + 8)
>  #define PCI_MSIX_VC(i)               ((i) * 16 + 12)
>  #define  PCI_MSIX_VC_MASK    0x00000001
> Index: arch/amd64/pci/pci_machdep.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/pci/pci_machdep.c,v
> retrieving revision 1.69
> diff -u -p -r1.69 pci_machdep.c
> --- arch/amd64/pci/pci_machdep.c      19 Aug 2018 08:23:47 -0000      1.69
> +++ arch/amd64/pci/pci_machdep.c      30 May 2019 18:06:39 -0000
> @@ -475,7 +475,8 @@ msix_addroute(struct pic *pic, struct cp
>           _bus_space_map(memt, base + offset, tblsz * 16, 0, &memh))
>               panic("%s: cannot map registers", __func__);
>  
> -     bus_space_write_8(memt, memh, PCI_MSIX_MA(entry), addr);
> +     bus_space_write_4(memt, memh, PCI_MSIX_MA(entry), addr);
> +     bus_space_write_4(memt, memh, PCI_MSIX_MAU32(entry), 0);
>       bus_space_write_4(memt, memh, PCI_MSIX_MD(entry), vec);
>       bus_space_barrier(memt, memh, PCI_MSIX_MA(entry), 16,
>           BUS_SPACE_BARRIER_WRITE);
> 

Reply via email to