Linux操作系统中如何按下PCIe的复位键

描述

编 者 按   

在Linux操作系统中,看如何按下PCIe的复位键

操作系统中的PCIe     

拿一张PCIe Spec中的拓扑图:

Linux

每一张PCIe EP设备连接Switch也好,还是直接插到RC上也好,按照PCIe的协议规定,PCIe是一个点对点传输协议,对于每个EP设备,其作为dwon stream端口,而与其对应的,则是其upstream 端口。像在Switch中的结构:

Linux

这里面对于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定义:

Linux

按照协议中Secondary Bus Reset的定义:

设置该位会触发相应 PCI Express 端口上的热复位。软件必须确保最短复位持续时间 (Trst)。软件和系统必须遵守第 6.6 节中定义的先访问后复位时序要求,除非使用就绪通知机制(请参阅第 6.23 节)或设置相关功能状态寄存器中的立即就绪位。   

 端口配置寄存器不得更改,除非需要更新端口状态。

该位的默认值为 0b。

即我们可以通过对该位域先写1,再写0从而对Port Bridge下的设备进行复位。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分