PCI總線的配置
2 PCI設(shè)備31
HOST處理器對(duì)PCI設(shè)備31進(jìn)行配置讀寫時(shí),需要通過HOST主橋、PCI橋1、2和3,最終到達(dá)PCI設(shè)備31。當(dāng)處理器訪問PCI設(shè)備31時(shí),首先將CONFIG_ADDRESS寄存器的Enable位置1,Bus Number字段置為3,并對(duì)Device、Function和Register Number字段賦值。之后當(dāng)處理器對(duì)CONFIG_DATA寄存器進(jìn)行讀寫訪問時(shí),HOST主橋、PCI橋1、2和3將按照以下步驟進(jìn)行處理,最后PCI設(shè)備31將接收這個(gè)配置請(qǐng)求。
(1)
(2)
(3)
(4)
(5)
2.4.3 PCI總線樹Bus號(hào)的初始化
在一個(gè)處理器系統(tǒng)中,每一個(gè)HOST主橋都推出一顆PCI總線樹。在一顆PCI總線樹中有多少個(gè)PCI橋(包括HOST主橋),就含有多少條PCI總線。系統(tǒng)軟件在遍歷當(dāng)前PCI總線樹時(shí),需要首先對(duì)這些PCI總線進(jìn)行編號(hào),即初始化PCI橋的Primary、Secondary和Subordinate Bus Number寄存器。在一個(gè)處理器系統(tǒng)中,一般將與HOST主橋直接相連的PCI總線被命名為PCI總線0。然后系統(tǒng)軟件使用DFS(Depth First Search)算法,依次對(duì)其他PCI總線進(jìn)行編號(hào)。值得注意的是,與HOST主橋直接相連的PCI總線,其編號(hào)都為0,因此當(dāng)處理器系統(tǒng)中存在多個(gè)HOST主橋時(shí),將有多個(gè)編號(hào)為0的PCI總線,但是這些編號(hào)為0的PCI總線分屬不同的PCI總線域,其含義并不相同。
在一個(gè)處理器系統(tǒng)中,PCI總線樹的結(jié)構(gòu)如圖2?13所示。當(dāng)然在一個(gè)實(shí)際的處理器系統(tǒng)中,很少會(huì)出現(xiàn)這樣復(fù)雜的PCI總線樹結(jié)構(gòu),本節(jié)采用這個(gè)結(jié)構(gòu)的目的是便于說明PCI總線號(hào)的分配過程。
在PCI總線中,系統(tǒng)軟件使用深度優(yōu)先DFS算法對(duì)PCI總線樹進(jìn)行遍歷,DFS算法和廣度優(yōu)先BFS(Breadth First Search)算法是遍歷樹型結(jié)構(gòu)的常用算法。與BFS算法相比,DFS算法的空間復(fù)雜度較低,因此絕大多數(shù)系統(tǒng)系統(tǒng)在遍歷PCI總線樹時(shí),都使用DFS算法而不是BFS算法。
DFS是搜索算法的一種,其實(shí)現(xiàn)機(jī)制是沿著一顆樹的深度遍歷各個(gè)節(jié)點(diǎn),并盡可能深地搜索樹的分支,DFS的算法為線性時(shí)間復(fù)雜度,適合對(duì)拓?fù)浣Y(jié)構(gòu)未知的樹進(jìn)行遍歷。在一個(gè)處理器系統(tǒng)的初始化階段,PCI總線樹的拓?fù)浣Y(jié)構(gòu)是未知的,適合使用DFS算法進(jìn)行遍歷。下文以圖2?13為例,說明系統(tǒng)軟件如何使用DFS算法,分配PCI總線號(hào),并初始化PCI橋中的Primary Bus Number、Secondary Bus Number和Subordinate Bus number寄存器。所謂DFS算法是指按照深度優(yōu)先的原則遍歷PCI胖樹,其步驟如下。
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
從以上算法可以看出,PCI橋的Primary Bus和Secondary Bus號(hào)的分配在遍歷PCI總線樹的過程中從上向下分配,而Subordinate Bus號(hào)是從下向上分配的,因?yàn)橹挥写_定了一個(gè)PCI橋之下究竟有多少條PCI總線后,才能初始化該P(yáng)CI橋的Subordinate Bus號(hào)。
2.4.4 PCI總線Device號(hào)的分配
一條PCI總線會(huì)掛接各種各樣的PCI設(shè)備,而每一個(gè)PCI設(shè)備在PCI總線下具有唯一的設(shè)備號(hào)。系統(tǒng)軟件通過總線號(hào)和設(shè)備號(hào)定位一個(gè)PCI設(shè)備之后,才能訪問這個(gè)PCI設(shè)備的配置寄存器。值得注意的是,系統(tǒng)軟件使用“地址尋址方式”訪問PCI設(shè)備的存儲(chǔ)器和I/O地址空間,這與訪問配置空間使用的“ID尋址方式”不同。PCI設(shè)備的IDSEL信號(hào)與PCI總線的AD[31:0]信號(hào)的連接關(guān)系決定了該設(shè)備在這條PCI總線的設(shè)備號(hào)。如上文所述,每一個(gè)PCI設(shè)備都使用獨(dú)立的IDSEL信號(hào),該信號(hào)將與PCI總線的AD[31:0]信號(hào)連接,IDSEL信號(hào)的含義見第1.2.2節(jié)。
在此我們簡(jiǎn)要回顧PCI的配置讀寫事務(wù)使用的時(shí)序。如圖1?3所示,PCI總線事務(wù)由一個(gè)地址周期加若干個(gè)數(shù)據(jù)周期組成。在進(jìn)行配置讀寫請(qǐng)求總線事務(wù)時(shí),C/BE#信號(hào)線的值在地址周期中為0x1010或者為0x1011,表示當(dāng)前總線事務(wù)為配置讀或者配置寫請(qǐng)求。此時(shí)出現(xiàn)在AD[31:0]總線上的值并不是目標(biāo)設(shè)備的PCI總線地址,而是目標(biāo)設(shè)備的ID號(hào),這與PCI總線進(jìn)行I/O或者存儲(chǔ)器請(qǐng)求時(shí)不同,因?yàn)镻CI總線使用ID號(hào)而不是PCI總線地址對(duì)配置空間進(jìn)行訪問。
如圖2?12所示,在配置讀寫總線事務(wù)的地址周期中,AD[10:0]信號(hào)已經(jīng)被Function Number和Register Number使用,因此PCI設(shè)備的IDSEL只能與AD[31:11]信號(hào)連接。
認(rèn)真的讀者一定可以發(fā)現(xiàn)在CONFIG_ADDRESS寄存器中Device Number字段一共有5位可以表示32個(gè)設(shè)備,而AD[31:11]只有21位,顯然在這兩者之間無法建立一一對(duì)應(yīng)的映射關(guān)系。因此在一條PCI總線上如果有21個(gè)以上的PCI設(shè)備,那么總是有幾個(gè)設(shè)備無法與AD[31:11]信號(hào)線連接,從而PCI總線無法訪問這些設(shè)備。因?yàn)镻CI總線在配置請(qǐng)求的地址周期中,只能使用第31~11這些AD信號(hào),所以在一條總線上最多也只能掛接21個(gè)PCI設(shè)備。這21個(gè)設(shè)備可能是從0到20,也可能是從11到31排列。從而系統(tǒng)軟件在遍歷PCI總線時(shí),還是需要從0到31遍歷整條PCI總線。
在實(shí)際的應(yīng)用中,一條PCI總線能夠掛接21個(gè)設(shè)備已經(jīng)足夠了,實(shí)際上由于PCI總線的負(fù)載能力有限,即便總線頻率為33MHz的情況下,在一條PCI總線中最多也只能掛接10個(gè)負(fù)載,一條PCI總線所能掛接的負(fù)載詳見表1?1。AD信號(hào)線與PCI設(shè)備IDSEL線的連接關(guān)系如圖2?14所示。
PCI總線推薦了一種Device Number字段與AD[31:16]之間的映射關(guān)系。其中PCI設(shè)備0與Device Number字段的0b00000對(duì)應(yīng);PCI設(shè)備1與Device Number字段的0b00001對(duì)應(yīng),并以此類推,PCI設(shè)備15與Device Number字段的0b01111對(duì)應(yīng)。
在這種映射關(guān)系之下,一條PCI總線中,與信號(hào)線AD16相連的PCI設(shè)備其設(shè)備號(hào)為0;與信號(hào)線AD17相連的PCI設(shè)備其設(shè)備號(hào)為1;以此類推,與信號(hào)線AD31相連的PCI設(shè)備其設(shè)備號(hào)為15。在Type 00h配置請(qǐng)求中,設(shè)備號(hào)并沒有像Function Number和Register Number那樣以編碼的形式出現(xiàn)在AD總線上,而是與AD信號(hào)一一對(duì)應(yīng),如圖2?12所示。
這里有一個(gè)原則需要讀者注意,就是對(duì)PCI設(shè)備的配置寄存器進(jìn)行訪問時(shí),一定要有確定的Bus Number、Device Number、Function Number和Register Number,這“四元組”缺一不可。在Type 00h配置請(qǐng)求中,Device Number由AD[31:11]信號(hào)線與PCI設(shè)備IDSEL信號(hào)的連接關(guān)系確定;Function Number保存在AD[10:8]字段中;而Register Number保存在AD[7:0]字段中;在Type 01h配置請(qǐng)求中,也有完整的四元組信息。
[1] 此時(shí)PCI橋作為一個(gè)PCI設(shè)備,接收訪問其配置空間的讀寫請(qǐng)求。
[2] 最終Type 01h配置請(qǐng)求將會(huì)被轉(zhuǎn)換為Type 00h配置請(qǐng)求,然后訪問PCI Agent設(shè)備。
[3] Type 01h配置頭信息存在于PCI總線事務(wù)的地址周期中。
[4] PCI橋根據(jù)Subordinate Bus Number和Secondary Bus Number寄存器,決定是否接收當(dāng)前配置請(qǐng)求
評(píng)論