编 者 按
在Linux操作系统中,看如何按下PCIe的复位键
操作系统中的PCIe
拿一张PCIe Spec中的拓扑图:
每一张PCIe EP设备连接Switch也好,还是直接插到RC上也好,按照PCIe的协议规定,PCIe是一个点对点传输协议,对于每个EP设备,其作为dwon stream端口,而与其对应的,则是其upstream 端口。像在Switch中的结构:
这里面对于Switch而言具有三个Downstream Port,而对于插在上面的三个EP设备而言,其是EP设备的Upstream Port。这三个Switch中的三个DownStream Port在Linux操作系统中也会创建三个PCI文件系统。
在PCIe体系结构中,如果作为EP的设备出现了故障,那么往往其Upstream Port也是会受到影响。通过系统重启可以解决,而在一些场景下,可能系统重启不太能接受,那么能否有其他方式来对这条出现问题的点对点链路进行下恢复呢?
按下Linux里面的PCIe复位键。
找到EP的Upstream Port
EP设备的Upstream Port在Linux操作系统中会当作一个PCIe Bridge Port,通过lspci是能够看到的。
对于如何找到对应的EP设备的Upstream Port,如果你对lspci工具命令行熟悉的话,可以通过lspci -tv指令去获取对应的Upstream Port。如果不熟,也没关系,提供一段python代码,可以获取到EP对应的Upstream Port的BDF号。
import os def find_upstreamport(ep_bdf): result_dirs = [] for root, dirs, files in os.walk("/sys/devices"): for dir in dirs: if dir == ep_bdf: return os.path.basename(root) print ("{0} upstream port not found".format(ep_bdf))
参数ep_bdf为对应的ep设备的bdf号,需带上domain域,形式为xxxxxx.x
Secondary Bus Reset
对于Port bridge,其配置空间定义中Bridge Control Register (Offset 3Eh)包含Secondary Bus Reset定义:
按照协议中Secondary Bus Reset的定义:
设置该位会触发相应 PCI Express 端口上的热复位。软件必须确保最短复位持续时间 (Trst)。软件和系统必须遵守第 6.6 节中定义的先访问后复位时序要求,除非使用就绪通知机制(请参阅第 6.23 节)或设置相关功能状态寄存器中的立即就绪位。
端口配置寄存器不得更改,除非需要更新端口状态。
该位的默认值为 0b。
即我们可以通过对该位域先写1,再写0从而对Port Bridge下的设备进行复位。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !