新聞中心

PCI總線的配置

作者: 時間:2016-12-14 來源:網(wǎng)絡(luò) 收藏

2 PCI設(shè)備31

HOST處理器對PCI設(shè)備31進行配置讀寫時,需要通過HOST主橋、PCI橋1、2和3,最終到達PCI設(shè)備31。
當處理器訪問PCI設(shè)備31時,首先將CONFIG_ADDRESS寄存器的Enable位置1,Bus Number字段置為3,并對Device、Function和Register Number字段賦值。之后當處理器對CONFIG_DATA寄存器進行讀寫訪問時,HOST主橋、PCI橋1、2和3將按照以下步驟進行處理,最后PCI設(shè)備31將接收這個配置請求。
(1) HOST主橋發(fā)現(xiàn)Bus Number字段的值為3,該總線號并不是與HOST主橋直接相連的PCI總線的Bus Number,所以HOST主橋?qū)⑻幚砥鲗ONFIG_DATA寄存器的讀寫訪問直接轉(zhuǎn)換為Type 01h配置請求,并將這個配置請求發(fā)送到PCI總線0上。PCI總線規(guī)定Type 01h配置請求只能由PCI橋負責處理。
(2) 在PCI總線0上,PCI橋1的Secondary Bus Number為1而Subordinate Bus Number為3。而1< Bus Number <= 3,所以PCI橋1將接收來自PCI總線0的Type 01h配置請求,并將這個配置請求直接下推到PCI總線1。
(3) 在PCI總線1上,PCI橋2的Secondary Bus Number為2而Subordinate Bus Number為3。而1< Bus Number <= 3,所以PCI橋2將接收來自PCI總線0的Type 01h配置請求,并將這個配置請求直接下推到PCI總線2。
(4) 在PCI總線2上,PCI橋3的Secondary Bus Number為3,因此PCI橋3將“來自PCI總線2的Type 01h配置請求”轉(zhuǎn)換為Type 00h配置請求,并將其下推到PCI總線3。PCI總線規(guī)定,如果PCI橋的Secondary Bus Number與Type 01h配置請求中包含的Bus Number相同時,該PCI橋?qū)⒔邮盏腡ype 01h配置請求轉(zhuǎn)換為Type 00h配置請求,然后再發(fā)向其Secondary Bus。
(5) 在PCI總線3上,有兩個設(shè)備PCI設(shè)備31和PCI設(shè)備32。在這兩個設(shè)備中,必然有一個設(shè)備將要響應(yīng)這個Type 00h配置請求,從而完成整個配置請求周期。本篇在第2.4.1節(jié)中,討論了究竟是PCI設(shè)備31還是PCI設(shè)備32接收這個配置請求,這個問題涉及PCI總線如何分配PCI設(shè)備使用的設(shè)備號。

2.4.3 PCI總線樹Bus號的初始化

