NVMe · Q1–328

NVM Express Base 2.4NVM Command Set 1.3NVMe over PCIe Transport 1.4

Q1–Q9

Controller 初始化與停用

先理解 controller 如何從停用轉為就緒,再開始處理命令。讀到能力,不表示 controller 已啟用;Host 設定 EN,也還要等待 RDY。即使 RDY=1,仍可能需要依 Ready Mode 確認媒體是否可用。本冊將狀態、等待時間及允許執行的動作放在一起,說明每個階段應如何判斷。

每個問題都接著完整解說,依內容帶讀欄位、比較機制或追蹤流程。先看本冊總覽,再沿問題閱讀;必要條件與正常路徑直接顯示。所有數字案例均為教學假設;Status 以 SCT/SC 表示,代碼後的 h 代表十六進位。

SCT
Status Code Type,完成狀態代碼類型

從未啟用到能送命令

重新啟用前,先確認上一輪停用已完成。啟用與停用都要觀察 RDY 的實際變化,不能只看 Host 自己寫入的 EN。

階段觀察/動作下一步的條件
停用完成CC.EN=0;CSTS.RDY=0設定 AQA、ASQ、ACQ 與 CC
啟用中Host 將 EN 從 0 設為 1,並開始計時等待 RDY=1,同時檢查 CFS 及適用的 timeout
介面就緒RDY=1;依 Ready Mode 判斷媒體限制先執行允許的 Admin 命令,再建立 I/O queue
再次停用Host 將 EN 從 1 清為 0,並停止提交新命令等待 RDY=0,才開始下一次初始化

舉例看懂:假設 CAP.TO=4,停用等待上限為 4×500 ms=2 s。這個期限用來等待 controller 停用,不是每筆 I/O 命令的 timeout。啟用時還須根據 CAP.CRMS、所選 Ready Mode 及 CRTO 決定期限,因此不能將這個 2 s 套用到所有等待情況。

來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.1.4 (AQA, ASQ, ACQ, CMBLOC) · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.5.1 · Base 2.4 §3.5.3–3.5.4

先把觀念接起來

教學 1 · 先分清誰寫、誰回報

CC.EN 由 Host 寫入,表示要求啟用或停用;CSTS.RDY 由 controller 回報,表示它目前是否就緒。就像按下電源開關與系統完成開機是兩個時點,驗證時也必須記錄 EN 變化與 RDY 變化各自的時間。單看 EN=1,只能證明 Host 已要求啟用,不能證明 controller 已準備好。

教學 2 · Independent mode 為什麼需要兩個期限

Independent mode 允許管理介面先就緒,再等待媒體能夠提供服務。CRIMT 對應介面就緒的期限,CRWMT 對應媒體就緒的期限;兩者都從 EN 由 0 變成 1 時起算。例如介面在 300 ms 就緒,而媒體期限是 2 s,媒體剩下的等待時間就是 1.7 s,不會從介面就緒時重新獲得 2 s。實際採用哪個期限,仍須依 CAP.TO 與 CRTO 的比較規則決定。

教學 3 · 重設後的位元仍在,不代表物件仍在

由清除 CC.EN 觸發的 Controller Reset 會保留 AQA、ASQ、ACQ,因此 Host 不必只因這種重設就重新提供相同的基底位址。不過,Admin Queue 指標已重設,I/O queue 也已刪除。如果 Host 繼續用舊 CID 紀錄配對新 CQE,可能把前一次 queue 留下的資料當成新結果。因此,重建命令追蹤狀態也是恢復流程的一部分。

