This makes pcidump -v show whether MSI/MSI-X interrupts are enabled
for a device, and for MSI-X, the size of the interrupt table and
which BAR/offset it's in.

ok?

Index: pcidump.c
===================================================================
RCS file: /cvs/src/usr.sbin/pcidump/pcidump.c,v
retrieving revision 1.52
diff -u -p -r1.52 pcidump.c
--- pcidump.c   12 Mar 2019 01:46:21 -0000      1.52
+++ pcidump.c   2 Apr 2019 03:24:11 -0000
@@ -54,6 +54,8 @@ void dump_bars(int, int, int, int);
 void dump_caplist(int, int, int, u_int8_t);
 void dump_pci_powerstate(int, int, int, uint8_t);
 void dump_pcie_linkspeed(int, int, int, uint8_t);
+void dump_msi(int, int, int, uint8_t);
+void dump_msix(int, int, int, uint8_t);
 void print_pcie_ls(uint8_t);
 int dump_rom(int, int, int);
 int dump_vga_bios(void);
@@ -398,6 +400,34 @@ dump_pcie_linkspeed(int bus, int dev, in
 }
 
 void
+dump_msi(int bus, int dev, int func, u_int8_t ptr)
+{
+       u_int32_t reg;
+
+       if (pci_read(bus, dev, func, ptr, &reg) != 0)
+               return;
+
+       printf("\t\tEnabled: %s\n", reg & PCI_MSI_MC_MSIE ? "yes" : "no");
+}
+
+void
+dump_msix(int bus, int dev, int func, u_int8_t ptr)
+{
+       u_int32_t reg;
+       u_int32_t table;
+
+       if ((pci_read(bus, dev, func, ptr, &reg) != 0) ||
+           (pci_read(bus, dev, func, ptr + PCI_MSIX_TABLE, &table) != 0))
+               return;
+
+       printf("\t\tEnabled: %s; table size %d (BAR %d:%d)\n",
+           reg & PCI_MSIX_MC_MSIXE ? "yes" : "no",
+           PCI_MSIX_MC_TBLSZ(reg) + 1,
+           (table & PCI_MSIX_TABLE_BIR),
+           (table & PCI_MSIX_TABLE_OFF));
+}
+
+void
 dump_pcie_enhanced_caplist(int bus, int dev, int func)
 {
        u_int32_t reg;
@@ -458,6 +488,12 @@ dump_caplist(int bus, int dev, int func,
                case PCI_CAP_PCIEXPRESS:
                        dump_pcie_linkspeed(bus, dev, func, ptr);
                        dump_pcie_enhanced_caplist(bus, dev, func);
+                       break;
+               case PCI_CAP_MSI:
+                       dump_msi(bus, dev,func, ptr);
+                       break;
+               case PCI_CAP_MSIX:
+                       dump_msix(bus, dev, func, ptr);
                        break;
                }
                ptr = PCI_CAPLIST_NEXT(reg);

Reply via email to