在进行PCIe调试过程中我们时常需要执行retrain操作。retrain命令是让PCIe 链路先退出Link状态(ltssm==L0),ltssm会进入recovery状态,然后再次进入L0状态。
retrain操作使用的setpci命令,操作对象是downstream port而非endpoint。
1.retrain操作步骤
- 将Secondary PCI Express Extended Capability中的Link Control 3 Register中Perform Equalization字段写1,此操作是为了保证重新建链过程中执行Equalization操作,Perform Equalization字段默认值为0,且每次重新建链后此字段会被清零。
2.设置目标速率:将PCI Express Capability Structure中的Link Control 2 Register的target Link Speed设置成目标速率,字段表示设备支持的最大速率
3.将PCI Express Capability Structure中的Link Control Register的Retrain Link字段写1,pcie链路将进行retrain操作。
2.案例说明
案例中14:02.0表示downstream port的bus number、device number和function number,在不同设备中数值不同。如下案例中“.B”表示按访问数据位宽是1字节。
- setpci -s 14:02.0 204.B=0x01
本案例中Secondary PCI Express Extended Capability的偏移地址是0x200,Link Control 3 Register的地址是0x204,将Perform Equalization设置成1
- setpci -s 14:02.0 cap_exp+0x30.B=0x44
将PCI Express Capability Structure地址采用缩写cap_exp来表示,Link Control 2 Register在PCI Express Capability Structure内部的地址偏移是0x30,因此Link Control Register的地址就是cap_exp+0x30,写数据0x44中的[3:0]为0x4对应target link speed,即16G速率。
- setpci -s 14:02.0 cap_exp+0x10.B=0x60
将PCI Express Capability Structure地址采用缩写cap_exp来表示,Link Control Register在PCI Express Capability Structure内部的地址偏移是0x10,因此Link Control Register的地址就是cap_exp+0x10,写数据0x60表示将Retrain Link置1。
NOTE:在改写字段时,首先需要先读字段地址的字节数据,然后改写对应字段,最终将改写后的数据使用setpci写入。