CID
Command Identifier,同一提交佇列內的命令識別碼
CQE
Completion Queue Entry,佇列中的完成項目
需要時回顧本篇名詞
Controller / namespace
controller 接收命令並管理存取;namespace 是命令可指定的一份邏輯儲存空間。NVM subsystem 則包含 controller 與非揮發儲存資源,同一 subsystem 可以有多個 controller。
SQ / CQ / SQE / CQE
Submission Queue(SQ)是提交佇列,Completion Queue(CQ)是完成佇列;SQE 與 CQE 分別是其中的一筆命令及完成項目。QID 識別 queue,CID 區分同一 SQ 中尚未完成的命令,NSID 則識別 namespace。
Register / Identify / Feature / Log
Register 提供可存取的控制或狀態資訊;Identify 查詢物件的能力與屬性;Feature 用來讀取或變更工作設定;Log Page 回報特定種類的狀態或紀錄。FID、LID、CNS、CSI 則分別用來選擇 Feature、Log Page、Identify 資料結構及命令集。
index / offset / zero-based
index 指出清單中的第幾筆,通常從 0 起算;offset 表示與起點相隔多遠,解讀時必須確認單位。若數量欄位採 zero-based 編碼,實際數量等於欄位值加 1;但不是所有欄位看到 0 都要加 1。Dword 是 4 bytes,1 byte 是 8 bits。
Scope / reset / retention
scope 表示操作影響哪些物件;retention 表示狀態是否保留。清除 CC.EN 所觸發的 Controller Reset,是 Controller Level Reset(CLR)的一種。同屬 CLR 的不同觸發方式,仍可能採用不同的 Register 保留規則。

本冊題目

  1. Q01 · Host 應如何從 CAP 與 VS 確認 NVMe 版本、最大 Queue 大小、Timeout、Doorbell 間距、Memory Page Size 及支援的 Command Set?
  2. Q02 · AQA、ASQ、ACQ 與 CC 各欄位應按照什麼順序設定?設定錯誤時可能發生什麼?
  3. Q03 · Host 設定 CC.EN 後,應如何根據 CAP.TO 與 CSTS.RDY 判斷 Controller 是否成功 Enable?
  4. Q04 · Host 清除 CC.EN 後,應如何判斷 Controller 是否成功 Disable?尚未 Disable 完成時能否重新 Enable?
  5. Q05 · Host 能否在 CSTS.RDY 為 0 時送出 Command 或更新 Doorbell?
  6. Q06 · CSTS.CFS 代表什麼?Controller 初始化失敗或進入 Fatal 狀態時,Host 應如何恢復?
  7. Q07 · Controller 初始化後可能進入哪些 Ready Mode?Host 應如何處理暫時或限制性的 Ready 狀態?
  8. Q08 · Controller Enable、Disable、Controller Reset、NVM Subsystem Reset 與 Shutdown 有什麼差異?
  9. Q09 · Controller Reset 後,哪些 Register、Admin Queue、Feature 與 I/O Queue 需要重新設定?

Q01 Host 應如何從 CAP 與 VS 確認 NVMe 版本、最大 Queue 大小、Timeout、Doorbell 間距、Memory Page Size 及支援的 Command Set?

跟著解說理解

Host 必須先知道 controller 支援哪些配置,才能正確初始化介面。CAP 用來宣告支援能力,CC 則記錄 Host 實際選用的設定,因此不能直接把 CAP 的能力位元複製到 CC。

1. 先確認資料的來源與範圍

讀取 CAP 與 VS 只會取得目標 controller 的資訊,不會改變 queue 或媒體狀態。即使已確認 NVMe 版本,Host 仍須逐項檢查選配功能,因為版本相同不代表支援的功能完全相同。

VS 的 MJR、MNR、TER 欄位共同表示版本。Queue 與命令集能力則由 CAP 提供:MQES+1 是單一 I/O queue 的 entry 數量上限,CQR 說明是否要求實體記憶體連續,CSS 則說明支援哪些命令集選擇方式。

2. 欄位、單位與判讀例子

這些欄位使用不同的編碼方式。CAP.TO 以 500 ms 為單位;相鄰 Doorbell 的間距是 2^(2+DSTRD) bytes;可選的記憶體頁面大小則介於 2^(12+MPSMIN) 與 2^(12+MPSMAX) bytes。判斷啟用逾時時,還必須一併讀取 CRTO。

