如何決定 PCIe Bus 的編號

首先來看在 x86 系統中,PCIe 是什麼樣的一個體系架構。下圖是一個 PCIe 的拓撲結構示例, PCIe 協議支持 256 個 Bus, 每條 Bus 最多支持 32 個 Device,每個 Device 最多支持 8 個 Function,所以由 BDF(Bus,device,function) 構成了每個 PCIe 設備節點的身份證號。

01_PCIe_BDF.jpg

 

PCIe 體系架構一般由 root complex,switch,endpoint 等類型的 PCIe 設備組成,在 root complex 和 switch 中通常會有一些 embeded endpoint(這種設備對外不出 PCIe 接口)。這麼多的設備,CPU 啟動後要怎麼去找到並認出它們呢? Host 對 PCIe 設備掃描是採用了深度優先算法,其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。我們一般稱這個過程為 PCIe 設備列舉(PCIe Enumeration)。列舉過程中 host 通過配置讀事物包來獲取下游設備的信息,通過配置寫事物包對下游設備進行設置。

 

第一步,PCI Host 主橋掃描 Bus 0 上的設備(在一個處理器系統中,一般將 Root complex 中與 Host Bridge 相連接的 PCI 總線命名為 PCI Bus 0),主橋發現 Bridge 1 後,將 Bridge1 下面的 PCI Bus 定為 Bus 1,系統將初始化 Bridge 1 的配置空間,並將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 0 和 1,以表明 Bridge 1 的上游總線是 0,下游總線是 1,由於還無法確定 Bridge1 下掛載設備的具體情況,系統先暫時將 Subordinate Bus Number 設為 0xFF。

02_PCIe_Enum_bus1.jpg

 

第二步,系統開始掃描 Bus 1,將會發現 Bridge 3,並發現這是一個 switch 設備。系統將 Bridge 3 下面的 PCI Bus 定為 Bus 2,並將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 1 和 2,和上一步一樣暫時把 Bridge 3 的 Subordinate Bus Number 設為 0xFF。

03_PCIe_Enum_bus2.jpg

 

第三步,系統繼續掃描 Bus 2,將會發現 Bridge 4。繼續掃描,系統會發現 Bridge 下面掛載的 NVMe SSD 設備,系統將Bridge 4 下面的 PCI Bus 定為 Bus 3,並將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 2 和 3,因為 Bus 3 下面掛的是端點設備(葉子節點),下面不會再有下游總線了,因此 Bridge 4 的Subordinate Bus Number 的值可以確定為 3。

04_PCIe_Enum_bus3.jpg

 

第四步,完成 Bus 3 的掃描後,系統返回到 Bus 2 繼續掃描,會發現 Bridge 5。繼續掃描,系統會發現下面掛載的 NIC 設備,系統將 Bridge 5 下面的 PCI Bus 設置為 Bus 4,並將該橋的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 2 和 4,因為 NIC 同樣是端點設備,Bridge 5 的 Subordinate Bus Number 的值可以確定為 4。

05_PCIe_Enum_bus4.jpg

 

第五步,除了 Bridge 4 和 Bridge 5 以外,Bus2 下面沒有其他設備了,因此返回到 Bridge 3,Bus 4 是找到的掛載在這個 Bridge 下的最後一個 bus 號,因此將 Bridge 3 的 Subordinate Bus Number 設置為 4。 Bridge 3 的下游設備都已經掃描完畢,繼續向上返回到 Bridge 1,同樣將 Bridge 1 的 Subordinate Bus Number 設置為 4。

06_PCIe_Enum_bus5.jpg

 

第六步,系統返回到 Bus 0 繼續掃描,會發現 Bridge 2,系統將 Bridge 2 下面的 PCI Bus 定為 Bus 5。並將 Bridge 2 的 Primary Bus Number 和 Secondary Bus Number 寄存器分別設置成 0 和 5, Graphics card 也是端點設備,因此 Bridge 2 的 Subordinate Bus Number 的值可以確定為 5。

至此,掛在 PCIe 總線上的所有設備都被掃描到,列舉過程結束,Host 通過這一過程獲得了一個完整的 PCIe 設備拓撲結構。

06_PCIe_Enum_bus5.jpg

系統上電以後,host會自動完成上述的設備列舉過程。除一些專有系統外,普通系統只會在開機階段進行進行設備的掃描,啟動成功後(列舉過程結束),即使插入一個PCIe設備,系統也不會再去識別它。

 

 

 

Reference

必看: 原来PCIe技术原理这么简单!





文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。

 

arrow
arrow
    全站熱搜

    silverwind1982 發表在 痞客邦 留言(0) 人氣()