NVMe · 規格與原理

NVMe Base 2.4:Device Self-test:執行、進度與結果

00.01.Device Self-test 讓控制器在背景執行內部測試。讀懂這項功能,必須分清「接受測試要求」、「正在測試」與「留下測試結果」三件事;主機收到命令成功完成,並不表示裝置已通過測試。

這篇的主軸

01

決定測試對象

01-01先確認支援能力,再選擇測試種類及要納入的 namespace;控制器接受要求後,才開始背景測試。

namespace
namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
02

追蹤正在進行的作業

02-01用目前作業與完成百分比回答「是否還在測試、做到哪裡」;新的命令、重設或中止要求可能影響進行中的作業。

03

判讀留下的結果

03-01測試停止後,再看結果紀錄。先確認哪些欄位有效,才能解釋失敗位置與相關資訊。

把主軸連起來

00.02.先確認控制器支援哪些測試,再選擇測試種類與 namespace,送出命令後觀察目前作業及進度,最後閱讀歷史結果與有效性標記。相同的 Get Log Page 可以在不同時間回答「做到哪裡」和「最後結果如何」,但兩者使用不同欄位。

01 Device Self-test 的啟動與執行

從「收到要求」走到「開始測試」

先確認裝置願意提供什麼

01.01.從 Identify 的 OACS.DSTS 確認 Device Self-test 支援,再讀 DSTO 與 EDSTT,理解同時執行作業的限制及延伸測試時間。EDSTT 是預估時間資訊,不能當成到點就宣告測試通過的計時器。

OACS.DSTS
Optional Admin Command Support 的 Device Self-test Supported bit,判斷 command 是否可用。
EDSTT
Extended Device Self-test Time,在 power state 0 下的 extended test 名目完成分鐘數。
DSTO
Device Self-test Options,Identify Controller 中回報 refresh 與 concurrency 選項的欄位。

指定種類,也指定對象

01.02.以測試 NSID=7 為例,STC 選擇測試種類,NSID 選擇納入的 namespace。兩個欄位回答不同問題。先確認 NSID=7 是有效且可透過收到命令的控制器存取的 namespace,才能把後面的結果與預期對象連起來。

NSID
Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
STC
Self-test Code 是 Device Self-test CDW10 的動作 nibble;result entry 的 STC 則是 Status Code,須依 SCVLD 判斷有效。

把命令完成與背景作業分開記錄

01.03.送出命令後,主機先收到這筆命令的 CQE。成功代表要求已被接受;測試本身可能仍在執行。接著讀 LID 06h 的目前作業與進度,才能回答「現在是否正在測試」。

LID 06h
Device Self-test Log Page 的 identifier 06h;同時包含 current operation 與 20 筆歷史結果。
CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
LID
Log Page Identifier;指定要讀取哪一種 log page 的編號。

已有作業時,先辨認兩次要求的關係

01.04.假設延伸測試尚未完成,主機又送出新的 STC。不能把第二次命令一概當作排隊等待,也不能假定它必定取代前一個作業。應依目前作業種類和新 STC 的組合,查清楚是拒絕、停止原作業,還是建立結果;這正是命令互動表的用途。

來源:Base 2.4 §5.2.14.2.1, 8.1.8 · Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.1.8, 文件頁 352-358, 614, PDF 頁 378-384, 640

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 199, PDF 頁 225

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 199-200, PDF 頁 225-226

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 200, PDF 頁 226

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 201, PDF 頁 227

Device Self-test 的命令與背景作業使用不同完成點命令成功回覆代表要求被接受,背景測試仍可能繼續。測試期間看 DSTOS/DSTCS;測試結束後再由結果紀錄判讀 DSTR 與有效旗標。時間軸只表示順序,不按持續時間比例繪製。主機提出要求STC + NSID命令 CQE 成功要求已接受主機繼續查詢Get Log Page背景測試執行中DSTOS:目前作業DSTCS:完成百分比測試已結束RDS:歷史結果命令完成 ≠ 測試通過;歷史結果 ≠ 目前進度
命令成功回覆代表要求被接受,背景測試仍可能繼續。測試期間看 DSTOS/DSTCS;測試結束後再由結果紀錄判讀 DSTR 與有效旗標。時間軸只表示順序,不按持續時間比例繪製。
DSTCS
Device Self-test Completion Status,LID 06h 中的 0 到 100 完成百分比。
DSTOS
Device Self-test Operation Status,LID 06h 中表示目前 operation 類型的 nibble。
DSTR
Device Self-test Result,結果 entry 中表示成功、abort 或 segment failure 的 nibble。

