PCI總線的配置
2.4 PCI總線的配置
PCI總線定義了兩類配置請求,一個是Type 00h配置請求,另一個是Type 01h配置請求。PCI總線使用這些配置請求訪問PCI總線樹上的設備配置空間,包括PCI橋和PCI Agent設備的配置空間。
其中HOST主橋或者PCI橋使用Type 00h配置請求,訪問與HOST主橋或者PCI橋直接相連的PCI Agent設備或者PCI橋[1];而HOST主橋或者PCI橋使用Type 01h配置請求,需要至少穿越一個PCI橋,訪問沒有與其直接相連的PCI Agent設備或者PCI橋。如圖2?8所示,HOST主橋可以使用Type 00h配置請求訪問PCI設備01,而使用Type 01h配置請求通過PCI橋1、2或者3轉換為Type 00h配置請求之后,訪問PCI總線樹上的PCI設備11、21、22、31和32[2]。
當x86處理器對CONFIG_DATA寄存器進行讀寫操作時,HOST主橋將決定向PCI總線發(fā)送Type 00h配置請求還是Type 01h配置請求。在PCI總線事務的地址周期中,這兩種配置請求總線事務的不同反映在PCI總線的AD[31:0]信號線上。
值得注意的是,PCIe總線還可以使用ECAM(Enhanced Configuration Access Mechanism)機制訪問PCIe設備的擴展配置空間,使用這種方式可以訪問PCIe設備256B~4KB之間的擴展配置空間。但是本節(jié)僅介紹如何使用CONFIG_ADDRESS和CONFIG_FATA寄存器產(chǎn)生Type 00h和Type 01h配置請求。有關ECAM機制的詳細說明見第5.3.2節(jié)。
處理器首先將目標PCI設備的ID號保存在CONFIG_ADDRESS寄存器中,之后HOST主橋根據(jù)該寄存器的Bus Number字段,決定是產(chǎn)生Type 00h配置請求,還是Type 01h配置請求。當Bus Number字段為0時,將產(chǎn)生Type 00h配置請求,因為與HOST主橋直接相連的總線號為0;大于0時,將產(chǎn)生Type 01h配置請求。
在地址周期中,HOST主橋使用配置讀寫總線事務,將CONFIG_ADDRESS寄存器的內(nèi)容拷貝到PCI總線的AD[31:0]信號線中。CONFIG_ADDRESS寄存器與Type 01h配置請求的對應關系如圖2?11所示。
從圖2?11中可以發(fā)現(xiàn),CONFIG_ADDRESS寄存器的內(nèi)容基本上是原封不動的拷貝到PCI總線的AD[31:0]信號線上的[3]。其中CONFIG_ADDRESS的Enable位不被拷貝,而AD總線的第0位為必須為1,表示當前配置請求是Type 01h。
當PCI總線接收到Type 01配置請求時,將尋找合適的PCI橋[4]接收這個配置信息。如果這個配置請求是直接發(fā)向PCI橋下的PCI設備時,PCI橋將接收個Type 01配置請求,并將其轉換為Type 00h配置請求;否則PCI橋將當前Type 01h配置請求原封不動的傳遞給下一級PCI總線。
如果HOST主橋或者PCI橋發(fā)起的是Type 00h配置請求,CONFIG_ADDRESS寄存器與AD[31:0]的轉換如圖2?12所示。
此時處理器對CONFIG_DATA寄存器進行讀寫時,處理器將CONFIG_ADDRESS寄存器中的Function Number和Register Number字段拷貝到PCI的AD總線的第10~2位;將AD總線的第1~0位賦值為0b00。PCI總線在配置請求總線事務的地址周期根據(jù)AD[1:0]判斷當前配置請求是Type 00h還是Type 01h,如果AD[1:0]等于0b00表示是Type 00h配置請求,如果AD[1:0]等于0b01表示是Type 01h配置請求。
而AD[31:11]與CONFIG_ADDRESS的Device Number字段有關,在Type 00h配置請求的地址周期中,AD[31:11]位有且只有一位為1,其中AD[31:11]的每一位選通一個PCI設備的配置空間。如第1.2.2節(jié)所述,PCI設備配置空間的片選信號是IDSEL,因此AD[31:11]將與PCI設備的IDSEL信號對應相連。
當以下兩種請求之一滿足時,HOST主橋或者PCI橋將生成Type 00h配置頭,并將其發(fā)送到指定的PCI總線上。
(1) CONFIG_ADDRESS寄存器的Bus Number字段為0時,處理器訪問CONFIG_DATA寄存器時,HOST主橋將直接向PCI總線0發(fā)出Type 00h配置請求。因為與HOST主橋直接相連的PCI總線號為0,此時表示HOST主橋需要訪問與其直接相連的PCI設備。
(2) 當PCI橋收到Type 01h配置頭時,將檢查Type 01配置頭的Bus Number字段,如果這個Bus Number與PCI橋的Secondary Bus Number相同,則將這個Type 01配置頭轉換為Type 00h配置頭,并發(fā)送到該PCI橋的Secondary總線上。
其中Type 00h配置請求可以直接讀取PCI Agent設備的配置空間,而Type 01h配置請求在通過PCI橋時,最終將被轉換為Type 00h配置請求,并讀取PCI Agent設備的配置寄存器。本節(jié)重點講述PCI橋如何將Type 01h配置請求轉換為Type 00h配置請求。
首先Type 00h配置請求不會被轉換成Type 01h配置請求,因為Type 00h配置請求是發(fā)向最終PCI Agent設備,這些PCI Agent設備不會轉發(fā)這些配置請求。
當CONFIG_ADDRESS寄存器的Bus Number字段為0時,處理器對CONFIG_DATA寄存器操作時,HOST主橋將直接產(chǎn)生Type 00h配置請求,掛接在PCI總線0上的某個設備將通過ID譯碼接收這個Type 00h配置請求,并對配置寄存器進行讀寫操作。如果PCI總線上沒有設備接收這個Type 00h配置請求,將引發(fā)Master Abort,詳情見PCI總線規(guī)范,本節(jié)對此不做進一步說明。
如果CONFIG_ADDRESS寄存器的Bus Number字段為n(n≠0),即訪問的PCI設備不是直接掛接在PCI總線0上的,此時HOST主橋對CONFIG_DATA寄存器操作時,將產(chǎn)生Type 01h配置請求,PCI總線0將遍歷所有在這條總線上的PCI橋,確定由哪個PCI橋接收這個Type 01h配置請求。
如果n大于等于某個PCI橋的Secondary Bus Number寄存器,而且小于等于Subordinate Bus number寄存器,那么這個PCI橋將接收在當前PCI總線上的Type 01配置請求,并采用以下規(guī)則進行遞歸處理。
(1) 開始。
(2) 遍歷當前PCI總線的所有PCI橋。
(3) 如果n等于某個PCI橋的Secondary Bus Number寄存器,說明這個Type 01配置請求的目標設備直接連接在該PCI橋的Secondary bus上。此時PCI橋將Type 01配置請求轉換為Type 00h配置請求,并將這個配置請求發(fā)送到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配置請求,并將其轉發(fā)到Secondary Bus,轉(2)。
(5) 結束。
下文將舉例說明PCI總線配置請求的轉換原則,并以圖2?8為例說明處理器如何訪問PCI設備01和PCI設備31的配置空間。PCI設備01直接與HOST主橋相連,因此HOST主橋可以使用Type 00h配置請求訪問該設備。
而HOST主橋需要經(jīng)過多級PCI橋才能訪問PCI設備31,因此HOST主橋需要首先使用Type 01h配置請求,之后通過PCI橋1、2和3將Type 01h配置請求轉換為Type 00h配置請求,最終訪問PCI設備31。
首先HOST處理器將CONFIG_ADDRESS寄存器的Enable位置1,Bus Number號置為0,并對該寄存器的Device、Function和Register Number字段賦值。當處理器對CONFIG_DATA寄存器訪問時,HOST主橋將存放在CONFIG_ADDRESS寄存器中的數(shù)值,轉換為Type 00h配置請求,并發(fā)送到PCI總線0上,PCI設備01將接收這個Type 00h配置請求,并與處理器進行配置信息交換。
其中HOST主橋或者PCI橋使用Type 00h配置請求,訪問與HOST主橋或者PCI橋直接相連的PCI Agent設備或者PCI橋[1];而HOST主橋或者PCI橋使用Type 01h配置請求,需要至少穿越一個PCI橋,訪問沒有與其直接相連的PCI Agent設備或者PCI橋。如圖2?8所示,HOST主橋可以使用Type 00h配置請求訪問PCI設備01,而使用Type 01h配置請求通過PCI橋1、2或者3轉換為Type 00h配置請求之后,訪問PCI總線樹上的PCI設備11、21、22、31和32[2]。
當x86處理器對CONFIG_DATA寄存器進行讀寫操作時,HOST主橋將決定向PCI總線發(fā)送Type 00h配置請求還是Type 01h配置請求。在PCI總線事務的地址周期中,這兩種配置請求總線事務的不同反映在PCI總線的AD[31:0]信號線上。
值得注意的是,PCIe總線還可以使用ECAM(Enhanced Configuration Access Mechanism)機制訪問PCIe設備的擴展配置空間,使用這種方式可以訪問PCIe設備256B~4KB之間的擴展配置空間。但是本節(jié)僅介紹如何使用CONFIG_ADDRESS和CONFIG_FATA寄存器產(chǎn)生Type 00h和Type 01h配置請求。有關ECAM機制的詳細說明見第5.3.2節(jié)。
處理器首先將目標PCI設備的ID號保存在CONFIG_ADDRESS寄存器中,之后HOST主橋根據(jù)該寄存器的Bus Number字段,決定是產(chǎn)生Type 00h配置請求,還是Type 01h配置請求。當Bus Number字段為0時,將產(chǎn)生Type 00h配置請求,因為與HOST主橋直接相連的總線號為0;大于0時,將產(chǎn)生Type 01h配置請求。
2.4.1 Type 01h和Type 00h配置請求
本節(jié)首先介紹Type 01h配置請求,并從PCI總線使用的信號線的角度上,講述HOST主橋如何生成Type 01配置請求。在PCI總線中,只有PCI橋能夠接收Type 01h配置請求。Type 01h配置請求不能直接發(fā)向最終的PCI Agent設備,而只能由PCI橋將其轉換為Type 01h繼續(xù)發(fā)向其他PCI橋,或者轉換為Type 00h配置請求發(fā)向PCI Agent設備。PCI橋還可以將Type 01h配置請求轉換為Special Cycle總線事務(HOST主橋也可以實現(xiàn)該功能),本節(jié)對這種情況不做介紹。在地址周期中,HOST主橋使用配置讀寫總線事務,將CONFIG_ADDRESS寄存器的內(nèi)容拷貝到PCI總線的AD[31:0]信號線中。CONFIG_ADDRESS寄存器與Type 01h配置請求的對應關系如圖2?11所示。
從圖2?11中可以發(fā)現(xiàn),CONFIG_ADDRESS寄存器的內(nèi)容基本上是原封不動的拷貝到PCI總線的AD[31:0]信號線上的[3]。其中CONFIG_ADDRESS的Enable位不被拷貝,而AD總線的第0位為必須為1,表示當前配置請求是Type 01h。
當PCI總線接收到Type 01配置請求時,將尋找合適的PCI橋[4]接收這個配置信息。如果這個配置請求是直接發(fā)向PCI橋下的PCI設備時,PCI橋將接收個Type 01配置請求,并將其轉換為Type 00h配置請求;否則PCI橋將當前Type 01h配置請求原封不動的傳遞給下一級PCI總線。
如果HOST主橋或者PCI橋發(fā)起的是Type 00h配置請求,CONFIG_ADDRESS寄存器與AD[31:0]的轉換如圖2?12所示。
此時處理器對CONFIG_DATA寄存器進行讀寫時,處理器將CONFIG_ADDRESS寄存器中的Function Number和Register Number字段拷貝到PCI的AD總線的第10~2位;將AD總線的第1~0位賦值為0b00。PCI總線在配置請求總線事務的地址周期根據(jù)AD[1:0]判斷當前配置請求是Type 00h還是Type 01h,如果AD[1:0]等于0b00表示是Type 00h配置請求,如果AD[1:0]等于0b01表示是Type 01h配置請求。
而AD[31:11]與CONFIG_ADDRESS的Device Number字段有關,在Type 00h配置請求的地址周期中,AD[31:11]位有且只有一位為1,其中AD[31:11]的每一位選通一個PCI設備的配置空間。如第1.2.2節(jié)所述,PCI設備配置空間的片選信號是IDSEL,因此AD[31:11]將與PCI設備的IDSEL信號對應相連。
當以下兩種請求之一滿足時,HOST主橋或者PCI橋將生成Type 00h配置頭,并將其發(fā)送到指定的PCI總線上。
(1)
(2)
2.4.2 PCI總線配置請求的轉換原則
當CONFIG_ADDRESS寄存器的Enable位為1,系統(tǒng)軟件訪問CONFIG_DATA寄存器時,HOST主橋可以產(chǎn)生兩類PCI總線配置讀寫總線事務,分別為Type 00h和Type 01h配置讀寫總線事務。在配置讀寫總線事務的地址周期和數(shù)據(jù)周期中,CONFIG_ADDRESS和CONFIG_DATA寄存器中的數(shù)據(jù)將被放置到PCI總線的AD總線上。其中Type 00h和Type 01h配置讀寫總線事務映射到AD總線的數(shù)據(jù)并不相同。其中Type 00h配置請求可以直接讀取PCI Agent設備的配置空間,而Type 01h配置請求在通過PCI橋時,最終將被轉換為Type 00h配置請求,并讀取PCI Agent設備的配置寄存器。本節(jié)重點講述PCI橋如何將Type 01h配置請求轉換為Type 00h配置請求。
首先Type 00h配置請求不會被轉換成Type 01h配置請求,因為Type 00h配置請求是發(fā)向最終PCI Agent設備,這些PCI Agent設備不會轉發(fā)這些配置請求。
當CONFIG_ADDRESS寄存器的Bus Number字段為0時,處理器對CONFIG_DATA寄存器操作時,HOST主橋將直接產(chǎn)生Type 00h配置請求,掛接在PCI總線0上的某個設備將通過ID譯碼接收這個Type 00h配置請求,并對配置寄存器進行讀寫操作。如果PCI總線上沒有設備接收這個Type 00h配置請求,將引發(fā)Master Abort,詳情見PCI總線規(guī)范,本節(jié)對此不做進一步說明。
如果CONFIG_ADDRESS寄存器的Bus Number字段為n(n≠0),即訪問的PCI設備不是直接掛接在PCI總線0上的,此時HOST主橋對CONFIG_DATA寄存器操作時,將產(chǎn)生Type 01h配置請求,PCI總線0將遍歷所有在這條總線上的PCI橋,確定由哪個PCI橋接收這個Type 01h配置請求。
如果n大于等于某個PCI橋的Secondary Bus Number寄存器,而且小于等于Subordinate Bus number寄存器,那么這個PCI橋將接收在當前PCI總線上的Type 01配置請求,并采用以下規(guī)則進行遞歸處理。
(1)
(2)
(3)
(4)
(5)
下文將舉例說明PCI總線配置請求的轉換原則,并以圖2?8為例說明處理器如何訪問PCI設備01和PCI設備31的配置空間。PCI設備01直接與HOST主橋相連,因此HOST主橋可以使用Type 00h配置請求訪問該設備。
而HOST主橋需要經(jīng)過多級PCI橋才能訪問PCI設備31,因此HOST主橋需要首先使用Type 01h配置請求,之后通過PCI橋1、2和3將Type 01h配置請求轉換為Type 00h配置請求,最終訪問PCI設備31。
1 PCI設備01
這種情況較易處理,當HOST處理器訪問PCI設備01的配置空間時,發(fā)現(xiàn)PCI設備01與HOST主橋直接相連,所以將直接使用Type 00h配置請求訪問該設備的配置空間,具體步驟如下。首先HOST處理器將CONFIG_ADDRESS寄存器的Enable位置1,Bus Number號置為0,并對該寄存器的Device、Function和Register Number字段賦值。當處理器對CONFIG_DATA寄存器訪問時,HOST主橋將存放在CONFIG_ADDRESS寄存器中的數(shù)值,轉換為Type 00h配置請求,并發(fā)送到PCI總線0上,PCI設備01將接收這個Type 00h配置請求,并與處理器進行配置信息交換。
關鍵詞:
PCI總線配
評論