N.T.開講:掌握3GIO之電源管理機能

2004-03-23
回顧昔日PCI介面的時代,存在一份「PCI Bus Power Management Interface Specification Revision 1.1」的規格,簡稱為「PCI-PM」。此外,也有一份耳熟能詳的「Advanced Configuration and Power Interface Specification, Revision 2.0」,簡稱ACPI,而裝置的電源管理狀態就是D0-D3。
回顧昔日PCI介面的時代,存在一份「PCI Bus Power Management Interface Specification Revision 1.1」的規格,簡稱為「PCI-PM」。此外,也有一份耳熟能詳的「Advanced Configuration and Power Interface Specification, Revision 2.0」,簡稱ACPI,而裝置的電源管理狀態就是D0-D3。  

而3GIO的電源管理全名為「PCI Express power management」,簡稱為「PCI Express-PM」。「PCI Express-PM」與上面兩者完全相容,這些電源管理的極致化目標,自然就是做好節約省電的控制,並在理想狀況下,不使用時就進入睡眠或中止模式,一旦要回復過來,當然也必須透過喚醒(Wake)的歷程。  

3GIO定義了L0、L0s、L1、L2、以及 L3等連結狀態,自然就是電源管理的具體實踐方式。而所謂地「PME-power management event 訊息」,就是喚醒的運用之道。  

3GIO之中,另闢有一種稱之為「ASPM - Active State Power Management」的特殊機制,即使裝置處於D0的情況之下,也可以進一步達成省電之道。這點務必要掌握,畢竟是新介面所導入的嶄新特性。  

不同於PCI-PM規範是定義介面上的電源管理狀態,3GIO卻是定義了連結電源管理狀態圖1。不難想像,這些連結電源管理狀態,傳統的PCI-PM軟體自然是看不見的。這些連結電源管理狀態的各個含意分別是:  

‧L0狀態圖2,亦即主動式狀態(Active state)。所有的3GIO介面上的資料交易皆是在此狀態下來進行。理所當然地,ASPM與相容的PCI-PM是必須支援L0。  

‧L0s圖3狀態可以看成一種預備或待命的節省電力狀態,但是卻可迅速回復,相容的PCI-PM根本難以對應,可是ASPM卻是必須必須支援L0s。畢竟, L0s狀態的誕生可以視為專為ASPM量身打造而設計的機制。在L0s狀態下,所有的主要電源、零件參考時脈與內部的PLL回路都不能關掉。然而,TLP 與DLLP資料交易的進行卻不許可,而3GIO的PHY實體層就提供了該機制,可以讓L0s快速地遷移至L0狀態,讓Tx端保持在「Electrical Idle」狀態。  

‧L1狀態圖4為比L0s狀態更為省電的待命模式。相容的PCI-PM必須支援L1,而對ASPM來說卻是 選項。在此狀態下,平台上的主要電源、零件參考時脈必須維持,而內部的PLL回路卻可以關掉,來達成進一步省電的目標。很明顯地,其回復時間自然比L0s狀態久,一般的範圍是ms級的層次。不過,TLP與DLLP資料交易的進行在此狀態下是不許可的,要讓Tx端保持在「Electrical Idle」狀態。  

‧L2/L3 Ready狀態是可看成虛擬的狀態協定,無妨可以觀想成切換、轉換點。  

‧L2狀態圖5,此狀態之下主電源與參考時脈是被關閉掉,以進入高度省電的模式下。至於喚醒邏輯部分的支撐,就需仰賴輔助電源Vaux;當然,更不可能進行TLP與DLLP資料的交易。請留意,該L2狀態的支援與否是選項。  

‧L3狀態圖6,意思是指沒有連結的含意,亦即零電源的狀態。  

若仔細研讀規格,將可發現有一個觀念凸顯出3GIO電源管理的特徵,就是除了L2/L3 Ready狀態轉進L2、L3之外,連結電源管理的轉換皆會經過L0狀態。我們將系統進入睡眠模式的歷程步驟描述一次之後,就可以理解這個觀念。  

步驟一: 系統軟體指示下游埠的裝置進入D3hot狀態。  

步驟二: 下游埠的裝置啟動連結進入L1狀態。  

步驟三: 系統軟體會引導Root Complex放送「PME_Turn_Off」的訊息,目的就是要移去主電源。  

步驟四: 該訊息將迫使連結先切回至L0狀態,用來傳送,讓下游埠的裝置可以回應「PME_TO_Ack」訊息。  

