一、PCIe體系結構的組成部件
PCIe匯流排作為處理器系統的區域性匯流排,其作用與PCI匯流排類似,主要目的是為了連線處理器系統中的外部裝置,當然PCIe匯流排也可以連線其他處理器系統。在不同的處理器系統中,PCIe體系結構的實現方法略有不同。但是在大多數處理器系統中,都使用了RC、Switch和PCIe-to-PCI橋這些基本模組連線PCIe和PCI裝置。在PCIe匯流排中,基於PCIe匯流排的裝置,也被稱為EP(Endpoint)。
1、基於PCIe架構的處理器系統
在不同的處理器系統中,PCIe體系結構的實現方式不盡相同。PCIe體系結構以Intel的x86處理器為藍本實現,已被深深地烙下x86處理器的印記。在PCIe匯流排規範中,有許多內容是x86處理器獨有的,也僅在x86處理器的Chipset中存在。在PCIe匯流排規範中,一些最新的功能也在Intel的Chipset中率先實現。本節將以一個虛擬的處理器系統A和PowerPC處理器為例簡要介紹RC的實現,並簡單歸納RC的通用實現機制。
1.1、處理器系統A
在有些處理器系統中,沒有直接提供PCI匯流排,此時需要使用PCIe橋,將PCIe鏈路轉換為PCI匯流排之後,才能連線PCI裝置。在PCIe體系結構中,也存在PCI匯流排號的概念,其編號方式與PCI匯流排相容。一個基於PCIe架構的處理器系統A如圖所示。
在上圖的結構中,處理器系統首先使用一個虛擬的PCI橋分離處理器系統的儲存器域與PCI匯流排域。FSB匯流排下的所有外部裝置都屬於PCI匯流排域。與這個虛擬PCI橋直接相連的匯流排為PCI匯流排0。這種架構與Intel的x86處理器系統較為類似。
在這種結構中,RC由兩個FSB-to-PCIe橋和儲存器控制器組成。值得注意的是在圖4 7中,虛擬PCI橋的作用只是分離儲存器域與PCI匯流排域,但是並不會改變訊號的電氣特性。RC與處理器通過FSB連線,而從電氣特性上看,PCI匯流排0與FSB相容,因此在PCI匯流排0上掛接的是FSB-to-PCIe橋,而不是PCI-to-PCIe橋。
在PCI匯流排0上有一個儲存器控制器和兩個FSB-to-PCIe橋。這兩個FSB-to-PCIe橋分別推出一個×16和×8的PCIe鏈路,其中×16的PCIe鏈路連線顯示卡控制器(GFX),其編號為PCI匯流排1;×8的PCIe鏈路連線一個Switch進行PCIe鏈路擴充套件。而儲存器控制器作為PCI匯流排0的一個Agent裝置,連線DDR插槽或者顆粒。
此外在這個PCI總線上還可能連線了一些使用“PCI配置空間”管理的裝置,這些裝置的訪問方法與PCI匯流排相容,在x86處理器的Chipset中集成了一些內嵌的裝置。這些內嵌的裝置使用均使用“PCI配置空間”進行管理,包括儲存器控制器。
PCIe匯流排使用端到端的連線方式,因此只有使用Switch才能對PCIe鏈路進行擴充套件,而每擴充套件一條PCIe鏈路將產生一個新的PCI匯流排號。如圖4 7所示,Switch可以將1個×8的PCIe埠擴充套件為4個×2的PCIe埠,其中每一個PCIe埠都可以掛接EP。除此之外PCIe匯流排還可以使用PCIe橋,將PCIe匯流排轉換為PCI匯流排或者PCI-X匯流排,之後掛接PCI/PCI-X裝置。多數x86處理器系統使用這種結構連線PCIe或者PCI裝置。
在PCIe匯流排規範中並沒有明確提及PCIe主橋,而使用RC概括除了處理器之外的所有與PCIe匯流排相關的內容。在PCIe體系結構中,RC是一個很模糊也很混亂的概念。Intel使用PCI匯流排的概念管理所有外部裝置,包括與這些外部裝置相關的暫存器,因此在RC中包含一些實際上與PCIe匯流排無關的暫存器。使用這種方式有利於系統軟體使用相同的平臺管理所有外部裝置,也利於平臺軟體的一致性,但是仍有其不足之處。
1.2、PowerPC處理器
PowerPC處理器掛接外部裝置使用的拓撲結構與x86處理器不同。在PowerPC處理器中,雖然也含有PCI/PCIe匯流排,但是仍然有許多外部裝置並不是連線在PCI總線上的。在PowerPC處理器中,PCI/PCIe匯流排並沒有在x86處理器中的地位。在PowerPC處理器中,還含有許多內部裝置,如TSEC(Three Speed Ethenet Controller)和一些內部整合的快速裝置,與SoC平臺匯流排直接相連,而不與PCI/PCIe匯流排相連。在PowerPC處理器中,PCI/PCIe匯流排控制器連線在SoC平臺匯流排的下方。
Freescale即將釋出的P4080處理器,採用的互連結構與之前的PowerPC處理器有較大的不同。P4080處理器是Freescale第一顆基於E500 mc核心的處理器。E500 mc核心與之前的E500 V2和V1相比,從指令流水線結構、記憶體管理和中斷處理上說並沒有本質的不同。E500mc核心內建了一個128KB大小的L2 Cache,該Cache連線在BSB總線上;而E500 V1/V2核心中並不含有L2 Cache,而僅含有L1 Cache而且與FSB直接相連。在E500mc核心中,還引入了虛擬化的概念。在P4080處理器中,一些快速外部裝置,如DDR控制器、乙太網控制器和PCI/PCIe匯流排介面控制器也是直接或者間接地連線到CoreNet中,在P4080處理器,L3 Cache也是連線到CoreNet中。P4080處理器的拓撲結構如圖4 8所示。
目前Freescale並沒有公開P4080處理器的L1、L2和L3 Cache如何進行Cache共享一致性。多數採用CoreNet架構互連的處理器系統使用目錄表法進行Cache共享一致性,如Intel的Nehelem EX處理器。P4080處理器並不是一個追求峰值運算的SMP處理器系統,而針對Data Plane的應用,因此P4080處理器可能並沒有使用基於目錄表的Cache一致性協議。在基於全互連網路的處理器系統中如果使用“類匯流排監聽法”進行Cache共享一致性,將不利於多個CPU共享同一個儲存器系統,在Cache一致性的處理過程中容易形成瓶頸。
如圖4 8所示,P4080處理器的設計重點並不是E500mc核心,而是CoreNet。CoreNet內部由全互連網路組成,其中任意兩個埠間的通訊並不會影響其他埠間的通訊。與MPC8548處理器相同,P4080處理器也使用OceaN[1]結構連線PCIe與RapidIO介面。
在P4080處理器中不存在RC的概念,而僅存在PCIe匯流排控制器,當然也可以認為在P4080處理器中,PCIe匯流排控制器即為RC。P4080處理器內部含有3個PCIe匯流排控制器,如果該處理器需要連線更多的PCIe裝置時,需要使用Switch擴充套件PCIe鏈路。
在P4080處理器中,所有外部裝置與處理器核心都連線在CoreNet中,而不使用傳統的SoC平臺匯流排[2]進行連線,從而在有效提高了處理器與外部裝置間通訊頻寬的同時,極大降低了訪問延時。此外P4080處理器系統使用PAMU(Peripheral Access Management Unit)分隔外設地址空間與CoreNet地址空間。在這種結構下,10GE/1GE介面使用的地址空間與PCI匯流排空間獨立。
P4080處理器使用的PAMU是對MPC8548處理器ATMU的進一步升級。使用這種結構時,外部裝置使用的地址空間、PCI匯流排域地址空間和儲存器域地址空間的劃分更加明晰。在P4080處理器中,儲存器控制器和儲存器都屬於一個地址空間,即儲存器域地址空間。此外這種結構還使用OCeaN連線SRIO和PCIe匯流排控制器,使得在OCeaN中的PCIe埠之間可以直接通訊,而不需要通過CoreNet,從而減輕了CoreNet的負載。
從核心互連和外部裝置互連的結構上看,這種結構具有較大的優勢。但是採用這種結構需要使用佔用晶片更多的資源,CoreNet的設計也十分複雜。而最具挑戰的問題是,在這種結構之下,Cache共享一致性模型的設計與實現。在Boxboro EX處理器系統中,可以使用QPI將多個處理器系統進行點到點連線,也可以組成一個全互連的處理器系統。這種結構與P4080處理器使用的結構類似,但是Boxboro EX處理器系統包含的CPU更多。
1.3、基於PCIe匯流排的通用處理器結構
在不同的處理器系統中,RC的實現有較大差異。PCIe匯流排規範並沒有規定RC的實現細則。在有些處理器系統中,RC相當於PCIe主橋,也有的處理器系統也將PCIe主橋稱為PCIe匯流排控制器。而在x86處理器系統中,RC除了包含PCIe匯流排控制器之外,還包含一些其他組成部件,因此RC並不等同於PCIe匯流排控制器。
如果一個RC中可以提供多個PCIe埠,這種RC也被稱為多埠RC。如MPC8572處理器的RC可以直接提供3條PCIe鏈路,因此可以直接連線3個EP。如果MPC8572處理器需要連線更多EP時,需要使用Switch進行鏈路擴充套件。
而在x86處理器系統中,RC並不是存在於一個晶片中,如在Montevina平臺中,RC由MCH和ICH兩個晶片組成。本節並不對x86和PowerPC處理器使用的PCIe匯流排結構做進一步討論,而只介紹這兩種結構的相同之處。一個通用的,基於PCIe匯流排的處理器系統如圖4 9所示。
上圖所示的結構將PCIe匯流排埠、儲存器控制器等一系列與外部裝置有關的介面都整合在一起,並統稱為RC。RC具有一個或者多個PCIe埠,可以連線各類PCIe裝置。PCIe裝置包括EP(如網絡卡、顯示卡等裝置)、Switch和PCIe橋。PCIe匯流排採用端到端的連線方式,每一個PCIe埠只能連線一個EP,當然PCIe埠也可以連線Switch進行鏈路擴充套件。通過Switch擴展出的PCIe鏈路可以繼續掛接EP或者其他Switch。
2、RC的組成結構
RC是PCIe體系結構的一個重要組成部件,也是一個較為混亂的概念。RC的提出與x86處理器系統密切相關。事實上,只有x86處理器才存在PCIe匯流排規範定義的“標準RC”,而在多數處理器系統,並不含有在PCIe匯流排規範中涉及的,與RC相關的全部概念。
不同處理器系統的RC設計並不相同,在圖4 7中的處理器系統中,RC包括儲存器控制器、兩個FSB-to-PCIe橋。而在圖4 8中的PowerPC處理器系統中,RC的概念並不明晰。在 PowerPC處理器中並不存在真正意義上的RC,而僅包含PCIe匯流排控制器。
在x86處理器系統中,RC內部集成了一些PCI裝置、RCRB(RC Register Block)和Event Collector等組成部件。其中RCRB由一系列“管理儲存器系統”的暫存器組成,而僅存在於x86處理器中;而Event Collector用來處理來自PCIe裝置的錯誤訊息報文和PME訊息報文。RCRB暫存器組屬於PCI匯流排域地址空間,x86處理器訪問RCRB的方法與訪問PCI裝置的配置暫存器相同。在有些x86處理器系統中,RCRB在PCI匯流排0的裝置0中。
RCRB是x86處理器所獨有的,PowerPC處理器也含有一組“管理儲存器系統”的暫存器,這組暫存器與RCRB所實現的功能類似。但是在PowerPC處理器中,該組暫存器以CCSRBAR暫存器為基地址,處理器採用儲存器映像方式訪問這組暫存器。
如果將RC中的RCRB、內建的PCI裝置和Event Collector去除,該RC的主要功能與PCI匯流排中的HOST主橋類似,其主要作用是完成儲存器域到PCI匯流排域的地址轉換。但是隨著虛擬化技術的引入,尤其是引入MR-IOV技術之後,RC的實現變得異常複雜。
但是RC與HOST主橋並不相同,RC除了完成地址空間的轉換之外,還需要完成物理訊號的轉換。在PowerPC處理器的RC中,來自OCeaN或者FSB的訊號協議與PCIe匯流排訊號使用的電氣特性並不相容,使用的匯流排事務也並不相同,因此必須進行訊號協議和匯流排事務的轉換。
在P4080處理器中,RC的下游埠可以掛接Switch擴充套件更多的PCIe埠,也可以只掛接一個EP。在P4080處理器的RC中,設定了一組Inbound和Outbound暫存器組,用於儲存器域與PCI匯流排域之間地址空間的轉換;而P4080處理器的RC還可以使用Outbound暫存器組將PCI裝置的配置空間直接對映到儲存器域中。PowerPC處理器在處理PCI/PCIe介面時,都使用這組Inbound和Outbound暫存器組。
在P4080處理器中,RC可以使用PEX_CONFIG_ADDR與PEX_CONFIG_DATA暫存器對 EP進行配置讀寫,這兩個暫存器與MPC8548處理器HOST主橋的PCI_CONFIG_ADDR和PCI_CONFIG_DATA暫存器類似,本章不再詳細介紹這組暫存器。而x86處理器的RC設計與PowerPC處理器有較大的不同,實際上和大多數處理器系統都不相同。x86處理器賦予了RC新的含義,PCIe匯流排規範中涉及的RC也以x86處理器為例進行說明,而且一些在PCIe匯流排規範中出現的最新功能也在Intel的x86處理器系統中率先實現。在x86處理器系統中的RC實現也比其他處理器系統複雜得多。深入理解x86處理器系統的RC對於理解PCIe體系結構非常重要。
3、Switch
本篇在上一節中簡單介紹了在PCIe匯流排中,如何使用Switch進行鏈路擴充套件,本節主要介紹Switch的內部結構。從系統軟體的角度上看,每一個PCIe鏈路都佔用一個PCI匯流排號,但是一條PCIe鏈路只能連線一個PCI裝置,Switch、EP或者PCIe橋片。PCIe匯流排使用端到端的連線方式,一條PCIe鏈路只能連線一個裝置。
一個PCIe鏈路需要掛接多個EP時,需要使用Switch進行鏈路擴充套件。一個標準Switch具有一個上游埠和多個下游埠。上游埠與RC或者其他Switch的下游埠相連,而下游埠可以與EP、PCIe-to-PCI-X/PCI橋或者下游Switch的上游埠相連。
PCIe匯流排規範還支援一種特殊的連線方式,即Crosslink連線方式。使用這種方式時,Switch的下游埠可以與其他Switch的下游埠直接連線,上游埠也可以其他Switch的上游埠直接連線。在PCIe匯流排規範中,Crosslink連線方式是可選的,並不要求PCIe裝置一定支援這種連線方式。
在PCIe體系結構中,Switch的設計難度僅次於RC,Switch也是PCIe體系結構的核心所在。而從系統軟體的角度上看,Switch內部由多個PCI-to-PCI橋組成,其中每一個上游和下游埠都對應一個虛擬PCI橋。在一個Switch中有多個埠,在其內部就有多少個虛擬PCI橋,就有多少個PCI橋配置空間。值得注意的是,在Switch內部還具有一條虛擬的PCI匯流排,用於連線各個虛擬PCI橋,系統軟體在初始化Switch時,需要為這條虛擬PCI匯流排編號。Switch的組成結構如圖4 10所示。
Switch需要處理PCIe匯流排傳輸過程中的QoS問題。PCIe匯流排的QoS要求PCIe匯流排區別對待優先權不同的資料報文,而且無論PCIe匯流排的某一個鏈路多麼擁塞,優先順序高的報文,如等時報文(Isochronous Packet)都可以獲得額定的資料頻寬。而且PCIe匯流排需要保證優先順序較高的報文優先到達。PCIe匯流排採用虛擬多通路VC技術,並在這些資料報文設定一個TC(Traffic Class)標籤,該標籤由3位組成,將資料報文根據優先權分為8類,這8類資料報文可以根據需要選擇不同的VC進行傳遞。
在PCIe匯流排中,每一條資料鏈路上最多可以支援8個獨立的VC。每個VC可以設定獨立的緩衝,用來接收和傳送資料報文。在PCIe體系結構中,TC和VC緊密相連,TC與VC之間的關係是“多對一”。
TC可以由軟體設定,系統軟體可以選擇某類TC由哪個VC進行傳遞。其中一個VC可以傳遞TC不相同的資料報文,而TC相同的資料報文在指定一個VC傳遞之後,不能再使用其他VC。在許多處理器系統中,Switch和RC僅支援一個VC,而x86處理器系統和PLX的Switch中可以支援兩個VC。
下文將以一個簡單的例子說明如何使用TC標籤和多個VC,以保證資料傳送的服務質量。我們將PCIe匯流排的端到端資料傳遞過程模擬為使用汽車將一批貨物從A點運送到B點。如果我們不考慮服務質量,可以採用一輛汽車運送所有這些貨物,經過多次往返就可以將所有貨物從A點運到B點。但是這樣做會耽誤一些需要在指定時間內到達B點的貨物。有些貨物,如一些急救物資、EMS等其他優先級別較高的貨物,必須要及時地從A點運送到B點。這些急救物資的運送應該有別於其他普通物資的運送。
為此我們首先將不同種類的貨物進行分類,將急救物資定義為TC3類貨物,EMS定義為TC2類貨物,平信定義為TC1類貨物,一般包裹定義為TC0類貨物,我們最多可以提供8種TC類標籤進行貨物分類。
之後我們使用8輛汽車,分別是VC0~7運送這些貨物,其中VC7的速度最快,而VC0的速度最慢。當發生堵車事件時,VC7優先行駛,VC0最後行駛。然後我們使用VC3運送急救物資,VC2運送EMS,VC1運送平信,VC0運送包裹,當然使用VC0同時運送平信和包裹也是可以的,但是平信或者包裹不能使用一種以上的汽車運送,如平信如果使用了VC1運輸,就不能使用VC0。因為TC與VC的對應關係是“多對一”的關係。
採用這種分類運輸的方法,我們可以做到在A點到B點頻寬有限的情況下,仍然可以保證急救物資和EMS可以及時到達B點,從而提高了服務質量。
PCIe匯流排除了解決資料傳送的QoS問題之外,還進一步考慮如何在鏈路傳遞過程中,使用流量控制機制防止擁塞。在PCIe體系結構中,Switch處於核心地位。PCIe匯流排使用Switch進行鏈路擴充套件,在Switch中,每一個埠對應一個虛擬PCI橋。深入理解PCI橋是理解Switch軟體組成結構的基礎。目前PCIe匯流排提出了MRA-Switch的概念,這種Switch與傳統Switch有較大的區別。
4、VC和埠仲裁
在Switch中存在多個埠,其中來自不同Ingress埠的報文可以發向同一個Egress埠,因此Switch必須要解決埠仲裁和路由選徑的問題。所謂埠仲裁指來自不同Ingress埠的報文到達同一個Egress埠的報文通過順序,埠仲裁機制如圖4 11所示。
在一個Switch中設有仲裁器,該仲裁器規定了資料報文通過Switch的規則。在PCIe匯流排中存在兩種仲裁機制,分別是基於VC和基於埠的仲裁機制。埠仲裁機制主要針對RC和Switch,當多個Ingress埠需要向同一個Egress埠傳送資料報文時需要進行埠仲裁。具體地講,在PCIe體系結構中有三個埠,需要進行埠仲裁。
• Switch的Egress埠。當EP A和EP B同時訪問EP C,D或者DDR-SDRAM時,需要通過Switch的Egress埠C。此時Switch需要進行埠仲裁確定是EP A的資料報文還是EP B的資料報文優先通過Egress埠C。
• 多埠RC的Egress埠。當RC的埠1和埠3同時訪問Endpoint C時,RC的埠2需要進行埠仲裁,決定來自RC哪個埠的資料可以率先通過。
• RC通往主儲存器的埠。當RC的埠1、埠2和埠3同時訪問DDR控制器時,這些資料報文將通過RC的Egress埠4,此時需要進行埠仲裁。
在PCIe體系結構中,鏈路的埠仲裁需要根據每一個VC獨立設定,而且可以使用不同的演算法進行埠仲裁。下文以圖4 11中,Switch的兩個Ingress埠A和B向Egress埠C傳送資料報文為例,簡要說明埠仲裁和VC仲裁的使用方法,其過程如圖4 12所示。
基於VC的仲裁是指發向同一個埠的資料報文,根據使用的VC而進行仲裁的方式。如上圖所示,當來自埠B和埠A資料報文(分別使用VC0和VC1通路)在到達埠C之前,需要首先進行埠仲裁後,才能進行VC仲裁。PCIe匯流排規定了3種VC仲裁方式, 分別為Strict Priority,RR(Round Robin)和WRR(Weighted Round Robin)演算法。
當使用Strict Priority仲裁方式時,發向VC7的資料報文具有最高的優先順序,而發向VC0的資料報文優先順序最低。PCIe匯流排允許對Switch或者RC的部分VC採用Strict Priority方式進行仲裁,而對其他VC採用RR和WRR演算法,如VC7~4採用Strict Priority方式,而採用其他方式處理VC3~0。
使用RR方式時,所有VC具有相同的優先順序,所有VC輪流使用PCIe鏈路。WRR方式與RR演算法類似,但是可以對每一個VC進行加權處理,採用這種方式可以適當提高VC7的優先權,而將VC0的優先權適當降低。
我們假定Ingress埠A和Ingress B向Egress埠C進行資料傳遞時,使用兩個VC通路,分別是VC0和VC1。其中標籤為TC0~3的資料報文使用VC0傳送,而標籤為TC4~7資料報文使用VC1傳送。
而資料報文在離開Egress埠C時,需要首先進行埠仲裁,之後再通過VC仲裁,決定哪個報文優先傳送。資料報文從Ingress A/B埠傳送到Egress C埠時,將按照以下步驟進行處理。
(1) 首先到達Ingress A/B埠的資料報文,將根據該埠的TC/VC對映表[8]決定使用該埠的哪個VC通道。如圖4 12所示,假設發向埠A的資料報文使用TC0~TC3,而發向埠B的資料報文使用TC0~TC7,這些資料報文在埠A中僅使用了VC0通道,而在埠B中使用了VC0和VC1兩個通道。
(2) 資料報文在埠中傳遞時,將通過路由部件(Routing Logic),將報文傳送到合適的埠。如圖4 12所示,埠C可以接收來自埠A或者B的資料報文。
(3) 當資料報文到達埠C時,首先需要經過TC/VC對映表,確定在埠C中使用哪個VC通路接收不同型別的資料報文。
(4) 對於埠C,其VC0通道可能會被來自埠A的資料報文使用,也可能會被來自埠B的資料報文使用。因此在PCIe的Switch中必須設定一個埠仲裁器,決定來自不同資料埠的資料報文如何使用VC通路。
(5) 資料報文通過埠仲裁後,獲得VC通路的使用權之後,還需要經過Switch中的VC仲裁器,將資料報文傳送到實際的物理鏈路中。
PCIe匯流排規定,系統設計者可以使用以下三種方式進行埠仲裁。
(1) Hardware-fixed仲裁策略。如在系統設計時,採用固化的RR仲裁方法。這種方法的硬體實現原理較為簡單,此時系統軟體不能對埠仲裁器進行配置。
(2) WRR仲裁策略,即加權的RR仲裁策略。
(3) Time-Based WRR仲裁策略,基於時間片的WRR仲裁策略,PCIe匯流排可以將一個時間段分為若干個時間片(Phase),每個端口占用其中的一個時間片,並根據埠使用這些時間片的多少對埠進行加權的一種方法。使用WRR和Time-Based WRR仲裁策略,可以在某種程度上提高PCIe匯流排的QoS。
PCIe裝置的Capability暫存器規定了埠仲裁使用的演算法。有些PCIe裝置並沒有提供多種埠仲裁演算法,可能也並不含有Capability暫存器。此時該PCIe裝置使用Hardware-fixed仲裁策略。
5、PCIe-to-PCI/PCI-X橋片
本節將PCIe-to-PCI/PCI-X橋片簡稱為PCIe橋片。該橋片有兩個作用。
• 將PCIe匯流排轉換為PCI匯流排,以連線PCI裝置。在一個沒有提供PCI匯流排介面的處理器中,需要使用這類橋片連線PCI匯流排的外設。許多PowerPC處理器在提供PCIe匯流排的同時,也提供了PCI匯流排,因此PCIe-to-PCI橋片對基於PowerPC處理器系統並不是必須的。
• 將PCI匯流排轉換為PCIe匯流排(這也被稱為Reverse Bridge),連線PCIe裝置。一些低端的處理器並沒有提供PCIe匯流排,此時需要使用PCIe橋將PCI匯流排轉換為PCIe匯流排,才能與其他PCIe裝置互連。這種用法初看比較奇怪,但是在實際應用中,確實有使用這一功能的可能。本節主要講解PCIe橋的第一個作用。
PCIe橋的一端與PCIe匯流排相連,而另一端可以與一條或者多條PCI匯流排連線。其中可以連線多個PCI匯流排的PCIe橋也被稱為多埠PCIe橋。
PCIe匯流排規範提供了兩種多埠PCIe橋片的擴充套件方法。多埠PCIe橋片指具有一個上游埠和多個下游埠的橋片。其中上游埠連線PCIe鏈路,而下游埠推出PCI匯流排,連線PCI裝置。
目前雖然PCIe匯流排非常普及,但是仍然有許多基於PCI匯流排的設計,這些基於PCI匯流排的設計可以通過PCIe橋,方便地接入到PCIe體系結構中。目前有多家半導體廠商可以提供PCIe橋片,如PLX、NXP、Tundra和Intel。就功能的完善和效能而言,Intel的PCIe橋無疑是最佳選擇,而PLX和Tundra的PCIe橋在嵌入式系統中得到了廣泛的應用。
二、PCIe裝置的擴充套件配置空間
本書在上一節講述了PCI裝置使用的基本配置空間。這個基本配置空間共由64個位元組組成,其地址範圍為0x00~0x3F,這64個位元組是所有PCI裝置必須支援的。事實上,許多PCI裝置也僅支援這64個配置暫存器。
此外PCI/PCI-X和PCIe裝置還擴充套件了0x40~0xFF這段配置空間,在這段空間主要存放一些與MSI或者MSI-X中斷機制和電源管理相關的Capability結構。其中所有能夠提交中斷請求的PCIe裝置,必須支援MSI或者MSI-X Capability結構。
PCIe裝置還支援0x100~0xFFF這段擴充套件配置空間。PCIe裝置使用的擴充套件配置空間最大為4KB,在PCIe匯流排的擴充套件配置空間中,存放PCIe裝置所獨有的一些Capability結構,而PCI裝置不能使用這段空間。
在x86處理器中,使用CONFIG_ADDRESS暫存器與CONFIG_DATA暫存器訪問PCIe配置空間的0x00~0xFF,而使用ECAM方式訪問0x000~0xFFF這段空間;而在PowerPC處理器中,可以使用CFG_ADDR和CFG_DATA暫存器訪問0x000~0xFFF。
PCI-X和PCIe匯流排規範要求其裝置必須支援Capabilities結構。在PCI匯流排的基本配置空間中,包含一個Capabilities Pointer暫存器,該暫存器存放Capabilities結構連結串列的頭指標。在一個PCIe裝置中,可能含有多個Capability結構,這些暫存器組成一個連結串列,其結構如圖4 14所示。
其中每一個Capability結構都有唯一的ID號,每一個Capability暫存器都有一個指標,這個指標指向下一個Capability結構,從而組成一個單向連結串列結構,這個連結串列的最後一個Capability結構的指標為0。
一個PCIe裝置可以包含多個Capability結構,包括與電源管理相關、與PCIe匯流排相關的結構、與中斷請求相關的Capability結構、PCIe Capability結構和PCIe擴充套件的Capability結構。