PCIe Chapter 11:熱插拔與拓樸變動

先看本章的角色與路徑

管理軟體先處理插入事件與供電,再等待適用的 Reset、Link 條件,最後枚舉與配置新 Function。管理軟體先處理插入事件與供電,再等待適用的 Reset、Link 條件,最後枚舉與配置新 Function。Hot-Plug 管理軟體Port/插槽控制新加入的 FunctionPresence/事件通知 ←依能力控制供電 →依序確認電源、Reset 與 Link完成等待後枚舉、配置並交給驅動

作者的插入流程示意。控制操作完成、Link 可用與裝置已配置是沿途不同的條件。

熱插拔把實體插入、供電、Link 建立與軟體配置接成一個受管理的過程。讀到插入狀態後,管理軟體還要依插槽能力完成後續準備。

前情提要:Chapter 3/4 的枚舉與資源配置會在新裝置加入時再次用到;Chapter 8/9 提供連線與重設後等待條件。

規格路線:Slot Implemented/Hot-Plug 能力 → Figures 7-30–7-32 的能力、控制、狀態 → §6.7.3 的操作與通知 → 枚舉及資源。

PCIe Hot-Plug 要把實體插槽的變化轉成一致的軟體狀態。能力、通知、供電、Link 就緒與資源配置各有不同的證據;其中任何一步成立,都不能代替其餘步驟。本篇先用插入案例說明查詢路線,再帶讀由按鈕發起的正常移除及取消分支。

能力查詢從管理插槽的 Port 開始

在 02:01.0 找到 PCI Express Capability base=0x70 後,先讀 Figure 7-23 的 Port Type 與 Slot Implemented,再看 Figure 7-30 的 Slot Capabilities。不能到 Endpoint 尋找所屬插槽的控制器。實體元件的配置仍取決於 form factor,Base 不要求每種插槽都有相同的按鈕、扣具與指示燈。

插槽起始快照
Register位置/寬度值
PCI Express Capabilities0x72/16 bits0x0162
Slot Capabilities0x84/32 bits0x002825DF
Slot Control0x88/16 bits0x17F8
Slot Status0x8A/16 bits0x0048

0x0162 表示 Version=2、Type=6、Slot Implemented=1。Slot Capabilities bits 0–4 全為 1,具備按鈕、電源控制器、MRL 扣具感測器與兩種指示燈;bit 6=1 支援 Hot-Plug,bit 18=0 支援 Command Completed。bits 31:19 為實體插槽 5,不是 Device Number;Power Limit Value=75、Scale=0,得到 75 W 上限,不是目前耗電量。

HPS bit 5=0,因此本例只示範有秩序流程。不能把這個 bit 當成所有非同步移除方案的唯一判定;Base 6.0 已不建議以舊 HPS 機制支援 async hot-plug,而建議 DPC。SFI 也可能抑制 HPS 讀值。

DPC
Downstream Port Containment,下游連接埠錯誤隔離
查詢位置

§6.7/Table 6-7(pp.727–728);Figure 7-23/Table 7-19(pp.953–954)→ Figures 7-30–7-32/Tables 7-27–7-29(pp.980–986)。HPS 與 DPC 見 §6.7.6(pp.741–742)。

狀態、事件與通知分開解讀

Slot Status=0x0048 同時表示 Presence Detect State bit 6=1,以及 Presence Detect Changed bit 3=1。前者是目前偵測結果,後者是待處理事件。相同 Slot Event 尚未清除時,後續同類事件會被忽略,所以一個 bit 不能表示變化次數或完整順序。

本例主電源關閉時仍由 out-of-band 機制偵測插入。一般在 In-Band PD Disable=0 時,Presence 是 in-band 與適用 out-of-band 的 OR;in-band 需要供電。Presence=1 仍不證明 Link Active。

0x17F8 已開啟 Presence Changed、Command Completed、DLL State Changed 的通知及 Hot-Plug Interrupt Enable,但事件紀錄與實際收到中斷不同。後者還需符合 INTx 或 MSI/MSI-X 的啟用、向量與路由條件。

MSI
Message Signaled Interrupt,訊息中斷
MSI-X
Message Signaled Interrupts Extension,表格式訊息中斷
不同時間的事件確認
Slot Status 快照寫入 0x8A 的 RW1C 值無新事件時讀回
0x0048:Presence Changed0x00080x0040
0x0050:Command Completed0x00100x0040
0x0140:DLL State Changed0x01000x0040

先保存並處理事件,再對指定 RW1C bit 寫 1;Presence 是唯讀狀態。實際處理須重新核對並行變化,不對相鄰 Control/Status 做不加區分的 32-bit 讀改寫。

事件與中斷

§6.7.3.1、§6.7.3.4(pp.735–737);Tables 7-28/7-29(pp.983–986)。中斷傳送回顧 Chapter 7。

命令完成不等於可以立刻枚舉

