目录
简介
lspci 和 setpci 命令在 Linux 发行版中本身可用。该命令具有各种级别的输出,并提供非常有用的时间点查看 PCI 总线上训练的不同组件的功能和状态。
大多数这些功能都是 PCI-Express 基本规范所需的配置空间寄存器的反映。与大多数命令一样,可以通过在 Linux 中运行“lspci --help”或“man lspci”来找到使用说明。
lspci
默认情况下,lspci 命令将显示所有设备信息,如下所示。
lspci-TV
此命令以树形格式显示 PCI 设备,并给出根端口 BDF(总线、设备、功能)编号。
在上面的日志中,Xilinx 设备连接到总线号“00”、设备号“01”和功能号“1”。
lspci-vvv
这是显示所有内容的最详细命令。要运行此命令,需要 root 权限。
下面的日志仅显示与 Xilinx PCIe 设备相关的部分。
注意事项
• 链路能力寄存器和链路状态寄存器均显示Gen3x8。有时,由于链接问题,它可能会下降。训练好的下行链路状态反映在链路状态寄存器中:
可纠正错误状态寄存器显示设置的非致命错误。在引导期间,主机也会探测未配置的功能。由于设计是针对一种功能进行配置的,因此其他功能的探测将被报告为不受支持的请求。此不受支持的请求被报告为建议性非致命错误。如果在启动过程中设置了 Non-Fatal Error、Unsupported Request 和 Correctable Error,则可以忽略。可以通过对相应寄存器中的相应位进行配置写入来清除它们。
• 用户必须监视不可纠正错误状态寄存器中的错误。如果该寄存器报告错误,则必须对其进行调查并解决。
PCI Express 功能从“80”开始。
lspci -vs <BDF>
此命令为所选设备提供详细输出,如下所示:
lspci -vvvs <BDF>
这是相同的命令,但输出更详细,如下所示:
lspci -nvmms <BDF>
此命令将 PCI 设备供应商 ID 和设备 ID 显示为数字。
设置pci
[root@localhost xilinx]# setpci --dumpregs
cap pos w 名称
00 W VENDOR_ID
02 W DEVICE_ID
04 W 命令
06 W STATUS
08 B REVISION
09 B CLASS_PROG
0a W CLASS_DEVICE
0c B CACHE_LINE_SIZE
0d B LATENCY_TIMER
0e B HEADER_TYPE
0f B BIST
10 L BASE_ADDRESS_0
14 L BASE_ADDRESS_1
18 L BASE_ADDRESS_2
1c L
BASE_ADDRESS_3 20 L
BASE_ADDRESS_4 24 L BASE_ADDRESS_5
28 L CARDBUS_CIS
2c L SUBSYSTEM_VENDOR_ID
2e W SUBSYSTEM_ID
30 L ROM_ADDRESS
3c B INTERRUPT_LINE
3d B INTERRUPT_PIN
3e B MIN_GNT
3f B MAX_LAT
18 B PRIMARY_BUS
19 B SECONDARY_BUS
1a B SUBORDINATE_BUS
1b B SEC_LATENCY_TIMER
1c B IO_BASE
1d B IO_LIMIT
1e W SEC_STATUS
20 W MEMORY_BASE
22 W MEMORY_LIMIT
24 W PREF_MEMORY_BASE
26 W PREF_MEMORY_LIMIT
28 L PREF_BASE_UPPER32
2c L PREF_LIMIT_UPPER32
30 W IO_BASE_UPPER16
32 W IO_LIMIT_UPPER16
38 L BRIDGE_ROM_ADDRESS
3e W BRIDGE_CONTROL
10 L CB_CARDBUS_BASE
14 W CB_CAPABILITIES
16 W CB_SEC_STATUS
18 B CB_BUS_NUMBER
19 B CB_CARDBUS_NUMBER
1a B CB_SUBORDINATE_BUS
1b B CB_CARDBUS_LATENCY
1c L CB_MEMORY_BASE_0
20 L CB_MEMORY_LIMIT_0
24 L CB_MEMORY_BASE_1
28 L CB_MEMORY_LIMIT_1
2c W CB_IO_BASE_0
2e W CB_IO_BASE_0_HI 30 W
CB_IO_LIMIT_0 32 W CB_IO_LIMIT_0_HI 34 W CB_IO_BASE_1 36 W CB_IO_BASE_1_HI 38 W CB_IO_LIMIT_1 3a W CB_IO_LIMIT_1_HI 40 W CB_SUBSYSTEM_VENDOR_ID 42 W CB_SUBSYSTEM_ID 44 L CB_LEGACY_MODE_BASE 01 00 - CAP_PM 02 00 - CAP_AGP 03 00 - CAP_VPD 04 00 - CAP_SLOTID 05 00 - CAP_MSI 06 00 - CAP_CHSWP 07 00 - CAP_PCIX 08 00 - CAP_HT 09 00 - CAP_VNDR 0a 00 - CAP_DBG 0b 00 - CAP_CCRC 0c 00 - CAP_HOTPLUG 0d 00 - CAP_SSVID 0e 00 - CAP_AGP3 0f 00 - CAP_SECURE
10 00 - CAP_EXP
11 00 - CAP_MSIX
12 00 - CAP_SATA
13 00 - CAP_AF
0001 00 - ECAP_AER
0002 00 - ECAP_VC
0003 00 - ECAP_DSN
0004 00 - ECAP_PB
0005 00 - ECAP_RCLINK
0006 00 - ECAP_RCILINK
0007 00 - ECAP_RCECOLL
0008 00 - ECAP_MFVC
000a 00 - ECAP_RBCB
000b 00 - ECAP_VNDR
000d 00 - ECAP_ACS
000e 00 - ECAP_ARI
000f 00 - ECAP_ATS
0010 00 - ECAP_SRIOV
识别setpci中的寄存器
以下是识别 setpci 命令中使用的寄存器的各种方法。
- 使用十六进制地址
- 提供注册名称
- 对于属于 PCI 功能一部分的寄存器,可以使用功能名称对第一个寄存器进行寻址。在 --dumpregs 输出中。检查以“CAP_”或“ECAP_”开头的名称。后面可以跟 +offset 以向地址添加偏移量(十六进制数字)。这使得更容易对作为所设置的相应能力寄存器的一部分的寄存器进行寻址。
- 宽度说明符(b、.w 或 .l)用于选择要读取或写入的字节数(1、2 或 4)。如果通过名称引用寄存器并且寄存器的宽度已知,则可以删除说明符。
- 所有寄存器名称和宽度说明符都不区分大小写。
示例:
命令
- 它指向命令寄存器中的值。如果将其替换为 4.w,它将指向相同的位置。
命令.l
- 这指向命令和状态寄存器的值。
供应商_ID+1.b
- 它指向供应商 ID 寄存器的高字节。
CAP_PM+2.w
- 这对应于电源管理能力的第二个字。
ECAP108.l
- 它指向 ID 为 0x108 的扩展功能的第一个 32 位字。
setpci –s 24:00.0 04.w=6
- 为了使 MSI 中断工作,必须在 PCIe 配置中设置总线主控启用位。上述命令可用于设置命令寄存器中的“总线主控启用”位。 “24:00.0”是本例中的 BDF 号码。对于不同的设备,它会有所不同,并且还取决于系统。待寻址设备的正确BDF请参见对应的lspci日志。
- 值 6 意味着我们正在设置内存启用位和总线主控启用位
setpci –s 24:00.0 4a.w=1
- 还必须在 PCIe 配置空间中启用 MSI 寄存器,MSI 中断才能工作。在 UltraScale+ 器件中,它位于偏移量 0x48(也在 lspci 日志中显示为“功能:[48]”)。为此,请发出 PCIe 配置写入,将位 16(MSI 控制寄存器位 0)设置为 1;上面的命令就是这样做的
setpci -s 00:01.0 d0.b=42
- 上述命令写入链路控制 2 寄存器以将速度设置为 Gen2。
- 这里的值“2”表示 Gen2,另一个位是“时隙时钟”,它已启用,因此未更改。发出上述命令后,如果执行lspci,则会显示寄存器中的速度值已更改为Gen2。不过,这只是它再次进行链接训练时训练到的速度。
- 要将链路速度更改为 Gen2,必须重新训练链路。这可以通过执行如下所示的命令来完成:
- setpci -s 00:01.0 b0.b=62