步驟五: 在送出「PME_TO_Ack」訊息之後,下游埠的裝置會激起L2/L3 Ready轉換協定。  

如果以流程演算式來觀看,則有下面之流程:  

「L0 --> L1 --> L0 --> L2/L3 Ready」  

PCI-PM機制的梗概  

誠如之前所言,3GIO支援所有PCI-PM之裝置電源管理狀態。而眾多裝置必須支援D0與D3狀態,D3狀態又可以細分成D3hot與D3cold狀態,D1與D2的支援乃是選項(Option)。這些D狀態就是大家耳熟能詳的「Device Power Management States」。  

「PCI Bus Power Management Interface Specification」該份規格,對於PCI-PM的底細有清楚的記載。官方網站上,應該可以尋得。  

下面是3GIO與D狀態之間的互動關係:  

‧D0狀態。所有的3GIO裝置都必須支援D0狀態。然而,D0狀態可以再度細分成兩個子狀態:D0uninitialized狀態與D0active狀態。當3GIO裝置投入電源之後,預設先行進入D0uninitialized狀態,經過初始化歷程與組態的洗禮完成之後,才會進入D0active狀態,系統自然會致能記憶體空間、輸出入空間與匯流排主控位元。  

‧D1狀態。該狀態是列為選項,除了PME訊息之外,連結上之裝置不能啟動TLP。  

‧D2狀態。該狀態也是列為選項,除了PME訊息之外,連結上之裝置不能啟動TLP。  

‧D3狀態。該項也是必須支援的項目,當裝置支援從D3發出PME訊息的機能時,規定上必須同時支援D3cold與D3hot狀態。而從D3hot狀態轉進D0狀態,所需的最少回復時間為10ms。  

D3cold與D3hot狀態的區別認知也是很重要的一環,因為當電源被徹底移除之後,就是進入D3cold狀態,必須再度歷經電源開啟次序的流程,然後才會進入D0uninitialized狀態。在這個時間點上,軟體必須實踐完整的初始化歷程,復原到D0active狀態。如果裝置支援D3cold接受喚醒的機能,就必須維護「Power Management Status/Control register」中的PME內文,作為PME服務常式回復之用。  

D3hot狀態必須反應組態的存取,比如PME_Turn_Off/PME_TO_Ack的協定。可以藉由移除電源,進入D3cold狀態,也可使用軟體的設定,進入D0unini-tialized狀態。因此,連結的電源管理狀態,是依據下游端裝置的D狀態來決定的。圖7範例說明了當下游端裝置進入功率節約狀態,比如說D1、D2或D3hot狀態時,連結是歷經怎樣的過程來轉進L1狀態的。而L1狀態的離開跳進L0狀態圖8,則可以由任意一方來開動。  

還有一個重要的議題,那就是PME機制之實踐。PME三個英文字代表著「Power Management Events」。3GIO中的PME機制自然與PCI-PM規格中所定義的PME機制相容。無妨如此來說,PME機制是3GIO裝置,用來請求PM狀態更易所採用的手段,大多是在節約狀態下,用來甦醒系統。  

連結喚醒機制的主要精神,是提供一種辦法讓平台間重新建立電源與時脈。依據規格上的規範,有兩類的喚醒(wakeup)機制被定義著。其一為標示 (Beacon)信號機制圖9;其二乃是WAKE#信號機制圖10。所謂的標示(Beacon)機制是利用頻帶內(In-band)信號的傳遞方式。而 WAKE#機制卻是採用旁頻帶(Side-band)的信號,也就是借用實質上存在的實體介面信號。  

使用喚醒之前機制,裝置皆必須靠軟體去設定PMCSR暫存器(Power Management Control/Status register)中的PME_En位元。圖11中的Case 1,WAKE#信號直接連到電源管理控制器,現象比較單純。但是,圖11中的Case 2,WAKE#信號是接續到開關裝置,就必須多出一道手續,將WAKE#信號轉換成標示(Beacon)信號。  

PM_PME Messages是隸屬於一種「posted」的TLP封包,用來告知電源管理軟體,在整個連接型態中的哪一個部位,要求PM狀態的改變。PM_PME Messages如同其他系統電源管理訊息一般,透過泛用型的TC #0,PM_PME Messages也都是引導至Root Complex的方向。若以狀態控制流程圖圖12來體驗PM_PME的遞送,是比較容易理解的。  

3GIO特有的電源管理策略  

