开发者分享 | 使用 lspci 和 setpci 调试 PCIe 问题

FPGA开发圈 2020-11-27 00:00

点击“蓝字”关注我们


lspci 命令和 setpci 命令均为 Linux 发行版中原生可用的命令。  

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


// lspci

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


// lspci-tv

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


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

// lspci-vvv

此命令可用于显示最详细的信息。需要 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”。


// lspci-vs <BDF>

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

// lspci-vvvs <BDF>

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

// lspci-nvmms <BDF>

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

// lspci-xxx

此命令可用于提供整个 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 中的寄存器

以下是识别 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)。



关注我们

FPGA开发圈 这里介绍、交流、有关FPGA开发资料(文档下载,技术解答等),提升FPGA应用能力。
评论
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 121浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 260浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 105浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 98浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 142浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 101浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 146浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 146浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 124浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 154浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