把流程對回規格條件

01.06.啟動 Device Self-test 前,先讀 Identify Controller:OACS.DSTS 判斷 command 是否支援;EDSTT 是 extended operation 在 power state 0 的名目分鐘數;DSTO.SDSO 決定同時只能有一個 subsystem-wide operation,或每個 controller 各一個。這三個欄位回答不同問題。

controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
SDSO
Single Device Self-test Operation,選擇 subsystem-wide 單一 operation 或 per-controller operation 的 bit。
來源:Base 2.4 §5.2.14.2.1, 8.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.1.8, 文件頁 352-358, 614, PDF 頁 378-384, 640

01.07.NSID 指定 Device Self-test 要納入的 namespace。0h 表示只測試控制器;FFFFFFFFh 表示納入作業開始時、已附加且可透過該控制器存取的所有 namespace。指定單一 namespace 時,識別碼超出有效範圍會回覆 Invalid Namespace or Format;有效識別碼若尚未配置,或 namespace 未附加到收到命令的控制器,則屬 inactive,回覆 Invalid Field in Command。Host-Initiated Refresh 忽略 NSID。

Host
主機;執行作業系統並送出 NVMe 命令的一端。
來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 199, PDF 頁 225

01.08.CDW10.STC[3:0] 選動作:1h=short、2h=extended、3h=Host-Initiated Refresh、Eh=vendor specific、Fh=abort;其餘 encoding reserved。只有 STC=Eh 時 CDW15.DSTP 才是 vendor specific,其他情況 CDW15 reserved。

DSTP
Device Self-test Parameter,只有 vendor-specific STC=Eh 時才有 vendor-defined 語意的 CDW15。
CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 199-200, PDF 頁 225-226

01.09.已有 operation 時,再送 short、extended 或 Host-Initiated Refresh 必須以 Device Self-test in Progress 中止;vendor-specific 新命令的行為仍是 vendor specific。STC=Fh 則依序中止目前 operation、建立最新 result、清除 current status,最後成功完成 command。

來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 200, PDF 頁 226

01.10.Device Self-test command 的 Admin CQE 只證明『啟動/中止動作已被處理』,不是背景測試已完成。command-specific status 1Dh 表示已有 operation in progress;software 必須把 CQE 與後續 LID 06h 分開記錄。

Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 201, PDF 頁 227

Device Self-test 的啟動與執行
測試對象或控制值涵蓋的範圍或動作執行與結果的規則
NSID=0只包含 controller不測 namespace media
目前可存取的 NSID指定 namespaceinvalid 與 inactive status 不同
NSID=FFFFFFFFh所有 attached/accessible namespaces集合以 start 時點為準
STC=Fhabort current operation成功不代表曾有 operation
閱讀相關規格圖表 → Device Self-test 的啟動與執行

02 LID 06h 的目前進度與歷史結果

讀懂一筆測試紀錄,而非只找「成功」兩個字

先看現在,再看歷史

02.01.LID 06h 前面的 DSTOS、DSTCS 描述目前作業及完成百分比;後面的結果項目保存已結束作業。假設目前進度是 50%,第一筆歷史紀錄仍可能是上一次測試結果,不能拿來宣告這次測試已成功或失敗。

辨認是哪種測試、怎麼結束

02.02.在同一筆結果內,DSTC 說明測試種類,DSTR 說明結束結果,SEGN 在適用時指出發生失敗的測試區段。把種類、結果及區段放在一起,才知道後面的失敗資訊是在描述哪一次作業。

SEGN
Segment Number,只有 DSTR=7h 時指出第一個失敗 diagnostic segment。

先讀有效性,再讀數值

02.03.VDINFO 的有效性旗標決定 NSID、FLBA 及狀態碼能否使用。例如 FLBA 的記憶體內容即使是 123,只要 FLBA Valid 沒有成立,123 就不能用來指出故障位置。有效旗標成立後,才以 namespace 的格式解釋這個 LBA。

