> Date: Tue, 2 Apr 2019 11:45:00 +0800 > From: Jonathan Matthew <jonat...@d14n.org> > > 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?
sure, ok kettenis@ > 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); > >