閱讀539 返回首頁    go 阿裏雲 go 技術社區[雲棲]


2.4 PCI總線的配置

PCI總線定義了兩類配置請求,一個是Type 00h配置請求,另一個是Type 01h配置請求。PCI總線使用這些配置請求訪問PCI總線樹上的設備配置空間,包括PCI橋和PCI Agent設備的配置空間。

其中HOST主橋或者PCI橋使用Type 00h配置請求,訪問與HOST主橋或者PCI橋直接相連的PCI Agent設備或者PCI;而HOST主橋或者PCI橋使用Type 01h配置請求,需要至少穿越一個PCI橋,訪問沒有與其直接相連的PCI Agent設備或者PCI橋。如2?8所示,HOST主橋可以使用Type 00h配置請求訪問PCI設備01,而使用Type 01h配置請求通過PCI12或者3轉換為Type 00h配置請求之後,訪問PCI總線樹上的PCI設備1121223132

x86處理器對CONFIG_DATA寄存器進行讀寫操作時,HOST主橋將決定向PCI總線發送Type 00h配置請求還是Type 01h配置請求。在PCI總線事務的地址周期中,這兩種配置請求總線事務的不同反映在PCI總線的AD[31:0]信號線上。

值得注意的是,PCIe總線還可以使用ECAM(Enhanced Configuration Access Mechanism)機製訪問PCIe設備的擴展配置空間,使用這種方式可以訪問PCIe設備256B~4KB之間的擴展配置空間。但是本節僅介紹如何使用CONFIG_ADDRESSCONFIG_FATA寄存器產生Type 00hType 01h配置請求。有關ECAM機製的詳細說明見第5.3.2節。

處理器首先將目標PCI設備的ID號保存在CONFIG_ADDRESS寄存器中,之後HOST主橋根據該寄存器的Bus Number字段,決定是產生Type 00h配置請求,還是Type 01h配置請求。當Bus Number字段為0時,將產生Type 00h配置請求,因為與HOST主橋直接相連的總線號為0;大於0時,將產生Type 01h配置請求。

2.4.1 Type 01hType 00h配置請求

本節首先介紹Type 01h配置請求,並從PCI總線使用的信號線的角度上,講述HOST主橋如何生成Type 01配置請求。在PCI總線中,隻有PCI橋能夠接收Type 01h配置請求。Type 01h配置請求不能直接發向最終的PCI Agent設備,而隻能由PCI橋將其轉換為Type 01h繼續發向其他PCI橋,或者轉換為Type 00h配置請求發向PCI Agent設備。PCI橋還可以將Type 01h配置請求轉換為Special Cycle總線事務(HOST主橋也可以實現該功能),本節對這種情況不做介紹。

在地址周期中,HOST主橋使用配置讀寫總線事務,將CONFIG_ADDRESS寄存器的內容拷貝到PCI總線的AD[31:0]信號線中。CONFIG_ADDRESS寄存器與Type 01h配置請求的對應關係如2?11所示。

 

2.4 PCI總線的配置 - maoxingbing - 毛毛蟲的爹

2?11中可以發現,CONFIG_ADDRESS寄存器的內容基本上是原封不動的拷貝到PCI總線的AD[31:0]信號線上的。其中CONFIG_ADDRESSEnable位不被拷貝,而AD總線的第0位為必須為1,表示當前配置請求是Type 01h

PCI總線接收到Type 01配置請求時,將尋找合適的PCI接收這個配置信息。如果這個配置請求是直接發向PCI橋下的PCI設備時,PCI橋將接收個Type 01配置請求,並將其轉換為Type 00h配置請求;否則PCI橋將當前Type 01h配置請求原封不動的傳遞給下一級PCI總線。

如果HOST主橋或者PCI橋發起的是Type 00h配置請求,CONFIG_ADDRESS寄存器與AD[31:0]的轉換如2?12所示。

 2.4 PCI總線的配置 - maoxingbing - 毛毛蟲的爹


此時處理器對CONFIG_DATA寄存器進行讀寫時,處理器將CONFIG_ADDRESS寄存器中的Function NumberRegister Number字段拷貝到PCIAD總線的第10~2位;將AD總線的第1~0位賦值為0b00PCI總線在配置請求總線事務的地址周期根據AD[1:0]判斷當前配置請求是Type 00h還是Type 01h,如果AD[1:0]等於0b00表示是Type 00h配置請求,如果AD[1:0]等於0b01表示是Type 01h配置請求。