VDINFO
Valid Diagnostic Information,分別 gate NSID、FLBA、SCT 與 SC 的 validity bitmap。
FLBA
Failing LBA,NVM Command Set 定義為造成 self-test failure 的其中一個 logical block address。

限制結論的範圍

02.04.NVM Command Set 說明 FLBA 可以指出造成測試失敗的一個 logical block;遇到多個失敗區塊時,這個欄位只提供其中一個。它不是完整清單,也不能擅自推論一定是所有失敗區塊中編號最小的那個。

logical block
邏輯區塊;namespace 可定址的基本單位,其資料大小由使用中的格式決定。
NVM
Non-Volatile Memory,斷電後仍能保存資料的記憶體。
來源:Base 2.4 §5.2.13 · Base 2.4 §5.2.13.1.7 · NVM Command Set 1.3 §4.1.4.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, 文件頁 213-216, PDF 頁 239-242

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 229-230, PDF 頁 255-256

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 231, PDF 頁 257

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 231-232, PDF 頁 257-258

來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.4.3, 文件頁 76, PDF 頁 76

把流程對回規格條件

02.06.讀取 LID 06h 所需的最小 Get Log Page slice 是:LID=06h、LSP=0、RAE 依事件策略選擇、NUMD 表示 564 bytes、LPOL/LPOU=0、OT=0、CSI=0、UIDX=0。564 bytes=141 dwords,因此 0's-based NUMD=140=008Ch;RAE=0 時 CDW10=008C0006h。

0's-based
0's-based encoding,以 0 表示實際數量 1;依欄位換算公式通常是欄位值加 1。
LPOL
Log Page Offset Lower,Get Log Page byte offset 的低 32 bits。
LPOU
Log Page Offset Upper,Get Log Page byte offset 的高 32 bits。
NUMD
Number of Dwords,0's-based transfer dword count;實際 bytes = (NUMD + 1) × 4。
UIDX
UUID Index,指向 UUID List 位置的 index;0 表示未指定 UUID。
CSI
I/O Command Set Identifier;選擇 I/O 命令集,NVM Command Set 使用 00h。
LSP
Log Specific Field,意義由所選 log page 定義的 command selector。
RAE
Retain Asynchronous Event,Get Log Page 是否保留相關 asynchronous event 的 selector。
來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, 文件頁 213-216, PDF 頁 239-242

02.07.LID 06h 的 byte 0 以 DSTOS 表示目前 operation,byte 1 的 DSTCS[6:0] 是完成百分比;DSTOS=0 時 host 應忽略 DSTCS。controller 在 operation 完成或被中止時,必須先建立 result entry,之後才能把 in-progress status 清為 0。

來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 229-230, PDF 頁 255-256

02.08.LID 06h 保留 20 筆、每筆 28 bytes 的結果,RDS1 永遠是最新完成或中止的 operation。未使用 entry 必須讓 DSTR=Fh 且 DSTC=0h,其他欄位由 host 忽略;不能把全零以外的殘值當成歷史結果。

來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 229-230, PDF 頁 255-256

02.09.每筆 DSTS 的高 nibble DSTC 表示原始 self-test code,低 nibble DSTR 表示完成/中止原因。只有 DSTR=7h 時 SEGN 才指出第一個失敗 segment;其他 DSTR 下 SEGN 應忽略。

來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 231, PDF 頁 257

02.10.VDINFO 的 NSIDVLD、FVLD、SCTVLD、SCVLD 是四個獨立 有效性判斷。NSID、FLBA、STCT、STC 只有在對應 bit=1 時才可解讀;先驗證 validity,再讀數值,不能用非零值猜測有效。

FVLD
Failing LBA Valid,決定 FLBA 欄位是否可解讀的 validity bit。
來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 231-232, PDF 頁 257-258

02.11.Base 將 Figure 219 的 FLBA 留給 I/O Command Set 定義。NVM Command Set 1.3 規定 bytes 23:16 是造成失敗的 logical block address;若有多個失敗 logical blocks,只回其中一個,且僅 FVLD=1 時有效。

I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
來源:NVM Command Set 1.3 §4.1.4.3

