740
技術社區[雲棲]
5.2 TLP的路由
TLP的路由是指TLP通過Switch或者PCIe橋片時采用哪條路徑,最終到達EP或者RC的方法。PCIe總線一共定義了三種路由方法,分別是基於地址(Address)的路由,基於ID的路由和隱式路由(Implicit)方式。
存儲器和I/O讀寫請求TLP使用基於地址的路由方式,這種方式使用TLP中的Address字段進行路由選徑,最終到達目的地。
而配置讀寫報文、“Vendor_Defined Messages”報文、Cpl和CplD報文使用基於ID的路由方式,這種方式使用PCI總線號(Bus Number)進行路由選徑。在Switch或者多端口RC的虛擬PCI-PCI橋配置空間中,包含如何使用PCI總線號進行路由選徑的信息。
而隱式路由方式主要用於Message報文的傳遞。在PCIe總線中定義了一係列消息報文,包括“INTx Interrupt Signaling”,“Power Management Messages”和“Error Signal Messages”等報文。在這些報文中,除了“Vendor_Defined Messages”報文,其他所有消息報文都使用隱式路由方式,隱式路由方式是指從下遊端口到上遊端口進行數據傳遞的使用路由方式,或者用於RC向EP發出廣播報文。
5.2.1 基於地址的路由
在PCIe總線中,存儲器讀寫和I/O讀寫TLP使用基於地址的路由方式。PCIe設備使用的地址路由方式與PCI設備使用的地址路由方式類似。隻是PCIe設備使用TLP進行數據傳送,而PCI設備使用總線周期進行數據傳送。使用地址路由方式進行數據傳遞的TLP格式如第5.3.1節的圖5?8所示,在這類TLP中包含目的設備的地址。
當一個TLP進行數據傳遞時,可能會經過多級Switch,最終到達目的地。Switch將根據存儲器讀寫和I/O讀寫請求TLP的目的地址將報文傳遞到合適的Egress端口上。如圖4?10所示,在一個Switch中包含了多個虛擬PCI-to-PCI橋。在Switch中有幾個端口,就包含幾個虛擬PCI-to-PCI橋。
在虛擬PCI-to-PCI橋的配置寄存器空間中,包含一個橋片能夠接收的物理地址範圍。PCIe總線通過這個物理地址範圍實現基於地址的路由。這段配置寄存器如圖5?4所示。當係統軟件初始化PCI總線時,將合理地設置這些寄存器,之後當TLP通過這些Switch時將根據這些寄存器選擇合適的路徑。
上圖中的配置寄存器描述了該虛擬PCI-to-PCI橋下遊PCI子樹使用的三組空間範圍,分別為I/O、存儲器和可預取的存儲器空間,分別用Base和Limit兩類寄存器描述,其中Base寄存器表示可訪問空間的基地址,Limit寄存器表示可訪問空間的大小。TLP使用基於地址的路由時,一定要通過查詢這組寄存器之後,再決定傳送路徑。這組寄存器的使用方法與PCI總線中的PCI橋兼容。
其中TLP從“上遊端口發送到下遊端口”與“下遊端口發送到上遊端口”的路由過程略有不同,如圖5?5所示。下文以TLP1~3的發送過程對地址路由過程進行說明。TLP1~3的描述如下。
- TLP1是一個存儲器或者I/O請求TLP,由RC發出,並通過一個Switch發向EP1。存儲器和I/O讀寫請求TLP使用這種地址路由方式。TLP1將從Switch的上遊端口傳送到下遊端口。
- TLP2是一個存儲器或者I/O請求TLP,由EP2發出,並通過一個Switch發向RC。當PCIe設備進行DMA讀寫操作時,將使用這種地址路由方式。TLP2將從Switch的下遊端口傳送到上遊端口。
- TLP3是一個存儲器或者I/O請求TLP,由一個EP2發出,並通過一個Switch後發送到另外一個EP。在x86處理器係統中,這種用法並不常見。但是在某些大規模處理器係統中,具有這種應用方式。此時TLP3將從Switch的下遊端口傳送到另外一個下遊端口。
1 TLP1的傳送過程
當TLP1從RC發向EP1時,這個TLP1為I/O或者存儲器報文,其中TLP1目的地址在EP1的BAR空間中。當處理器訪問EP的BAR空間時,需要使用該類TLP。值得注意的是這個數據報文在通過RC時需要進行地址轉換。
TLP1首先通過PCI Bus0發向Switch,並通過Switch的Upstream端口到達P-P1橋片,P-P1橋片首先根據配置寄存器中的Limit和Base寄存器決定是否接收TLP1。如果Switch不接收TLP1,則將該TLP作為不支持的請求(Unsupported Request)處理,此時如果TLP1需要回應報文,Switch將發出完成報文,該報文的狀態為UR(Unsupported Request)。
如果Switch接收TLP1,則表示TLP1所訪問的地址在該Switch下遊端口所連接的EP或者Switch中,此時Switch將TLP1從PCI Bus0推至PCI Bus1中,即穿越P-P1橋片。TLP1到達PCI Bus1後將同時查找P-P2和P-P3橋片配置寄存器中的Limit和Base寄存器,決定是P-P2還是P-P3橋片接收TLP1。本小節中的例子將使用P-P2橋片接收TLP1,並將TLP1推至PCI Bus2,而PCI Bus2上的EP1將接收TLP1,完成整個地址路由。
2 TLP2的傳送過程
當TLP2從EP2發向RC時,一般來說該TLP將訪問處理器係統的主存儲器。此時TLP2首先將請求發至P-P3橋片,在P-P3橋片配置寄存器的Limit和Base寄存器中當然不會包含TLP2所訪問的地址,此時P-P3橋片將TLP2推至PCI Bus1。
TLP從“下遊端口向上遊端口”與“TLP從上遊端口向下遊端口”進行傳遞時,橋片的處理機製有所不同,從上遊端口向下遊端口傳遞時,如果橋片配置寄存器的Limit和Base寄存器包含該TLP的訪問地址時,橋片將接收此TLP,否則不接收該TLP。而從下遊端口向上遊端口傳遞時,如果橋片配置寄存器的Limit和Base寄存器不包含該TLP的訪問地址時,橋片將接收該TLP,並將其推至橋片的上遊PCI總線。值得注意的是,這兩種地址譯碼方式都屬於PCI總線的正向譯碼。
當TLP2到達PCI Bus1時,首先檢查在PCI Bus1總線上的P-P2橋片是否可以接收此TLP,如果不能接收則TLP2通過P-P1橋片傳遞到PCI Bus0,即到達RC。
在MPC8548處理器中,到達RC的TLP首先通過Inbound寄存器進行地址轉換,將TLP的PCI總線地址轉換為處理器的地址,然後訪問處理器中相應的存儲器空間;對於x86處理器而言,MCH也會完成PCI域地址空間到存儲器域地址空間的轉換,然後訪問處理器中相應的存儲器空間。
3 TLP3的傳送過程
TLP3的傳遞方式與TLP2的傳遞方式有些類似,當TLP3傳遞到PCI Bus1時,P-P2橋片將接收TLP3,並將TLP3傳遞到PCI Bus2上的EP1中。由以上敘述可以發現,PCIe總線中基於地址的路由方式與PCI總線上的基於地址的數據傳遞流程十分相近。TLP3在PCI總線域上進行數據傳遞,因此不需要進行PCI總線域到存儲器域的地址轉換。
5.2.2 基於ID的路由
在PCIe總線中,基於ID的路由方式主要用於配置讀寫請求TLP、Cpl和CplD報文,此外Vendor_Defined消息報文也可以使用這種基於ID的路由方式。而在PCI總線中,隻有配置讀寫周期才使用ID進行數據傳遞。
基於ID的路由方式與基於地址的路由方式有較大的不同,基於ID路由方式的TLP頭格式也與基於地址路由方式的頭格式不同,其報文格式如圖5?6所示。
如上圖所示,使用ID路由方式的TLP頭,其Byte8~11字段與基於地址路由的TLP不同。基於ID路由的TLP,使用Bus Number、Device Number和Function Number進行路由尋址。從軟件的角度上看,PCIe總線與PCI總線兼容,隻是在PCIe總線中,每一個PCIe設備使用唯一的PCI設備號,但是每一個設備仍然可以有多個子設備(Function)。
PCIe總線規定,在一個PCI總線域空間中,最多隻能有256條PCI總線,因此在一個TLP中,Bus Number由五位組成;而在每一條總線中最多包含32個設備,因此TLP中的Device Number由5位組成;而每一個設備中最多包含8個功能,因此一個TLP的Function Number由3位組成。
配置讀寫請求TLP是使用“基於ID路由”的一組重要報文,其主要作用是讀寫PCIe總線的EP、Switch及PCIe橋片的配置寄存器,以完成PCIe總線的配置。在處理器係統上電之後需要進行PCI總線係統的枚舉,為PCI總線分配總線號,並設置Switch、PCIe橋片或者EP的配置寄存器,如Limit寄存器組、Base寄存器組、BAR寄存器、Subordinate Bus Number、Secondary Bus Number和Primary Bus Number等一係列配置寄存器。
在上文中我們簡單介紹了Limit寄存器組和Base寄存器組的用法,下文將重點描述Subordinate Bus Number、Secondary Bus Number和Primary Bus Number寄存器。Subordinate Bus Number、Secondary Bus Number和Primary Bus Number寄存器在Type 01h配置寄存器中,用來描述PCI-to-PCI橋片的上遊及下遊總線號。這段寄存器在PCI配置寄存器中的位置如所圖5?7示。
與PCI總線中的橋片類似,Primary Bus Number記錄PCI-to-PCI橋上遊的PCI總線號,Secondary Bus Number記錄PCI-to-PCI橋下遊的第一個PCI總線號,而Subordinate Bus Number記錄PCI-to-PCI橋下遊的最後一個PCI總線號。
如圖5?5所示,P-P1橋片的Primary Bus Number為0,Secondary Bus Number為1,而Subordinate Bus Number為3。這些總線號,在處理器係統對PCI總線進行枚舉時由係統初始化程序設置,從係統初始化程序的角度上看,PCIe總線與PCI總線基本兼容,隻是PCIe總線對配置空間進行了一些擴展。
如表5?2所示,RC可以使用Type 00h和Type 01h讀寫請求TLP,對PCIe設備的配置寄存器進行讀寫訪問,配置讀寫請求TLP隻能由RC發出,配置讀寫請求TLP使用基於ID的路由方式。
如圖5?5所示的例子,RC首先使用Type 00h配置請求TLP訪問在PCI Bus0總線上的設備,PCI Bus0上的所有設備,包括橋片都要監聽PCI Bus 0上的配置請求,在本例中隻有Switch掛接在PCI Bus0上,實際上是Switch的上遊端口與PCI Bus0直接相連。因此Switch的上遊端口將接收RC發出的Type 00h配置請求TLP,之後Switch將向RC發出完成報文,結束配置請求。與PCI總線相同,PCIe總線的Type 00h類型配置請求TLP不能夠穿越橋片,在圖5?5中這類請求隻能訪問Switch上遊端口的配置空間。
PCI總線是基於共享總線的數據傳送方式,在一條PCI總線上可以連接多個PCI Agent設備,其中每一個PCI Agent都提供了一個IDSEL#信號,這個信號與PCI-to-PCI橋片或者HOST主橋的地址線直接相連,PCI總線根據與IDSEL#信號與地址線的連接關係決定相應設備的Device Number。
這與PCIe總線的使用方法不同,PCIe總線使用“端對端”的連接方式,在PCIe鏈路隻能連接一個下遊設備,而這個下遊設備的Device Number隻能為0。而隻有在Switch的虛擬PCI總線上可以連接多個Device Number不同的端口。
當一個虛擬PCI總線上掛接PCI-to-PCI橋時,係統配置軟件將使用Type 01h配置請求TLP訪問PCI-PCI橋下遊的PCI設備。如圖5?5所示,RC可以通過Type 01h配置請求TLP訪問P-P2橋片、P-P3橋片,EP1和EP2。
當RC使用Type 01h配置請求TLP,直接訪問P-P1橋的下遊設備時,首先需要檢查該TLP的Bus Number是否為1,如果為1表示該TLP的訪問目標在PCI Bus 1總線上,此時PCI-to-PCI橋將這個Type 01h類型的TLP轉換為Type 00h類型的TLP,然後推至PCI Bus 1總線,並訪問其下的設備。
如果該TLP的Bus Number在P-P1橋片的Secondary Bus Number和Subordinate Bus Number寄存器之間,則P-P1橋片將該Type 01h類型的TLP直接轉發到PCI Bus 1上,並不改變該TLP的類型,之後Type 01和類型的TLP將繼續檢查P-P2和P-P3橋片的配置空間,決定由P-P2還是P-P3接收該TLP。如果TLP的PCI Bus Number為2時,P-P2橋片將接收該TLP,並將該Type 01h類型TLP轉換為Type 00h類型的TLP,然後發送給EP1,並由EP1處理該TLP。
上文簡要講述了配置請求TLP使用ID路由方式從上遊端口向下遊端口的傳遞規則,但是Vendor_Defined消息報文和Cpl和CplD報文還可能從下遊端口向上遊端口進行傳遞。此時PCIe總線處理方法略有不同。下文仍以圖5?5為例說明這種情況。
當一個TLP從EP2傳送到EP1或者RC時,首先檢查P-P3橋片的配置空間,P-P3橋片發現該TLP不是發向自己時,將該TLP推至上遊總線,即PCI Bus 1。如果PCI Bus1上P-P1橋片沒有認領該TLP,該TLP將繼續向P-P2橋片傳遞,並由這個橋片將TLP轉發給合適的EP;如果P-P1橋片認領該TLP,該TLP將繼續向上遊總線傳遞,直至RC。
由以上描述可以發現,PCIe總線使用的基於ID的路由方式與PCI總線中配置讀寫總線事務通過PCI橋的方法較為類似。
5.2.3 隱式路由
PCIe總線規定消息請求報文使用隱式路由方式。在PCIe總線中,有許多消息是直接發向RC或者來自RC的廣播報文,這些報文不使用地址或者ID進行路由,而是使用Msg和MsgD報文的Route字段進行路由,這種路由方式被稱為隱式路由。
PCIe總線定義了一些用於中斷請求、錯誤狀態處理、鎖定總線事務、熱插拔信號處理和“Vendor_Defined Messages”消息報文。這些消息報文需要使用隱式路由方式進行傳遞。消息報文的Route字段的含義如表5?4所示。
Route[2:0] | 描述 |
000 | 路由到RC |
001 | 使用地址路由 |
010 | 使用ID路由 |
011 | 來自RC的廣播報文 |
100 | 本地消息,在接收端結束(Legacy中斷消息使用這種報文格式,傳遞來自PCI總線的中斷報文) |
101 | 用於PCIe電源管理(PME_TO_Ack報文使用) |
110~111 | 保留 |
由上表所示,使用隱式路由方式的TLP,其Route字段為“000”,“011”,“100”或者“101”。當一個報文使用隱式路由向EP發送時,EP將對Route字段進行檢查,如果這個報文是“來自RC的廣播報文”,或者是“本地報文”,EP將接收此報文。
如果Switch收到一條使用隱式路由的TLP時,將根據報文Route字段的不同而分別處理。如果Switch的上遊端口接收了一條來自RC的廣播消息,則將該報文發向所有的下遊端口;如果Switch接收了一條來自下遊端口發向RC的消息報文時,Switch將此報文直接轉發到上遊端口,直至RC;如果Switch接收了一條使用隱式路由方式的本地消息報文,則Switch接收並終結此報文,不再上傳或下推。
如果RC收到一個使用隱式路由的TLP時,將根據報文Route字段而分別處理這些TLP。如果該Route字段為0b000和0b101,RC將接收該TLP,並作相應的處理;如果為0b100,RC將接收該TLP,並結束該TLP報文的傳遞。最後更新:2017-04-03 16:48:37