AD[31:11]CONFIG_ADDRESSDevice Number字段有關,在Type 00h配置請求的地址周期中,AD[31:11]位有且隻有一位為1,其中AD[31:11]的每一位選通一個PCI設備的配置空間。如第1.2.2節所述,PCI設備配置空間的片選信號是IDSEL,因此AD[31:11]將與PCI設備的IDSEL信號對應相連。

當以下兩種請求之一滿足時,HOST主橋或者PCI橋將生成Type 00h配置頭,並將其發送到指定的PCI總線上。

(1)      CONFIG_ADDRESS寄存器的Bus Number字段為0時,處理器訪問CONFIG_DATA寄存器時,HOST主橋將直接向PCI總線0發出Type 00h配置請求。因為與HOST主橋直接相連的PCI總線號為0,此時表示HOST主橋需要訪問與其直接相連的PCI設備。

(2)      PCI橋收到Type 01h配置頭時,將檢查Type 01配置頭的Bus Number字段,如果這個Bus NumberPCI橋的Secondary Bus Number相同,則將這個Type 01配置頭轉換為Type 00h配置頭,並發送到該PCI橋的Secondary總線上。

2.4.2 PCI總線配置請求的轉換原則

CONFIG_ADDRESS寄存器的Enable位為1,係統軟件訪問CONFIG_DATA寄存器時,HOST主橋可以產生兩類PCI總線配置讀寫總線事務,分別為Type 00hType 01h配置讀寫總線事務。在配置讀寫總線事務的地址周期和數據周期中,CONFIG_ADDRESSCONFIG_DATA寄存器中的數據將被放置到PCI總線的AD總線上。其中Type 00hType 01h配置讀寫總線事務映射到AD總線的數據並不相同。

其中Type 00h配置請求可以直接讀取PCI Agent設備的配置空間,而Type 01h配置請求在通過PCI橋時,最終將被轉換為Type 00h配置請求,並讀取PCI Agent設備的配置寄存器。本節重點講述PCI橋如何將Type 01h配置請求轉換為Type 00h配置請求。

首先Type 00h配置請求不會被轉換成Type 01h配置請求,因為Type 00h配置請求是發向最終PCI Agent設備,這些PCI Agent設備不會轉發這些配置請求。

CONFIG_ADDRESS寄存器的Bus Number字段為0時,處理器對CONFIG_DATA寄存器操作時,HOST主橋將直接產生Type 00h配置請求,掛接在PCI總線0上的某個設備將通過ID譯碼接收這個Type 00h配置請求,並對配置寄存器進行讀寫操作。如果PCI總線上沒有設備接收這個Type 00h配置請求,將引發Master Abort,詳情見PCI總線規範,本節對此不做進一步說明。

如果CONFIG_ADDRESS寄存器的Bus Number字段為n(n0),即訪問的PCI設備不是直接掛接在PCI總線0上的,此時HOST主橋對CONFIG_DATA寄存器操作時,將產生Type 01h配置請求,PCI總線0將遍曆所有在這條總線上的PCI橋,確定由哪個PCI橋接收這個Type 01h配置請求。

如果n大於等於某個PCI橋的Secondary Bus Number寄存器,而且小於等於Subordinate Bus number寄存器,那麼這個PCI橋將接收在當前PCI總線上的Type 01配置請求,並采用以下規則進行遞歸處理。

(1)      開始。

(2)      遍曆當前PCI總線的所有PCI橋。

(3)      如果n等於某個PCI橋的Secondary Bus Number寄存器,說明這個Type 01配置請求的目標設備直接連接在該PCI橋的Secondary bus上。此時PCI橋將Type 01配置請求轉換為Type 00h配置請求,並將這個配置請求發送到PCI橋的Secondary Bus上,Secondary Bus上的某個設備將響應這個Type 00h配置請求,並與HOST主橋進行配置信息的交換,轉(5)

(4)      如果n大於PCI橋的Secondary Bus Number寄存器,而且小於等於PCI橋的Subordinate Bus number寄存器,說明這個Type 01配置請求的目標設備不與該PCI橋的Secondary Bus直接相連,但是由這個PCI橋下遊總線上的某個PCI橋管理。此時PCI橋將首先認領這個Type 01配置請求,並將其轉發到Secondary Bus,轉(2)

