只重設一個功能,軟體要完成哪些事?

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

先沿正常流程讀完一次,再看本章後段的未完成交易、就緒通知與其他重設方式。

保留其他功能的工作,只重設 03:00.0時間向下。軟體確認能力、停止新工作並處理舊交易,寫入重設控制,等待必要條件,再恢復設定。03:00.1 與共用連線不受此功能重設影響。 系統軟體 目標 03:00.0 其他功能 03:00.1繼續原本工作共用連線維持運作 確認功能重設能力 停工,處理尚未完成的交易 寫入重設控制先回覆這筆設定寫入開始功能重設 確認設定就緒,以及舊交易已妥善處理本例在重設前已完成舊交易的等待 恢復必要設定,再開放新工作
作者依 Base 6.0 §6.6.2 繪製的功能重設時序。時間由上往下;03:00.1 與共用連線持續運作。

只想重建 03:00.0 的工作環境時,先查它是否支援 FLR(Function Level Reset,以單一功能為範圍的重設)。軟體先停止新工作、處理舊交易,再觸發重設;等到設定就緒且舊交易的等待條件已滿足,才恢復設定並重新開放工作。

必要前情:Chapter 6 已說明 DMA(Direct Memory Access,裝置直接存取記憶體)的生命週期;Chapter 7 建立中斷通知路徑;Chapter 8 則說明 Link(相鄰連接埠間的連線)。本章保留這條連線,只重建其中一個 Function(可獨立設定的功能單位)。

規格閱讀路線:Figure 7-24/Table 7-20 查支援能力 → Figure 7-26/Table 7-22 查未完成交易 → Figure 7-25/Table 7-21 找觸發控制 → §6.6.2 讀等待與恢復條件。這是軟體的閱讀與操作順序,圖號不必由小排到大。

  1. 確認範圍與能力

    03:00.1 必須繼續工作;這裡處理普通多功能裝置,虛擬化的例外在下一節說明。

    軟體先從能力清單取得 PCI Express Capability(PCIe 能力結構)起點,再讀 Figure 7-24/Table 7-20 的 bit 28。它指出這個功能是否支援 FLR(單一功能重設);本例的讀值為 1。

    FLR
    Function Level Reset,以功能為範圍的重設

    Base 6.0 §6.6.2(p.724)、Figure 7-24/Table 7-20(pp.955、958)。

  2. 停止工作並處理舊交易

    裝置的 DMA(直接記憶體存取)與中斷也要納入停工安排。此狀態位只追蹤該功能送出的 Non-Posted Requests(需要完成回覆的請求)。

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

    軟體先協調其他存取者,依裝置介面停止新工作,再查看 Figure 7-26/Table 7-22 的 Transactions Pending(未完成交易指示)。本例最初讀到 1;軟體持續處理,直到原有回覆已到達,或已有合理把握不會再到達。

    Base 6.0 Table 7-22(p.966)、§6.6.2 的 Implementation Note(p.727)。

  3. 寫入觸發控制

    先完成本例的停工與舊交易處理;採 16-bit 寫入,保留其他控制欄位。

    依 Figure 7-25/Table 7-21,軟體對 Device Control(裝置控制暫存器)的 bit 15 寫 1。裝置先回覆這筆 Configuration Write(設定空間寫入),再開始重設。

    Base 6.0 Figure 7-25/Table 7-21(pp.959、962)、§6.6.2(p.726)。

  4. 等到可以恢復設定

    本例已在重設前處理舊交易;若觸發時仍有未完成請求,還要滿足下方「等待」一節的額外條件。

    本例依 p.727 的安排等待 100 ms,再進行設定存取。重設本身必須在 100 ms 內完成;若後續初始化仍需時間,裝置對設定請求必須回覆 RRS(Request Retry Status,要求稍後重試)。軟體依回覆繼續等待,直到可正常設定。

    Base 6.0 §6.6.2(pp.725–727)。

  5. 恢復設定並重新開放工作

    設定已就緒,舊交易的等待條件也已滿足;保留的連線與另一個功能繼續運作。

    軟體依欄位屬性恢復資源與控制,重建裝置工作介面和通知路徑,再開放新工作。重設保留哪些欄位,要回到 §6.6.2 的例外清單逐項確認。

    Base 6.0 §6.6.2(pp.724–726)、Table 7-2(pp.914–915)。

圖中元件

系統軟體

協調停工、設定寫入、等待與恢復,管理何時重新開放工作。

基本責任

重設流程由掌握裝置與平台條件的軟體協調;裝置介面的停工步驟須查該介面規格。

