PCIe Chapter 9:Reset 的範圍與恢復條件

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

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

完整中文教學 · English · 課程路線

沿正常流程走一次

Chapter 6–8 已建立記憶體存取、中斷與連線。本章保留這條連線,重新建立目標 Function(可獨立設定的功能單位)的工作環境。閱讀順序隨軟體的需求安排:Figure 7-24 查能力,Figure 7-26 查未完成交易,Figure 7-25 找觸發控制,再接到 §6.6.2 的等待與恢復。

  1. 讀 Device Capabilities(裝置能力暫存器)bit 28,確認支援 FLR(單一功能重設)。
  2. 協調其他存取者,停止新工作並處理舊請求。p.727 的實作說明以清除 Command、查看 Transactions Pending(未完成交易指示)示範一種安排;此位只追蹤需要完成回覆的 Non-Posted Requests。
  3. 對 Device Control(裝置控制暫存器)的 Initiate FLR 寫 1。裝置先回覆這筆設定寫入,再開始重設。
  4. 本例先等 100 ms,再進行設定存取。若後續初始化仍需時間,RRS(Request Retry Status,要求稍後重試)會讓軟體繼續等待;恢復前也須滿足舊交易的等待條件。
  5. 按欄位屬性恢復設定,重建裝置工作與通知路徑,再開放新工作。

接著沿這條流程讀欄位值,以及各步驟需要注意的例外。

想保留其他 Function 的工作,先避開過大的重設範圍

不同重設的責任範圍
機制意義與選擇限制
Cold/Warm Fundamental ResetCold 隨供電發生;Warm 不移除再接回電源,Base 未指定通用觸發方法。範圍取決於硬體與平台,不能當成指定單一 Function。
Hot Reset透過 Link 傳播 Conventional Reset;Downstream Port 的 Secondary Bus Reset 會發起它。Switch 可繼續向下游傳播。
FLR重設指定普通 Endpoint Function,不得影響 Link 或其他普通 Function。
FLR
Function Level Reset,以功能為範圍的重設

若 03:00.1 必須繼續工作,就應先查 03:00.0 的 FLR 能力。對 02:01.0 發起 Secondary Bus Reset 會波及兩者;在 Switch 更上游操作,範圍還可能擴大。PERST# 的板級時序需要相應平台/form factor 規格。PF(Physical Function,管理虛擬功能的實體功能)的 FLR 會清 VF Enable(虛擬功能啟用位),使 VFs(Virtual Functions,虛擬功能)不再存在,不能套用普通 Function 的隔離結論。

範圍來源

§6.6.1–§6.6.2(pp.721–727)、§4.2.5.9(p.441);PF/VF:Table 7-21(p.962)。

先查能力,再處理 Pending,最後才觸發

作者假設的 FLR 讀值
位址/寬度值判讀
0x74/32 bits0x10008000Device Capabilities bit 28=1,支援 FLR。
0x7A/16 bits0x0020Device Status bit 5=1,有未完成 Non-Posted Requests。
0x78/16 bits0x2810Device Control 既有設定。
0x04/16 bits0x0006Command 的 MSE(Memory Space Enable,記憶體空間回應許可)、BME(Bus Master Enable,裝置發送許可)已開啟。

依序讀 Figure 7-24/Table 7-20、Figure 7-26/Table 7-22、Figure 7-25/Table 7-21。完成停工與必要等待後,以 16-bit 寫入 0x2810 | 0x8000 = 0xA810 觸發 FLR,不連帶寫入相鄰的 RW1C(寫 1 清除)狀態。Initiate FLR 讀值永遠為零;同一 bit 在 PCIe-to-PCI/PCI-X Bridge 另有意義,因此必須先確認 Function 類型。

欄位定位

Figures 7-24–7-26、Tables 7-20–7-22(pp.955、958–959、962、965–966)。

停止新 Request,不代表舊 Completion 已消失

BME(裝置發送許可)=0 不會收回先前送出的 Request。Transactions Pending 只反映此 Function 發出的 Non-Posted Requests;它們可能已完成或被 timeout 終止,這個 bit 不涵蓋所有 Posted Writes、CPU 存取或外部工作,且 FLR 完成時本身就必須清零。

作者情境中,Tag(交易識別標記)=0x13 的舊 MRd(Memory Read,記憶體讀取) 尚未回覆便發生 FLR。若立即重新使用該 Tag,遲到的 Completion 可能被誤配給新交易。軟體應先協調其他存取者、停止裝置新工作及 DMA(Direct Memory Access,直接記憶體存取)/中斷,再處理未完成交易。p.727 的 Implementation Note 提供清 Command、輪詢 Pending 或等待足夠時間後才發 FLR 的範例演算法;它不能取代裝置特有的停工程序。

Pending 與 stale Completion

Table 7-22(p.966);§6.6.2(pp.725–727)。

FLR 完成、設定就緒與舊交易等待須分開確認

觸發 FLR 的 Configuration Write 必須先取得 Completion,再開始 FLR。Function 必須在 100 ms 內完成 FLR,但特有的後續初始化可能更久;超過此時限仍需初始化時,必須以 RRS(要求稍後重試)回覆 Configuration Request。回過非 RRS Completion 後,下次 Reset 前不得再回 RRS。

