現在市面上幾乎可見到所有的PCI Express(PCI-E)相關產品,包括晶片組主機板、介面卡、插拔大會(Plugfest)的舉辦,甚至是市面上的英文原文參考書,都是以2003年4月發布的1.0a版為基準...
現在市面上幾乎可見到所有的PCI Express(PCI-E)相關產品,包括晶片組主機板、介面卡、插拔大會(Plugfest)的舉辦,甚至是市面上的英文原文參考書,都是以2003年4月發布的1.0a版為基準。但在2005年3月更新至1.1版本,此版本到底更動哪些規格,會不會衝擊到原來的設計,相信都是眾所關心的焦點。
PCI-E原本就是一項很艱難的技術,若是站在傳輸協定面向來看,PCI-E幾乎算是複雜度上的最高級。
雖然在Devcon-2005的開發者會議上,有針對1.1版的主要更新作簡報,但是仍不容易了解。為了使閱讀更系統化而不覺得厭煩,將不逐點描述,而是將從上而下的觀點來談論主要更動之處。
在中斷處理方面,除了保有既有的訊息訊號中斷(Message Signaled Interrupt, MSI)機制,多增加MSI-X的中斷方式(MSI-X Capability)。在PCI2.3中,就有很清楚的記載MSI機制,基本上,它是一種記憶體寫入(Memory Write)的資料交易。而MSI-X其實就是MSI機制的加強版,在PCI3.0中有所描述。
PCI-E中規範的開關元件不能將封包作分割,而1.1版新規格中,允許對等式資料交易連接的根聯合體(Root Complex)元件,可以有能力將封包切割成較小的格式,以滿足不同匯流排區段之所求(圖1)。
另外,在根聯合體元件的定義部分增加功能性,允許根聯合體元件中內建端點裝置(Endpoint)以及一個事件收集器(Event Collector)的區塊。整合端點的涵意就是從此之後,根聯合體元件也可以視為端點裝置,其中,事件收集器的區塊可用來終結內部端點所產生的電源管理事件(Power Management Event, PME)訊息或錯誤訊息(圖2)。
如此一來,PCI-E連接型態就有可能存在三種端點裝置,即沿用舊PCI規範的舊式端點(Legacy Endpoints)、使用PCI-E新機能的原生PCI-E端點(Native PCI-E Endpoint),以及追加的內建整合端點的根聯合體元件。
無論是3DW或4DW之封包交易層封包(TLP)的標頭,其第七個位元組皆規畫兩個欄位,分別是最後一個DW的位元組致能(Byte Enable)以及第一個DW的位元組致能,其使用規則不變。新追加的規定是所有的不具QW(1QW=2DW=8Byte)對齊的記憶體請求交易(Memory Request),若是其長度為1QW的場合,第一個DW與最後一個DW的位元組致能,必須呈現連續性。
請求交易的TLP含有標籤[7:0]之欄位,對於所謂Posted資料交易而言,並未定義,可以是任何數值。如果廠商自行定義的訊息(Vendor Defined Messages)用來與PCI-X裝置的ID訊息互通,那麼該欄位的內容就有所限制。
此外,新增CRS Software Visibility選項機能,該項機能的致能必須仰賴一個新的組態位元,就坐落於根聯合體元件的「PCI-E Capability」區塊結構中的「Root Control Register」暫存器中(圖3~5)。
先來回顧CRS(Configuration Request Retry Status)的內在意涵,猶記得在PCI-E的規範中,任何記憶體讀取請求、IO讀寫請求,或組態讀寫請求都會有完整TLP封包的回應,其中的三個位元完成狀態的欄位,即是完成狀態碼(Completion Status Code)。所能顯示的狀態總共有成功完成(Successful Completion, SC)、不支援要求(Unsupported Request, UR)、CRS及CA(Completer Abort)等。其中的CRS是指進行組態請求時,目標端離線,須稍後重新再試。該項新特徵允許根聯合體來告知軟體收到CRS狀態,軟體就可以去處理其他的工作。
若是所接收的TLP結束具有EDB符號,而且LCRC沒有依照規格的指定反轉。同時,「NAK_SCHEDULED」的旗幟在清除狀態下時,設定它並立即準備回應NAK資料連結層協定封包(DLLP)。
若是所接收的TLP封包結束具有EDB符號,而且LCRC沒有依照規格的指定反轉。同時,「NAK_SCHEDULED」的旗幟在清除狀態下時,設定它並立即準備回應NAK DLLP封包。
從QoS/TC/VC角度觀察針對多功能裝置(Multi-function Devices)提供一個多功能虛擬頻道(Multi-Function Virtual Channel, MFVC)能力暫存器(Capability Register)的架構,係一選項(Option)機能。
攸關多功能裝置在等時傳輸(Isochronous Transaction)的支援,MFVC能力不可以對裝置送過來的等時交易請求,施予任何反壓(Backpress)手段,來抑制封包傳送。
在PCI-E世界裡,所謂的流程控制(Flow Control)是指接收端有緩衝器空間時,會利用流程控制專用之DLLP來告知傳送端。然後,傳送端才可以丟出TLP(圖6)。
在使用InitFC1以及InitFC2兩個DLLP進行流程控制的順序,務必要遵守P(Posted Requests)、NP(Non-Posted Requests)及CPL(Completions)的優先順序關係。InitFC1作為告知用途,InitFC2則是用來確認。
建議當匯流排上沒有任何TLP或DLLP往來之際,多使用流程控制封包。當在進行InitFC2階段,資料交易層(Transaction Layer)必須擋住任何TLP往下層丟。
在正常情況下,端點裝置對於「Posted Request」,不得逾越或延遲該類請求所需的最高限制時間10μs。涵義可能跨及有兩個層次。第一,當端點裝置接收到「Posted Request」請求之後,必須設計在10μs之內,送出流程控制的資訊。第二個層次,若是裝置無法處理下一個「Posted Request」,那麼軟體就要確保在10μs內不會送出。
多功能裝置若是接收到封包,其TC欄位沒有映到MFVC能力架構中致能的虛擬頻道,就視為「Malformed TLP」之錯誤。
原本列為選項之連結調訓錯誤(Link Training Errors)之偵測,已經從規格中正式移除,因此,原本與「Advanced Error Capability」相關的位元,就不再有規範及意義。此外,必須去偵查8b/10b編碼是否有誤,若有誤,則以實體層接收錯誤來呈報。在原來裝置能力暫存器(Device Capability Register)中,則加入「Role-Based Error Reporting」位元(圖7)。
若是在資料交易層(Transaction Layer)發現多項錯誤,一個接收的TLP建議僅僅呈報一項錯誤。
在資料連結層中,新增加一項「Surprise Down」的錯誤狀態,錯誤的偵測也是列為選項,預設的錯誤等級則是致命(Fatal)的錯誤。通常,這項錯誤的發生是由實體層來告知資料連結層「Physical LinkUp = 0」之現象,資料連結層就必須將狀態從「DL_Active」轉移到「DL_Inactive」,此即視為「Surprise Down」的錯誤狀態。「Advance Error Extended Capability」暫存器群中就有相因應的位元規範,至於軟體如何知曉裝置是否支援這項機能,只須讀取「Link Capability」暫存器中的「Surprise Down Error Reporting Capable」位元即可(圖8)。
為了顯示出「DL_Active」的狀態,在連結狀態暫存器中新追加「DLL Link Active」位元,也是列為選項,透過讀取「Link Capability」暫存器中的「DLL Active Reporting Capable」位元即可知道支援與否(圖9)。
若就實體層的邏輯部分而言,須偵測8b/10b解碼錯誤,並呈報為實體層接收錯誤。若就實體層的電氣部分,嶄新的時脈恢復機能有所描述,因此,新的眼狀圖標準則重新再定義(圖10)。
裝置在基本重置(Fundamental Reset)之後,必須在20ms內進入檢測狀態,而先前1.0a規格是80ms。
軟體在基本重置之後等待100ms,才開始進行組態的動作。任何一種重置,無論是冷重置(Cold Reset)、溫重置(Warm Reset)、熱重置(Hot Reset)還是DL_Down,對於資料交易層都是一樣的效應。
原本在規格中列為選項的連結調訓錯誤(Link Training Errors)已經從規格中移除,因此,原本在「Advanced Error Capability」暫存器群中的相關位元,其定義就沒有效益可言。
允許連接埠中的各個傳輸巷道,可以用不同的速率來傳送,比如說有些傳輸巷道用2.5Gbps,有些傳輸巷道則是用5Gbps的速率。
「Link Control Register」的位元七「Extended Sync」有新的詮釋解讀,若是設定該位元,身處於L0s狀態的裝置在進入L0狀態之前,先傳送額外的指令(Ordered Sets)。
PCI-E的電源管理實在難以了解,首先,PCI-E多了一種主動狀態電源管理(Active State Power Management, ASPM)模式。簡單來說,就是新增特殊的低電壓狀態。其一為L0s(L0 Standby),所有的PCI-E裝置大多須支援,此種狀態的特徵就是回到正常L0運作狀態的等待時間(Latency)非常短。由於該狀態的進入是連結之單方向,傳輸埠只要偵測到連結有一段的閒置週期(Idle Time),就會激發,將L0轉入L0s狀態。
其二乃是L1狀態,比L0s更省電,但它是選項。ASPM機能的支援與否,就必須透過連結能力暫存器的設定(圖11)。
當裝置要跑到低電源模式時,可以依靠軟體進入D1/D2/D3hot等狀態,而裝置也須將連結轉移到L1狀態。反之,裝置就透過軟體組態存取的方式,或是激發電源管理事件的方式來回到L0運作狀態(圖12)。
固然列為選項的L1狀態比起L0s能夠更省電,但是付出的代價也更高,而且,是連結的雙方向進入,雙邊裝置的資料交易層就不能夠動作。要留意的是進入該狀態是由下游端元件來激發,比如說端點裝置或是開關裝置的上游埠(圖13)。
PCI-E1.1的「L2/L3_Ready」被定義為虛擬的轉換狀態,準備讓連結移除電源或時脈。當系統移除Vcc以及時脈之後,如果輔助電源(Vaux)依然還在,就是進入L2狀態。反之,若是連輔助電源也關掉,當然就是進入L3狀態。
之前,需要PCI PM電源管理軟體將裝置放入D3hot狀態,再經過「PME_Turn_Off/ PME_TO_Ack」的交握處理過程,裝置才會切入「L2/L3_Ready」狀態,而連結的轉換程序為「L0→L1→L0→L2/L3_Ready」。
而最新的PCI-E1.1可以在裝置的任何D狀態(D0、D1、D2、D3hot)情況下,軟體可以激發「PME_Turn_Off/PME_TO_Ack」的交握處理,裝置直接轉入「L2/L3_Ready」。簡單來說,就是允許從L0狀態直接轉入「L2/L3_Ready」狀態。
同時,1.1版本也新增一個嶄新的狀態「LDn - Link Down」,這個也是轉入狀態,是進入L0狀態的切換點。能夠轉入LDn狀態的僅能有L2、L3、L2/L3_Ready等狀態,而從LDn轉移到L0狀態,就是連結的再度初始化,當然也就是必須經過「LTSSM Detect」狀態。
在LDn狀態裏,Vcc電源以及參考時脈均已開啟,至於裝置內部的的PLL鎖相迴路可以開啟也可以關閉,依設計而定(圖14)。當連結處於L1或L2/L3_Ready之電源狀態時,參考時脈必須開啟,這個特徵對於一些須要耗電、低攜帶式裝置的應用,顯得特別珍貴。
「Link Capability Register」中新追加的位元十八「Clock Power Management Capable」,表示裝置有能力在L1或L2/L3_Ready之電源狀態關閉「REFCLK#」訊號(圖15)。
另外,在「Link Control Register」的位元八也新追加「Enable Clock Power Management」的啟動控制功能(圖16),若是該位元設定為零,清楚表示時脈電源管理被關掉,必須將REQCLK#信號維持在低電位,此位元的預設值乃是設定為零。
當裝置處於D1或是D2的電源狀態下,可以接受的TLP資料交易封包唯有組態要求(Configuration Request)以及訊息要求(Message Request),其他所接受的要求一率以不支援要求來處理。至於裝置處於D3hot的電源狀態下,可以接受的TLP資料交易封包也是唯有組態要求以及訊息要求,其他所接受的要求以不支援要求來處理,這點則是列在選項。
連結控制暫存器的主動狀態電源管理控制位元[1:0],修改預設數值僅能在00b,也就是意味著L0s以及L1狀態的進入是失能的。
除了裝置端點可以發起進入ASPM L1狀態的談判溝通,開關裝置的上游埠也可以做到相同的請求。
通常,PME以及熱插拔事件的中斷,是共同分享相同的MSI或MSI-X的向量位址,該向量位址「PCI-E Capabilities Register」中的「Interrupt Message Number」欄位。
原本定義的「Attention Indicator On/Off/Blink」、「Power Indicator On/Off/ Blink」燈號指示,以及「Attention Button Pressed」訊息,全部拿掉不再支援,一些相關的暫存器當然就沒有定義可言。若是堅持設計維持在1.0a版本,當然就可以繼續沿用下去,在此強烈建議能不用就盡量不要用。
先前已經提過在連結狀態暫存器的位元十三新增加「DLL Link Active」位元,用來呼應資料連結層的「DL_Active」狀態(圖17)。就熱插拔(Hot Plug)事件來說,該位元可以讓軟體判斷裝置是否已經上電(Powered)。
這個機能也是列為選項,支援與否可以從讀取「Link Capability」暫存器中的「DLL Active Reporting Capable」位元得知。
若就「PCI-E Extended Capabilities」機能來觀察,很明顯加入不少東西,還好都是選項。
‧0001h = Advanced Error Reporting Extended Capability
‧0002h = Virtual Channel Extended Capability implemented in a device without an MFVC structure
‧0003h = Serial Number Extended Capability
‧0004h = Power Budgeting Extended Capability
‧0005h = Root Complex Link Declaration Extended Capability
‧0006h = Root Complex Internal Link Control Extended Capability
‧0007h = Root Complex Event Collector Endpoint Association Extended Capability
‧0008h = Multi-Function Virtual Channel (MFVC) Extended Capability
‧0009h = Virtual Channel Extended Capability implemented in a Multi-Function device with an MFVC structure
‧000Ah = RCRB Header Extended Capability
‧000Bh = Vendor-Specific Extended Capability