目標 03:00.0

先回覆觸發寫入,再重設自己的狀態,並依規則回報設定是否就緒。

基本責任

普通 Endpoint Function 具有自己的設定空間;功能重設不要求共用連線重新訓練。

其他功能 03:00.1

繼續原有工作,不因本次普通功能重設而被重設。

基本責任

本例是普通多功能裝置;虛擬化的實體功能與虛擬功能有額外關係,見「重設範圍」一節。

1. 只想重新初始化 03:00.0,該選哪種 Reset?

本例要讓 03:00.1 繼續工作,因此選擇只影響 03:00.0 的重設機制。Base 6.0 的 Conventional Reset(一般重設)涵蓋 Cold、Warm、Hot 三種;FLR 則只重設指定的普通功能,保留 Link(相鄰埠間連線)與其他普通功能的狀態。

依影響範圍選擇重設機制
機制如何發生本例需注意的範圍
Cold Fundamental Reset供電後必須發生的 Fundamental Reset。影響接受該重設的元件;不能當成只重設 03:00.0。
Warm Fundamental Reset沒有移除再接回主電源,由硬體觸發 Fundamental Reset。Base 未定義通用的 Warm Reset 產生方式,需看平台與 form factor。
Hot Reset透過 Link 的 in-band 機制傳播 Conventional Reset。這條 Link 下游的元件受影響;若往下還有 Switch,範圍可能延伸到整個分支。
FLR對支援 FLR 的 Endpoint Function 寫入 Initiate FLR。重設指定普通 Function,不得改變 Link 狀態,也不得影響其他普通 Function。

虛擬化有額外的相依關係:SR-IOV(把一個裝置提供成多個虛擬功能的機制)中,PF(Physical Function,管理虛擬功能的實體功能)收到 FLR 時會清除 VF Enable(虛擬功能啟用位),使其 VFs(Virtual Functions,虛擬功能)不再存在。因此,這類重設還要納入其所管理的虛擬功能。

SR-IOV
Single Root I/O Virtualization,單根I/O虛擬化

PERST#(硬體提供的重設訊號)是提供給元件或卡片時使用的 Fundamental Reset 訊號名稱,但 Base 沒有替所有插槽形式規定一套通用的板級時序。不能把某張卡的 PERST# 操作方法當成 PCIe 所有平台都成立的步驟。

在 Root Port 或 Switch Downstream Port 設定 Bridge Control 的 Secondary Bus Reset,必須送出 Hot Reset。以本例來說,重設 02:01.0 的次級側會波及 03:00.0 與 03:00.1;若改在 Switch 更上游發起,還可能影響另一分支的 04:00.0。應先沿 Chapter 1 的拓樸畫出範圍,再決定能否操作。

Reset 分類與範圍來源

§6.6.1(pp.721–724);Hot Reset 傳播條件見 p.723、§4.2.5.9(p.441);FLR 見 §6.6.2(pp.724–727)。PF/VF 例外見 Table 7-21(p.962)。Conventional Reset 後的初始化也有 sticky 欄位例外,不能理解成每個 bit 一律歸零。

2. 我要查 FLR,依序看哪些 Figure?

沿 Chapter 2 的能力清單找到 PCI Express Capability(PCIe 能力結構),就能取得本次欄位的共同起點。本例起點為 0x70,Device/Port Type(裝置/連接埠類型)為 Endpoint。接著先查支援能力,再讀未完成交易狀態,最後定位觸發控制。下表的讀值是作者假設。

FLR 案例的設定讀值
讀取位置與寬度值來源與判讀
0x74,32 bits0x10008000Figure 7-24/Table 7-20:Device Capabilities bit 28=1,支援 FLR;bit 15 為 Role-Based Error Reporting。
0x7A,16 bits0x0020Figure 7-26/Table 7-22:Device Status(裝置狀態暫存器)的 Transactions Pending(未完成交易指示)bit 5=1,尚有此功能發出的 Non-Posted Requests(需要完成回覆的請求)未完成。
0x78,16 bits0x2810Figure 7-25/Table 7-21:Device Control(裝置控制暫存器)的既有設定;bit 15 讀為零。
0x04,16 bits0x0006Command:MSE(Memory Space Enable,記憶體空間回應許可)與 BME(Bus Master Enable,裝置發送許可)已啟用。停工程序須協調軟體與裝置,不可只直接發 FLR。