來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.4.3, 文件頁 76, PDF 頁 76

LID 06h 的目前進度與歷史結果
進度或歷史欄位描述什麼資訊何時可以使用這個欄位
DSTOS/DSTCScurrent state/progressDSTOS=0 時忽略 percentage
DSTR=7h + SEGN已知第一個 failed segment其他 DSTR 忽略 SEGN
FVLD + FLBA其中一個 failing LBA不是所有失敗 LBA 清單
POH + STCT/STCfailure context仍需 validity bits
POH
Power On Hours,self-test result 建立時累積的 power-on hours,不含指定 low-power 時間。
閱讀相關規格圖表 → LID 06h 的目前進度與歷史結果

03 讀懂本篇的規格圖表

03.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。

圖表組 01 · Device Self-test 的啟動與執行 · 7 張圖表

03.02.命令格式先讀 NSID 與 STC,再沿狀態流程找到 LID 06h。結果布局先拆開測試種類與結果碼,再依 SEGN、FVLD 等有效性條件決定要讀哪些細節。

回到本節的解釋與範例

依目前作業與新要求,逐步判斷接受或中止

03.03.先用 DSTO.SDSO 決定「已有測試」是看收到命令的控制器,還是看整個 subsystem,再以 STC 選互動表的一列。NSID 與 DSTP 則分別決定對象及適用參數。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
STC bits 3:0/DSTPSTC=1h、2h、3h 分別是 short、extended、Host-Initiated Refresh;Eh 是廠商測試;Fh 是中止。DSTP 只有 Eh 使用廠商定義,其餘為保留。要求 short test 時,不能在 DSTP 填一個自訂「測試次數」;此處並沒有這個標準用途。
已有作業 + STC=1h/2h/3h新命令以 Device Self-test in Progress 結束,不會因新命令而排入下一個標準測試。Extended 正在執行,再送 short:第二筆要求被拒絕,不能把它的 status 當成第一筆測試已發現故障。
已有作業 + STC=Fh依序中止作業、建立最新結果紀錄、更新目前狀態,再成功完成中止命令。中止命令成功後,應到歷史結果找被中止作業的紀錄,不能把成功 CQE 解釋成測試通過。
沒有作業 + STC=1h/2h/3h 或 Fh啟動要求先驗證參數並建立目前作業;Fh 則成功完成而不修改 log。Eh 的處理由廠商定義。沒有測試時送 Abort,不會憑空新增一筆測試失敗紀錄。
NSID=0h/單一 NSID/FFFFFFFFh0h 只含控制器,單一值選指定 namespace,FFFFFFFFh 選作業開始時經該控制器可存取的所有已附加 namespaces。Refresh 忽略 NSID。識別碼 invalid 回 Invalid Namespace or Format;inactive 回 Invalid Field in Command。兩者要按 Base 的有效性及附加關係區分。
來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 176, 文件頁 199, PDF 頁 225

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 177, 文件頁 199, PDF 頁 225

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 178, 文件頁 200, PDF 頁 226

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 179, 文件頁 200, PDF 頁 226

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 180, 文件頁 201, PDF 頁 227

Base Figure 176 · Device Self-test Namespace Test Action

一句話重點

Base176-1Self-test 的 NSID 選擇測試對象,invalid 與 inactive 分別表示不同問題。

來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 176, 文件頁 199, PDF 頁 225

用例子讀懂

Base176-2假設 NN=8,NSID 9 無效;NSID 3 若尚未配置或未附加到此控制器,則為 inactive。0h 在此命令特別表示只測控制器,Host-Initiated Refresh 忽略 NSID。

Base Figure 177 · Device Self-test - Command Dword 10

一句話重點

Base177-1STC 選擇短測試、延伸測試、Refresh、廠商測試或中止。

來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 177, 文件頁 199, PDF 頁 225

用例子讀懂

Base177-2想執行短測試填 1h,想中止正在執行的測試填 Fh;這個選擇器不是測試目前完成百分比。

Base Figure 179 · Device Self-test - Command Processing

一句話重點

Base179-1Self-test 命令處理取決於是否已有測試在執行。

來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 179, 文件頁 200, PDF 頁 226

用例子讀懂

