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, ®) != 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, ®) != 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);