能力判讀為 (0x10008000 >> 28) & 1 = 1。完成停工與必要等待後,保留 Device Control 其他欄位,寫入 0x2810 | 0x8000 = 0xA810,觸發 FLR。這是針對本例值的 16-bit 寫入;不要把相鄰的 Device Status 一起讀改寫,以免意外清掉 RW1C(寫 1 清除)狀態。

Initiate FLR(觸發功能重設)bit 的讀值永遠是零;寫入後,軟體要依 §6.6.2 的時間與就緒規則等待。同一 bit 在 PCI Express-to-PCI/PCI-X Bridge 的意義是 Bridge Configuration Retry Enable,因此 Function 類型是解碼前提。

能力、控制與狀態的三張圖

Figure 7-24/Table 7-20(pp.955、958);Figure 7-25/Table 7-21(pp.959、962);Figure 7-26/Table 7-22(pp.965–966)。Command 的欄位意義沿用 Chapter 4;本章只新增 Reset 所需的控制關係。

3. 停止發送新請求後,舊交易怎麼處理?

BME(裝置發送許可)清零後,裝置停止發出適用的新請求;先前已送出的請求仍可能在系統中傳遞。Transactions Pending 也只反映此 Function 發出的 Non-Posted Requests;它沒有計算所有 Posted Writes、CPU 對裝置的存取,或裝置在外部介面的工作。

考慮一個作者假設的情境:03:00.0 已送出 Tag(交易識別標記)=0x13 的 MRd(Memory Read,記憶體讀取),Completion(完成回覆)還在路上。FLR 讓 Function 丟失先前交易的追蹤資訊;若軟體立即恢復工作,Function 又將同一 Tag(交易識別標記)用於新 MRd(記憶體讀取),遲到的舊 Completion(完成回覆) 就可能被誤認為新交易的回覆。這是規格所提醒的 stale Completion 風險。

停工時,各欄位實際追蹤哪些事情
觀察可以判斷不能據此判斷
BME=0禁止其適用的新 Request 發送。所有舊 Completion 都已回來。
FLR 前 Transactions Pending=0其追蹤的 Non-Posted Requests 已完成或被 Completion Timeout 終止。所有 Posted Writes 與外部工作均已完成。
FLR 後 Transactions Pending=0符合 FLR 完成時必須清除此 bit 的要求。證明沒有任何舊 Completion 仍在系統中。

因此,應先停止其他軟體對 Function 的存取,依裝置介面停止新工作、協調 DMA 與中斷,再處理 PCIe 未完成交易。規格的 Implementation Note 提供一種安排:清除整個 Command、輪詢 Transactions Pending,待它清除或已等待足夠時間確信剩餘回覆不會到達後,再發起 FLR。這是範例演算法,不是所有裝置都只要照抄這幾步就完成停工。

未完成交易與舊 Completion

Transactions Pending 精確範圍:Table 7-22(p.966)。FLR 等待義務:§6.6.2(pp.725–726);Implementation Note “Avoiding Data Corruption from Stale Completions”(p.727)。DMA 映射與記憶體回收的前提連回 Chapter 6。

4. 100 ms 到了,是哪一件事完成了?

上圖的正常流程已在重設前處理舊交易。現在把等待條件拆開來看,以便處理「觸發時仍有未完成請求」的情況。規格要求 Function 在觸發後 100 ms 內完成 FLR;但 Function 特有的後續初始化可能還需要時間。若超過這個時限後仍需要初始化,它收到 Configuration Request 時必須回 RRS(要求稍後重試)。當它已對 Configuration Request 回過非 RRS 的 Completion,就不能在下一次 Reset 前又回 RRS。

FLR 完成、設定就緒與舊交易處理是不同條件發起 FLR 後,一條路徑等待 FLR 完成並確認設定就緒;另一條路徑確認舊 Non-Posted 交易的等待義務已滿足。兩者都成立後才可初始化並恢復工作。發起 FLR寫入先獲回覆FLR 完成,確認設定就緒100 ms 上限 ≠ 初始化全完成處理先前 Non-Posted Requests依觸發時狀態與 timeout 等待兩個條件都滿足才初始化並恢復工作
作者整理的條件關係圖;上下兩條路徑都要滿足,不是二選一。若事前已妥善處理舊交易,下方條件可在 FLR 前完成。

若發起 FLR 時 Transactions Pending=1,軟體在初始化前還必須留出足夠時間,讓相關 Completion 到達,或合理確信它們不會再到達。規格建議參考 FLR 前的 Completion Timeout;若當時 timeout 被停用,等待時間由系統決定,但不得少於 100 ms。不能拿 FLR 後的預設 timeout 值替換這個判斷。