Base179-2沒有測試時送 Abort 可以成功但不新增測試結果;有測試時送 Abort 則會中止並記錄結果,兩種成功有不同效果。

Base Figure 180 · Device Self-test - Command Specific Status Values

一句話重點

Base180-1Device Self-test in Progress 表示已有測試,新的要求未能開始。

來源:Base 2.4 §5.2.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, Figure 180, 文件頁 201, PDF 頁 227

用例子讀懂

Base180-2收到此狀態後,先讀目前測試資訊;它不是新測試的通過結果,也不是說裝置的資料一定壞掉。

同一筆命令的身分、對象與資料方向

03.04.CDW0 先選操作與資料指標格式;NSID 選操作對象;DPTR/MPTR 再指向資料。命令專屬 Dwords 的含義由 OPC 與命令集決定。

DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
MPTR
Metadata Pointer,SQE 中指出獨立 metadata buffer 的欄位。
一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
OPC/FUSE/CIDOPC 選操作,FUSE 說明融合操作角色,CID 讓完成項目找回原命令。相同的 CDW10 數值放在 Read 與 Set Features 中,可能完全不是同一種意思。
PSDT → DPTR/MPTRPSDT 決定指標依 PRP 或 SGL 等格式解讀;指標內的數值不可在未選格式時直接當成長度。主機先選指標格式,再按該格式準備 buffer 描述,最後由命令語意判斷資料方向。
NSID/CDW2–CDW15NSID 與命令專屬欄位共同決定對象、範圍及選項。Create 的 DPTR 指向建立參數;它不是新 namespace 的實體儲存位址。
NDT/NDM/MDPTR廠商命令使用共同格式時,資料與 metadata 長度各有自己的欄位及指標。先看廠商命令格式支援宣告,再依長度定義換算,不能把欄位上限直接加 1 後存回同寬整數。
metadata
隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
PSDT
PRP or SGL for Data Transfer,CDW0 中決定 DPTR 應按 PRP 或 SGL 解讀的欄位。
CID
Command Identifier,與 SQ identifier 合用以辨識 outstanding command。
NDM
Number of Dwords in Metadata Transfer,standard vendor-specific format 中的實際 metadata dword 數。
NDT
Number of Dwords in Data Transfer,standard vendor-specific format 中的實際 data dword 數。
PRP
Physical Region Page,以 memory page 為單位描述 host-addressable data buffer 的 pointer 格式。
SGL
Scatter Gather List,以 descriptor 與 segment 描述一段或多段 data buffer 的格式。
來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168

Base Figure 93 · Common Command Format

一句話重點

Base93-1共通 SQE 固定各命令共用欄位的位置。

SQE
Submission Queue Entry,SQ 中的一筆命令資料結構。
來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168

用例子讀懂

Base93-2同樣在 CDW10,Read 與管理命令可以有完全不同含義;先依 OPC 選命令,再查專屬欄位表。

從支援能力決定測試計畫

03.05.這份 Identify Controller 結構很長,本篇需要的是測試支援、同時執行限制與延伸測試時間;其他功能欄位不參與這次判讀。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
OACS.DSTSDevice Self-test 支援位元決定能否使用命令。DSTS=0 時,不能因 LID 06h 有固定編號就假定能啟動測試。
DSTO.SDSO指出 subsystem 的單一 Device Self-test 作業限制。兩個控制器都支援命令,不等於可各自同時啟動一個作業;仍需確認共享的作業限制。
EDSTT延伸測試完成時間以分鐘表示,供安排測試使用。EDSTT=10 表示時間資訊是 10 分鐘;它不是目前完成百分比,也不能當作第 10 分鐘必定通過的保證。
來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 340-364, PDF 頁 366-390

Base Figure 338 · Identify Controller Data Structure

一句話重點

Base338-1Identify Controller 先告知能力與限制,主機再決定可使用的操作。

來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 340-364, PDF 頁 366-390

用例子讀懂

Base338-2規格列出某選用命令時,先查相應支援欄位再發出要求;「命令有定義」與「這台控制器支援」是不同證據。

圖表組 02 · LID 06h 的目前進度與歷史結果 · 12 張圖表

