lspci命令和setpci命令都可以在Linux发行版中获得。

这两个命令都可以提供多级输出,适用于检查PCI总线上训练的不同组件在不同时间点的功能和状态。这些功能中的大部分可以反映《PCI Express 基本规范》中所需的配置空间寄存器。与大多数命令一样,您可以通过运行lspci-help 或者man lspci 在Linux中。

//lspci

默认情况下,lspci命令可以显示所有设备信息,如下图所示。

//lspci-tv

该命令以树形格式显示PCI设备,并提供根端口总线、设备和功能(BDF)号。

在上面的日志中,Xilinx设备被连接到总线号)“00 ,设备号)" 01 和功能号1 。

//lspci-vvv

该命令可用于显示最详细的信息。运行此命令需要Root权限。

以下日志仅显示与Xilinx PCIe设备相关的部件。

关键点:

Gen3x8显示在链接功能寄存器和链接状态寄存器。有时,由于链接问题,可能会出现链接中断训练。向下训练的链接状态将反映在链接状态寄存器中:

可纠正错误状态寄存器显示非致命错误。在启动过程中,主机还会检测未配置的功能。由于该设计是为单个功能配置的,因此探测其他功能的操作将被报告为不支持该请求。这个不受支持的请求将被报告为建议性非致命错误。如果非致命错误,不支持的请求和可纠正的错误如果在启动过程中发生,则可以忽略此错误。这种错误可以通过将配置写入相应寄存器的相应位来清除。

用户必须监控不可纠正错误状态寄存器中是否有错误。如果该寄存器中报告了错误,必须进行调查并解决。

PCI函数的起始位置是80 。

//lspci-vs

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

//lspci-vvvs

该命令具有相同的功能,但可以提供更详细的输出,如下所示:

//lspci-nvmms

该命令可用于以数字形式显示PCI设备的供应商ID和设备ID。

//lspci-xxx

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

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

PCI-ID:位于0x00中的红色框显示供应商ID (0x10EE),后面是显示在蓝色框中的设备ID (0x7038)。下面是子供应商ID (0x10EE)和子器件ID (0x0700 ),分别位于红框和蓝框中,偏移量为0x2C和0x2E。

主控制器使能:回到0x04处的上部黄色框,其中16位字0000 0000 0000 0111 已显示。它代表命令寄存器。第2位是总线主控制器启用有点。

16位数的单词0000 0000 0000 0001 显示在0x06处的绿色框中。它代表状态寄存器,可能会随时间而变化,可用于向根联合体发送信号,指示某些条件已经发生。和条形存储器:位于0x10,其中32位字0000 0000 0000 1111 0111010 0000 已显示。

bit=0-请求存储空间

2:1=00 -位宽为32位的基址。

3=0 & gt;-不可预取

位31:4=0xF7C0(最低4位假定为0,因为它们必须在字节和Dword边界上分配)。注意:如果这个请求位宽是64位,那么下一个D字将包含较高的存储器地址,下一个BAR将是BAR2。

0x 14-这里是BAR1的地址,但由于都是0 ,该设备仅包含1个BAR选项。

检查PCIe链接宽度

PCIe宽度用于确定PCIe车道的数量。以下命令可用于查找链路功能寄存器中的PCIe链路宽度信息和链路状态寄存器中的协商链路宽度。

检查PCIe速度

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

检查PCIe最大有效载荷尺寸(MPS)

以下命令可以提供最大有效负载大小在设备控制寄存器。

检查PCIe最大读取请求大小

列出所有PCIe设备

//setpci

Setpci命令可用于读写配置寄存器。参见setpci-help 有关setpci特性的更多信息。

Setpci包含标准配置头中所有寄存器的名称。setpci-dump regs 命令显示所有PCI寄存器和功能的列表,如下所示:

[root@localhost xilinx]# setpci-dumpregscap pos W name 00 W VENDOR _ ID02 W DEVICE _ ID04 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 _ 014 L BASE _ ADDRESS _ 118 L BASE _ ADDRESS _ 21c L BASE _ ADDRESS _ 320 L BASE _ ADDRES S _ 528 L CARDBUS _ CIS2c L L PREF _ BASE _ upper 322 c L PREF _ LIMIT _ upper 3230 W IO _ BASE _ upper 1632 W IO _ LIMIT _ upper 1638 L BRIDGE _ ROM _ address 3e W BRIDGE _ CON trol 10 L CB _ CARDBUS _ BASE 14 W CB _ capabilities 16 W CB _ SEC _ status 18 B CB _ BUS _ number 19 B CB _ CARDBUS _ number 1 B CB _ CARDBUS _ latency 1c L CB _ MEMORY _ BASE _ 020 L CB _ MEMORY _ LIMIT _ 00 -CAP _ HT09 00-CAP _ vndr 0a 00-CAP _ DBG0b 00-CAP _ CCR c0 00-CAP _ hotplug 00-CAP _ ssvid00 e 00-CAP _ AGP 30 f 00-CAP _ secure 10 00-CAP _ exp 11 00-CAP _ msix 12 00-CAP _ SATA 13 00-CA P _ af 0001 00-ECAP _ aer 0002 00-ECAP _ VC 0003 00-ECAP _ DSN 000

//识别setpci中的寄存器

以下是识别setpci命令中使用的寄存器的各种方法。

使用十六进制地址

提供注册名称。

对于作为PCI功能一部分的寄存器,第一个寄存器可以通过功能名称找到。在- dumpregs输出中。查找以“cap _ 开头的姓名。或“ecap _ 。此名称后面可以跟offset,以便向地址添加偏移量(十六进制值)。这使得很容易找到包含在相应功能寄存器组中的寄存器。

宽度说明符(b,w或者。l)用于选择要读取或写入的字节数(1、2或4)。如果寄存器是通过名称引用的,并且寄存器的宽度是已知的,那么可以删除该说明符。

所有寄存器的名称和宽度说明符都区分大小写。

示例:

命令

指向命令寄存器中的值。如果换成4.w,会指向同一个位置。

命令. l

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

供应商标识1.b

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

CAP_PM 2.w

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

ECAP108.l

第一个32位字指向ID为0x108的扩展函数。

set PCIs 24:00.0 04 . w=6

为了使MSI中断生效,必须在PCIe配置中设置总线主机使能位。上面的命令可以用来设置总线主控制器启用命令寄存器中的位。"24:00.0&quot在这个例子中表示BDF数。不同设备的编号不同,并且因系统而异。要找到正确的设备BDF,请参考相应的lspci日志。

值为6表示内存启用位和总线主控制器启用当前设置了位。

//setpcis 24:00.0 4a . w=1

MSI寄存器也必须在PCIe配置空间中使能,MSI中断才能正常工作。在UltraScale设备中,它位于偏移量0x48处(也显示为lspci日志中的功能:[48])。为此,发出PCIe配置写将位16(MSI控制寄存器的位0)设为1;上述命令可用于执行此操作。

执行上述命令后,可以运行lspci命令。这应该显示MSI:启用相反。

//setpci -s 01:00.0 82.b

上面的命令用于从链接状态寄存器超大规模PCIe端点设备。

地址82 表示超大规模设备。有关详细表格,请参见(PG213)。

//setpci -s 00:01.0 d0.b

上述命令用于读取根端口的链路控制2寄存器。

在对应的lspci日志中,链接函数基址为a0,如下图所示:

链路2寄存器偏移量是30 。添加a0 到30 生成d0 。a0 地址表示根端口设备,如上面的截图所示。该地址因所用设备而异。对于使用UltraScale设备的根端口,功能地址的起始位置是70 ,如下所示,而链路控制2寄存器的偏移量仍然是30 ,这意味着十进制值为48。

基址值70 也可以从lspci日志中读取,如下所示:

//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)。