編 者 按
在Linux操作系統(tǒng)中,看如何按下PCIe的復(fù)位鍵
操作系統(tǒng)中的PCIe
拿一張PCIe Spec中的拓?fù)鋱D:
每一張PCIe EP設(shè)備連接Switch也好,還是直接插到RC上也好,按照PCIe的協(xié)議規(guī)定,PCIe是一個點對點傳輸協(xié)議,對于每個EP設(shè)備,其作為dwon stream端口,而與其對應(yīng)的,則是其upstream 端口。像在Switch中的結(jié)構(gòu):
這里面對于Switch而言具有三個Downstream Port,而對于插在上面的三個EP設(shè)備而言,其是EP設(shè)備的Upstream Port。這三個Switch中的三個DownStream Port在Linux操作系統(tǒng)中也會創(chuàng)建三個PCI文件系統(tǒng)。
在PCIe體系結(jié)構(gòu)中,如果作為EP的設(shè)備出現(xiàn)了故障,那么往往其Upstream Port也是會受到影響。通過系統(tǒng)重啟可以解決,而在一些場景下,可能系統(tǒng)重啟不太能接受,那么能否有其他方式來對這條出現(xiàn)問題的點對點鏈路進(jìn)行下恢復(fù)呢?
按下Linux里面的PCIe復(fù)位鍵。
找到EP的Upstream Port
EP設(shè)備的Upstream Port在Linux操作系統(tǒng)中會當(dāng)作一個PCIe Bridge Port,通過lspci是能夠看到的。
對于如何找到對應(yīng)的EP設(shè)備的Upstream Port,如果你對lspci工具命令行熟悉的話,可以通過lspci -tv指令去獲取對應(yīng)的Upstream Port。如果不熟,也沒關(guān)系,提供一段python代碼,可以獲取到EP對應(yīng)的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))
參數(shù)ep_bdf為對應(yīng)的ep設(shè)備的bdf號,需帶上domain域,形式為xxxxxx.x
Secondary Bus Reset
對于Port bridge,其配置空間定義中Bridge Control Register (Offset 3Eh)包含Secondary Bus Reset定義:
按照協(xié)議中Secondary Bus Reset的定義:
設(shè)置該位會觸發(fā)相應(yīng) PCI Express 端口上的熱復(fù)位。軟件必須確保最短復(fù)位持續(xù)時間 (Trst)。軟件和系統(tǒng)必須遵守第 6.6 節(jié)中定義的先訪問后復(fù)位時序要求,除非使用就緒通知機(jī)制(請參閱第 6.23 節(jié))或設(shè)置相關(guān)功能狀態(tài)寄存器中的立即就緒位。
端口配置寄存器不得更改,除非需要更新端口狀態(tài)。
該位的默認(rèn)值為 0b。
即我們可以通過對該位域先寫1,再寫0從而對Port Bridge下的設(shè)備進(jìn)行復(fù)位。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11324瀏覽量
209938 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6858瀏覽量
123485 -
端口
+關(guān)注
關(guān)注
4文章
980瀏覽量
32115
原文標(biāo)題:按下Linux里PCIe的復(fù)位鍵
文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論