编 者 按
操作系统中的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号。
importos deffind_upstreamport(ep_bdf): result_dirs = [] forroot, dirs, files inos.walk("/sys/devices"): fordir indirs: ifdir == ep_bdf: returnos.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下的设备进行复位。
审核编辑:汤梓红
-
Linux
+关注
关注
87文章
11222浏览量
208891 -
操作系统
+关注
关注
37文章
6734浏览量
123184 -
端口
+关注
关注
4文章
954浏览量
32008
原文标题:按下Linux里PCIe的复位键
文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论