pcie链路信号质量不好,导致Pcie链路报错时需要将链路降速进行测试。链路速率可以通过pcie功能寄存器(PCI Express Capabilities Register)进行配置。Pcie功能寄存器可以通过配置空间中Capabilities Register (0x34)寄存器来查找首地址。

PCIE 设备基本配置空间定义如下:

PCIE 桥基本配置空间如下:

配置空间Capabilities Register (0x34)地址存放Capabilitie首地址。通过lspci命令查看一个pcie桥片配置空间如下:

配置空间0x34地址值为0x40

另外通过lspci –vvv也可以查看配置空间信息如下:

Capabilities也是0x40

功能寄存器定义如下:

上面桥片功能寄存器对应的如下:

功能寄存器对应的相关值如下:

PCI Expres Cap ID0x10

Next Cap Pointer0x80

PCI Express Capabilities Register:0x0042(根桥端口Root Port of PCI Express Root Complex*)

Link Capabilities0x01717c13(支持8GT/s)

Link Control Register: 0x0,寄存器定义如下:

Link Control 寄存器第Retrain Link (5)位设置成1时速率会重新训练。

Link Control 2 Register: 0x0001,寄存器定义如下:

Link Control 2 寄存器Target Link Speed (0-3)可以设置速率。

0000b: 强制2.5GT/s

0001b: 2.5GT/s

0010b: 5.0GT/s

重新设置pcie速率配置上面两个寄存器:
1、修改Link Control 2 Register的低4位,设置速率

2Link Control Register5位置1,重新训练速率。

修改pcie配置寄存器可以通过setpci工具,输入命令setpci –dumpregs可以查看pcie配置空间可设置寄存器名称,如下所示: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

其中10 00 - CAP_EXP表示PCIE功能寄存器,其中10是功能ID。用CAP_EXP+偏移就能读写对应功能寄存器。例如读取功能寄存器Link Control(偏移0x10)的值,输入: setpci -s 00:1c.0 CAP_EXP+0x10.w

如果要重新强制PCIE速率为2.5GT/s,可以输入以下命令:

setpci -s 00:1c.0 CAP_EXP+0x30.b=0x0

setpci -s 00:1c.0 CAP_EXP+0x10.b=0x20

.b1字节 .w 2个字节 .l: 4个字节

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