通常所說「Native PCI Express Power Management Mechanisms」乃是3GIO獨特採用的電源管理方式,依據邏輯來推斷,當然需要嶄新的軟體來支援撐腰,才能發生效用。另外,所有的3GIO裝置,都必須支援ASPM(Active State Power Management)的起碼要求。當裝置處於D0的狀態,也就是完全移動的狀態,其上游端的連結,也是處於L0的狀態,而ASPM(Active State Power Management)圖13的基本精神所在之一,就是讓D0狀態的裝置,可以有辦法來降低連結的功率耗費。  

ASPM定義有兩種待命連結狀態。L0s狀態圖14是時間切換、等待最為快速的策略,所有的3GIO皆必須該L0s連結狀態。另外的L1狀態圖15則是高效率、省電的模式,等待時間還不錯。然,L1的支援與否,對於ASPM來說,卻是列為選項。  

依據規定,3GIO裝置有責任義務,必須報告從L0s或L1切換至L0所需的時間,專用術語就以「exit latency」來稱呼。而當系統跑在舊版的作業系統時,也是可以透過BIOS程式碼來開啟或關閉ASPM的功能。  

L1狀態在ASPM下是一個選項,提供更為節約的方式,付出的代價就是時間較長的「Exit Latency」。對於軟體來說,這個時間是可以取得的參數。因為只要透過「Link Capabilities」暫存器就可以做到。至於,所用策略何時進入ASPM的L1狀態,由使用者自行規劃。  

針對L1狀態在ASPM,特別提供了三個電源管理的訊息。  

‧PM_ Active_State_Request_L1 : 隸屬於DLLP封包的一種。  

‧PM_ Request_Ack : 也是隸屬於DLLP封包的一種。  

‧PM_Active_State_Nak : 則是隸屬於TLP封包的一種。  

ASPM之L1狀態的協商法則,用圖16、圖17來一窺內部流程的端詳。至於L1狀態的逃離就顯得簡單許多,沒有什麼協商談判流程。一個開關裝置當下游端開始L1狀態離開切換時,上游端連結的轉換不得超過1μs。以圖18為範例,有三個連結,端點C在時間點T轉進L0狀態,則連結3需要在T+32的時間點進入L0狀態。因為,端點C的耗掉時間為T+8,開關裝置B則須T+32。以此類推,最終連結1的完成時間為T+34,也就是說,總共有「34μs」的遲延時間。  

探索ASPM組態的內部  

每一個3GIO元件對於ASPM的支援與否,必須在ASPM Support組態的欄位裡頭的位元設定,報告透露支援的程度概況。L0s狀態是絕對必要,但是在D0active狀態下,對於L1狀態的支援與否,卻是選項。「ASPM Support」組態的欄位裡頭的位元設定:  

‧00b - 保留用  

‧01b - 支援L0s狀態  

‧10b - 保留用  

‧1b - L0s 與 L1的支援  

前面不斷提及L0s狀態與L1狀態的「Exit Latency」,也就是轉進L0狀態所需的潛伏等待時間,每一個3GIO元件裝置的連接埠(port)有責任義務要告知這個數值。設定的所在處就在於「L0s Exit Latency」與「L1 Exit Latency」組態的欄位三個位元裡。「L0s Exit Latency」的位元編碼涵義如下:  

‧000b - 小於64ns  

‧001b - 64ns到128ns之間  

‧010b - 128ns到256ns之間  

‧011b - 256ns到512ns之間  

‧100b - 512ns到1μs之間  

‧101b -1us到2μs之間  

‧110b -2us到4μs之間  

‧111b - 大於4μs  

如果有支援L1狀態,「L1 Exit Latency」的位元編碼涵義如下:  

‧000b - 小於1μs  

‧001b - 1us到2μs間  

‧010b - 2us到4μs間  

‧011b - 4us到8μs間  

‧100b - 8us到16μs間  

‧101b -16us到32μs間  

‧110b -32us到64μs間  

‧111b - 大於64μs  

基本上,這兩個欄位的存在,一點都不難理解,因為為了更謹慎的措施,端點也有兩個與之相為呼應的欄位,分別是「Endpoint L0s Acceptable Latency」以及「Endpoint L1 Acceptable Latency」,置放在「Link Capabilities」暫存器中。電源管理軟體針對各個元件對於ASPM的致能,實乃透過「ASPM Control」的欄位來處置:  

‧00b - Disabled  

‧01b - L0s Entry Enabled  

‧10b - L1 Entry Enabled  