Host 先建立 NVMe Register 的位址映射,再讀取 VS 與 CAP。根據讀到的能力,選擇合法的 MPS、CSS、AMS 與 Ready Mode,接著配置 queue。若 IOCSS=1,則在啟用後以 Identify CNS 1Ch 查詢可使用的命令集組合。

CNS
Controller or Namespace Structure,選擇Identify回傳結構

讀取成功後,Host 應能算出合法的配置範圍;這次 Register 讀取本身不會產生 CQE。例如,MQES=03FFh 表示最多 1024 個 queue 位置,而 DSTRD=2 表示相鄰 Doorbell 相隔 16 bytes。

CQE
Completion Queue Entry,佇列中的完成項目

3. 判讀時要保留的條件

讀取唯讀 Register 不會以 Invalid Field CQE 回覆錯誤。至於後續設定,若 Host 把不支援的值寫入 CC.MPS 或 CC.AMS,規範可能將結果定義為 undefined behavior;此時不能要求 controller 回傳某個固定錯誤碼。

驗證時,應確認 CC.CSS 選用的命令集符合 CAP.CSS 宣告的能力及 Identify 回報的組合。同樣地,Create Queue 的 QSIZE 必須符合 MQES 限制。Admin Queue 則另受 AQA 的 4096 個位置上限約束,不能與 I/O queue 的上限混為一談。

來源:Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.5.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q02 AQA、ASQ、ACQ 與 CC 各欄位應按照什麼順序設定?設定錯誤時可能發生什麼?

跟著解說理解

Host 必須先準備 Admin SQ 與 CQ 的記憶體,再把位置與大小告訴 controller。這樣 controller 啟用後,才有可用的通道接收管理命令並回報結果。

SQ
Submission Queue,提交佇列
CQ
Completion Queue,完成佇列

1. 操作前先準備什麼

這些設定影響目標 controller 的管理介面。若 queue 位址填錯,controller 就可能無法讀取命令或寫入完成結果,導致後續 Identify、Get Features 等命令都無法正常完成。

先從 CAP 確認可用的 MPS 範圍、CSS、AMS 與 CRMS,再檢查 AQA 對 Admin Queue 長度的限制。Host 選用的配置必須同時符合這些條件。

AQA.ASQS 與 ACQS 儲存的是 entry 數量減 1;ASQ 與 ACQ 則提供實體起始位址,且必須依 CC.MPS 對齊。CC 還需設定 CSS、MPS、AMS 與 CRIME。若使用 NVM I/O,IOSQES 與 IOCQES 分別設為 6 與 4。

2. 先後順序與完成條件

先等待前一次重設完成,確認 RDY=0,再配置實體連續的 Admin Queue 記憶體,並把 Admin CQ 的 Phase 初始化為 0。接著,在 EN=0 時寫入 AQA、ASQ、ACQ 及合法的 CC 設定。將 EN 設為 1 後,等待 RDY=1。I/O entry 大小則必須在建立 I/O Queue 前設定完成。

CQ
Completion Queue,完成佇列

初始化成功後,Host 可以透過 Admin Queue 提交 Identify。不過,I/O Queue 仍需另外建立;若採 Independent mode,也不能只憑 RDY=1 就認定所有媒體都已就緒。

3. 未符合條件時如何處理

例如,以 AQA size=0 的配置啟用 controller、在 EN=1 時修改 MPS,或選用不支援的 MPS/AMS,都可能落入規範所稱的 undefined behavior。這些是 Register 使用方式的問題,不能擅自規定 controller 必須回傳 Invalid Field CQE。

驗證時,先確認 Register 的編碼正確,再確認 Admin CQ 能收到與原命令 CID 相符的 Identify 完成結果。CC.EN=1 只表示 Host 已要求啟用,單憑這個值還不足以證明初始化完成。

