只重設一個功能,軟體要完成哪些事?
選擇步驟後,圖中對應的元件與下方解說會加上重點標示。完整圖與所有解說會持續顯示;也可用方向鍵切換步驟。
先沿正常流程讀完一次,再看本章後段的未完成交易、就緒通知與其他重設方式。
只想重建 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 讀等待與恢復條件。這是軟體的閱讀與操作順序,圖號不必由小排到大。
確認範圍與能力
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)。
停止工作並處理舊交易
裝置的 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)。
寫入觸發控制
先完成本例的停工與舊交易處理;採 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)。
等到可以恢復設定
本例已在重設前處理舊交易;若觸發時仍有未完成請求,還要滿足下方「等待」一節的額外條件。
本例依 p.727 的安排等待 100 ms,再進行設定存取。重設本身必須在 100 ms 內完成;若後續初始化仍需時間,裝置對設定請求必須回覆 RRS(Request Retry Status,要求稍後重試)。軟體依回覆繼續等待,直到可正常設定。
Base 6.0 §6.6.2(pp.725–727)。
恢復設定並重新開放工作
設定已就緒,舊交易的等待條件也已滿足;保留的連線與另一個功能繼續運作。
軟體依欄位屬性恢復資源與控制,重建裝置工作介面和通知路徑,再開放新工作。重設保留哪些欄位,要回到 §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。接著先查支援能力,再讀未完成交易狀態,最後定位觸發控制。下表的讀值是作者假設。
| 讀取位置與寬度 | 值 | 來源與判讀 |
|---|---|---|
| 0x74,32 bits | 0x10008000 | Figure 7-24/Table 7-20:Device Capabilities bit 28=1,支援 FLR;bit 15 為 Role-Based Error Reporting。 |
| 0x7A,16 bits | 0x0020 | Figure 7-26/Table 7-22:Device Status(裝置狀態暫存器)的 Transactions Pending(未完成交易指示)bit 5=1,尚有此功能發出的 Non-Posted Requests(需要完成回覆的請求)未完成。 |
| 0x78,16 bits | 0x2810 | Figure 7-25/Table 7-21:Device Control(裝置控制暫存器)的既有設定;bit 15 讀為零。 |
| 0x04,16 bits | 0x0006 | Command: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 時 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,進階錯誤回報
螢幕較窄時,可左右滑動表格查看完整內容。
| 欄位與位置 | FLR 前 → FLR 後 | 對照規則後的判讀 |
|---|---|---|
| Bus Master Enable,Command bit 2,0x04 | 0 → 0 | 軟體停工時已清零,FLR 也要求清除這項發送許可。兩次都是零,表示此時仍未重新開放相應的新請求;這個讀值本身不證明 FLR 已完成。 |
| Max_Payload_Size,Device Control bits 7:5,0x78 | 000b → 000b | §6.6.2 明列保留此欄位。Table 7-21 把 000b 定義為 128 bytes 的大小設定,這個零不是「沒有 Payload 能力」。 |
| Completion Timeout Status,Uncorrectable Error Status bit 14,0x104 | 1 → 1 | Table 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 的實作說明安排,數值與情境是作者推演;來源未把這個安排規定為所有裝置唯一的停工程序。