若支援 Function Readiness Status(FRS,功能就緒狀態通知),收到 Configuration-Ready 訊息可讓系統軟體提早發出 Configuration Requests,但這不保證 Function 先前發出的 Requests 都已完成。FLR 進行中,收到的 Request 可以被靜默丟棄;不要用任意 MMIO(Memory-Mapped I/O,記憶體映射 I/O)讀取當成標準 FLR 完成檢查。

時間與存取規則

§6.6.2(pp.725–727)。觸發 FLR 的 Configuration Write 必須先獲得 Completion,再開始 FLR;進行中的 Request/Completion 處置與後續 RRS 規則見 p.726。FRS 是有條件的就緒通知,不取代對 stale Completion 的等待。

5. 如果用的是 Hot Reset,能套同一套等待方式嗎?

Conventional Reset(一般重設)要另外選擇等待起點;它取決於連接埠的速率能力與就緒通知。例如在無法確定可用 DRS(Device Readiness Status,裝置就緒狀態通知)、且沒有其他適用的提早就緒機制時:若 Downstream Port 只支援到 5 GT/s,至少從 Conventional Reset 結束等待 100 ms;若它支援高於 5 GT/s,則至少從 Link training 完成後等待 100 ms,才向緊鄰下游裝置發出 Configuration Request。

作者時間例:Reset 在 t=0 ms 結束,一個支援 16 GT/s 的 Port 到 t=40 ms 才完成 Link training。上述分支的第一個 Configuration Request 最早在 t=140 ms,而不是 t=100 ms。這個時間不是保證裝置已成功完成初始化;它仍可能依法回 RRS。

Immediate Readiness(立即就緒)、DRS(裝置就緒通知)、Readiness Time Reporting(就緒時間回報),以及系統已知的特定裝置需求,可能改變可存取時間,必須依各自條件判斷。未使用 Readiness Notifications 時,在 Conventional Reset 結束後至少要容許 1.0 s,才能因有效 Configuration Request 尚未取得 Successful Completion 而判定裝置故障;這與前述第一次可送 Request 的等待是不同規則。

DRS
Device Readiness Status,裝置就緒狀態
Conventional Reset 的時間分支

§6.6.1(pp.722–723)。本例選用支援高於 5 GT/s、無提早就緒例外的分支。RRS 的 Host 可見性與合法使用時機已在 Chapter 3說明;不要把 RRS 當成一般 MMIO 的重試狀態。

6. 依欄位判讀保留值,再恢復工作

FLR 會把 Function 專屬狀態帶回規定的初始值,同時保留 §6.6.2 明列的例外。恢復設定前,先讀各欄位的屬性與重設規則,才能知道哪些值應清除、哪些值應保留,以及哪些設定需要由軟體重建。

FLR 後仍讀到舊錯誤,該從哪裡查起?

【模擬資料】以下快照為教學用途建立,不代表特定硬體或平台。沿用普通多功能裝置的 03:00.0,PCI Express Capability 起點為 0x70;另假設已定位 AER(Advanced Error Reporting,進階錯誤回報)的起點為 0x100、版本為 2,採 Non-Flit Mode(以個別交易封包進行可靠傳遞)。

本例在停工前已留下 Completion Timeout 紀錄。軟體完成前述停工程序,清除 Command 並處理舊交易後,才取得「FLR 前」快照;「FLR 後」快照則在已滿足重設與設定就緒條件時讀取。假設兩次快照之間沒有新錯誤,也沒有軟體清除 AER 紀錄。下表只列相關欄位,不是完整 Register dump。

AER
Advanced Error Reporting,進階錯誤回報

螢幕較窄時,可左右滑動表格查看完整內容。

同一個 Function 的 FLR 前後快照
欄位與位置FLR 前 → FLR 後對照規則後的判讀
Bus Master Enable,Command bit 2,0x040 → 0軟體停工時已清零,FLR 也要求清除這項發送許可。兩次都是零,表示此時仍未重新開放相應的新請求;這個讀值本身不證明 FLR 已完成。
Max_Payload_Size,Device Control bits 7:5,0x78000b → 000b§6.6.2 明列保留此欄位。Table 7-21 把 000b 定義為 128 bytes 的大小設定,這個零不是「沒有 Payload 能力」。
Completion Timeout Status,Uncorrectable Error Status bit 14,0x1041 → 1Table 7-135 將此 bit 定義為 RW1CS(重設時保留、寫 1 清除的狀態)。依 Table 7-2,FLR 不會初始化或修改它;在本例前提下,這是保留下來的舊紀錄。