CID
Command Identifier,同一提交佇列內的命令識別碼

來源:Base 2.4 §3.1.4 (AQA, ASQ, ACQ, CMBLOC) · Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.5.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q03 Host 設定 CC.EN 後,應如何根據 CAP.TO 與 CSTS.RDY 判斷 Controller 是否成功 Enable?

跟著解說理解

Host 寫入啟用要求後,controller 還需要時間準備。這題要分辨「已要求啟用」與「已能處理命令」,並選對等待期限,避免過早重設;在 Base 2.4 中,判斷時也必須納入 CRTO。

1. 操作前先準備什麼

這裡判斷的是目標 controller 的啟用狀態。至於媒體是否已可存取,還要配合所選的 Ready Mode,不能只看一個 RDY 值。

讀取 CAP.CRMS、CC.CRIME、CRTO.CRWMT/CRIMT 及 CAP.TO,確認目前採用哪種 Ready Mode 及等待期限。不能假設所有啟用情況都只需要查看 CAP.TO。

2. 先後順序與完成條件

Enable 的兩條等待期限

下圖把介面就緒與媒體就緒分開。兩個計時器都從 Enable 起算,不是在 RDY=1 後才開始等媒體。

  1. 起點:CC.EN 由 0 變 1

    記下時間與 CC.CRIME;讀取 RDY、CFS,持續確認初始化狀態。

  2. 分支 A:With Media

    以 CRWMT 判斷就緒期限。CRTO 的單位是 500 ms;到 RDY=1 才提交此模式允許的命令。

  3. 分支 B:Independent

    先以 CRIMT 判斷介面就緒,再以 CRWMT 判斷媒體期限。RDY=1 不代表媒體已健康可用;仍須遵守命令的媒體就緒條件。

  4. 回到同一條時間軸驗證

    教學假設 CRIMT=2、CRWMT=20:介面期限在 Enable 後 1 s,媒體期限在 Enable 後 10 s。

A、B 是不同模式,不是依序執行的兩個操作。若發生初始化失敗,須連同 CFS 與失敗條件判斷,不能只因曾看到 RDY=1 就宣告成功。

3. 未符合條件時如何處理

透過 Register 啟用 controller,不會產生 CQE。若媒體尚未就緒,只有符合對應條件的命令,才能回報 Namespace Not Ready(SCT=0, SC=82h)或 Admin Command Media Not Ready(0/24h)。

SCT
Status Code Type,完成狀態代碼類型

應把啟用時間、CRIME、命令種類與回傳 Status 放在同一條時間軸上核對。Figure 84 只允許列出的 Admin 命令在特定條件下回報媒體尚未就緒,並非所有 Admin 命令都能用這個理由暫時拒絕執行。

4. 錯誤完成與紀錄要如何對照

透過 Register 啟用 controller,不會產生 CQE,因此這個動作本身沒有 DNR 或 More。Independent mode 在合法等待期間,若命令因媒體尚未就緒而失敗,可以回報 DNR=0;超過 CRWMT 後,就不得繼續以相同的暫時性理由回報 DNR=0。More 則依 Error Information Log 是否有該命令的補充資訊設定。

DNR
Do Not Retry,命令重試的狀態提示

若發生 §3.5.4.1 定義的初始化期限失敗,而且 controller 支援 PEL,必須記錄 NVM Subsystem Hardware Error Event,原因為 Controller Ready Timeout Exceeded。這是失敗條件觸發的紀錄,不是每次 Enable 成功都必須新增的事件。

來源:Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.5.3–3.5.4 · Base 2.4 §3.5.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q04 Host 清除 CC.EN 後,應如何判斷 Controller 是否成功 Disable?尚未 Disable 完成時能否重新 Enable?

跟著解說理解

Host 必須確認上一輪命令處理已停止,才能開始下一輪初始化。等待停用完成,就是為了建立這個明確的分界。

1. 操作前先準備什麼

