把插入事件接到可使用的裝置

選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。

由上往下看本章的有管理插入路徑;是否具有 Power Controller 與哪些通知能力,先由插槽欄位決定。

管理軟體先處理插入事件與供電,再等待適用的 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 的操作與通知 → 枚舉及資源。

  1. 先找到負責這個插槽的 Port

    實體連接器不直接代表具備標準 Hot-Plug 管理能力;本章以有管理的 PCIe 插槽為例。

    查 Slot Implemented 與 Hot-Plug 相關能力,確認本章的欄位適用,再定位 Slot Capabilities、Control、Status。

    Base 6.0 §6.7/Table 6-7,pp.727–728;Figure 7-23/Table 7-19,pp.953–954。

  2. 把目前狀態和事件分開讀

    事件狀態與目前狀態各有用途;Command Completed 也有自己的支援及通知規則。

    Presence Detect State 表示目前偵測狀態;Presence Detect Changed 表示變動事件。軟體保存事件,再依 Enable 與通知方式接手。

    Base 6.0 Figures 7-30–7-32/Tables 7-27–7-29,pp.980–986;§6.7.3.1/§6.7.3.4,pp.735–737。

  3. 完成供電與可存取條件

    本文會區分控制完成及 Link/Reset 後等待的起算點;支援能力不相同時,流程須依相應規則調整。

    依插槽能力控制供電,再等待適用的電源、Reset 與 Link 條件。通知某次控制操作完成後,仍繼續檢查裝置存取條件。

    Base 6.0 §6.7.3.2–§6.7.3.3,pp.735–736;§6.6.1,pp.721–723。

  4. 找到 Function,配置資源後再使用

    新裝置仍可能遇到 Bus 或位址資源不足;突然消失另依錯誤及隔離條件處理。

    走回枚舉與 BAR/Bridge Window 配置,確認可用資源後再交給驅動程式。有秩序移除則先停止使用,再處理實體離開。

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

    Firmware 3.3 §3.5、§4.3.2、§4.5.1,pp.34–37、46–49、53;Base 6.0 §6.7、§6.2.11,pp.727、694–697。

圖中元件

Port/插槽控制

本例由這個 Port 的 Slot 欄位提供插槽能力、控制與狀態。

基本責任

Presence、事件狀態、供電控制與通知各有欄位,不以其中一項代替全部準備條件。

1. 有插槽,就一定能在運作中拔插嗎?

不一定。PCIe 的 Native Hot-Plug 定義了一組可搭配使用的機制;按鈕、指示燈、電源控制器、固定扣具與偵測器是否存在,還要看實際 form factor。Base 規格不替所有連接器指定相同的拔插方式。

插槽相關資訊各自回答什麼
資訊能回答的問題還不能下的結論
Slot Implemented這個 Downstream Port 是否連接插槽?不表示支援 Hot-Plug。
Hot-Plug Capable插槽是否具備 Hot-Plug 能力?不表示 OS 已取得控制權。
Presence Detect State目前的存在偵測結果為何?不表示 Link 已可傳輸。
Data Link Layer Link ActiveData Link 是否已進入可運作狀態?不表示裝置已枚舉、取得 BAR 資源或完成驅動初始化。
BAR
Base Address Register,基底位址暫存器

OS 與韌體之間的管理權由 Chapter 13 的 _OSC 協調說明。這裡先接受「OS 有權管理此插槽」的前提,專心觀察硬體如何回報。

先讀機制範圍,再看能力欄位

Base 6.0 §6.7–§6.7.1、Table 6-7(pp.727–728);§7.5.3.2、Table 7-19(pp.953–954);Figures 7-30–7-32、Tables 7-27–7-29(pp.980–986)。PCI Firmware 3.3 §4.5.1、Table 4-6(pp.48–53)規定控制權;授權本身不證明每個插槽的硬體能力。

2. 如果要查這個插槽能做什麼,依序看哪幾張圖?

先在控制插槽的 Downstream Port 02:01.0 找 PCI Express Capability,不能到新插入的 Endpoint 尋找插槽控制器。本例 Capability base=0x70。先讀 Figure 7-23 的 Port Type 與 Slot Implemented,再讀 Figure 7-30 的 Slot Capabilities;有了能力前提,才解讀 Figures 7-31、7-32 的 Control 與 Status。

Hot-Plug 插槽的起始讀值
位置與寬度值用途
PCI Express Capabilities,0x72,16 bits0x0162Version=2、Type=6、Slot Implemented=1。
Slot Capabilities,0x84,32 bits0x002825DF能力、功率上限與實體插槽編號。
Slot Control,0x88,16 bits0x17F8通知已設定,主電源關閉、指示燈關閉。
Slot Status,0x8A,16 bits0x0048目前偵測到裝置,且存在狀態曾改變。