在一個處理器系統(tǒng)中,每一個HOST主橋都推出一顆PCI總線樹。在一顆PCI總線樹中有多少個PCI橋(包括HOST主橋),就含有多少條PCI總線。系統(tǒng)軟件在遍歷當前PCI總線樹時,需要首先對這些PCI總線進行編號,即初始化PCI橋的Primary、Secondary和Subordinate Bus Number寄存器。
在一個處理器系統(tǒng)中,一般將與HOST主橋直接相連的PCI總線被命名為PCI總線0。然后系統(tǒng)軟件使用DFS(Depth First Search)算法,依次對其他PCI總線進行編號。值得注意的是,與HOST主橋直接相連的PCI總線,其編號都為0,因此當處理器系統(tǒng)中存在多個HOST主橋時,將有多個編號為0的PCI總線,但是這些編號為0的PCI總線分屬不同的PCI總線域,其含義并不相同。
在一個處理器系統(tǒng)中,PCI總線樹的結(jié)構(gòu)如圖2?13所示。當然在一個實際的處理器系統(tǒng)中,很少會出現(xiàn)這樣復(fù)雜的PCI總線樹結(jié)構(gòu),本節(jié)采用這個結(jié)構(gòu)的目的是便于說明PCI總線號的分配過程。
在PCI總線中,系統(tǒng)軟件使用深度優(yōu)先DFS算法對PCI總線樹進行遍歷,DFS算法和廣度優(yōu)先BFS(Breadth First Search)算法是遍歷樹型結(jié)構(gòu)的常用算法。與BFS算法相比,DFS算法的空間復(fù)雜度較低,因此絕大多數(shù)系統(tǒng)系統(tǒng)在遍歷PCI總線樹時,都使用DFS算法而不是BFS算法。
DFS是搜索算法的一種,其實現(xiàn)機制是沿著一顆樹的深度遍歷各個節(jié)點,并盡可能深地搜索樹的分支,DFS的算法為線性時間復(fù)雜度,適合對拓撲結(jié)構(gòu)未知的樹進行遍歷。在一個處理器系統(tǒng)的初始化階段,PCI總線樹的拓撲結(jié)構(gòu)是未知的,適合使用DFS算法進行遍歷。下文以圖2?13為例,說明系統(tǒng)軟件如何使用DFS算法,分配PCI總線號,并初始化PCI橋中的Primary Bus Number、Secondary Bus Number和Subordinate Bus number寄存器。所謂DFS算法是指按照深度優(yōu)先的原則遍歷PCI胖樹,其步驟如下。
(1) HOST主橋掃描PCI總線0上的設(shè)備。系統(tǒng)軟件首先忽略所有這條總線上的PCI Agent設(shè)備,因為在這些設(shè)備之下不會掛接新的PCI總線。例如PCI設(shè)備01下不可能掛接新的PCI總線。
(2) HOST主橋首先發(fā)現(xiàn)PCI橋1,并將PCI橋1的Secondary Bus命名為PCI總線1。系統(tǒng)軟件將初始化PCI橋1的配置空間,將PCI橋1的Primary Bus Number寄存器賦值為0,而將Secondary Bus Number寄存器賦值為1,即PCI橋1的上游PCI總線號為0,而下游PCI總線號為1。
(3) 掃描PCI總線1,發(fā)現(xiàn)PCI橋2,并將PCI橋2的Secondary Bus命名為PCI總線2。系統(tǒng)軟件將初始化PCI橋2的配置空間,將PCI橋2的Primary Bus Number寄存器賦值為1,而將Secondary Bus Number寄存器賦值為2。
(4) 掃描PCI總線2,發(fā)現(xiàn)PCI橋3,并將PCI橋3的Secondary Bus命名為PCI總線3。系統(tǒng)軟件將初始化PCI橋3的配置空間,將PCI橋3的Primary Bus Number寄存器賦值為2,而將Secondary Bus Number寄存器賦值為3。
(5) 掃描PCI總線3,沒有發(fā)現(xiàn)任何PCI橋,這表示PCI總線3下不可能有新的總線,此時系統(tǒng)軟件將PCI橋3的Subordinate Bus number寄存器賦值為3。系統(tǒng)軟件在完成PCI總線3的掃描后,將回退到PCI總線3的上一級總線,即PCI總線2,繼續(xù)進行掃描。
(6) 在重新掃描PCI總線2時,系統(tǒng)軟件發(fā)現(xiàn)PCI總線2上除了PCI橋3之外沒有發(fā)現(xiàn)新的PCI橋,而PCI橋3之下的所有設(shè)備已經(jīng)完成了掃描過程,此時系統(tǒng)軟件將PCI橋2的Subordinate Bus number寄存器賦值為3。繼續(xù)回退到PCI總線1。
(7) PCI總線1上除了PCI橋2外,沒有其他橋片,于是繼續(xù)回退到PCI總線0,并將PCI橋1的Subordinate Bus number寄存器賦值為3。
(8) 在PCI總線0上,系統(tǒng)軟件掃描到PCI橋4,則首先將PCI橋4的Primary Bus Number寄存器賦值為0,而將Secondary Bus Number寄存器賦值為4,即PCI橋1的上游PCI總線號為0,而下游PCI總線號為4。
(9) 系統(tǒng)軟件發(fā)現(xiàn)PCI總線4上沒有任何PCI橋,將結(jié)束對PCI總線4的掃描,并將PCI橋4的Subordinate Bus number寄存器賦值為4,之后回退到PCI總線4的上游總線,即PCI總線0繼續(xù)進行掃描。
(10) 系統(tǒng)軟件發(fā)現(xiàn)在PCI總線0上的兩個橋片PCI總線0和PCI總線4都已完成掃描后,將結(jié)束對PCI總線的DFS遍歷全過程。
從以上算法可以看出,PCI橋的Primary Bus和Secondary Bus號的分配在遍歷PCI總線樹的過程中從上向下分配,而Subordinate Bus號是從下向上分配的,因為只有確定了一個PCI橋之下究竟有多少條PCI總線后,才能初始化該PCI橋的Subordinate Bus號。

2.4.4 PCI總線Device號的分配

