Hi,
right now i got the chance to play a little bit with PCIe. I read some
parts of the spec
and was interessted what my PCIe devices can do. I also found out that
pcidump can
not display the Enhanced Capabilites.
This patch enables pcidump to display them.
I did not find a good list of descriptions for the different
capabilities, the one im using
in this patch was taken from the linux kernel. Is it possible to get a
complete list
somewhere?
Here is an example output:
# pcidump -v
Domain /dev/pci0:
0:0:0: Intel 82Q33 Host
0x0000: Vendor ID: 8086 Product ID: 29d0
0x0004: Command: 0006 Status: 2090
0x0008: Class: 06 Subclass: 00 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fc
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 00 Line: 00 Min Gnt: 00 Max Lat: 00
0x00e0: Capability 0x09: Vendor Specific
0:1:0: Intel 82Q33 PCIE
0x0000: Vendor ID: 8086 Product ID: 29d1
0x0004: Command: 0104 Status: 0010
0x0008: Class: 06 Subclass: 04 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 01 Latency Timer: 00 Cache Line Size: 08
0x0010: 00000000
0x0014: 00000000
0x0018: Primary Bus: 0 Secondary Bus: 1 Subordinate Bus: 1
Secondary Latency Timer: 00
0x001c: I/O Base: f0 I/O Limit: 00 Secondary Status: 0000
0x0020: Memory Base: fff0 Memory Limit: 0000
0x0024: Prefetch Memory Base: fff1 Prefetch Memory Limit: 0001
0x0028: Prefetch Memory Base Upper 32 Bits: 00000000
0x002c: Prefetch Memory Limit Upper 32 Bits: 00000000
0x0030: I/O Base Upper 16 Bits: 0000 I/O Limit Upper 16 Bits: 0000
0x0038: Expansion ROM Base Address: 00000000
0x003c: Interrupt Pin: 01 Line: 0b Bridge Control: 0000
0x0088: Capability 0x0d: PCI-PCI
0x0080: Capability 0x01: Power Management
State: D0
0x0090: Capability 0x05: Message Signalled Interrupts (MSI)
0x00a0: Capability 0x10: PCI Express
Link Speed: 2.5 / 2.5 GT/s Link Width: x0 / x16
0x0100: Enhanced Capability 0x02: Virtual Channel Capability
0x0140: Enhanced Capability 0x05: Root Complex Link Declaration
0:2:0: Intel 82Q33 Video
0x0000: Vendor ID: 8086 Product ID: 29d2
0x0004: Command: 0007 Status: 0090
0x0008: Class: 03 Subclass: 00 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR mem 32bit addr: 0xd0100000/0x00080000
0x0014: BAR io addr: 0x00001c40/0x0008
0x0018: BAR mem prefetchable 32bit addr: 0xe0000000/0x10000000
0x001c: BAR mem 32bit addr: 0xd0000000/0x00100000
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fc
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 01 Line: 0b Min Gnt: 00 Max Lat: 00
0x0090: Capability 0x05: Message Signalled Interrupts (MSI)
0x00d0: Capability 0x01: Power Management
State: D0
0:26:0: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 2937
0x0004: Command: 0005 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 80 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x00001820/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 01 Line: 0a Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x13: PCI Advanced Features
0:26:1: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 2938
0x0004: Command: 0005 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x00001840/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 02 Line: 09 Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x13: PCI Advanced Features
0:26:2: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 2939
0x0004: Command: 0005 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x00001860/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 03 Line: 0b Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x13: PCI Advanced Features
0:26:7: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 293c
0x0004: Command: 0106 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 20 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR mem 32bit addr: 0xd0180000/0x00000400
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 02 Line: 09 Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x01: Power Management
State: D0
0x0058: Capability 0x0a: Debug Port
0x0098: Capability 0x13: PCI Advanced Features
0:28:0: Intel 82801I PCIE
0x0000: Vendor ID: 8086 Product ID: 2940
0x0004: Command: 0004 Status: 0010
0x0008: Class: 06 Subclass: 04 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 81 Latency Timer: 00 Cache Line Size: 08
0x0010: 00000000
0x0014: 00000000
0x0018: Primary Bus: 0 Secondary Bus: 2 Subordinate Bus: 2
Secondary Latency Timer: 00
0x001c: I/O Base: f0 I/O Limit: 00 Secondary Status: 2000
0x0020: Memory Base: fff0 Memory Limit: 0000
0x0024: Prefetch Memory Base: fff1 Prefetch Memory Limit: 0001
0x0028: Prefetch Memory Base Upper 32 Bits: 00000000
0x002c: Prefetch Memory Limit Upper 32 Bits: 00000000
0x0030: I/O Base Upper 16 Bits: 0000 I/O Limit Upper 16 Bits: 0000
0x0038: Expansion ROM Base Address: 00000000
0x003c: Interrupt Pin: 01 Line: 09 Bridge Control: 0000
0x0040: Capability 0x10: PCI Express
Link Speed: 2.5 / 2.5 GT/s Link Width: x0 / x1
0x0100: Enhanced Capability 0x02: Virtual Channel Capability
0x0180: Enhanced Capability 0x05: Root Complex Link Declaration
0x0080: Capability 0x05: Message Signalled Interrupts (MSI)
0x0090: Capability 0x0d: PCI-PCI
0x00a0: Capability 0x01: Power Management
State: D0 PME# enabled
0:28:4: Intel 82801I PCIE
0x0000: Vendor ID: 8086 Product ID: 2948
0x0004: Command: 0004 Status: 0010
0x0008: Class: 06 Subclass: 04 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 81 Latency Timer: 00 Cache Line Size: 08
0x0010: 00000000
0x0014: 00000000
0x0018: Primary Bus: 0 Secondary Bus: 3 Subordinate Bus: 3
Secondary Latency Timer: 00
0x001c: I/O Base: f0 I/O Limit: 00 Secondary Status: 2000
0x0020: Memory Base: fff0 Memory Limit: 0000
0x0024: Prefetch Memory Base: fff1 Prefetch Memory Limit: 0001
0x0028: Prefetch Memory Base Upper 32 Bits: 00000000
0x002c: Prefetch Memory Limit Upper 32 Bits: 00000000
0x0030: I/O Base Upper 16 Bits: 0000 I/O Limit Upper 16 Bits: 0000
0x0038: Expansion ROM Base Address: 00000000
0x003c: Interrupt Pin: 02 Line: 05 Bridge Control: 0000
0x0040: Capability 0x10: PCI Express
Link Speed: 2.5 / 2.5 GT/s Link Width: x0 / x1
0x0100: Enhanced Capability 0x02: Virtual Channel Capability
0x0180: Enhanced Capability 0x05: Root Complex Link Declaration
0x0080: Capability 0x05: Message Signalled Interrupts (MSI)
0x0090: Capability 0x0d: PCI-PCI
0x00a0: Capability 0x01: Power Management
State: D0 PME# enabled
0:28:5: Intel 82801I PCIE
0x0000: Vendor ID: 8086 Product ID: 294a
0x0004: Command: 0007 Status: 0010
0x0008: Class: 06 Subclass: 04 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 81 Latency Timer: 00 Cache Line Size: 08
0x0010: 00000000
0x0014: 00000000
0x0018: Primary Bus: 0 Secondary Bus: 4 Subordinate Bus: 4
Secondary Latency Timer: 00
0x001c: I/O Base: f0 I/O Limit: 00 Secondary Status: 6000
0x0020: Memory Base: d020 Memory Limit: d020
0x0024: Prefetch Memory Base: fff1 Prefetch Memory Limit: 0001
0x0028: Prefetch Memory Base Upper 32 Bits: 00000000
0x002c: Prefetch Memory Limit Upper 32 Bits: 00000000
0x0030: I/O Base Upper 16 Bits: 0000 I/O Limit Upper 16 Bits: 0000
0x0038: Expansion ROM Base Address: 00000000
0x003c: Interrupt Pin: 03 Line: 0b Bridge Control: 0004
0x0040: Capability 0x10: PCI Express
Link Speed: 2.5 / 2.5 GT/s Link Width: x1 / x1
0x0100: Enhanced Capability 0x02: Virtual Channel Capability
0x0180: Enhanced Capability 0x05: Root Complex Link Declaration
0x0080: Capability 0x05: Message Signalled Interrupts (MSI)
0x0090: Capability 0x0d: PCI-PCI
0x00a0: Capability 0x01: Power Management
State: D0 PME# enabled
0:29:0: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 2934
0x0004: Command: 0005 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 80 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x00001880/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 01 Line: 0a Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x13: PCI Advanced Features
0:29:1: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 2935
0x0004: Command: 0005 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x000018a0/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 02 Line: 05 Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x13: PCI Advanced Features
0:29:2: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 2936
0x0004: Command: 0005 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x000018c0/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 03 Line: 0b Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x13: PCI Advanced Features
0:29:7: Intel 82801I USB
0x0000: Vendor ID: 8086 Product ID: 293a
0x0004: Command: 0106 Status: 0290
0x0008: Class: 0c Subclass: 03 Interface: 20 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR mem 32bit addr: 0xd0181000/0x00000400
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 01 Line: 0a Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x01: Power Management
State: D0
0x0058: Capability 0x0a: Debug Port
0x0098: Capability 0x13: PCI Advanced Features
0:30:0: Intel 82801BA Hub-to-PCI
0x0000: Vendor ID: 8086 Product ID: 244e
0x0004: Command: 0107 Status: 0010
0x0008: Class: 06 Subclass: 04 Interface: 01 Revision: 92
0x000c: BIST: 00 Header Type: 01 Latency Timer: 00 Cache Line Size: 00
0x0010: 00000000
0x0014: 00000000
0x0018: Primary Bus: 0 Secondary Bus: 5 Subordinate Bus: 5
Secondary Latency Timer: 20
0x001c: I/O Base: f0 I/O Limit: 00 Secondary Status: 2280
0x0020: Memory Base: fff0 Memory Limit: 0000
0x0024: Prefetch Memory Base: fff1 Prefetch Memory Limit: 0001
0x0028: Prefetch Memory Base Upper 32 Bits: 00000000
0x002c: Prefetch Memory Limit Upper 32 Bits: 00000000
0x0030: I/O Base Upper 16 Bits: 0000 I/O Limit Upper 16 Bits: 0000
0x0038: Expansion ROM Base Address: 00000000
0x003c: Interrupt Pin: 00 Line: ff Bridge Control: 0004
0x0050: Capability 0x0d: PCI-PCI
0:31:0: Intel 82801IB LPC
0x0000: Vendor ID: 8086 Product ID: 2918
0x0004: Command: 0007 Status: 0210
0x0008: Class: 06 Subclass: 01 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 80 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR empty (00000000)
0x0014: BAR empty (00000000)
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 00 Line: 00 Min Gnt: 00 Max Lat: 00
0x00e0: Capability 0x09: Vendor Specific
0:31:2: Intel 82801I AHCI
0x0000: Vendor ID: 8086 Product ID: 2923
0x0004: Command: 0007 Status: 02b0
0x0008: Class: 01 Subclass: 06 Interface: 01 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR io addr: 0x00001c58/0x0008
0x0014: BAR io addr: 0x00001c4c/0x0004
0x0018: BAR io addr: 0x00001c50/0x0008
0x001c: BAR io addr: 0x00001c48/0x0004
0x0020: BAR io addr: 0x000018e0/0x0020
0x0024: BAR mem 32bit addr: 0xd0182000/0x00000800
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 02 Line: 0b Min Gnt: 00 Max Lat: 00
0x0080: Capability 0x05: Message Signalled Interrupts (MSI)
0x0070: Capability 0x01: Power Management
State: D0
0x00a8: Capability 0x12: SATA
0x00b0: Capability 0x13: PCI Advanced Features
0:31:3: Intel 82801I SMBus
0x0000: Vendor ID: 8086 Product ID: 2930
0x0004: Command: 0103 Status: 0280
0x0008: Class: 0c Subclass: 05 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR mem 64bit addr: 0x00000000d0183000/0x00000100
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR io addr: 0x00001c00/0x0020
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 02 Line: 0b Min Gnt: 00 Max Lat: 00
0:31:6: Intel 82801I Thermal
0x0000: Vendor ID: 8086 Product ID: 2932
0x0004: Command: 0002 Status: 0010
0x0008: Class: 11 Subclass: 80 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 00
0x0010: BAR mem 64bit addr: 0x00000000d0184000/0x00001000
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fd
0x0030: Expansion ROM Base Address: 00000000
0x0038: 00000000
0x003c: Interrupt Pin: 01 Line: 09 Min Gnt: 00 Max Lat: 00
0x0050: Capability 0x01: Power Management
State: D0
4:0:0: Broadcom BCM5754
0x0000: Vendor ID: 14e4 Product ID: 167a
0x0004: Command: 0106 Status: 0010
0x0008: Class: 02 Subclass: 00 Interface: 00 Revision: 02
0x000c: BIST: 00 Header Type: 00 Latency Timer: 00 Cache Line Size: 08
0x0010: BAR mem 64bit addr: 0x00000000d0200000/0x00010000
0x0018: BAR empty (00000000)
0x001c: BAR empty (00000000)
0x0020: BAR empty (00000000)
0x0024: BAR empty (00000000)
0x0028: Cardbus CIS: 00000000
0x002c: Subsystem Vendor ID: 1734 Product ID: 10fe
0x0030: Expansion ROM Base Address: 10790000
0x0038: 00000000
0x003c: Interrupt Pin: 01 Line: 0b Min Gnt: 00 Max Lat: 00
0x0048: Capability 0x01: Power Management
State: D0 PME# enabled
0x0050: Capability 0x03: Vital Product Data (VPD)
0x0058: Capability 0x09: Vendor Specific
0x00e8: Capability 0x05: Message Signalled Interrupts (MSI)
0x00d0: Capability 0x10: PCI Express
Link Speed: 2.5 / 2.5 GT/s Link Width: x1 / x1
0x0100: Enhanced Capability 0x01: Advanced Error Reporting
0x013c: Enhanced Capability 0x02: Virtual Channel Capability
0x0160: Enhanced Capability 0x03: Device Serial Number
0x016c: Enhanced Capability 0x04: Power Budgeting
Patch:
Index: sys/dev/pci/pcireg.h
==================================================================
--- sys/dev/pci/pcireg.h
+++ sys/dev/pci/pcireg.h
@@ -591,10 +591,19 @@
#define PCI_PCIE_SLCSR_PDS 0x00400000
#define PCI_PCIE_SLCSR_LACS 0x01000000
#define PCI_PCIE_RCSR 0x1c
#define PCI_PCIE_LCAP2 0x2c
+/*
+ * PCI Express; enhanced capabilities
+ */
+#define PCI_PCIE_ECAP 0x100
+#define PCI_PCIE_ECAP_ID(x) (((x) & 0x0000ffff))
+#define PCI_PCIE_ECAP_VER(x) (((x) >> 16) & 0x0f)
+#define PCI_PCIE_ECAP_NEXT(x) ((x) >> 20)
+#define PCI_PCIE_ECAP_LAST 0x0
+
/*
* Extended Message Signaled Interrups; access via capability pointer.
*/
#define PCI_MSIX_MC_MSIXE 0x80000000
#define PCI_MSIX_MC_TBLSZ_MASK 0x07ff0000
Index: usr.sbin/pcidump/pcidump.c
==================================================================
--- usr.sbin/pcidump/pcidump.c
+++ usr.sbin/pcidump/pcidump.c
@@ -99,10 +99,43 @@
"PCI Express",
"Extended Message Signalled Interrupts (MSI-X)",
"SATA",
"PCI Advanced Features"
};
+
+const char *pci_enhanced_capnames[] = {
+ "Unknown",
+ "Advanced Error Reporting",
+ "Virtual Channel Capability",
+ "Device Serial Number",
+ "Power Budgeting",
+ "Root Complex Link Declaration",
+ "Root Complex Internal Link Control",
+ "Root Complex Event Collector",
+ "Multi-Function VC Capability",
+ "Virtual Channel Capability",
+ "Root Complex/Root Bridge",
+ "Vendor-Specific",
+ "Config Access",
+ "Access Control Services",
+ "Alternate Routing ID",
+ "Address Translation Services",
+ "Single Root I/O Virtualization",
+ "Multi Root I/O Virtualization",
+ "Multicast",
+ "Page Request Interface",
+ "Reserved for AMD",
+ "Resizable BAR",
+ "Dynamic Power Allocation",
+ "TPH Requester",
+ "Latency Tolerance Reporting",
+ "Secondary PCIe Capability",
+ "Protocol Multiplexing",
+ "Process Address Space ID",
+ "Downstream Port Containment",
+ "Precision Time Measurement",
+};
int
main(int argc, char *argv[])
{
int nfuncs;
@@ -352,10 +385,39 @@
printf(" / ");
print_pcie_ls(cspeed);
printf(" GT/s Link Width: x%d / x%d\n", swidth, cwidth);
}
+
+void
+dump_pcie_ehanced_caplist(int bus, int dev, int func)
+{
+ u_int32_t reg;
+ u_int16_t ptr;
+ u_int16_t ecap;
+
+ ptr = PCI_PCIE_ECAP;
+
+ do {
+ if (pci_read(bus, dev, func, ptr, ®) != 0)
+ return;
+
+ if (PCI_PCIE_ECAP_ID(reg) == 0xffff &&
+ PCI_PCIE_ECAP_NEXT(reg) == PCI_PCIE_ECAP_LAST)
+ return;
+
+ ecap = PCI_PCIE_ECAP_ID(reg);
+ if (ecap >= nitems(pci_enhanced_capnames))
+ ecap = 0;
+
+ printf("\t0x%04x: Enhanced Capability 0x%02x: ", ptr, ecap);
+ printf("%s\n", pci_enhanced_capnames[ecap]);
+
+ ptr = PCI_PCIE_ECAP_NEXT(reg);
+
+ } while (ptr != PCI_PCIE_ECAP_LAST);
+}
void
dump_caplist(int bus, int dev, int func, u_int8_t ptr)
{
u_int32_t reg;
@@ -377,12 +439,14 @@
if (cap >= nitems(pci_capnames))
cap = 0;
printf("%s\n", pci_capnames[cap]);
if (cap == PCI_CAP_PWRMGMT)
dump_pci_powerstate(bus, dev, func, ptr);
- if (cap == PCI_CAP_PCIEXPRESS)
+ if (cap == PCI_CAP_PCIEXPRESS) {
dump_pcie_linkspeed(bus, dev, func, ptr);
+ dump_pcie_ehanced_caplist(bus, dev, func);
+ }
ptr = PCI_CAPLIST_NEXT(reg);
}
}
void