(0x0162 >> 4) & 0xF = 6 表示 Switch Downstream Port;bit 8=1 才讓插槽欄位具有本節所需的意義。若 Slot Implemented=0,不能繼續把整個 Slot Register 區都當成有效插槽資料;Data Link Layer State Changed 等欄位另有明確例外。

Slot Capabilities 的 bits 0–4 都是 1:Attention Button、Power Controller、MRL Sensor、Attention Indicator、Power Indicator 均存在。MRL 是 Manually-operated Retention Latch,也就是手動固定扣具。bit 6=1 表示 Hot-Plug Capable;bit 18=0 表示支援 Command Completed 通知。0x002825DF >> 19 = 5 是實體插槽編號,不是 Device Number。

功率欄位也要分開算:Value=(0x002825DF >> 7) & 0xFF = 75,Scale=0,因此本例上限為 75 W。這是插槽所提供的上限資訊,不是裝置當下量到的耗電量。本例沒有使用 Value 大於 0xEF 時的特殊編碼。

Hot-Plug Surprise bit 5=0。本例只示範有秩序流程;不能由此推斷其他平台完全無法處理非同步移除。Base 6.0 已不建議以舊 HPS 機制支援 async hot-plug,而建議使用 DPC。若有 SFI,讀到的 HPS 還可能受 SFI HPS Suppress 影響。

DPC
Downstream Port Containment,下游連接埠錯誤隔離
能力查詢路徑

Figure 7-23/Table 7-19(pp.953–954)→ Figure 7-30/Table 7-27(pp.980–982)→ Figure 7-31/Table 7-28(pp.982–984)→ Figure 7-32/Table 7-29(pp.985–986)。HPS 的版次提醒見 §6.7.6(pp.741–742);SFI 對 HPS 的影響見 Table 7-27(p.980)。

3. Presence=1 與 Presence Changed=1,有什麼差別?

0x0048 的 bit 6 是目前狀態,bit 3 是待處理事件。前者說「現在偵測到裝置」,後者說「存在狀態曾經改變」。事件 bit 不記錄變化次數,也不保存每次變化方向;同類 Slot Event 尚未清除時,後續同類事件會被忽略。因此軟體不能把 Changed=1 解成「剛好插入一次」。

本例有主電源控制器,也有符合 form factor 的 out-of-band presence detect,因此主電源關閉時仍能偵測插入。一般而言,In-Band PD Disable=0 時 Presence Detect State 是 in-band 與適用 out-of-band 偵測的 OR;in-band 偵測需要裝置已有供電。若兩種偵測來源不同步,只看這一個 bit 不能還原完整的物理過程。

通知又是另一層。Slot Control=0x17F8 開啟 PDC Enable bit 3、Command Completed Interrupt Enable bit 4、Hot-Plug Interrupt Enable bit 5,以及 Data Link Layer State Changed Enable bit 12。存在事件 bit 可以在通知停用時設起來;而要收到中斷,還必須符合所選 INTx 或 MSI/MSI-X 機制的條件。

MSI
Message Signaled Interrupt,訊息中斷
MSI-X
Message Signaled Interrupts Extension,表格式訊息中斷
三個事件快照與精確清除值
已保存的 Slot Status這次要處理的事件向 0x8A 寫入的 16-bit 值沒有新事件時的後續讀值
0x0048Presence Detect Changed0x00080x0040
0x0050Command Completed0x00100x0040
0x0140Data Link Layer State Changed0x01000x0040

這些事件欄位是 RW1C:對欲清除的 bit 寫 1;Presence Detect State 是唯讀欄位,不是要清除的事件。三列是不同時間的快照,假設清除期間沒有新事件;實際處理仍須重新讀取目前狀態。不要把相鄰 Slot Control 與 Slot Status 一起做不加區分的 32-bit 讀改寫。

事件、目前狀態與通知

§6.7.3.1(p.735)定義事件待處理期間的行為;§6.7.3.4(pp.736–737)定義中斷條件。Presence 與各 RW1C 欄位見 Table 7-29(pp.985–986);In-Band PD Disable 見 Table 7-28(p.984)。中斷傳送本身回顧 Chapter 7。

4. 寫入 Power On 後,什麼時候可以開始枚舉?

本例先處理插入事件、確認扣具關閉與功率預算足夠,再向 Slot Control 寫入 0x12F8。這個值保留通知設定,讓 Power Controller Control bit 10=0(Power On),Power Indicator bits 9:8=10b(Blink),Attention Indicator bits 7:6=11b(Off)。假設沒有前一個未完成的 Hot-Plug 命令。