清除 EN 會觸發目標 controller 的重設,影響其所有 I/O Queue。因此,這個動作並不是只暫停其中一條 SQ。

SQ
Submission Queue,提交佇列

CAP.TO 說明清除 EN 後,Host 應等待 RDY 從 1 變成 0 的最長時間。驗證時,也應保存 CC、CSTS 的讀值及時間,才能確認轉移是否在期限內完成。

在正常停用流程中,Host 從 EN=1、RDY=1 的狀態清除 EN。清除後還必須等到 RDY=0,才能重新啟用 controller。

2. 先後順序與完成條件

Host 先停止提交新命令,再清除 EN,並持續讀取 RDY。等到 RDY=0 後,重新初始化 Admin CQ 與 Host 的命令追蹤資料,完成 CC 設定,最後才把 EN 設回 1。

RDY=0 才是停用完成的判斷依據,不需要等到每筆舊命令都收到獨立 CQE。此時原有的 I/O Queue 已失效,不能繼續使用。

3. 未符合條件時如何處理

若 RDY 還是 1,Host 就把 EN 從 0 設回 1,結果屬於 undefined behavior。由於這是 Register 操作,不是提交 Admin 命令,因此不能要求 controller 以 Command Sequence Error 回覆。

核對 EN、RDY 的轉移順序後,還應確認 Host 已停止使用舊 queue。即使舊記憶體裡仍看得到資料,也不代表該 queue 仍可繼續運作。

來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q05 Host 能否在 CSTS.RDY 為 0 時送出 Command 或更新 Doorbell?

跟著解說理解

Host 可以先在記憶體中準備 SQE,但準備完成並不等於已提交命令。更新 SQ Tail Doorbell 才會通知 controller 有新命令,因此必須等到 controller 與 queue 都可用時才能進行。

SQE
Submission Queue Entry,佇列中的命令項目

1. 何時可以提交命令

這個限制適用於該 PCIe controller 的 Admin 與 I/O 命令提交。初始化時先設定 Admin Queue Register 是建立通道的步驟,不能將它視為已經送出命令。

判斷能否提交時,必須同時確認 CSTS.RDY、CC.EN 及目標 queue 是否存在。即使 RDY=1,也仍需檢查 queue 是否已建立,以及 controller 是否處於 shutdown 狀態。

先等到 RDY=1,並確認目標 queue 已建立且尚未刪除。接著,讓 SQE 的內容對裝置可見,再更新 SQ Tail Doorbell,完成提交。

SQE
Submission Queue Entry,佇列中的命令項目

2. Doorbell 不能取代就緒條件

SQ Tail Doorbell 告訴 controller 哪些新命令已提交;CQ Head Doorbell 則告訴 controller,Host 已處理到哪個完成位置。這兩種通知都不能讓尚未就緒的 controller 提前進入 Ready 狀態。

若 Host 在 controller 或 queue 尚不可用時提交,不能期待收到固定的錯誤 CQE。原因是停用中的 Admin Queue 本來就無法作為可靠的錯誤回報通道。

如果看到 EN=1、RDY=0 且等待逾時,應先檢查初始化是否完成。此時尚未合法提交的 Identify 沒有回覆,不能據此判定裝置不支援 Identify。

來源:Base 2.4 §3.3.3–3.4.1 · Base 2.4 §3.3.1 · Base 2.4 §3.1.4 (CC, CSTS, NSSR) · PCIe Transport 1.4 §3.1–3.4 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q06 CSTS.CFS 代表什麼?Controller 初始化失敗或進入 Fatal 狀態時,Host 應如何恢復?

跟著解說理解

CFS 通常表示 controller 處於嚴重異常狀態,與單筆命令失敗不同。不過,在虛擬化配置中,secondary controller 進入 Offline 也會設定 CFS。因此,判斷硬體故障前,應先確認 controller 的角色及 Online/Offline 狀態。

1. 先保留哪些證據