(5)      結束。

下文將舉例說明PCI總線配置請求的轉換原則,並以2?8為例說明處理器如何訪問PCI設備01PCI設備31的配置空間。PCI設備01直接與HOST主橋相連,因此HOST主橋可以使用Type 00h配置請求訪問該設備。

HOST主橋需要經過多級PCI橋才能訪問PCI設備31,因此HOST主橋需要首先使用Type 01h配置請求,之後通過PCI123Type 01h配置請求轉換為Type 00h配置請求,最終訪問PCI設備31

1 PCI設備01

這種情況較易處理,當HOST處理器訪問PCI設備01的配置空間時,發現PCI設備01HOST主橋直接相連,所以將直接使用Type 00h配置請求訪問該設備的配置空間,具體步驟如下。

首先HOST處理器將CONFIG_ADDRESS寄存器的Enable位置1Bus Number號置為0,並對該寄存器的DeviceFunctionRegister Number字段賦值。當處理器對CONFIG_DATA寄存器訪問時,HOST主橋將存放在CONFIG_ADDRESS寄存器中的數值,轉換為Type 00h配置請求,並發送到PCI總線0上,PCI設備01將接收這個Type 00h配置請求,並與處理器進行配置信息交換。

2 PCI設備31

HOST處理器對PCI設備31進行配置讀寫時,需要通過HOST主橋、PCI123,最終到達PCI設備31

當處理器訪問PCI設備31時,首先將CONFIG_ADDRESS寄存器的Enable位置1Bus Number字段置為3,並對DeviceFunctionRegister Number字段賦值。之後當處理器對CONFIG_DATA寄存器進行讀寫訪問時,HOST主橋、PCI123將按照以下步驟進行處理,最後PCI設備31將接收這個配置請求。

(1)      HOST主橋發現Bus Number字段的值為3,該總線號並不是與HOST主橋直接相連的PCI總線的Bus Number,所以HOST主橋將處理器對CONFIG_DATA寄存器的讀寫訪問直接轉換為Type 01h配置請求,並將這個配置請求發送到PCI總線0上。PCI總線規定Type 01h配置請求隻能由PCI橋負責處理。

(2)      PCI總線0上,PCI1Secondary Bus Number1Subordinate Bus Number3。而1< Bus Number <= 3,所以PCI1將接收來自PCI總線0Type 01h配置請求,並將這個配置請求直接下推到PCI總線1

(3)      PCI總線1上,PCI2Secondary Bus Number2Subordinate Bus Number3。而1< Bus Number <= 3,所以PCI2將接收來自PCI總線0Type 01h配置請求,並將這個配置請求直接下推到PCI總線2

(4)      PCI總線2上,PCI3Secondary Bus Number3,因此PCI3將“來自PCI總線2Type 01h配置請求”轉換為Type 00h配置請求,並將其下推到PCI總線3PCI總線規定,如果PCI橋的Secondary Bus NumberType 01h配置請求中包含的Bus Number相同時,該PCI橋將接收的Type 01h配置請求轉換為Type 00h配置請求,然後再發向其Secondary Bus

(5)      PCI總線3上,有兩個設備PCI設備31PCI設備32。在這兩個設備中,必然有一個設備將要響應這個Type 00h配置請求,從而完成整個配置請求周期。本篇在第2.4.1節中,討論了究竟是PCI設備31還是PCI設備32接收這個配置請求,這個問題涉及PCI總線如何分配PCI設備使用的設備號。

2.4.3 PCI總線樹Bus號的初始化

在一個處理器係統中,每一個HOST主橋都推出一顆PCI總線樹。在一顆PCI總線樹中有多少個PCI(包括HOST主橋),就含有多少條PCI總線。係統軟件在遍曆當前PCI總線樹時,需要首先對這些PCI總線進行編號,即初始化PCI橋的PrimarySecondarySubordinate Bus Number寄存器。

在一個處理器係統中,一般將與HOST主橋直接相連的PCI總線被命名為PCI總線0。然後係統軟件使用DFS(Depth First Search)算法,依次對其他PCI總線進行編號。值得注意的是,與HOST主橋直接相連的PCI總線,其編號都為0,因此當處理器係統中存在多個HOST主橋時,將有多個編號為0PCI總線,但是這些編號為0PCI總線分屬不同的PCI總線域,其含義並不相同。