若觸發時 Transactions Pending=1,初始化前仍須容許舊 Completion 到達,或合理確信不會再到達;規格建議依 FLR 前的 Completion Timeout 等待。若當時 timeout 停用,時間由系統決定但不得少於 100 ms。FRS(Function Readiness Status,功能就緒狀態通知)的 Configuration-Ready 可提早允許 Configuration 存取,仍不保證先前 Requests 全部完成。FLR 進行中 Request 可被靜默丟棄,不能任意用 MMIO(Memory-Mapped I/O,記憶體映射 I/O)輪詢當作完成通知。

Conventional Reset 的起點又不同。在無 DRS(Device Readiness Status,裝置就緒狀態通知)/其他提早就緒例外的分支,支援高於 5 GT/s 的 Downstream Port 要從 Link training 完成後等至少 100 ms。作者例:Reset 於 t=0 ms 結束,training 於 t=40 ms 完成,首次 Configuration Request 最早為 t=140 ms。只支援到 5 GT/s 的對應分支從 Reset 結束計時。未使用 Readiness Notifications 時,Conventional Reset 結束後至少容許 1 s,才可因尚無 Successful Completion 判定故障;這不是首次可存取時間。

各種等待的依據

FLR:§6.6.2(pp.725–727);Conventional Reset、Immediate Readiness、DRS 與時間回報例外:§6.6.1(pp.722–723)。

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

先讀 §6.6.2 的 FLR 規則與保留例外,再以 Table 7-2 解讀欄位屬性。重設後有些發送許可會清除,部分設定與錯誤紀錄則保留;逐欄核對後,才能決定軟體接著要恢復什麼。

用前後快照查清楚舊錯誤為何還在

【模擬資料】以下快照為教學用途建立,不代表特定硬體或平台。沿用普通 Function 03:00.0,PCI Express Capability 在 0x70;另假設 AER(Advanced Error Reporting,進階錯誤回報)已定位在 0x100、版本 2,採 Non-Flit Mode(個別交易封包傳遞模式)。本例先前已記錄 Completion Timeout,軟體清除 Command 並妥善處理舊交易後取得第一份快照;完成 FLR、設定已就緒後取得第二份。期間沒有新錯誤或 AER 清除寫入。下表只列相關欄位。

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

03:00.0 的 FLR 前後讀值
欄位與位置FLR 前 → 後對照規格
Bus Master Enable,Command bit 2,0x040 → 0停工時已由軟體清零,FLR 也要求清除此發送許可。維持零表示尚未重新開放相應的新請求,本身不能證明重設已完成。
Max_Payload_Size,Device Control bits 7:5,0x78000b → 000bFLR 明列保留;000b 是 128 bytes 的大小設定。
Completion Timeout Status,Uncorrectable Error Status bit 14,0x1041 → 1Table 7-135 的屬性為 RW1CS(重設時保留、寫 1 清除的狀態);Table 7-2 規定 Hot Reset 與 FLR 不初始化或修改它。

查錯誤紀錄時,從 Figure 7-155 的 bit 14 接到 Table 7-135,再查 Table 7-2 的 RW1CS。Default=0 沒有取消保留規則;在本例前提下,重設後的 1 是舊紀錄。若事件與寫入歷史不完整,還需要查期間是否發生新錯誤。

保存錯誤資料後,對 0x104 做 32-bit 寫入 0x00004000,只清 bit 14。其他已定義的狀態位元寫 0,不受這次清除影響;沒有新錯誤時,bit 14 隨後讀為 0。先前保存的資料仍記錄這次 Timeout。快照與其他 AER 欄位的處理見 Chapter 12。

完整保留例外仍查 §6.6.2,包括 Max_Payload_Size、ASPM Control(連線自動省電控制)、RCB(Read Completion Boundary,讀取回覆邊界)、HwInit(硬體初始化)與 sticky(重設時保留)類型;Flit-capable 實作另有要求。Physical/Data Link 狀態機與 VC0(預設虛擬通道)不被 FLR 重設。Cold/Warm Reset 與輔助電源的保留條件要另查。

恢復時,按 RO(唯讀)、RW1C(寫 1 清除)、RW1CS、觸發控制與可寫設定分別處理,再重建裝置介面、中斷與 DMA 條件,最後開放工作。FLR 不替軟體清除主機 buffer,也不定義每張卡的 queue 重建方式。

DMA
Direct Memory Access,裝置直接存取記憶體
保留與欄位來源

Base 6.0 §6.6.2 Function Level Reset (FLR)(PDF/印刷 pp.724–726);Table 7-2 Register and Register Bit-Field Types(pp.914–915);Figure 7-5/Table 7-4 Command Register(pp.918–919);Figure 7-25/Table 7-21 Device Control Register(pp.959–960);Figure 7-154/Table 7-134 Advanced Error Reporting Extended Capability Header(p.1112);Figure 7-155/Table 7-135 Uncorrectable Error Status Register(p.1113)。本段引用的 PDF 與印刷頁碼相同。

回到這次重設的範圍

FLR 沒有讓 Link 重訓,是否代表失敗?

不是。FLR 不得影響 Link;應查 Function 的重設與恢復條件。

FLR 後 Pending=0,就能回收所有 DMA buffer 嗎?

不能。還需要舊交易等待、裝置停工、其他軟體存取協調及平台 DMA 生命週期條件。

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...