03.06.先分開 log 的 current header 與歷史結果描述子。DSTS 中測試種類和結果碼分開讀,再以結果種類及有效位決定 SEGN、FLBA 等欄位是否有效;NUMD 計算則使用整個所需傳輸長度。

回到本節的解釋與範例

把失敗位置連回有效旗標與 namespace 格式

03.07.NVM Figure 111 補上 Base 結果紀錄中 FLBA 的命令集語意。它不另外建立一份測試結果,必須回到同一筆 Base Figure 219 紀錄內判讀。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
VDINFO 的 FLBA Valid → FLBA bytes 23:16有效旗標成立時,FLBA 才表示造成失敗的一個 logical block。FLBA=123、有效旗標=0:不能採用 123。有效旗標=1:才可將它作為其中一個失敗位置。
NSID/LBA format/FLBANSID 確定儲存對象,格式決定該 LBA 代表多少資料;多個失敗區塊可能只回報其中之一。每個 block 4096 bytes 時,LBA 123 的資料起點是 503808 bytes。這是 logical address 的換算,不是 NAND 實體頁地址。
來源:NVM Command Set 1.3 §4.1.4.3

來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.4.3, Figure 111, 文件頁 76, PDF 頁 76

NVM Figure 111 · Self-test Results Data Structure

一句話重點

NVM111-1Self-test 的 FLBA 只有在有效性標記成立時才是有效故障位置。

來源:NVM Command Set 1.3 §4.1.4.3

來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.4.3, Figure 111, 文件頁 76, PDF 頁 76

用例子讀懂

NVM111-2紀錄中即使保留一個非零 FLBA,若對應有效 bit 沒有設定,就不能據此指認那個 LBA 壞掉。

目前進度與歷史結果使用不同欄位

03.08.先由 log header 讀目前作業,再選一筆結果紀錄。紀錄內先看測試種類與結果,再按有效性旗標讀失敗欄位。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
DSTOS/DSTCS;RDS1–RDS20前者是目前作業與進度,後者是結果紀錄序列。目前進度 50% 與最前面的歷史成功結果可以同時存在,兩者未必屬於同一作業。
DSTC/DSTR/SEGN/POH分別描述測試種類、結果、適用的失敗區段與作業時間背景。先確認作業如何結束,再決定 SEGN 能否用於解釋失敗位置。
VDINFO → NSID/FLBA/STCT/STC有效性旗標決定哪些資訊可信;STCT 與狀態碼需成對解讀。FLBA Valid=0 時,FLBA 的非零內容不能用來指出故障 LBA。
VS廠商專屬結果需依廠商格式解讀,不沿用其他裝置的定義。未知 VS bytes 保留原值及來源,不能任意翻成錯誤類別。
來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, Figure 218, 文件頁 230, PDF 頁 256

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, Figure 219, 文件頁 231-232, PDF 頁 257-258

Base Figure 218 · Device Self-test Log Page

一句話重點

Base218-1Self-test log 同時保存目前作業狀態與歷史結果。

來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, Figure 218, 文件頁 230, PDF 頁 256

用例子讀懂

Base218-2目前進度 50% 表示正在執行的測試;最前面的歷史結果可能屬於前一次已結束測試,兩者不要混成同一次結果。

Base Figure 219 · Self-test Result Data Structure

一句話重點

Base219-1Self-test Result 的有效標記決定哪些失敗欄位可以解讀。

來源:Base 2.4 §5.2.13.1.7

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, Figure 219, 文件頁 231-232, PDF 頁 257-258

用例子讀懂

Base219-2先看 VDINFO,再決定 NSID、FLBA 或狀態欄位是否有效;欄位有非零內容不代表它在這次結果中有效。

測試區段與 Format 影響範圍如何一起判斷