在一個處理器係統中,PCI總線樹的結構如2?13所示。當然在一個實際的處理器係統中,很少會出現這樣複雜的PCI總線樹結構,本節采用這個結構的目的是便於說明PCI總線號的分配過程。

2.4 PCI總線的配置 - maoxingbing - 毛毛蟲的爹

PCI總線中,係統軟件使用深度優先DFS算法對PCI總線樹進行遍曆,DFS算法和廣度優先BFS(Breadth First Search)算法是遍曆樹型結構的常用算法。與BFS算法相比,DFS算法的空間複雜度較低,因此絕大多數係統係統在遍曆PCI總線樹時,都使用DFS算法而不是BFS算法。

DFS是搜索算法的一種,其實現機製是沿著一顆樹的深度遍曆各個節點,並盡可能深地搜索樹的分支,DFS的算法為線性時間複雜度,適合對拓撲結構未知的樹進行遍曆。在一個處理器係統的初始化階段,PCI總線樹的拓撲結構是未知的,適合使用DFS算法進行遍曆。下文以2?13為例,說明係統軟件如何使用DFS算法,分配PCI總線號,並初始化PCI橋中的Primary Bus NumberSecondary Bus NumberSubordinate Bus number寄存器。所謂DFS算法是指按照深度優先的原則遍曆PCI胖樹,其步驟如下。

(1)      HOST主橋掃描PCI總線0上的設備。係統軟件首先忽略所有這條總線上的PCI Agent設備,因為在這些設備之下不會掛接新的PCI總線。例如PCI設備01下不可能掛接新的PCI總線。

(2)      HOST主橋首先發現PCI1,並將PCI1Secondary Bus命名為PCI總線1。係統軟件將初始化PCI1的配置空間,將PCI1Primary Bus Number寄存器賦值為0,而將Secondary Bus Number寄存器賦值為1,即PCI1的上遊PCI總線號為0,而下遊PCI總線號為1

(3)      掃描PCI總線1,發現PCI2,並將PCI2Secondary Bus命名為PCI總線2。係統軟件將初始化PCI2的配置空間,將PCI2Primary Bus Number寄存器賦值為1,而將Secondary Bus Number寄存器賦值為2

(4)      掃描PCI總線2,發現PCI3,並將PCI3Secondary Bus命名為PCI總線3。係統軟件將初始化PCI3的配置空間,將PCI3Primary Bus Number寄存器賦值為2,而將Secondary Bus Number寄存器賦值為3

(5)      掃描PCI總線3,沒有發現任何PCI橋,這表示PCI總線3下不可能有新的總線,此時係統軟件將PCI3Subordinate Bus number寄存器賦值為3。係統軟件在完成PCI總線3的掃描後,將回退到PCI總線3的上一級總線,即PCI總線2,繼續進行掃描。

(6)      在重新掃描PCI總線2時,係統軟件發現PCI總線2上除了PCI3之外沒有發現新的PCI橋,而PCI3之下的所有設備已經完成了掃描過程,此時係統軟件將PCI2Subordinate Bus number寄存器賦值為3。繼續回退到PCI總線1

(7)      PCI總線1上除了PCI2外,沒有其他橋片,於是繼續回退到PCI總線0,並將PCI1Subordinate Bus number寄存器賦值為3

(8)      PCI總線0上,係統軟件掃描到PCI4,則首先將PCI4Primary Bus Number寄存器賦值為0,而將Secondary Bus Number寄存器賦值為4,即PCI1的上遊PCI總線號為0,而下遊PCI總線號為4

(9)      係統軟件發現PCI總線4上沒有任何PCI橋,將結束對PCI總線4的掃描,並將PCI4Subordinate Bus number寄存器賦值為4,之後回退到PCI總線4的上遊總線,即PCI總線0繼續進行掃描。

(10)  係統軟件發現在PCI總線0上的兩個橋片PCI總線0PCI總線4都已完成掃描後,將結束對PCI總線的DFS遍曆全過程。

從以上算法可以看出,PCI橋的Primary BusSecondary Bus號的分配在遍曆PCI總線樹的過程中從上向下分配,而Subordinate Bus號是從下向上分配的,因為隻有確定了一個PCI橋之下究竟有多少條PCI總線後,才能初始化該PCI橋的Subordinate Bus號。

2.4.4 PCI總線Device號的分配