‧11b - L0s and L1 Entry enabled  

當ASPM Control = 00,意義相當清楚,連接埠不可以將連結帶入L0s狀態。也就是說,連結下游端之連接埠不能送出PM_Active_State_Request_L1的 DLLP封包到上游端的連結。  

當ASPM Control = 01,其條件迎合之下,連接埠將連結帶入L0s狀態。連結下游端之連接埠,也不行送出PM_Active_ State_Request_L1的DLLP封包到上游端的連結。  

而當ASPM Control=10,連接埠的傳送器(Tx)就不能進入L0s狀態,而連結下游端之連接埠,可以送出PM_Active_ State_Request_L1的 DLLP封包到上游端的連結。  

當ASPM Control=11,其條件迎合之下,連接埠將連結帶入L0s狀態。連結下游端之連接埠,可以送出 PM_Active_State_Request_L1的 DLLP封包到上游端的連結。但是,還必須釐清一兩個其他欄位的功用,那就是每一個3GIO元件裝置如何來告知參考時脈的來源。「Slot Clock Configuration」欄位,該位元其實就坐落於PCI Express Capability構造「連結狀態」的暫存器裡頭。此位元表示元件裝置使用平台在連接器上所提供的參考時脈;另一個「Common Clock Configuration」欄位表示連結雙端是否使用共通的時脈來源,此欄位也是坐落於PCI Express Capability構造「連結狀態」的暫存器裡頭。於是,我門可以啟動ASPM的軟體流程演算,逐步分別敘述。  

步驟一: 3GIO元件裝置電源開啟之後,「Slot Clock Configuration」欄位位元有其適當的設定。  

步驟二: 3GIO系統軟體會掃描「Slot Clock Configuration」欄位位元,來判定雙方是否使用相同的參考時脈來源。  

步驟三: 3GIO系統軟體會更新「Common Clock Configuration」欄位位元。  

步驟四: 裝置必須反應各自的「L0s/L1 exit latency」。  

步驟五: 3GIO系統軟體會讀取並計算出每一個端點的「L0s/L1 exit latency」時間數值。  

步驟六: 對於每一個端點裝置,3GIO系統軟體會檢查端點裝置自行告知的「Endpoint L0s/L1 Acceptable Latency」時間數值,作為控制依據。  

輔助電源的支援機制與電源管理之 系統訊息暨DLLP  

輔助電源通常是用來支援標示(Beacon)喚醒的機制,PCI-PM規格指出一個裝置必須支援PME,為了耗費所能夠允許的最高輔助電流。然而,PCI Express PM在Device Control暫存器中追加了一個嶄新的控制位元「Aux Power PM Enable」,提供另一種方式,耗費所能夠允許的最高輔助電流,但是不用去顧慮PME產生之位階。3GIO請求輔助電源是在「PMC - Power Management Capabilities」暫存器中的「Aux_Current」欄位中所指定非零的數值。傳統的PCI-PM系統軟體是不可能知道該新位元的存在,也僅僅能夠依據裝置告知的PME支援、Aux_Current欄位、PME_Enable位元,來致能輔助電流。因此,這個3GIO所新增加的「Aux Power PM Enable」,就值得進一步搞清楚。  

情形一: 當Aux Power PM Enable = 1b時,輔助電源的配置乃是依據「PMC - Power Management Capabilities」暫存器中的「Aux_Current」欄位。而與「PMCSR -Power Management Control/Status register」暫存器中的「PME_En」位元無關。  

情形二: ux Power PM Enable = 0b時,輔助電源的配置就是依據PCI-PM規範中的「PME_En」位元。  

最後,就將3GIO中所規範的電源管理(PM)封包,做個最為扼要的整理。  

‧PM_Enter_L1 : DLLP 封包  

‧PM_Enter_L23 : DLLP 封包  

‧PM_Active_State_Request_L1 : DLLP 封包  

‧PM_Request_Ack : DLLP 封包  

‧PM_Active_State_Nak : Transaction Layer Message  

‧PM_PME : Transaction Layer Message  

‧PME_Turn_Off : Transaction Layer Message  

‧PME_TO_Ack : Transaction Layer Message  

言及至此,可以來闡述一個廣義地觀念問題:PME所涵蓋的協定處理,可以跨及三個範疇,分別是電源管理協定、介面卡與裝置熱插拔處理協定與插槽電源管理。因此,PME軟體的策劃就需要涵蓋以上各個要素的因應措施。  

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!