嚴重的 controller 異常可能影響整個命令服務;某個 namespace 的媒體錯誤,則不一定具有相同的影響範圍。兩者需要分別判斷。

應一併觀察 CSTS.CFS、RDY、CC.EN 與適用的等待期限。Identify 中宣告支援某項選配功能,並不會讓 Host 可以忽略 CFS 所指出的狀態。

先保存 Register,以及已取得的 CQE 和 Log。若管理通道仍可使用,再讀取其他診斷資訊;若通道已無回應,就不能無限等待 Get Log Page 完成。

2. 依什麼順序排除原因

先確認 Register 讀取仍有效,以及 CFS 真的是 1;不可將失效讀取的全 1 值直接解碼成每個狀態位都成立。

Host 應根據故障情況,以及目前還能存取哪些控制介面,選擇適當的 Controller Level Reset。等狀態轉移完成後,再重新初始化。若控制介面完全沒有回應,則需要平台層的恢復處理;一次清除 CC.EN 並不保證能排除所有故障。

3. 把觀察結果接回規格條件

恢復後,還要確認 RDY 正常、Identify 可完成,而且新 queue 能正確處理命令。CFS 已清除只表示該狀態不再成立,不能單憑這點認定資料完整性也已通過驗證。

若 controller 還能回報受影響命令的結果,Internal Error(SCT=0, SC=06h)可能適用。若故障已嚴重到無法透過 CQE 溝通,則可能改由 CFS 指示異常;此時不能要求每筆命令都留下 CQE。

應對照同一時間的 CFS、初始化等待期限與硬體錯誤紀錄,確認它們是否指向相同事件。單筆命令回傳 Invalid Field,並不足以證明 controller 已進入 Fatal 狀態。

來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §9.1–9.6.1 · Base 2.4 §3.5.3–3.5.4 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §8.2.7

回本冊題目

Q07 Controller 初始化後可能進入哪些 Ready Mode?Host 應如何處理暫時或限制性的 Ready 狀態?

跟著解說理解

Ready Mode 決定 controller 何時可以開始服務。Independent 模式允許管理命令在媒體初始化完成前先開始執行,但媒體仍必須在規定的期限內就緒。

1. 機制與適用範圍

這裡討論兩種模式:Controller Ready With Media,以及 Controller Ready Independent of Media。它們規定的是介面與媒體的就緒關係,而不是額外定義一組可任意解讀的 degraded-ready 狀態碼。

CRIME=0 選擇 With Media,CRIME=1 選擇 Independent。判斷當下允許執行哪些命令時,要一起檢查 CSTS.RDY、CRTO.CRIMT/CRWMT,以及 Figure 84 的命令分類。

2. 用操作與結果理解

CAP.CRMS 中的 CRWMS、CRIMS 分別宣告兩種模式的支援能力。當 CAP.CRMS=11b 時,Host 可以透過 CC.CRIME 選擇要使用的模式。

Host 必須在啟用前選好模式。若選擇 Independent 模式,RDY=1 後可先執行不依賴媒體的查詢;需要媒體的命令若收到允許的暫時性 Status,則延後處理。同時仍要追蹤從 Enable 開始計算的 CRWMT,不能重新起算。

With Media 模式正常就緒時,controller 應已能處理所要求的媒體存取。Independent 模式的 RDY=1 則先表示介面及適用命令已可服務,尚不能據此認定所有 namespace 都已就緒。

3. 容易誤判的地方

在規範允許的條件下,controller 可以回傳 0/82h 或 0/24h;其中 0/24h 只適用於 Independent 模式下特定的 Admin 命令。超過媒體就緒期限後,若仍以同一個暫時等待理由回報 DNR=0,就不符合該期限的要求。

同時核對 CAP 宣告、CC 選擇、timeout 與命令行為。CSTS.PP 是另一種暫停處理指示,不是第三個 Ready Mode。

來源:Base 2.4 §3.5.3–3.5.4 · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q08 Controller Enable、Disable、Controller Reset、NVM Subsystem Reset 與 Shutdown 有什麼差異?

