问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用lspci和setpci调试PCIe问题

创作时间:
作者:
@小白创作中心

使用lspci和setpci调试PCIe问题

引用
CSDN
1.
https://blog.csdn.net/zhuzongpeng/article/details/127014185

在Linux系统中,PCIe设备的调试和配置是一个常见的任务。本文将详细介绍如何使用lspci和setpci这两个强大的命令行工具来查看和修改PCIe设备的配置寄存器,帮助系统管理员和开发人员快速定位和解决问题。

lspci命令和setpci命令均为Linux发行版中原生可用的命令。这2条命令均可提供多级输出,适合在不同时间点用于查看PCI总线上训练的不同组件的功能和状态。其中大部分功能均可反映《PCI Express基本规范》中所需的配置空间寄存器。与大部分命令一样,在Linux中可通过运行“lspci --help”或“man lspci”来获取实用的指示信息。

lspci命令详解

默认情况下lspci命令可显示所有器件信息,如下图所示。

此命令可按树状格式显示PCI器件,并提供根端口总线、器件和功能(BDF)编号。

在以上日志中,赛灵思器件连接到总线编号(Bus Number)“00”、器件编号(Device Number)“01”和功能编号(Function Number)“1”。

此命令可用于显示最详细的信息。需要root用户权限才能运行此命令。

以下日志仅显示与赛灵思PCIe器件相关的部分。

要点:

  • “链路功能寄存器(Link Capability Register)”和“链路状态寄存器(Link Status Register)”均显示Gen3x8。有时由于链路问题,可能发生链路向下训练。向下训练的链路状态会反映在链路状态寄存器中:
  • “可纠正错误状态寄存器(Correctable Error Status register)”显示“非致命错误(Non-Fatal Error)”。启动期间,主机还会探测未配置的功能。由于设计是针对单一功能配置的,因此探测其它功能的操作将报告为请求不受支持。此不受支持的请求将报告为“非致命错误:建议(Advisory Non-Fatal error)”。如果在启动期间出现“非致命错误(Non-Fatal Error)”、“请求不受支持(Unsupported Request)”和“可纠正错误(Correctable Error)”,此错误可忽略。通过在对应寄存器中对相应的位执行配置写入即可清除此类错误。
  • 用户必须监控不可纠正错误状态寄存器中是否存在错误。如果在此寄存器中报告了错误,则必须对其进行调查并解决。
  • PCI Express功能起始位置为“80”。

此命令可提供有关选定器件的详细输出,如下所示:

此命令作用相同,但可提供更详细的输出,如下所示:

此命令可用于以数字形式显示PCI器件供应商ID和器件ID。

此命令可用于提供整个PCI配置空间的十六进制转储。

0x00的前2个字节实际为0x10EE。在PCIe规范中,所有数据均按偏移来定义,例如,包含0x80的黄色框位于偏移0x34处-表示该指针指向扩展功能寄存器的第一个地址。

PCI-ID:在位于0x00的红色框内显示的是供应商ID(0x10EE),后接蓝色框内显示的器件ID(0x7038)。其下方位于偏移0x2C和0x2E的红色框和蓝色框内分别是子供应商ID(0x10EE)和子器件ID(0x0700)。

总线主控制器启用:回到上方位于0x04处的黄色框内,其中显示的是16位字“0000 0000 0000 0111”。它表示命令寄存器。位2是“总线主控制器启用”位。

位于0x06处的绿色框内显示的是16位字“0000 0000 0000 0001”。它表示状态寄存器,可能随时间而改变,它可用于向根联合体(Root complex)发送信号,以表示发生了某些状况。

BAR和存储器:位于0x10处,其中显示的是32位字“0000 0000 0000 0000 1111 01111010 0000”

  • 位0 = 0 - 针对存储器空间的请求
  • 位2:1 =“00”- 基址,位宽为32位
  • 位3 =“0”- 不可预取
  • 位31:4 = 0xF7C0(最低的4个位假定为0,因为必须在字节和Dword边界上赋值)
    注:如果该请求位宽为64位,那么下一个D-Word将包含上位内存地址,下一个BAR将为BAR2。
  • 0x14 - 此处是BAR1地址,但由于全部为0,因此该器件仅含1个BAR选项

检查PCIe链路宽度
PCIe宽度用于判定PCIe通道数。以下命令可便于查找“链路功能寄存器”中的“PCIe链路宽度”信息,以及“链路状态寄存器”中协商的链路宽度。

检查PCIe速度
与用于检查PCIe链路宽度信息的命令类似,以下命令可提供有关PCIe速度的信息。