03.09.Figure 700 是測試切分的說明性範例;Figure 701 則是 Format 對測試的中止條件表。前者不要求所有廠商使用相同區段,後者要依 SES 選擇 FNS 或 SENS 分支。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
segment/test performed/failure criteria/SEGN區段、測試內容與失敗判準描述一次內部檢查;結果紀錄的 SEGN 在有效時指向失敗區段。SEGN=2 不足以直接推論某顆 NAND die 壞掉,仍需廠商對區段的定義。
SES=000b → FNS;SES=001b/010b → SENS沒有 secure erase 時看 FNS,有 secure erase 時看 SENS;相應位元為 1 時,表中要求中止,不再以兩筆 NSID 的相同與否作限制。不要同時把 FNS 與 SENS 都當成必要條件,應先由 SES 選對那一欄。
單一 Format NSID/單一測試 NSID相應範圍位元為 0 時,兩個 NSID 相同才落入表中的必須中止條件。Format NSID=7、測試 NSID=7,與 Format NSID=8、測試 NSID=7 的判斷不同。
FFFFFFFFh/OptionalFormat 全部 namespace 時中止;單一 Format 對上涵蓋所有 namespace 的測試時,表中部分列是 Optional。Optional 表示允許中止但不要求中止,不能改寫成一定中止或一定繼續。
來源:Base 2.4 §8.1.8 · Base 2.4 §8.1.8.1-8.1.8.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8, Figure 700, 文件頁 615, PDF 頁 641

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8.1-8.1.8.2, Figure 701, 文件頁 616, PDF 頁 642

Base Figure 700 · Example Device Self-test Operation (Informative)

一句話重點

Base700-1Self-test 範例示意分段測試與失敗判斷的關係。

來源:Base 2.4 §8.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8, Figure 700, 文件頁 615, PDF 頁 641

用例子讀懂

Base700-2沿某一 segment 看測試內容與失敗條件,再看結果如何記錄;此圖是說明性例子,不要求每家控制器都用相同內部測試順序。

Base Figure 701 · Format NVM command Aborting a Device Self-Test Operation

一句話重點

Base701-1Format NVM 是否中止 Self-test 取決於作用範圍與格式化條件。

來源:Base 2.4 §8.1.8.1-8.1.8.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8.1-8.1.8.2, Figure 701, 文件頁 616, PDF 頁 642

用例子讀懂

Base701-2格式化另一個不在測試範圍內的 namespace,不能只憑「有 Format 命令」就推論測試必須中止;按 NSID、SES 等條件交叉查表。

同一筆 Get Log Page 的目標、範圍與資料位置

03.10.讀 log 先選 LID 與命令集,再解讀該 log 的 LSP/LSI;NUMD 決定本次量,LPO 決定本次起點,DPTR 決定主機接收位置。

LSI
Log Specific Identifier,意義由所選 log page 定義的 identifier。
一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
LID/CSI/LSP/LSILID 與 CSI 選紀錄種類,LSP、LSI 的含義由所選 log 定義。LSP 在 Boot 中可含 BPID,在 Telemetry 中有建立 capture 的控制位元,不能跨 log 照搬。
NUMDU/NUMDL先合成 NUMD=(NUMDU<<16)|NUMDL,再計算 (NUMD+1)×4 bytes。512 bytes 對應 NUMD=127;高低部分不能各自加 1。
LPOU/LPOL/OT高低欄位組成 64-bit offset;OT 決定按 byte 位移或項目索引解讀。byte-offset 模式下,從 512-byte 表頭後開始讀資料要保留起點差異;index 模式不能直接使用同一個 byte 數。
DPTR/RAEDPTR 給接收記憶體,RAE 控制相關事件的保留行為。分段讀取先準備每段 buffer,再在恰當時機確認事件,避免中途改變可取得的紀錄。
LSUPP/LID Specific ParameterSupported Log Pages 回報實際支援及 log 專屬能力。規格列有某個 LID,不代表此裝置一定實作;先查支援再使用進階選項。
offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。
NUMDL
Number of Dwords Lower,Get Log Page 的 NUMD 低 16 bits。
NUMDU
Number of Dwords Upper,Get Log Page 的 NUMD 高 16 bits。
index
index;用來選取清單中的項目或格式。它回答「選哪一項」,不是「離起點多遠」。
來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 203, 文件頁 213, PDF 頁 239

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 204, 文件頁 213, PDF 頁 239

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 205, 文件頁 214, PDF 頁 240

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 206, 文件頁 214, PDF 頁 240

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 207, 文件頁 214, PDF 頁 240

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 208, 文件頁 214-215, PDF 頁 240-241

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 209, 文件頁 215-216, PDF 頁 241-242