跟著解說理解

這幾個動作分別處理開始服務、停止並重設,以及移除電源前的準備。先分清它們的目的,才能避免用 Reset 取代原本需要的正常 Shutdown。

1. 差別在哪裡

啟用或清除 CC.EN 的作用對象是單一 controller。NVM Subsystem Reset 則依規範涵蓋相應的 subsystem 或 domain 範圍;Shutdown 也另有 controller 與 subsystem 層級,必須先確認使用的是哪一種。

Enable:EN 0→1。Controller Reset:EN 1→0。NSSR.NSSRC 寫 4E564D65h 觸發支援的 subsystem reset。正常 controller shutdown 用 CC.SHN=01b,觀察 CSTS.SHST=10b。

2. 如何選擇與確認

CAP.NSSRS 可用來確認是否支援 NSSR。判斷 Shutdown 的作用範圍時,則還要查看 CAP 宣告的 shutdown 能力與 CSTS.ST。

若準備正常移除電源,Host 應先協調 I/O,再送出 Shutdown 通知,並等待關機處理完成。若目的是故障恢復,則選擇合適的 Reset,之後重新建立命令處理環境。

不同動作有不同的完成判斷:啟用時等待 RDY=1;停用或重設時檢查對應的狀態轉移;Shutdown 則等待 SHST=10b。Shutdown 完成不表示所有 Register 都已回到重設值。

3. 比較時要保留的條件

Register 操作本身沒有 CQE。Shutdown 過程中,controller 可以對適用命令回報 Commands Aborted due to Power Loss Notification(0/05h);但不能因此把所有 Reset 中未完成的命令,都預期為相同 Status。

應先記錄觸發方式與影響範圍,再比較操作前後保留了哪些值。如果紀錄只寫「reset」,就無法說明 AQA、PCIe 狀態與 Feature 為何有不同的保留結果。

來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.6.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

Q09 Controller Reset 後,哪些 Register、Admin Queue、Feature 與 I/O Queue 需要重新設定?

跟著解說理解

重設後,Host 需要重新建立可用的命令處理環境。這樣才能把新命令與上一輪的 queue 指標、Phase 及未完成命令分開處理。

1. 先界定觸發方式與影響對象

本題只討論清除 CC.EN 所觸發的 Controller Reset。FLR 與 NVM Subsystem Reset 來自不同觸發方式,不能直接套用這裡的 Register 保留規則。

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

先查看 §3.7.2 的重設例外,以及各 Register 的 Reset 欄,確認哪些值會保留。Feature 則還要考慮作用範圍、是否可保存設定,以及 Figure 126、127、466 的恢復規則。

2. 哪些狀態改變,恢復後怎麼處理

這種重設會保留 AQA、ASQ、ACQ、指定的 PMR Register 與 CMBMSC,但仍會重設 Admin Queue 的指標,並刪除所有 I/O SQ/CQ。Host 因此需要重新配置 CC。Feature 的恢復方式則另行判斷:可保存設定者依重設範圍恢復 Saved,沒有 Saved 時使用 Default;不可保存設定者依持續性規則處理。HMB 也需要重新配置。

PMR
Persistent Memory Region,持久性記憶體區域
HMB
Host Memory Buffer,主機記憶體緩衝

先等到 RDY=0,確認保留的 Admin Queue 記憶體仍可使用,並把 Admin CQ 的 Phase 初始化為 0。完成配置並啟用後,重新查詢必要的能力與 Feature,再協商 Number of Queues,最後依序建立 CQ 與 SQ。

重建成功後,新命令應能在新建立的 queue 上正常完成。即使沿用相同的 QID 或記憶體位址,也不表示上一輪 queue 可以接續使用。

3. 如何驗證保留或恢復結果