查第三列時,先用 Figure 7-155 找到 Completion Timeout Status,再讀 Table 7-135 的 Attributes 與 Default。表中的 Default 雖然是 0,RW1CS 的規則卻明確要求 Hot Reset 與 FLR 保留這個 bit。因此,本例重設後仍為 1,符合保留要求。若沒有兩次快照之間的寫入與事件紀錄,就還需要查清期間是否發生過新錯誤。

軟體保存相關錯誤資料後,可對 0x104 做 32-bit 寫入 0x00004000,只對 bit 14 寫 1;其他已定義的狀態位元寫 0,不會被這次寫入清除。假設沒有新錯誤,之後讀到 bit 14=0,表示這筆紀錄已清除。錯誤曾經發生的歷史,仍由先前保存的資料保留。需要一起保存哪些 AER 欄位,接到 Chapter 12 的錯誤快照與清除流程閱讀。

Max_Payload_Size、ASPM Control(連線自動省電控制)、RCB(Read Completion Boundary,讀取回覆邊界)等保留例外,須逐項查 §6.6.2;HwInit(硬體初始化)與 sticky(重設時保留)類型則接到 Table 7-2。共用的實體層、資料連結層狀態機與 VC0(預設虛擬通道)不被 FLR 重設。保留也有條件:涉及 Cold/Warm Reset 或輔助電源時,要重新核對相應規則。

最後按欄位用途恢復可寫設定,再重建裝置工作介面、中斷及 DMA 條件,完成後才開放新工作。RO(唯讀)欄位不用寫回,RW1C(寫 1 清除)或 RW1CS 狀態不能跟著整份 dump 寫回;觸發控制與共用欄位也各有使用條件。FLR 不會替軟體重新建立 queue 或清除主機 buffer;裝置 Register 的重建順序需查該介面規格。

從 Reset 規則查到欄位屬性

PCI Express Base Specification Revision 6.0:§6.6.2 Function Level Reset (FLR)(PDF/印刷 pp.724–726)定義保留例外與發送許可清除;Table 7-2 Register and Register Bit-Field Types(PDF/印刷 pp.914–915)定義 HwInit、sticky 與 RW1CS。Figure 7-5/Table 7-4 Command Register(PDF/印刷 pp.918–919)定義 BME;Figure 7-25/Table 7-21 Device Control Register(PDF/印刷 pp.959–960)定義 Max_Payload_Size。Figure 7-154/Table 7-134 Advanced Error Reporting Extended Capability Header(PDF/印刷 p.1112)定位結構與版本;Figure 7-155/Table 7-135 Uncorrectable Error Status Register(PDF/印刷 p.1113)定位 bit 14 的屬性與初始值。本表的前後讀值與清除操作由作者依這些規則建立。Flit-capable 實作另有 MUST@FLIT 保留要求,完整清單仍以 §6.6.2 為準。

7. 把 03:00.0 的重設流程接起來

回到開頭的需求:03:00.1 繼續工作,軟體重新建立 03:00.0 的工作環境。先用 Figure 7-24 確認支援,再以 Figure 7-26 觀察未完成交易;本例先處理舊交易,才依 Figure 7-25 寫入觸發控制。設定就緒後,軟體按欄位屬性恢復配置,最後重建裝置工作與通知路徑。

Link 沒有重新訓練,接下來要觀察哪裡?

這正是單一功能重設的預期範圍。接下來觀察 03:00.0 的設定就緒與恢復過程;共用連線持續運作,03:00.1 也繼續工作。(§6.6.2,pp.724–726。)

舊回覆還可能到達時,為什麼要延後恢復工作?

重設會讓功能失去舊交易的追蹤資訊。若立即重用交易標記,遲到的回覆可能被配給新交易;因此要依觸發時的狀態與重設前的逾時設定,完成必要等待。重設後 Pending 清零是規定的狀態變化,不能代替這段等待。

電源狀態切換也會影響初始化,該從哪裡接著讀?

D3hot→D0 的行為還受到 No_Soft_Reset(不進行軟重設)欄位影響。既有 Chapter 10 會從 PMCSR(電源管理控制與狀態暫存器)說明;電源狀態切換有自己的條件,不保證等同本章的功能重設。

版本與來源

採 PCI Express Base Specification Revision 6.0,§6.6.1–§6.6.2 與本章就近標示的欄位表。引用頁碼同時是文件頁與 PDF 頁。正常流程依 p.727 的實作說明安排,數值與情境是作者推演;來源未把這個安排規定為所有裝置唯一的停工程序。