在进行 PCIe 调试过程中我们时常需要执行 retrain 操作。retrain 命令是让 PCIe 链路先退出 Link 状态(ltssm==L0),ltssm 会进入 recovery 状态,然后再次进入 L0 状态。
retrain 操作使用的 setpci 命令,操作对象是 downstream port 而非 endpoint。
1.retrain 操作步骤
1.将 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 字节。
(1)setpci -s 14:02.0 204.B=0x01
本案例中 Secondary PCI Express Extended Capability 的偏移地址是 0x200,Link Control 3 Register 的地址是 0x204,将 Perform Equalization 设置成 1
(2)setpci -s 14:02.0cap_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 速率。
(3)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 写入。
END
作者:IC小鸽
文章来源:IC小鸽
推荐阅读
更多 IC 设计干货请关注IC 设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。