一條PCI總線會掛接各種各樣的PCI設(shè)備,而每一個PCI設(shè)備在PCI總線下具有唯一的設(shè)備號。系統(tǒng)軟件通過總線號和設(shè)備號定位一個PCI設(shè)備之后,才能訪問這個PCI設(shè)備的配置寄存器。值得注意的是,系統(tǒng)軟件使用“地址尋址方式”訪問PCI設(shè)備的存儲器和I/O地址空間,這與訪問配置空間使用的“ID尋址方式”不同。
PCI設(shè)備的IDSEL信號與PCI總線的AD[31:0]信號的連接關(guān)系決定了該設(shè)備在這條PCI總線的設(shè)備號。如上文所述,每一個PCI設(shè)備都使用獨立的IDSEL信號,該信號將與PCI總線的AD[31:0]信號連接,IDSEL信號的含義見第1.2.2節(jié)。
在此我們簡要回顧PCI的配置讀寫事務(wù)使用的時序。如圖1?3所示,PCI總線事務(wù)由一個地址周期加若干個數(shù)據(jù)周期組成。在進行配置讀寫請求總線事務(wù)時,C/BE#信號線的值在地址周期中為0x1010或者為0x1011,表示當前總線事務(wù)為配置讀或者配置寫請求。此時出現(xiàn)在AD[31:0]總線上的值并不是目標設(shè)備的PCI總線地址,而是目標設(shè)備的ID號,這與PCI總線進行I/O或者存儲器請求時不同,因為PCI總線使用ID號而不是PCI總線地址對配置空間進行訪問。
如圖2?12所示,在配置讀寫總線事務(wù)的地址周期中,AD[10:0]信號已經(jīng)被Function Number和Register Number使用,因此PCI設(shè)備的IDSEL只能與AD[31:11]信號連接。
認真的讀者一定可以發(fā)現(xiàn)在CONFIG_ADDRESS寄存器中Device Number字段一共有5位可以表示32個設(shè)備,而AD[31:11]只有21位,顯然在這兩者之間無法建立一一對應(yīng)的映射關(guān)系。因此在一條PCI總線上如果有21個以上的PCI設(shè)備,那么總是有幾個設(shè)備無法與AD[31:11]信號線連接,從而PCI總線無法訪問這些設(shè)備。因為PCI總線在配置請求的地址周期中,只能使用第31~11這些AD信號,所以在一條總線上最多也只能掛接21個PCI設(shè)備。這21個設(shè)備可能是從0到20,也可能是從11到31排列。從而系統(tǒng)軟件在遍歷PCI總線時,還是需要從0到31遍歷整條PCI總線。
在實際的應(yīng)用中,一條PCI總線能夠掛接21個設(shè)備已經(jīng)足夠了,實際上由于PCI總線的負載能力有限,即便總線頻率為33MHz的情況下,在一條PCI總線中最多也只能掛接10個負載,一條PCI總線所能掛接的負載詳見表1?1。AD信號線與PCI設(shè)備IDSEL線的連接關(guān)系如圖2?14所示。

PCI總線推薦了一種Device Number字段與AD[31:16]之間的映射關(guān)系。其中PCI設(shè)備0與Device Number字段的0b00000對應(yīng);PCI設(shè)備1與Device Number字段的0b00001對應(yīng),并以此類推,PCI設(shè)備15與Device Number字段的0b01111對應(yīng)。
在這種映射關(guān)系之下,一條PCI總線中,與信號線AD16相連的PCI設(shè)備其設(shè)備號為0;與信號線AD17相連的PCI設(shè)備其設(shè)備號為1;以此類推,與信號線AD31相連的PCI設(shè)備其設(shè)備號為15。在Type 00h配置請求中,設(shè)備號并沒有像Function Number和Register Number那樣以編碼的形式出現(xiàn)在AD總線上,而是與AD信號一一對應(yīng),如圖2?12所示。
這里有一個原則需要讀者注意,就是對PCI設(shè)備的配置寄存器進行訪問時,一定要有確定的Bus Number、Device Number、Function Number和Register Number,這“四元組”缺一不可。在Type 00h配置請求中,Device Number由AD[31:11]信號線與PCI設(shè)備IDSEL信號的連接關(guān)系確定;Function Number保存在AD[10:8]字段中;而Register Number保存在AD[7:0]字段中;在Type 01h配置請求中,也有完整的四元組信息。


[1] 此時PCI橋作為一個PCI設(shè)備,接收訪問其配置空間的讀寫請求。
[2] 最終Type 01h配置請求將會被轉(zhuǎn)換為Type 00h配置請求,然后訪問PCI Agent設(shè)備。
[3] Type 01h配置頭信息存在于PCI總線事務(wù)的地址周期中。
[4] PCI橋根據(jù)Subordinate Bus Number和Secondary Bus Number寄存器,決定是否接收當前配置請求


上一頁 1 2 下一頁

關(guān)鍵詞: PCI總線配

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