3GIO是一個極為高階的匯流排,集合了PCI/PCI-X/Infiniband三者的特徵於一身,而系統架構所涉及到的主題重點,不外乎中斷的支援處理與服務、錯誤的偵測與記錄或修正、虛擬通道(Virtual Channel)的機制、即時傳輸的機能、裝置的同步、資料交易鎖定的功能、重置與熱插拔的支援等...
3GIO是一個極為高階的匯流排,集合了PCI/PCI-X/Infiniband三者的特徵於一身,而系統架構所涉及到的主題重點,不外乎中斷的支援處理與服務、錯誤的偵測與記錄或修正、虛擬通道(Virtual Channel)的機制、即時傳輸的機能、裝置的同步、資料交易鎖定的功能、重置與熱插拔的支援等,本文將以大樹法則、平台取向的觀點針對以上所提及各個機能的實踐細節與3GIO系統架構的內部精髓做深入探索。
無庸置疑地,中斷的機制是匯流排相當重要的一個環節,由於3GIO一改過去並列式匯流排的方式,採用了序列式或串列式的傳輸方式,無形之中,原本活生生存在實體上的中斷信號就消失,因此,必須要研擬出一套解決的替代方案才行。
我們先掌握一個很重要的觀念,就是為了維持與PCI軟體的一致互容性,3GIO介面所提供的中斷機制,大約可以歸納成兩大類。
方式一,不難體會就是模擬PCI介面中斷的信號,傳達至內建中斷控制器的晶片組中,通常就是「Root Complex」元件。因此,既存的軟體可以繼續沿用下去。只不過這些原本實體存在的接腳信號,換成頻帶內之訊息傳遞過去。因此,規劃了兩類訊息「Assert_INTx」與「Deassert_INTx」。其中的x是原本PCI匯流排的中斷A/B/C/D信號,讀者亦可將這些訊息視為虛擬的信號線。
而方式二的MSI中斷機制也不是3GIO新創造出來的東西。所謂「MSI capability」的功能,在PCI 2.3匯流排的規格中,早就存在了,只不過該項機能在PCI規範中是列為選項,且由於過去並沒有被活用化,3GIO就將現成的東西拿來善用罷了。基於這個緣故,要談論MSI就不得不回到PCI的規範裡;而且,先要說清楚一個很重要的處理方式,稱之為資料結構也沒關係,因為MSI就是仰賴它才能夠存活的,而這就是「Capabilities List」的構造圖2。
其中的8個位元「ID」欄位圖3就是由PCI-SIG組織來定義各個識別值的功能,比如說,當Capability ID等於05h時,就是支援MSI機制的涵義。至於裝置是否支援「Capabilities List」的判定也很容易,只需從狀態暫存器的位元四即可知曉。
基本上,MSI的理念實踐就是利用記憶體寫入的資料交易動作,也就是將特定的資料寫入特定的位址中,相信讀者定能了解,這就是中斷的向量位址(Vector)。
除了基本的MSI之外,規格中又定義了超強版MSI-X。不過,我們將焦點擺至MSI身上就夠了,畢竟,兩者的動作模式很接近。如果想預知MSI-X的底細,建議讀者可翻開PCI的規格。
其次,了解「MSI Capability Structure」也是基本的要務與功夫。每一個支援MSI機能的裝置,必須實踐自己的「MSI Capability Structure」。請參閱圖4,就可以約略了解。
當裝置要啟動中斷服務時,即是將「訊息資料暫存器(Message Data register)」的內容寫入訊息位址暫存器所指定的地方,並請留意訊息位址暫存器有32位元與64位元位址類別之分,而傳統的裝置可以自由支援兩者之一,然而3GIO的裝置卻明文規定僅能夠採用64位元位址的MSI機制,其中的訊息控制暫存器可以讓系統軟體來管控MSI。
回想過去,當我們在談論介面信號的錯誤處理時,大致上都是在「錯誤偵測」的議題上著墨,但是3GIO在錯誤的處理方式可就卓越許多,不僅在信號錯誤的處理機制中注入更多更細膩的處理方式,也提供了伺服器水準的錯誤處理能力。
有錯誤就要報告,然而錯誤報告圖5的等級層次在3GIO規格中,將之分類成兩大階層。之一,是基本的錯誤報告機能(baseline capability);之二,是進階式的錯誤報告機能(Advanced Error Reporting capability)。當然,後者所提供的服務已達高階處理的水平,是列為選項支援的機能,且應用於伺服器等級之類的產品。
再來澄清另一個觀念。3GIO規格中將錯誤的項目作分門別類,同時也明確定義出在實體層(PHY)中、資料連結層(Data Link layer)中與資料交易層(Transaction layer)中,各自會產生的錯誤事件,可稱之為錯誤表列(圖6)。
其錯誤分類方式採用兩個層次來描述,先歸類成「可修正的錯誤」(Correctable errors)與「不可修正的錯誤」(Uncorrectable errors),而「不可修正的錯誤」又細分成致命與非致命的錯誤圖7。至於如此分類的最大用意是方便於錯誤處理軟體的處理與彈性。而此處所說的「可修正的錯誤」是泛指3GIO協定在不遺失資料的情況下,可以修復資料,無須軟體的介入,只靠著硬體本身的處理就足夠了,一個典型的範例就是TLP封包的 LCRC錯誤發生之際,藉由資料連結層從丟(Retry)的過程來修復之。至於「不可修正的錯誤」當然是指對於衝擊到介面機能的錯誤,規格中並無任何描述或定義來修正這類的錯誤。
那麼致命與非致命的錯誤,兩者又該如何來區分?一個大原則必須掌握,那就是當傳送端與接收端的傳輸道路途徑已經是一條不可靠不能依賴的連結時,這就是致命的錯誤。
而只要是在傳輸連結正常的情況下所發生的錯誤,則被視為非致命的錯誤。致命的錯誤與PCI/PCI-X匯流排的SERR#信號產生,差不多有同樣的涵義。
繼之深論錯誤信號的呈現方式,3GIO提供了兩種方式,第一種方式是透過「完了狀態 - Completion Status」圖8、圖9的欄位,該欄位是坐落在完了封包標頭裡頭。
第二種方式,則是借助訊息資料交易之請求標頭圖10裡的訊息碼(Message Code)圖11。
錯誤的訊息是依據偵測到嚴重性,來將訊息傳送至Root Complex,Root Complex就會查看請求標頭裡的Request ID來確定來源出處,並向上傳達至平台的錯誤處理軟體。如果裝置不支援進階式的錯誤報告機能(Advanced Error Reporting Capability),就是依靠裝置狀態暫存器(Device Status Register)裡的位元來告知偵測到的錯誤。
虛擬通道圖12在3GIO江山裡是非常重要的機能,但是必須搭配一個稱之為流量歸類(Traffic Class)的東西,來支援不同的傳輸服務型態。簡而言之,TC/VC圖13的機制就是3GIO用來確保服務品質QoS(Quality of Service)的利器。
虛擬通道說白一點就是在同一條資料傳輸連結之下,產生多數個資料流。當然,多工的方式是無法避免的。但是,各個虛擬通道的流程控制卻是完全獨立的,誰也不能干擾到誰,最多可以支援的虛擬通道數目是8個。而流量歸類(Traffic Class)必須映射到各個虛擬通道上。TC0/VC0是預設的基本需求,也是固定的要件。超過VC0以上的配置是列為選項機能,如果支援多數個虛擬通道,就有義務要實踐「PCI Express Virtual Channel Capability」結構。
無論是虛擬通道還是流量歸類,都有優先順序的設定問題,而這完全是掌控在您所採用的策略機制而定,可以由控制軟體來處置。
虛擬通道的識別就是透過Virtual Channel Identification(VC ID)來辨認。但是,請留意,如果在資料交易層封包TLP圖14中似乎看不到VC ID的欄位,反而是存在流量歸類的欄位。
有趣的問題就來了。既然TLP封包中未指明是經由哪一個虛擬通道來載送,那究竟會不會出問題呢?關鍵就在於TC/VC的映射關係圖15。相同的流量歸類是不會對應到不同的虛擬通道上,但多數個流量歸類TC卻可以對應至同一個虛擬通道。即以圖16為例,存在於端點裝置(Endpoint)與切換裝置 (Switch)之間的下游埠,僅使用一個虛擬通道VC0,所有的流量歸類TC(0-7)均透過此虛擬通道來傳送。而切換裝置與Root Complex之間,使用兩個虛擬通道VC0與VC1,TC7走VC1途徑,TC(0-6)則是透過VC0。
由此案例可以清楚地看出,下游埠之連結是很典型多數個TC映射到單一VC0的配置組態。如此的安置,究竟能夠帶來什麼好處呢?流量歸類的數值,牽涉到次序流通的處理,服務的彈性與流量確保就可以實現。
經過以上討論,可以輕易地看出,相同連結的兩端一定要維持相同的TC/VC映射關係圖17,也就是系統軟體在完成組態的過程之後,將裝置兩端的TC/VC映射關係建立起來圖16。
虛擬通道的機制中,存在有一個虛擬通道仲裁(VC Arbitration)的觀念。此概念不是很容易理解,而欲說明該觀念,或許先從切換裝置的基本觀來說起,會比較清楚。一個典型具有三個連接埠(Port)的切換裝置,從資料流通的面向來觀察的話,有如圖19所示。
每一個連接埠皆會存在資料的傳送出口(Egress)與接收資料的入口(Ingress)。假設一個單方向的案例來說明資料流如何從切換裝置的入口轉接到出口。圖20的例子是描述切換裝置的連接埠0與連接埠1進來的資料流如何導引到連接埠2。首先,目標出口埠(Egress Port)的判定是依據TLP封包標頭中的位址路由資訊來決定。其次,出口埠的虛擬通道當然是依據該埠的TC/VC映射關係來取決。因此,從不同連接埠來卻朝向相同出口埠虛擬通道的資料交易,必須仰賴仲裁的方法,才能夠順利將資料交易傳遞給彼端。這道步驟在規格上是以「Port Arbitration」來稱呼。一旦資料流順利到達出口埠之虛擬通道,由於出口埠之連結是由多個虛擬通道的多工方式來傳送資料流,觀念上來說,這就是等於「VC Arbitration」。所以說,一筆資料交易流經切換裝置裡的轉換是經過「Port Arbitration」與「VC Arbitration」兩道歷程才能到達正確的彼岸。
當建立起「VC Arbitration」的觀念之後,我們就可以來進一步地探索該觀念的落實方式。相信讀者應該能夠聯想到,這其實就是優先權或優先順序的問題,至於實踐之道,可以有三種方式可供選擇。
而「Port Arbitration」能夠採用的方式,可以是硬體固定式的機制,比如說平等輪流式,也可以採用可以編程(Programmable)的策略。完全依據設計者對於頻寬需求的狀況來決定。
說到等時的資料載送(isochronous transfer)圖22,必須有滿足的充分必要條件,不外乎兩件要務。之一,對於資料頻寬必須有足夠的承諾,也就是在一定時間之內得將資料傳送過去。第二,就是對於資料傳輸服務的等待時間(Latency)的考量。
前面所述及的TC/VC機制,也就是來達成即時資料載送的手段與策略。他必須仰賴軟體在點對點的請求端(Requester)與完了端 (Completer)做好適當的組態設定。對3GIO而言,有兩種類型的等時資料載送形式,一個是端點裝置與Root Complex之間的通信,另一個則是所謂對等式的傳輸方式,也就是端點裝置與端點裝置之間的通信。
就第一種情況來說,其實就是針對Root Complex元件作記憶體的讀寫請求動作,Root Complex元件做負責完了交易的處理。
為了確保等時資料傳輸能夠滿足上述的兩個必要條件。請求端(Requester)與完了端(Completer)兩端必須建立一定的默契關係。一來可以確保頻寬的預留,二來也可以調節在傳輸連結途徑上之資料流量。無形之中,也就解決了頻寬使用不當的問題。比如說,使用過度造成其他傳輸沒有資源可用,或者是流程控制失常,造成資料流的過於堵塞。基於此因,系統軟體對於等時資料傳輸的頻寬控制就顯得相當重要。有一個數學的基本公式,用來說明頻寬配置如何來算出其定量的關係。
BW = BandWidth= N*Y/T
上式的涵義是指在一特定的時間T內,有N次的資料交易傳輸,而且每一筆資料交易傳輸的資料承載量(Payload)為Y。然而,請特別留意上面的公式並未能指明另一項的重要參數,那就是潛伏等待時間L(Latency)。為了實踐以上這些需求。3GIO於「Virtual Channel Capability Structure」中,提供了一個參考時脈(Reference Clock)的欄位,主要的用意是將特定的時間T,均勻地分布成虛擬的時序間隔t(Timeslot)。
如此的安排,有什麼好處嗎?只要能夠控制在每一個時序間隔t之內,僅僅允許一個等時資料載送的封包,這麼一來比較能夠促成頻寬均勻分佈的等時傳輸。好比說,參考時脈(Reference Clock)的欄位等於00b時,意味著虛擬的時序間隔t為100ns。假設WRR Port Arbitration的表格大小為128時,也就是說會存在有128個虛擬的時序間隔t,那麼T就等於12.8μs,而資料承載量(Payload)Y 的法則很簡單,就是不能超過「Max_Payload_Size」的設定。
最後一個攸關等時傳輸頻寬控制的重要觀念就是3GIO終端裝置的頻寬配置是透過系統軟體與裝置驅動程式兩者之間溝通後的結果。至於如何來進行溝通,不在規格的範疇裡,可能需要實際在撰寫時,累積一些實務的經驗,才能體悟一些 Know-How。
裝置同步與被鎖定資料交易的問題
所謂的裝置同步(Device Synchronization)其實就是一種停止的機制,其主要的用意就是要確保系統中不存在懸而未決、尚未處理完畢的資料交易,列舉一兩種場合來闡明為何需要這樣子的處理機制,場合一,當某種因素導致系統操作會去更改匯流排編號時,也就是更動到「Requester ID」的場合。然而,請求端與完了端彼此之間的資料交易卻是尚未結束之際,必然會產生不良的後果,結果難料。場合二,在熱插拔協定的移除之際,也必須要確定沒有尚未處理完畢的資料交易。以上所言等情況,皆需要裝置同步(Device Synchronization)的機制來克服這個問題。但是請謹記在心,該機制的實踐所牽扯的到範圍從裝置硬體、驅動程式到系統軟體,都必須合作無間才能夠順利達成。
至於所謂的鎖定式的資料交易(Locked Transac
-tion),意指一種特有專屬的資料交易處理方式,為了讓傳統軟體在存取輸出入裝置時,不至於產生死結(Deadlock)動彈不得的狀況,才允許傳統裝置支援該類資料交易。但是,所有的3GIO端點裝置與橋接器,均不得送出這種資料交易的請求,3GIO端點裝置也不允許支援鎖定式資料交易的存取。比較特殊的情況是Root Complex可以送出鎖定式的請求到3GIO匯流排上,方法很簡單,就是在標頭上設定LOCK位元即可。至於執行的順序,建議參考規格的描述。鎖定式資料交易的激起是由主機端處理器來產生,一旦鎖定關係的建立之後,Root Complex與傳統裝置或橋接器(Bridge)的連接資料交通,來自別人的存取不得介入,會被阻斷掉。至於鎖定關係的解除,乃是依靠「Unlock Message」的訊息傳輸來終結掉。
敬請記住,3GIO端點裝置是禁止支援鎖定式資料交易,如果碰到「MRdLk」之類的請求,就以「Unsupported Request」的狀態來回應之。而傳統的裝置,固然允許支援鎖定式資料交易,但是並不鼓勵使用。
任何的介面或是匯流排必然會有談到重置(Reset)的細節與處理。3GIO在此方面略顯繁瑣,1.0版所定義的「Power Good」重置,到了規格1.0a版,更名為「基本重置 - Fundamental Reset」圖24。
先來認識3GIO所提供的三種重置方式,分別是冷重置(Cold reset)、暖重置(Warm Reset)與熱重置(Hot reset)。當主電源開啟之後產生的基本重置,就是冷重置(Cold reset)。如果在某些情況下,不用移去主電源或重新開啟主電源,靠著硬體的激發產生的基本重置,則是暖重置(Warm Reset)。而熱重置(Hot reset)就單純多了,透過頻帶內的訊息進行重置,就是熱重置(Hot reset),比如說,資料連結層所報告的「DL_Down」狀態,與熱重置的涵義就很神似。
而當進行任何一種重置之後,所有的連接埠(Ports)與狀態機器,都必須歸返到盤古開天起始時的數值。如果,「基本重置 - Fundamental Reset」之後,實體層就必須對雙方連結途徑作調訊處理,也就是連結初始化與流程控制的初始化過程,使得傳輸的連結途徑可以載送資料封包。然而,請勿忘記裝置需要時間的處理與回應。因此無論是系統這一方,還是裝置那一端,均有時序上的定性與定量規約。就元件裝置端來說,於「基本重置 - Fundamental Reset」之後的80ms之內,必須進入連結調訊(Link Training)之狀態。
當完成連結調訊之後,也就是表明跳入「DL_Active」的狀態,元件裝置端就必須能夠接收DLLP與TLP的資料封包。而為了讓裝置端進行內部的初始化工作,系統軟體在重置之後,至少要等待100ms以上的時間,才能夠對裝置進行組態請求的送出。Root Complex與系統軟體必得允許在裝置重置之後一秒鐘,才判斷裝置是否成功完成組態請求。
有一隻PERST# (Input to add-in card)的信號線,可以用來作為冷重置(Cold reset)、暖重置(Warm Reset)的參考點,也可以是主電源來到的指示器。
3GIO的架構是徹底允許熱插拔的,也是很重要的一項特徵,但是必須有配套的措施才能夠精確無誤地實踐這個機能。大家可能都忽略老早的PCI時代,就存在有一份「PCI Standard Hot-Plug Controller and Subsystem Specification, Rev 1.0」的規範,換句話說,PCI介面也做得到,除了工業用電腦之外,一些作主機板個人電腦平台的工程師,一時大意或無這方面的需求,也就不知道有此規範的存在。
3GIO的熱插拔並不是大革新,而是舊瓶新裝,但是裝飾的更細緻、更人性化。為了徹底實踐該機能,規格中特意規範了一個標準使用模式(standard usage model),列舉一些要素,讓設計者在實務上有所遵循。
為了達成以上這些特徵,在「PCI Express Capability Structure」裡定義了一堆的暫存器與訊息,實作之時,務必遵循。