Index: sys/dev/pci/pcireg.h =================================================================== RCS file: /cvs/src/sys/dev/pci/pcireg.h,v retrieving revision 1.62 diff -u -p -r1.62 pcireg.h --- sys/dev/pci/pcireg.h 19 Jan 2024 18:38:16 -0000 1.62 +++ sys/dev/pci/pcireg.h 16 Feb 2024 02:04:50 -0000 @@ -566,9 +566,15 @@ typedef u_int8_t pci_revision_t; #define PCI_PCIE_XCAP_SI 0x01000000 #define PCI_PCIE_XCAP_VER(x) (((x) >> 16) & 0x0f) #define PCI_PCIE_XCAP_TYPE(x) (((x) >> 20) & 0x0f) -#define PCI_PCIE_XCAP_TYPE_RP 0x4 -#define PCI_PCIE_XCAP_TYPE_DOWN 0x6 -#define PCI_PCIE_XCAP_TYPE_PCI2PCIE 0x8 +#define PCI_PCIE_XCAP_TYPE_ENDPOINT 0x0 +#define PCI_PCIE_XCAP_TYPE_LEGACY_ENDPOINT 0x1 +#define PCI_PCIE_XCAP_TYPE_RP 0x4 +#define PCI_PCIE_XCAP_TYPE_UP 0x5 +#define PCI_PCIE_XCAP_TYPE_DOWN 0x6 +#define PCI_PCIE_XCAP_TYPE_PCIE2PCI 0x7 +#define PCI_PCIE_XCAP_TYPE_PCI2PCIE 0x8 +#define PCI_PCIE_XCAP_TYPE_ROOT_ENDPOINT 0x9 +#define PCI_PCIE_XCAP_TYPE_ROOT_EVENT_COLL 0xa #define PCI_PCIE_DCAP 0x04 #define PCI_PCIE_DCSR 0x08 #define PCI_PCIE_DCSR_ERO 0x00000010 Index: usr.sbin/pcidump/pcidump.c =================================================================== RCS file: /cvs/src/usr.sbin/pcidump/pcidump.c,v retrieving revision 1.70 diff -u -p -r1.70 pcidump.c --- usr.sbin/pcidump/pcidump.c 1 Feb 2024 18:26:45 -0000 1.70 +++ usr.sbin/pcidump/pcidump.c 16 Feb 2024 02:04:50 -0000 @@ -504,6 +504,39 @@ dump_pci_powerstate(int bus, int dev, in printf("\n"); } +static const char * +pcie_xcap_type(uint32_t xcap) +{ + uint32_t type = PCI_PCIE_XCAP_TYPE(xcap); + static char unknown[32]; + + switch (type) { + case PCI_PCIE_XCAP_TYPE_ENDPOINT: + return ("Endpoint"); + case PCI_PCIE_XCAP_TYPE_LEGACY_ENDPOINT: + return ("Legacy Endpoint"); + case PCI_PCIE_XCAP_TYPE_RP: + return ("Root Port"); + case PCI_PCIE_XCAP_TYPE_UP: + return ("Upstream"); + case PCI_PCIE_XCAP_TYPE_DOWN: + return ("Downstream"); + case PCI_PCIE_XCAP_TYPE_PCIE2PCI: + return ("PCIe to PCI Bridge"); + case PCI_PCIE_XCAP_TYPE_PCI2PCIE: + return ("PCI to PCIe Bridge"); + case PCI_PCIE_XCAP_TYPE_ROOT_ENDPOINT: + return ("Root Complex Endpoint"); + case PCI_PCIE_XCAP_TYPE_ROOT_EVENT_COLL: + return ("Root Complex Event Collector"); + default: + break; + } + + snprintf(unknown, sizeof(unknown), "unknown type (%d)", type); + return (unknown); +} + static unsigned int pcie_dcap_mps(uint32_t dcap) { @@ -547,9 +580,25 @@ print_pcie_ls(uint8_t speed) void dump_pcie_linkspeed(int bus, int dev, int func, uint8_t ptr) { - u_int32_t dcap, dcsr; + u_int32_t xcap, dcap, dcsr; u_int32_t lcap, lcsr; u_int8_t cwidth, cspeed, swidth, sspeed; + + if (pci_read(bus, dev, func, ptr + PCI_PCIE_XCAP, &xcap) != 0) + return; + + printf("\t\tVersion: %u, Type: %s", + PCI_PCIE_XCAP_VER(xcap), pcie_xcap_type(xcap)); + switch (PCI_PCIE_XCAP_TYPE(xcap)) { + case PCI_PCIE_XCAP_TYPE_RP: + case PCI_PCIE_XCAP_TYPE_DOWN: + if (xcap & PCI_PCIE_XCAP_SI) + printf(", Slot Implemented"); + else + printf(", Slot Not Implemented"); + break; + } + printf("\n"); if (pci_read(bus, dev, func, ptr + PCI_PCIE_DCAP, &dcap) != 0) return;