重設中斷的舊命令沒有統一、必須回傳的「Reset Status」。重建時若使用非法 QID 或大小,則依對應 Create 命令的規則判斷。直接對舊 queue 更新 Doorbell,不能代替重建流程。

應比較重設前後的 Register、Get Features 回覆與實際可用的 Queue 配置。尤其要分清楚:AQA 的值被保留,不代表 Admin CQ 裡的舊內容仍然有效。

先確認 Host 已清除上一輪未完成命令的對照資料,並重新初始化 Phase。即使新命令重用了相同 CID,也不能把它對應到上一輪的命令。

來源:Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.4 · Base 2.4 §5.2.30.1 (common fields, scope and persistence) · Base 2.4 §3.1.4 (AQA, ASQ, ACQ, CMBLOC) · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1

回本冊題目

原文定位與既有圖表判讀

Base 的文件頁碼等於 PDF 頁碼減 26;NVM 與 PCIe 兩份規格的文件頁碼則與 PDF 頁碼相同。以下依提供的 PDF 本文列出章節、頁碼及 Figure 編號。若同一頁包含其他主題,只引用本題需要的定義,不納入 Fabrics 或 PCIe Link、封包內容。

  • Base 2.4 · §3.1.4 (CAP, VS)
    文件頁 54–59 · PDF 80–85 · Figure 36–37
  • Base 2.4 · §3.1.4 (CC, CSTS, NSSR)
    文件頁 60–66 · PDF 86–92 · Figure 41–43
  • Base 2.4 · §3.1.4 (AQA, ASQ, ACQ, CMBLOC)
    文件頁 66–68 · PDF 92–94 · Figure 44–47
  • Base 2.4 · §3.1.4 (CRTO)
    文件頁 72–73 · PDF 98–99 · Figure 57
  • Base 2.4 · §3.3.1
    文件頁 88–91 · PDF 114–117 · Figure 73–74
  • Base 2.4 · §3.3.3–3.4.1
    文件頁 101 · PDF 127
  • Base 2.4 · §3.5.1
    文件頁 105–106 · PDF 131–132
  • Base 2.4 · §3.5.3–3.5.4
    文件頁 109–113 · PDF 135–139 · Figure 84–85
  • Base 2.4 · §3.6.1
    文件頁 114–115 · PDF 140–141
  • Base 2.4 · §3.7.1–3.7.4
    文件頁 120–124 · PDF 146–150
  • Base 2.4 · §4.4
    文件頁 166–169 · PDF 192–195 · Figure 126–127
  • Base 2.4 · §5.2.13.1.14 (header, reset, hardware, Set Feature events)
    文件頁 244–256, 258, 262–264 · PDF 270–282, 284, 288–290 · Figure 232–244, 246, 252–253
  • Base 2.4 · §5.2.30.1 (common fields, scope and persistence)
    文件頁 456–460 · PDF 482–486 · Figure 463–466
  • Base 2.4 · §8.2.7
    文件頁 754–758 · PDF 780–784 · Figure 796
  • Base 2.4 · §9.1–9.6.1
    文件頁 825–826 · PDF 851–852
  • PCIe Transport 1.4 · §3.1–3.4
    文件頁 9–13 · PDF 9–13 · Figure 3–8

需要看欄位圖時

以下連結可開啟對應的圖表教學,查閱欄位及判讀方式。每張圖保留固定的教學位置,方便之後反覆查詢。

使用的原始文件
  • NVM Express Base Specification · Revision 2.4 · 2026-07-31
    NVM-Express-Base-Specification-Revision-2.4-Ratified-2026.07.31.pdf
  • NVM Express NVM Command Set Specification · Revision 1.3 · 2026-07-31
    NVM-Express-NVM-Command-Set-Specification-Revision-1.3-Ratified-2026.07.31.pdf
  • NVM Express NVMe over PCIe Transport Specification · Revision 1.4 · 2026-07-31
    NVM-Express-NVMe-over-PCIe-Transport-Specification-Revision-1.4-Ratified-2026.07.31.pdf