分開看 Function 與 Link,再設定省電路徑
選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。
先區分上下兩列的對象,再讀各自控制。橫線表示各列有自己的轉換規則,不把 D-state 與 L-state 畫成同一條狀態鏈。
作者的分層狀態示意,未列出全部狀態與雙向轉換;本章以適用的 L1.2 設定案例放大說明。
Function 電源狀態與 Link 電源狀態描述不同對象。D0 表示 Function 的工作電源狀態;在符合條件時,它使用的 Link 仍可透過 ASPM(Active State Power Management,主動狀態電源管理)進入省電狀態。
前情提要:Chapter 8 已建立相鄰兩端的 Link;本章再把這兩端的省電能力、控制與退出條件接起來。
規格路線:Tables 5-1/5-2 → PM Capability 與 Link 欄位 → Figures 7-146–7-150 的 L1 Substates → LTR 與退出時間條件。
- LTR
- Latency Tolerance Reporting,延遲容忍度回報
先確定想省的是哪一部分
本章分開說明不同 Mode 的支援條件;Flit Mode 不支援 L0s,不能照搬舊模式的狀態集合。
分清 Function 的 D-state 與 Link 的 L-state,再選 PMCSR 或 Link 控制。
Base 6.0 §5.2–§5.3.1/Tables 5-1–5-2,pp.600–609。
取得兩端的能力與控制
ASPM 控制 Link;PMCSR 控制 Function。L1 子狀態的支援與 Enable 必須依兩端條件安排。
讀 PM Capability、Link Capabilities/Control;需要 L1 子狀態時,再找到 L1 PM Substates Extended Capability。
Base 6.0 Figures 7-17–7-19、7-24、7-27–7-28、7-146–7-150,pp.944–949、956–957、967–972、1103–1108。
依規則建立設定與時間參數
本章逐項說明 Control 1/Control 2 的適用狀態及兩端先後;圖不省略這些設定前提。
沿正文的設定順序處理 Enable 與退出時間,確認目前狀態允許修改相關欄位。
Base 6.0 §5.5.4–§5.5.5、§7.8.3.3–§7.8.3.4,pp.650–651、1106–1108。
檢查進入及退出所需條件
已支援、已啟用與當下允許進入省電狀態是相連的檢查步驟;喚醒另依電源與 PME 路徑處理。
- PME
- Power Management Event,電源管理事件
Enable 設定完成後,仍依 LTR(Latency Tolerance Reporting,延遲容忍回報)與相關時間要求判斷是否可進入 L1.2;退出後再依狀態確認可用性。
Base 6.0 §5.5.1、§6.18/Figure 6-15,pp.644、781–782;§5.8–§5.9,pp.654–655。
1. 裝置在 D0,Link 還能省電嗎?
可以。D-state 描述 Function 的電源管理狀態,L-state 描述 Link 的狀態。D0 是 Function 的正常工作狀態,但在沒有傳輸需求時,啟用的 Active State Power Management(ASPM)仍可讓 Link 進入較省電的狀態。新流量出現時,Link 再恢復傳輸。
| 狀態 | 管理對象與用途 | 恢復時要注意 |
|---|---|---|
| D0/D1/D2/D3hot/D3cold | Function。D1、D2 可選;D3hot 仍有主電源,D3cold 沒有主電源。 | D3hot 可透過 PMCSR 回 D0;D3cold 需要平台恢復電源與相應 Reset。 |
| L0 | Link 正常傳輸;Flit Mode 的 L0p 可讓部分 Lane 閒置。 | L0p 仍至少保留雙向各一條 active Lane,不是整條 Link 停止傳輸。 |
| L0s | 低恢復延遲的 Link 省電狀態,可分方向進入。 | Flit Mode 不支援;有 Retimer 或指定的獨立 SSC 時脈條件時,也不得宣告支援。 |
| L1、L1.1、L1.2 | Link 降低耗電;Substates 可進一步處理時脈與電氣狀態。 | 是否能用,取決於雙端能力、控制、時序與進入條件。 |
| L2/L3 | 主電源已移除的 Link 狀態;是否有 Vaux 區分 L2 與 L3。 | L2 不傳一般封包,要先喚醒電源/時脈與 Link。 |
Vaux 指輔助電源,實際供應方式取決於 form factor。D3cold 不是「完全沒有任何電源」的同義詞:若要在主電源移除後偵測喚醒事件,仍需適當的輔助供電。
此外,D0 還分 uninitialized 與 active。剛完成 Conventional Reset 或 FLR 的 Function 回到 D0uninitialized,不能只因 PowerState=00b 就假定裝置工作介面已可使用。
- FLR
- Function Level Reset,以功能為範圍的重設
D-state 與 L-state 的關係
§5.2、Table 5-1(pp.600–604);§5.3.1(pp.604–608);Table 5-2(p.609);D0 子狀態見 p.605。L0s 限制與 L0p 見 §4.2.6.6–§4.2.6.7(p.445)。這裡只建立狀態關係,不把圖表中的可能組合當成任意可直接轉移的操作。
2. 要查裝置的省電能力,先找哪個 Capability?
先走傳統 Capability 清單找 ID=0x01,再看 Figure 7-17 的 Power Management 結構。注意 Figure 7-18 把 Capability ID、Next Pointer 與能力欄位畫在同一個 32-bit 範圍內;如果只讀 +0x02 的 16-bit PMC,bit 編號要隨讀取起點調整。本例直接讀完整 DWORD,避免混用兩套編號。
| 位置與寬度 | 值 | 先取得的資訊 |
|---|---|---|
| 0x40,32 bits | 0xC8035001 | ID=0x01、Next=0x50、Version=3;D1/D2 不支援。 |
| 0x44,16 bits | 0x810B | PowerState=3、No_Soft_Reset=1、PME_En=1、PME_Status=1。 |
(0xC8035001 >> 27) & 0x1F = 0x19,代表可從 D0、D3hot、D3cold 產生 PME。這是能力,不是保證系統目前已備妥所有喚醒資源。本例假設適當的輔助供電可用、沒有實作可選 Data Register,Aux_Current=0 採自供電情況;不把零解讀成所有情況都不需要供電。
- PME
- Power Management Event,電源管理事件
PME 是 Power Management Event。PME_En=1 表示允許發出通知,PME_Status=1 則記錄符合條件的事件;Status 的設定不受 Enable 值影響。因此「有事件」與「允許送通知」仍然要分開。
PMCSR 的 PowerState 只有 00b=D0、01b=D1、10b=D2、11b=D3hot,沒有「再寫一個值就進 D3cold」的編碼。寫入不支援的可選 D1/D2 時,寫入本身正常完成,但資料被丟棄,狀態不改變。
能力到控制的 Figure 路徑
Figure 7-17(p.944)→ Figure 7-18/Table 7-14(pp.945–947)→ Figure 7-19/Table 7-15(pp.947–949)。PME_Support 的 bit 31 與輔助電源條件見 p.947;Aux_Current=0 的解釋見 p.946。
3. 從 D3hot 回 D0,要不要重新初始化?
先讀 No_Soft_Reset。若為 1,透過 PowerState 寫入從 D3hot 回 D0,必須保留內部 Function 狀態,回到 D0active;若為 0,內部狀態未定義,軟體必須完整重新初始化。後者也不保證舊資料都已清除,所以 D3hot→D0 不能取代 FLR 的用途。
- FLR
- Function Level Reset,以功能為範圍的重設
本例 PMCSR=0x810B,想回到 D0 且暫時保留 PME_Status 供後續處理。除了清 PowerState bits 1:0,還要在寫值中將 RW1CS 的 bit 15 寫零;否則把讀到的 1 原樣寫回,就會提前清掉事件。
| 動作 | 16-bit 值 | 結果或理由 |
|---|---|---|
| 起始讀值 | 0x810B | D3hot、No_Soft_Reset=1、通知已啟用、事件待處理。 |
| 寫入 D0 | 0x0108 | 保留其他適用欄位;PowerState=0,對 PME_Status 寫 0。 |
| 等待適用恢復時間後讀取 | 0x8108 | D0;PME_Status 仍是 1。 |
| 處理事件後,明確清除 PME_Status | 0x8108 | 這次刻意對 bit 15 寫 1;若沒有新事件,後續讀回 0x0108。 |
這些值假設沒有其他軟體或新事件並行改動狀態。本例的 Immediate_Readiness_on_Return_to_D0=0,也未採其他就緒時間機制,所以 D3hot→D0 後至少等 10 ms,才再存取 Function,包括 Configuration Space。No_Soft_Reset=1 免除的是重新初始化,不是這段恢復等待。
進入 D3hot 前,驅動程式必須處理仍等待 Completion 的交易,並準備可能因主電源移除而遺失的狀態。若是經 Fundamental Reset 回 D0,或曾進入 L2/L3 Ready 而產生 DL_Down,不能沿用本例的狀態保存結論。
保存狀態與恢復時間
§5.3.1.4(pp.606–608);Figure 5-18/Table 5-14(pp.654–655);No_Soft_Reset、PME_En、PME_Status 見 Table 7-15(pp.948–949),Immediate Readiness 見 Table 7-14(p.945)。Flit-capable Function 必須設定 No_Soft_Reset,但它仍只適用指定的電源轉換。
4. ASPM 與把 Function 寫成 D3hot,有什麼不同?
ASPM 讓硬體在允許的條件下,於 D0 閒置時管理 Link。PCI-PM 軟體電源管理則先改變 Function 的 D-state,再由相關規則協調 Link。例如普通非 ARI 多 Function 裝置,不能只因其中一個 Function 離開 D0,就代表其他 Function 也都停止工作;其 Upstream Port 必須等所有 Functions 都離開 D0,才可代表 PCI-PM 發起進 L1。
- ARI
- Alternative Routing-ID Interpretation,替代路由識別碼解讀
查 ASPM 時,先讀兩端 Link Capabilities 的 ASPM Support,再查 Link Control 的 ASPM Control。前者宣告可用機制,後者表示軟體開放哪些機制;Enable 不是「這一刻已經在 L1」的狀態回報。
接著要比對恢復延遲:Link Capabilities 的 L1 Exit Latency 是 Port 恢復需要多久;Endpoint 的 Device Capabilities 則提供 Endpoint L1 Acceptable Latency,表示它可容忍多少延遲。兩者名字相近,卻不在同一個 Register。若經過多個 Switch,必須考慮整條路徑。
三段 Link 的 L1 exit latency,要直接相加嗎?
不能一概相加。Figure 5-8 的三段 Link 範例中,Switch 會及早在上游開始退出,退出過程可重疊;規格的結果為最後一段在 T+34 μs 完成,而不是把所有 Port 的數字相加。先讀 p.634 的時間敘述,再對照 p.635 的拓樸,才能理解延遲如何沿路傳播。
ASPM 能力、政策與延遲
§5.3.2(pp.609–610);§5.4.1(pp.621–640);Figure 5-8(pp.634–635)。Figure 7-27/Table 7-23(pp.967–970)、Figure 7-28/Table 7-24(pp.971–972);Endpoint 可容忍延遲見 Figure 7-24/Table 7-20(pp.956–957),不要沿用 p.640 敘述中對其 Register 的不精確交叉指稱。
5. 從省電設定接到 L1 的實際進入流程
允許 ASPM L1 之後,兩端還要完成協商,才會讓 Link 進入 L1。先讀 Figure 7-27/Table 7-23 的 ASPM Support,再查 Figure 7-28/Table 7-24 的 ASPM Control;接下來換到 Figure 5-7,看設定如何接到兩端的動作。
【模擬資料】以下情境為教學用途建立,不代表特定硬體或平台。本節另用一條 8.0 GT/s、Non-Flit Mode 的 Link,連接 Switch Downstream Port 02:01.0 與 Endpoint Upstream Port 03:00.0。兩端皆支援並已正確啟用 ASPM L1,延遲政策已確認可用;Endpoint 的各個 D0 Function 也都允許 L1。此例不啟用 L1.1/L1.2,裝置仍維持 D0,先帶讀基本 L1 的正常進入。
Endpoint 位於這條 Link 的下游端,但它的 Port 類型是 Upstream Port。圖中由 Endpoint 發起要求;Switch 以它的 Downstream Port 回應。開始協商前,Endpoint 已累積到 §5.4.1.3.1 對各 FC 類別要求的最低 credit(接收緩衝額度),足以傳送相應的最大封包。
- FC
- Flow Control,流量控制
螢幕較窄時,可左右滑動圖查看兩端的動作。
- TLP
- Transaction Layer Packet,交易層封包
- DLLP
- Data Link Layer Packet,資料鏈結層封包
讀原本的 Figure 5-7 時,左右兩邊是元件,中間的 T、D、P 分別代表 Transaction、Data Link、Physical Layer。先沿時間往下看「哪一層停止安排新傳送」,再看兩個方向如何先後進入 Electrical Idle(電氣閒置)。圖例中的 Active/Inactive 用來標示各層活動;Data Link 狀態機是否進入 DL_Inactive,仍須另依 Figure 3-2 的轉換條件判讀。
這裡有兩種不同的確認。等待最後一筆 TLP 的 Link 層確認,是為了讓 Retry Buffer(保存重送副本的緩衝區)清空;PM_Request_Ack 則表示對端接受 L1 進入要求。它也屬於 DLLP(Data Link Layer Packet,資料連結層封包),但不是確認某一筆 TLP 的 Ack DLLP,也不是 Memory Read 的 Completion。若先前的 Memory Read 還在等 Completion,軟體與硬體仍要繼續追蹤那筆讀取;進入 L1 不會替它完成交易。
Switch 已同意進 L1,這時卻有 Memory Write 要傳,怎麼辦?
延續圖中的接受分支:假設 Switch 已送出 PM_Request_Ack,接著才有一筆 Memory Write(記憶體寫入)排到這條下行 Link。依 §5.4.1.3.1,Switch 必須先完成 L1 轉換,再發起退出;即使當下還沒有傳送該封包所需的 Flow Control credit,也必須發起退出。回到 L0 後,封包仍須通過正常的額度與傳送條件。
接著讀 Figure 4-54 與 §4.2.7.7:L1.Entry 進到 L1.Idle,符合退出條件後轉到 Recovery,再依適用流程回 L0。這段 Recovery 是正常的退出路徑。若工具只留下「沒有 TLP」的區間,還需補上 PM 協商、Electrical Idle 與 LTSSM(連線訓練狀態機)紀錄,才能核對它標示的 L1。
- LTSSM
- Link Training and Status State Machine,鏈結訓練與狀態機
等候交易結果時,Completion Timeout 在 L1 期間仍繼續計時;Flow Control Update timers 則在 L1 期間凍結。省電轉換沒有讓所有計時器一起停止。若對端無法接受進入要求,則改讀 Figure 5-6 的拒絕分支:PM_Active_State_Nak 是 Message TLP,和 Link 層要求重送的 Nak DLLP 不同。Figure 5-6 畫的是 L0s 已啟用的範例,後續行為仍須依實際設定判斷。
從能力欄位、協商時序到 LTSSM
PCI Express Base Specification Revision 6.0:Figure 7-27/Table 7-23 Link Capabilities Register(PDF/印刷 pp.967–968)、Figure 7-28/Table 7-24 Link Control Register(PDF/印刷 p.971);§5.4.1.3 ASPM L1 State、§5.4.1.3.1 ASPM Entry into the L1 State(PDF/印刷 pp.626–631);Figure 5-6 L1 Transition Sequence Ending with a Rejection (L0s Enabled)(p.632)、Figure 5-7 L1 Successful Transition Sequence 與 §5.4.1.3.2 Exit from the L1 State(p.633)。§4.2.7.7 L1(PDF/印刷 p.519)、Figure 4-54 L1 Substate Machine(p.520)接到實體層退出路徑。圖例的活動標示與資料連結層狀態機分開判讀,後者見 §3.2.1(pp.265–268);Table 4-48(p.453)將 L1 的 LinkUp 列為 1。本節的拓撲與待送 Memory Write 是作者推演;重複間距、計時與中斷例外以完整文字規則為準。
6. 已支援 L1,是否就能直接開 L1.2?
還不行。L1 PM Substates 是另一個 Extended Capability,ID=0x001E。L1.0 對應原本的 L1;L1.1 保持 Link common-mode 電壓,L1.2 不要求保持;兩者以 CLKREQ# 協調進出。ASPM L1.2 還需要 Latency Tolerance Reporting(LTR)支援,讓裝置回報可容忍的服務延遲。
以下換成一條獨立的作者假設 Link:兩端都支援 L1 Substates 與所需 LTR,平台已確認 CLKREQ#、時脈及時序設計可用。走訪各自的 Extended Capability 清單後,剛好都在 0x200 找到這個結構;不能把 0x200 當成固定標準位址。
| 位置與寬度 | Downstream Port | Upstream Port |
|---|---|---|
| Header,0x200,32 bits | 0x0001001E | 0x0001001E |
| Capabilities,0x204,32 bits | 0x00280A1F | 0x0051141F |
| 已完成設定的 Control 1,0x208,32 bits | 0x40801404 | 0x40800004 |
| 已完成設定的 Control 2,0x20C,32 bits | 0x00000051 | 0x00000051 |
依 Figure 7-147/Table 7-129,Header 的 ID=0x001E、Version=1、Next=0;這一版沒有 +0x10 的 L1 PM Substates Status Register。Version=2 才表示實作該 Status Register,不能因為正在讀 Base 6.0,就假定每個 Capability 都是最高版本。
依 Figure 7-148/Table 7-130,兩端 Capabilities 的低五位都是 0x1F,表示總支援位元與四種 PCI-PM/ASPM 子狀態能力均存在。Downstream Port 的 Port T_POWER_ON Value=5、Scale=0,為 10 μs;Upstream Port 的 Value=10、Scale=1,為 100 μs。Port Common_Mode_Restore_Time 分別是 10、20 μs。
Control 2 的編碼位置不同:(0x51 >> 3) & 0x1F = 10、0x51 & 3 = 1,所以設定的 T_POWER_ON 是 10 × 10 μs=100 μs。不要拿 Capabilities 的 bits 23:19 去解 Control 2。
Control 1 的 bit 2=1,只開 ASPM L1.2;其餘三個子狀態 Enable=0。Downstream Port 的 Common_Mode_Restore_Time=20 μs;這個欄位在 Upstream Port 是 RsvdP,因此兩端完整值不同。本例假設平台已確認上述設定適合元件與連接設計;單憑兩端宣告值取最大值,不足以保證每個平台的時序都合適。
Extended Capability 的閱讀路徑
§7.8.3、Figure 7-146(pp.1103–1104)→ Figure 7-147/Table 7-129(p.1104)→ Figure 7-148/Table 7-130(pp.1105–1106)→ Figure 7-149/Table 7-131(pp.1106–1108)→ Figure 7-150/Table 7-132(p.1108)。多 Function Upstream Port 只在 Function 0 實作此 Capability,控制整個 Port。
7. 這組 Enable 值應該如何建立?
上表是設定後快照,不是四個 DWORD 可以任意順序寫入。§5.5.4 要求先確認兩端對應的 Supported bit 都為 1;否則啟用的行為未定義。實際安排還要符合下列順序。
- 設定 ASPM L1 Substates 前,兩端先停用 ASPM L1;若要設定 PCI-PM Substates,則須在 D0 進行。
- 啟用 L1.2 前,先設定適用的 T_POWER_ON、Common_Mode_Restore_Time,以及 ASPM L1.2 的 LTR threshold。修改時間欄位時,相應的 L1.2 Enable 必須保持清除。
- 兩端 LTR threshold 必須相同。先在 Downstream Port 設定所需的 Substate Enable,才可在 Upstream Port 設定對應 bit。
- 完成設定後,依 ASPM 與延遲政策恢復所需的 ASPM L1。將來停用 Substate 時順序相反:先清 Upstream Port,再清 Downstream Port。
「位於拓樸上游的元件」與「Upstream Port」不是同一句話:在 Endpoint 與 Switch 之間,Endpoint 的 Upstream Port 位於 Link 的下游端。設定順序要認 Port 類型,不能只憑中文的上下游方向猜。
設定順序與時序條件
§5.5.4(p.650)與 Table 5-11(p.651);欄位可修改條件見 Tables 7-131/7-132(pp.1107–1108)。T_POWER_ON 與 common-mode 設定還取決於元件、AC 耦合電容及連接設計,規格沒有指定單一通用算式。
8. Enable 已經是 1,為什麼還不能進 L1.2?
先看 Control 1 的 threshold:Value 在 bits 25:16,Scale 在 bits 31:29。因此 (0x40801404 >> 16) & 0x3FF = 128,Scale=2;依 Figure 6-15,scale 2 的單位是 1024 ns,得到 131072 ns,也就是 131.072 μs。Upstream Port 的 threshold 相同。
假設已在 ASPM L1.0、CLKREQ# 已 deassert,其他進入條件都成立。兩種服務需求仍須分別檢查;不能只看 snoop 那一欄。本例的 LTR 數字是已解碼的最近有效回報,不是 Max Latency Register 的上限。
| 情境 | Snoop 需求 | No-snoop 需求 | ASPM L1.2 條件 |
|---|---|---|---|
| A | 204800 ns | 102400 ns | No-snoop 小於 131072 ns,不滿足進入條件。 |
| B | 204800 ns | 153600 ns | 兩者皆大於或等於 threshold;在上述前提下應進入 L1.2。 |
若某一類沒有服務延遲需求,該類可用「無需求」的分支判斷;這不等於 Requirement=1、Value=0。後者代表任何延遲都會影響裝置,要求盡可能快的服務。LTR 是裝置回報的容忍度,也不是 Root Complex 保證一定做到的硬性延遲承諾。
在情境 A,若另外開了 ASPM L1.1,還可以依規則進 L1.1;本例的 bit 3=0,因此不能假設有這個退路。只看到 L1.2 Enable=1,既不能證明正在 L1.2,也不能證明設定失敗。
進入條件與 LTR 單位
§5.5.1(p.644)要求兩類 LTR 分別滿足;Figure 6-15、§6.18(pp.781–782)定義 Requirement 與 Scale。啟用 Endpoint LTR 前,Root Complex 與所有中間 Switch 必須支援,且由靠近 Root Port 者先啟用(p.781)。Control 1 threshold 的兩端一致性見 p.650。
9. 主電源已移除,裝置如何通知系統醒來?
先分兩步:恢復能傳輸的環境,再送出辨識事件來源的 PM_PME Message。L2 中不能直接傳一般 TLP;支援喚醒的裝置必須利用適用的 WAKE# 或 Beacon 機制,讓平台恢復電源、時脈與 Link。具體使用哪一種,取決於 form factor。Link 重新可用後,PM_PME 帶著 Requester ID 向 Root Complex 傳遞來源。
因此,PME_Support=1 只是其中一項證據。還要有 PME_En、必要的輔助供電、平台喚醒路徑,以及沿途元件的配合。這也說明為什麼 PMCSR 的 D3hot 設定不能單獨代表整個平台已完成 D3cold 電源切換。
喚醒的兩個階段
Base 6.0 §5.3.3.1–§5.3.3.2(pp.615–616);D3cold 的供電與保存狀態見 §5.3.1.4.2(pp.608–609)。WAKE# 不是可不分插槽形式任意套用的通用接線指令。
10. 沿條件判讀省電行為
No_Soft_Reset=1,但裝置經歷 D3cold 再上電,還能直接沿用原先狀態嗎?
不能。No_Soft_Reset 保證的是指定的 D3hot→D0 軟體轉換;從 D3cold 恢復需要電源與 Fundamental Reset,回到 D0uninitialized,再建立工作狀態。(§5.3.1.4,pp.606–608。)
只有 Endpoint 支援 ASPM L1.2,上游 Port 不支援,可以只開 Endpoint 嗎?
不可以。對應能力必須兩端都支援才可啟用,否則行為未定義;還要遵守雙端設定順序與 LTR/時序前提。(§5.5.4,p.650。)
到這裡,課程已串起裝置發現、傳輸、可靠性、Reset 與省電。接著讀 Chapter 11 的 Hot-Plug,再串起錯誤回報與系統控制權,處理裝置在運作中改變狀態時,平台如何協調。