對 Hot-Plug Capable Port 的 Slot Control 寫入就是一個 Hot-Plug 命令,即使只改通知設定也一樣。本例支援 Command Completed,所以必須等前一個命令完成後才發下一個;若一秒後仍未回報完成,規格允許重送或發下一個命令。這是命令介面的規則,不是「逾時就能假定供電成功」。

插入案例中的三種完成時間零毫秒寫入電源命令,二十毫秒收到命令完成,四十毫秒讀到 Link Active,沒有提早就緒機制時最早一百四十毫秒開始設定存取。t = 0 ms寫 Power Ont = 20 msCommand Completedt = 40 ms讀到 Link Activet = 140 ms首個設定存取可接受下一個命令從 Link Active 起等 100 ms
作者時間假設;橫軸不按比例。命令完成、Link 可用與設定存取時點不是同一件事。

Command Completed 只保證控制器已處理前一個命令、可以接收下一個命令,不保證命令對應的實際動作已完成。同樣地,Power Controller Control 讀回 0,只是最近寫入的設定;電源故障等狀況仍可能阻止實際供電。

之後收到 Data Link Layer State Changed,須再讀 Link Status 的 Data Link Layer Link Active,確認為 1。本例在 t=40 ms 讀到 Link Status=0x2043,其中 bit 13=1;沒有適用的提早就緒機制,所以從這次讀到 Active 起等 100 ms,t=140 ms 才開始 Configuration Request。不能把 100 ms 從 t=0 或 Command Completed 起算。

§6.7.3.3 另規定:Hot-Add 啟動後,一秒內應出現 Data Link Layer State Changed;有 Power Controller 時,本例起點就是 t=0 的供電寫入。對已 Active 但尚未回 Successful Completion 的裝置,軟體又須允許從 Active 起至少一秒,才可認定裝置損壞。這兩個一秒處理不同問題;RRS 與 Reset 的等待例外回看 Chapter 9。

時序依據

§6.7.3.2–§6.7.3.3(pp.735–736);Table 7-28(p.984)說明控制讀回值;Table 7-29(pp.985–986)限定 Command Completed 的意義及 Link Active 檢查。Configuration 首次存取的 Readiness 例外見 §6.6.1(pp.721–723)。

5. Link 已起來,為什麼新裝置仍可能不能使用?

接下來要完成 枚舉與 資源配置。這不是重跑兩章的所有細節,而是檢查新增裝置能否放進目前仍在使用的拓樸。

作者資源案例:假設某條下游路徑只剩 0x80080000–0x800FFFFF 可用,共 0x80000 bytes,也就是 512 KiB。新裝置的一個 BAR 需要 0x100000 bytes(1 MiB),且依大小對齊。即使裝置已能回 Configuration Completion,這段空間仍放不下 BAR;把 BAR 寫到視窗外也不會讓上游自動轉送。

平台可以在最初配置時預留適當的 Bus Numbers 與 Memory/I/O 範圍。若預留不足,是否能重新配置,要看上游視窗、Host Bridge 可提供資源,以及其他驅動是否能配合暫停與搬移。這是平台與 OS 的配置政策,不能把「支援 Hot-Plug」寫成「保證任何新卡都裝得下」。

資源範圍與推演邊界

PCI Firmware 3.3 §3.5(pp.34–37)、§4.3.2(p.47)說明 Host Bridge 資源及 OS 配置邊界;Bridge/BAR 欄位沿用 Chapter 4 的來源。本例剩餘空間與容量比較是作者推演,不是規格指定的保留大小或重新配置演算法。

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

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);裝置停止與資料保存方法須另查裝置及軟體文件。

7. 把插入與移除流程接起來

Presence Changed=1,但 Presence=0,是否能說從未插入過裝置?

不能。前者保留事件,後者是目前狀態;中間可能有多次變動。應以當前狀態決定處理方向,不能把單一事件 bit 當成歷史清單。依據:§6.7.3.1、Table 7-29。

控制權已授予 OS、Link 也 Active,還差哪種證據才能開始裝置工作?

至少還要通過首次設定存取的等待條件、完成枚舉與資源配置,並完成驅動要求的初始化。每一步回答的問題不同,不能用 Active 取代。依據:§6.7.3.3、PCI Firmware 3.3 §3.5。

Command Completed=1 後又讀到 Power Fault,哪個紀錄優先相信?

兩者不矛盾。前者說明命令介面可接受下一個命令;後者記錄電源故障。必須處理故障並重新確認硬體狀態,不能用命令完成覆蓋掉故障證據。依據:Table 7-28、Table 7-29。