检查PCIe最大有效载荷大小(MPS)
以下命令可提供“器件控制寄存器(Device Control Register)”下的“最大有效载荷大小(Max Payload Size)”值。

检查PCIe最大读取请求大小
列出所有PCIe器件

setpci命令详解

setpci命令可用于读取和写入配置寄存器。请参阅“setpci –help”以获取有关setpci功能的详细信息。

setpci包含标准配置报头中的所有寄存器的名称。“setpci –dumpregs”命令可显示包含所有PCI寄存器和功能的列表,如下所示:

[root@localhost xilinx]# setpci --dumpregs
cap pos w name
00 W VENDOR_ID
02 W DEVICE_ID
04 W COMMAND
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命令中所使用的寄存器的各种方法。

  • 使用十六进制地址
  • 提供寄存器名称
  • 对于属于PCI功能的一部分的寄存器,可通过功能名称来找到第一个寄存器。在--dumpregs输出中。查找以CAP_ECAP_开头的名称。在此名称后可接+offset以向该地址添加偏移(十六进制值)。这样即可便于找到包含在已设置的相应功能寄存器内的寄存器。
  • 宽度说明符(b、.w或.l)用于选择要读取或写入的字节数(1、2或4)。如果按名称来引用寄存器且该寄存器宽度已知,则可删除该说明符。
  • 寄存器的所有名称和宽度说明符都区分大小写。

示例:

COMMAND

  • 指向命令寄存器中的值。如果将其替换为4.w,则将指向相同位置。

COMMAND.l

  • 指向命令寄存器和状态寄存器的值。

VENDOR_ID+1.b

  • 指向供应商ID寄存器的上位字节。

CAP_PM+2.w

  • 对应于功耗管理功能的第二个字。

ECAP108.l

  • 指向ID为0x108的扩展功能的第一个32位字。

setpci –s 24:00.0 04.w=6

  • 要使MSI中断生效,必须在“PCIe配置”中设置“总线主控制器启用(Bus Master Enable)”位。以上命令可用于在命令寄存器中设置“总线主控制器启用”位。此示例中的“24:00.0”表示BDF编号。不同器件采用不同编号,且因系统而异。要找到正确的器件BDF,请参阅对应lspci日志。
  • 值为6表示当前设置的是“存储器启用(Memory Enable)”位和“总线主控制器启用”位。

setpci –s 24:00.0 4a.w=1

  • 在PCIe配置空间内还必须启用MSI寄存器才能使MSI中断正常工作。在UltraScale+器件中,它位于偏移0x48处(在lspci日志中也显示为Capabilities: [48])。为此,请发出“PCIe配置写入(PCIe Configuration Write)”以将位16(MSI控制寄存器位0)设为1;以上命令可用于执行此操作。
  • 执行以上命令后,可运行lspci命令。这样应可改为显示“MSI: Enable +”。

setpci -s 01:00.0 82.b

  • 以上命令用于从UltraScale+ PCIe端点器件的“链路状态寄存器”中执行读取
  • 地址“82”表示UltraScale+器件。请参阅(PG213)以查看详细表格。

setpci -s 00:01.0 d0.b

  • 以上命令用于从根端口(Root Port)的链路控制2寄存器中执行读取
  • 在对应lspci日志中,链路功能基址为a0,如下所示:
  • 链路控制2寄存器偏移为“30”。将“a0”添加至“30”即可生成“d0”。“a0”地址表示根端口器件,如以上截屏中所示。此地址因使用的器件而异。对于使用UltraScale+器件的根端口,功能地址起始位置为“70”,如下所示,而链路控制2寄存器偏移仍为“30”,即表示十进制值48。
    从lspci日志中还可读取基址值“70”,如下所示:

setpci -s 00:01.0 d0.b=42

  • 以上命令用于写入链路控制2寄存器,以将速度设置为Gen2。
  • 此处值“2”表示Gen2,另一个位为“插槽时钟”,该位已启用,因此不发生更改。发出以上命令后,如果运行lspci,那么寄存器中显示的速度值将更改为Gen2。但这只是它再次执行链路训练时的训练目标速度。
  • 要将链路速度更改为Gen2,必须对链路进行重新训练。可通过执行以下所示命令来进行重新训练:

setpci -s 00:01.0 b0.b=62

更改PCIe最大读取请求大小

  • 查询寄存器以避免覆盖其它属性。
  • setpci -s 04:00.0 78.w
  • 将期望值写入寄存器。
  • setpci -s 04:00.0 78.w=2936
  • “最大读取请求”所在的“器件控制寄存器”的字节偏移针对UltraScale+器件为78h。该值对于其它器件可能发生改变。用户应查询相应的产品指南。下表来自(PG213)。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号