確認扣具關閉、功率預算足夠且沒有前一筆未完成命令後,本例寫 Slot Control=0x12F8:Power On、Power Indicator Blink、Attention Indicator Off,保留原通知設定。任何 Slot Control 寫入都是 Hot-Plug 命令;本例支援 Command Completed,須等前一筆完成才發下一筆。一秒未完成時,規格允許重送或發下一筆,不能據此假定供電成功。

作者設定的插入時間線
時間證據或動作意義
0 ms寫入 Power On啟動插入供電流程。
20 msCommand Completed控制器可接受下一個命令;不保證實際動作完成。
40 msLink Status=0x2043讀到 Data Link Layer Link Active=1。
140 ms開始 Configuration Request從讀到 Active 起已等 100 ms;本例無提早就緒機制。

Power Controller Control 的讀回值也不是電源量測;故障可能阻止供電。DLL State Changed 後,必須讀 Link Active,不能只憑 Changed bit 發設定存取。Hot-Add 的 DLL 變化一秒期限從本例的 Power On 寫入起算;判定已 Active 卻無 Successful Configuration Completion 的裝置損壞,則須從 Active 起允許至少一秒。兩個期限不同。

完成與等待條件

§6.7.3.2–§6.7.3.3(pp.735–736);Tables 7-28/7-29(pp.984–986)。Reset 與 Readiness 例外見 §6.6.1(pp.721–723)及 Chapter 9。

可存取設定空間之後,仍要有可用資源

假設目前路徑只剩 0x80080000–0x800FFFFF,共 0x80000 bytes(512 KiB),新 BAR 需要 0x100000 bytes(1 MiB)且依大小對齊。即使 Configuration Request 成功,這段空間仍放不下。BAR 寫到視窗外不會讓 Bridge 自動轉送。

BAR
Base Address Register,基底位址暫存器

事先預留 Bus Numbers 與位址範圍可降低配置困難;不足時能否搬移其他配置,取決於 Host Bridge 資源、沿途視窗及軟體協調。這是作者的系統推演,不是規格保證每張熱插入卡都有空間。詳細枚舉與 BAR 計算連回 Chapters 3–4。

配置邊界

PCI Firmware 3.3 §3.5(pp.34–37)、§4.3.2(p.47);Chapter 4。

按下按鈕後,什麼時候可以拔卡?

Attention Button 是提出熱插拔要求的按鈕。軟體接受移除要求後,先以 Power Indicator(電源指示燈)閃爍回應使用者,保留取消機會;接著協調裝置停止工作、關電並完成等待,最後才讓使用者取出卡片。

【模擬資料】以下情境為教學用途建立,不代表特定硬體或平台。續用管理插槽的 Switch Downstream Port 02:01.0 與下游 Endpoint 03:00.0。假設先前插入已完成,裝置正常工作、指示燈常亮,沒有電源故障;軟體具有管理權。MRL 扣具維持關閉,直到流程允許實體移除。本例有獨立的插卡偵測來源,因此主電源關閉後,只要卡片仍在,Presence Detect State 仍為 1。

先前插入快照中的 Attention Button Pressed Enable 為 0。本次先在 02:01.0 的 Slot Control 將這個 bit 與 Hot-Plug Interrupt Enable 設為 1,並完成該筆命令的處理;Port 的中斷機制也已正確啟用。下圖由上往下讀,右側是取消分支。螢幕較窄時,可左右滑動查看完整流程。

接受按鈕要求後,仍須完成取消窗口、停止工作與關電等待成功移除路徑由上往下。五秒內再次按下按鈕,改走右側取消分支。主路徑在軟體與裝置停止工作後才要求關電,完成至少一秒的關電等待及移除條件後,才將電源指示燈關閉。保存並清除第一次按鈕事件管理軟體接受這次移除要求Power Indicator 開始閃爍由此起算五秒取消窗口未取消:停止新工作,處理在途工作取得裝置與軟體的停止證據尚未停止完成時,停留在這一步要求 Power Off,指示燈維持閃爍各筆命令遵守 Command Completed 規則關電後至少等一秒,且移除條件已成立軟體才將 Power Indicator 關閉使用者依插槽規定取出卡片Presence 由 1 變成 0五秒內再次按下取消這次移除本例維持供電,恢復常亮
作者依 §6.7.1.5、§6.7.1.8 整理的正常移除流程。右側取消分支不再往下執行關電;圖中距離不代表經過時間。

先處理按鈕事件,才接得住第二次按下

查 Figure 7-32/Table 7-29,Attention Button Pressed 位於 Slot Status bit 0,屬於 RW1C(寫入 1 清除)。假設此時 Slot Status 讀值為 0x0041,卡片存在、按鈕事件為 1,其餘欄位為 0。本例先保存事件,再以 16-bit 寫入 0x0001 到 0x8A,只清這個事件。§6.7.3.1 說明,同類事件在前一筆仍待處理時會被忽略;若一直保留第一次按鈕事件,第二次按下就無法成為新的事件紀錄。

接著讀 §6.7.1.5:軟體接受要求,讓 Power Indicator(電源指示燈)開始閃爍後,才開始五秒取消窗口。使用者在這段時間再次按下,就取消這次操作。本例的取消分支保留裝置供電,再依命令完成規則將指示燈恢復常亮。五秒從實際開始閃爍起算;中斷送達或軟體讀到 Status 的時間,都不是這個起點。

