pcie link training

有机会用瑞芯微做EP,X86做RC ,调试两者建立连接。

环境配置

如图所示,两块单板,期望瑞芯微做EP,X86做RC,两者能够互联。

LINK 配置过程

主要配置瑞芯微

瑞芯微的芯片配置,在配置EP模式时,分为控制器和PHY两部分,两部分都需要配置为EP模式。

由于软件代码的bug,导致PHY的部分时钟工作的RC模式,并且配置时钟来自芯片本身,而非对端送过来的。于是乎导致实际环境中两个RC进行互联。

现象之瑞芯微EP侧

通过对瑞芯微单板进行复位,通过寄存器查看PCIE连接已经建立,相关寄存器为:

值为 0x4407,也就是物理层和数据链路层都被设置为1,都link了,并且LTSSM为0x11,根据瑞芯微手册说明,

也就是进入了连接状态。

现象之X86 RC侧

x86侧相关寄存器

在瑞芯微单板复位过程或者复位过后的2分钟左右的时间内,我们看到此寄存器的变化情况如下:

50: 00 00 11 38 00 b2 5c 00 00 00 48 01 08 00 00 00 (8 表示在link traing,3 bit29 表示已经link active)

50: 00 00 11 30 00 b2 5c 00 00 00 48 01 08 00 00 00 (link training为0,同时link up为1,表示已经进入L状态

50: 00 00 11 38 00 b2 5c 00 00 00 48 01 08 00 00 00 (此处很快又进入link traing状态)

50: 00 00 11 30 00 b2 5c 00 00 00 48 01 08 00 00 00

50: 00 00 11 38 00 b2 5c 00 00 00 48 01 08 00 00 00

50: 00 00 11 38 00 b2 5c 00 00 00 48 01 08 00 00 00

50: 00 00 11 38 00 b2 5c 00 00 00 48 01 08 00 00 00

50: 00 00 11 10 00 b2 5c 00 00 00 48 01 08 00 00 00 后续一直link traing ,直到此时没有再traing,说明对端已经起来了。没又link traing的对象了!

通过上述寄存器变化,可以得知,X86侧看到的PCIE link状态为短暂的link (offset 0x53值为0x30时),而后大部分时间在0x38这个状态,也就是一直在link training。

LTSSM状态变化与对应寄存器的关系

翻看PCIE协议,其中 当link up 1 并且 link training 也为1时,只有configuration和recovery两个状态。

而通过上面65标识文字及下面转换图,可以得到从Recovery进入configuration时才被设置为1。

于是我们想是什么导致 LINK 从Lx 状态变化到了Recovery状态

Recovery状态进入

通过上述发现后,我们在瑞芯微一侧持续跟踪连接状态,发现其LTSSM也在recovey的几个状态和L0之间转换

速率、带宽的改变是主要功能

然而我们已经配置X1 GEN1。

X86 桥片NSR功能

PCI Power Management Control

在实验过程钟,怀疑PCIE端口的电源状态相关,于是将其改配

setpci -s 0:1c.0 a4.b=0x8

如果写0,则下挂设备会跟着复位。注意。

rescan功能

1)在第二节的配置,LINK不稳定的情况下,我们通过lspci -vt命令可以看到对应的桥片端口信息如下:

+-1c.0-[01]----

虽然看到了桥片PCIE端口,但是看不到设备。

2)在第二节看到连接状态为0x30 0x38时,我们通过下面命令,

/sys/bus/pci/devices/0000:00:1c.0# echo 1 >rescan

此时,再查看lspci -vt

+-1c.0-[01]----00.0 Fuzhou Rockchip Electronics Co., Ltd Neural Network Processor Card

3)即可以看到设备信息,进而可以读取此设备的配置空间寄存器信息

lspci -xxx -s 1:0.0

10: 00 00 00 3c 00 00 00 00 00 00 00 00 00 00 00 00

20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

4) 此时虽然看到了设备,但是0x10 bar0 寄存器的值并非X86地址空间的地址,而是原始瑞芯微芯片的地址。说明rescan并没有给设备分配地址,这也情有可原,毕竟其上游端口也没地址可分。

总结

我们纠结于 LTSSM状态机苦寻无果,而最终走读代码发现由于两侧都配置为RC导致了上述的现象。

至于为什么在此种配置下会llink training几分钟,而不是几十分钟后续再进一步探索。

intel 是否有寄存器直接指示LTSSM状态变化?还好此款桥片支持LINK状态查询,即寄存器的link active 位。

猜你喜欢

转载自blog.csdn.net/proware/article/details/128943672