Base Figure 203 · Get Log Page - Data Pointer

一句話重點

Base203-1Get Log Page 的 DPTR 指向主機接收 log 資料的空間。

來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 203, 文件頁 213, PDF 頁 239

用例子讀懂

Base203-2同樣是 512-byte buffer,LID 不同會得到不同結構;DPTR 只提供位置,不會決定 log 類型。

Base Figure 204 · Get Log Page - Command Dword 10

一句話重點

Base204-1Get Log Page 的 CDW10 選擇 log、低位長度及相關控制參數。

來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 204, 文件頁 213, PDF 頁 239

用例子讀懂

Base204-2讀取 512 bytes 共 128 Dwords,長度原始值為 127;同時填正確 LID,才能知道回來的是哪一份紀錄。

Base Figure 206 · Get Log Page - Command Dword 12

一句話重點

Base206-1LPOL 是 log offset 的低 32 bits,單位還要看 offset 模式。

來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 206, 文件頁 214, PDF 頁 240

用例子讀懂

Base206-2byte-offset 模式下讀下一段 512 bytes,LPOL 設 512;index-offset 模式則以項目索引解釋,數字 512 不再表示相同位置。

index-offset
index-offset 對比;index 選取項目,offset 計算位置。例如從 0 起算的 Format Index=2 選第 3 個格式,而 OFST=256 表示從 image 起點位移 256 個 Dwords。

Base Figure 208 · Get Log Page - Command Dword 14

一句話重點

Base208-1CDW14 的 CSI、OT、UIDX 決定命令集、offset 模式與相關選擇。

來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 208, 文件頁 214-215, PDF 頁 240-241

用例子讀懂

Base208-2相同 LPOL=4,在 byte-offset 與 index-offset 下表示不同事物;先看 OT 才能正確解讀位置。

Base Figure 209 · Get Log Page - Log Page Identifiers

一句話重點

Base209-1LID 清單把紀錄編號與其命令集、範圍連在一起。

來源:Base 2.4 §5.2.13

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, Figure 209, 文件頁 215-216, PDF 頁 241-242

用例子讀懂

Base209-2先依本篇所需的紀錄選取清單中的對應列,再看 CSI 與作用範圍;編號只選紀錄種類,完整欄位排列仍到該 log 的結構表閱讀。

03.11.Device Self-test 是由 vendor-specific segments 組成的背景工作。若另一個 command 必須暫停測試才能處理,controller 必須(shall)依序 suspend self-test、處理並完成該 command、再 resume self-test;同時可處理哪些 command 則由 vendor 決定。

來源:Base 2.4 §8.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8, 文件頁 614, PDF 頁 640

03.12.short operation 應(should)在兩分鐘內完成,且 Controller Level Reset 會中止;extended operation 應在 EDSTT 內完成,必須跨 Controller Level Reset 與 power restoration 持續並於之後 resume。兩者不能共用同一套 reset 預期。

來源:Base 2.4 §8.1.8.1-8.1.8.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8.1-8.1.8.2, 文件頁 615-616, PDF 頁 641-642

03.13.short 與 extended 都會被適用的 Format NVM、sanitize start 或 STC=Fh 中止,namespace 從 inventory 移除時則可能(may)中止。Figure 701 顯示 Format 的 NSID 與 secure-erase 選項會改變是否必須中止,不能只看 opcode。

來源:Base 2.4 §8.1.8.1-8.1.8.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.8.1-8.1.8.2, 文件頁 615-616, PDF 頁 641-642

學完後想一想

1. Device Self-test 啟動命令成功後,如何知道測試是否還在執行?

04.01.啟動 completion 不包含整個測試的最終結果。Device Self-test log 的 current operation 與 completion percentage 描述目前進度;結果紀錄則用於已結束的測試。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 201, PDF 頁 227

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 229-230, PDF 頁 255-256

2. Self-test result 中 FLBA 看起來是合理地址,就一定可以當作失敗位置嗎?

04.02.要先檢查對應的 validity bit;未宣告有效時不能依數值推論。即使有效,也可能只描述多個失敗 logical blocks 中的一個,並非完整範圍。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 231-232, PDF 頁 257-258

來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.4.3, 文件頁 76, PDF 頁 76