一條PCI總線會掛接各種各樣的PCI設備,而每一個PCI設備在PCI總線下具有唯一的設備號。係統軟件通過總線號和設備號定位一個PCI設備之後,才能訪問這個PCI設備的配置寄存器。值得注意的是,係統軟件使用“地址尋址方式”訪問PCI設備的存儲器和I/O地址空間,這與訪問配置空間使用的“ID尋址方式”不同。

PCI設備的IDSEL信號與PCI總線的AD[31:0]信號的連接關係決定了該設備在這條PCI總線的設備號。如上文所述,每一個PCI設備都使用獨立的IDSEL信號,該信號將與PCI總線的AD[31:0]信號連接,IDSEL信號的含義見第1.2.2節。

在此我們簡要回顧PCI的配置讀寫事務使用的時序。如1?3所示,PCI總線事務由一個地址周期加若幹個數據周期組成。在進行配置讀寫請求總線事務時,C/BE#信號線的值在地址周期中為0x1010或者為0x1011,表示當前總線事務為配置讀或者配置寫請求。此時出現在AD[31:0]總線上的值並不是目標設備的PCI總線地址,而是目標設備的ID號,這與PCI總線進行I/O或者存儲器請求時不同,因為PCI總線使用ID號而不是PCI總線地址對配置空間進行訪問。

2?12所示,在配置讀寫總線事務的地址周期中,AD[10:0]信號已經被Function NumberRegister Number使用,因此PCI設備的IDSEL隻能與AD[31:11]信號連接。

認真的讀者一定可以發現在CONFIG_ADDRESS寄存器中Device Number字段一共有5位可以表示32個設備,而AD[31:11]隻有21位,顯然在這兩者之間無法建立一一對應的映射關係。因此在一條PCI總線上如果有21個以上的PCI設備,那麼總是有幾個設備無法與AD[31:11]信號線連接,從而PCI總線無法訪問這些設備。因為PCI總線在配置請求的地址周期中,隻能使用第31~11這些AD信號,所以在一條總線上最多也隻能掛接21PCI設備。這21個設備可能是從020,也可能是從1131排列。從而係統軟件在遍曆PCI總線時,還是需要從031遍曆整條PCI總線。

在實際的應用中,一條PCI總線能夠掛接21個設備已經足夠了,實際上由於PCI總線的負載能力有限,即便總線頻率為33MHz的情況下,在一條PCI總線中最多也隻能掛接10個負載,一條PCI總線所能掛接的負載詳見1?1AD信號線與PCI設備IDSEL線的連接關係如2?14所示。

2.4 PCI總線的配置 - maoxingbing - 毛毛蟲的爹

PCI總線推薦了一種Device Number字段與AD[31:16]之間的映射關係。其中PCI設備0Device Number字段的0b00000對應;PCI設備1Device Number字段的0b00001對應,並以此類推,PCI設備15Device Number字段的0b01111對應。

在這種映射關係之下,一條PCI總線中,與信號線AD16相連的PCI設備其設備號為0;與信號線AD17相連的PCI設備其設備號為1;以此類推,與信號線AD31相連的PCI設備其設備號為15。在Type 00h配置請求中,設備號並沒有像Function NumberRegister Number那樣以編碼的形式出現在AD總線上,而是與AD信號一一對應,如2?12所示。

這裏有一個原則需要讀者注意,就是對PCI設備的配置寄存器進行訪問時,一定要有確定的Bus NumberDevice NumberFunction NumberRegister Number,這“四元組”缺一不可。在Type 00h配置請求中,Device NumberAD[31:11]信號線與PCI設備IDSEL信號的連接關係確定;Function Number保存在AD[10:8]字段中;而Register Number保存在AD[7:0]字段中;在Type 01h配置請求中,也有完整的四元組信息。



此時PCI橋作為一個PCI設備,接收訪問其配置空間的讀寫請求。

最終Type 01h配置請求將會被轉換為Type 00h配置請求,然後訪問PCI Agent設備。

Type 01h配置頭信息存在於PCI總線事務的地址周期中。

PCI橋根據Subordinate Bus NumberSecondary Bus Number寄存器,決定是否接收當前配置請求。

最後更新:2017-04-03 16:48:37

  上一篇:go ubuntu11.04啟動 及虛擬文件係統
  下一篇:go Xml+Xslt測試工具