取消窗口結束後,先讓裝置停止工作

本例選擇在五秒內未取消後,才停止接受新工作,並協調驅動程式與裝置處理尚未完成的讀寫、DMA 傳輸及中斷。這一段是作者安排的系統流程:各類裝置如何停止佇列、取消工作或保存資料,要查裝置與軟體文件。若停止條件尚未滿足,就留在這一步,維持禁止拔卡的狀態。

DMA
Direct Memory Access,裝置直接存取記憶體

例如,將 Bus Master Enable 清為 0,限制的是 Function 後續發起的相關 Request;先前送出的 Memory Read、已進入路徑的 Posted Write,以及應用程式要保存的資料,仍需各自的完成證據。這些停止與保存要求,無法只靠 Slot Status 判斷。

關電命令完成後,指示燈也不能立刻熄滅

沿 Figure 7-31/Table 7-28 找到 Power Controller Control:寫入 1 要求 Power Off;Power Indicator Control 的 10b 讓指示燈維持閃爍。這兩項可放在同一筆 Slot Control 寫入,但各動作的執行順序未由規格指定;本例開始關電前,指示燈就已經在閃爍。

本插槽支援 Command Completed,因此軟體依 §6.7.3.2 等候上一筆命令完成後,才發下一筆 Slot Control 命令。再讀 §6.7.1.8:關電後必須等待至少一秒,才可做任何依賴電源已移除的動作;等待結束前,不得關閉 Power Indicator,也不得重新要求上電。Command Completed 只表示控制器可接下一筆命令;這段等待仍要遵守。Control 讀回值也只是最後寫入的要求,並非電壓量測。

待關電等待及適用的移除條件都成立,軟體才以 Power Indicator Control=11b 關閉指示燈。回到 Table 6-9 Power Indicator States:閃爍表示操作進行中,尚不允許插拔;Off 才表示允許插入或移除。實際要移除哪些電源與訊號,仍須符合插槽的 form factor(機構與電氣形式)規格,部分輔助電源或訊號可能繼續存在。

同一次正常移除,卡片存在、主電源與 Link 可以先後改變
觀察時間Presence Detect State本例的主電源/LinkPower Indicator 與使用者動作
要求已接受,仍在協調1,卡片仍在仍供電,Link 可用閃爍,等待流程完成
關電等待與移除準備已完成,尚未取卡1,獨立插卡偵測仍有效主電源已關閉,Link Active=0Off,依插槽規定解除扣具並取卡
卡片已取出,偵測狀態已更新0,另記錄 Presence Detect Changed沒有可供裝置工作的 LinkOff,軟體處理後續插槽事件

上表列出的是本例各階段的已知結果。若手上只有 Command Completed=1、Power Controller Control=1、Presence Detect State=1 的快照,能讀出的是命令介面已就緒、最後要求關電,以及卡片仍被偵測;實際關電等待是否完成,還要查控制寫入與流程時間紀錄。

若裝置突然消失:軟體可能來不及完成上述協調,便已失去裝置存取。後續要處理失效的軟體狀態與未完成工作;DPC 可限制下游錯誤擴散,應用工作與資料保存的結果仍由裝置及軟體層確認。隔離與恢復連回 Chapter 12,不再重複正常移除的按鈕流程。

DPC
Downstream Port Containment,下游連接埠錯誤隔離
按鈕、指示燈、關電等待與欄位的閱讀路線

依據 PCI Express Base Specification Revision 6.0。先讀 §6.7.1.5 Attention Button(PDF/印刷 p.731),確認接受要求與五秒取消窗口;接 Table 6-9 Power Indicator States/§6.7.1.1.2 Power Indicator(pp.729–730),理解常亮、閃爍與 Off 的使用者意義;再讀 §6.7.1.8 Power Controller(pp.731–732),確認關電後至少一秒的等待。事件與命令處理接 §6.7.3.1 Slot Events、§6.7.3.2 Command Completed Events(pp.735–736)。最後以 Figure 7-31 Slot Control Register/Table 7-28(pp.982–984),以及 Figure 7-32 Slot Status Register/Table 7-29(pp.985–986)定位 Enable、Indicator、Power Control、RW1C 與 Presence 欄位。所有上述 PDF 與印刷頁碼相同。移除模式與隔離沿用 §6.7、§6.7.6、§6.2.11(pp.727、741–742、694–697);裝置停止與資料保存方法須另查裝置及軟體文件。

用兩個問題檢查判讀

Presence Changed=1、Presence=0,是否代表從未插入?

不能。Changed 是待處理事件,Presence 是目前結果,兩者不能還原完整歷史。依據:§6.7.3.1、Table 7-29。

Command Completed 與 Power Fault 同時存在,是否互相矛盾?

不矛盾。命令介面可以接收下一筆,不保證供電成功;仍須處理電源故障。依據:Tables 7-28/7-29。

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...