NVMe · 規格與原理

NVMe Base 2.4:Telemetry:資料收集與一致性讀取

00.01.Telemetry 把裝置收集的內部狀態整理成主機可讀取的紀錄。這篇的重點是取得一份完整且一致的資料:誰建立紀錄、各資料區有多大,以及分段讀取期間紀錄是否已經換成另一份。

這篇的主軸

01

先確認誰建立紀錄

01-01主機發起與控制器發起的紀錄有不同建立方式;先分清來源,才能正確選擇讀取與確認完成的做法。

02

從表頭找出資料範圍

02-01先讀表頭,再用資料區邊界決定要讀哪些區段;標準定義位置,廠商資料格式決定如何理解內容。

03

確保分段讀到同一份紀錄

03-01資料可能分多次取回;要檢查紀錄識別與變更資訊,避免把不同時間的內容拼成一份。

把主軸連起來

00.02.先分清主機發起與控制器發起的紀錄,再從 header 得知資料區範圍。讀取多個區段時,要保留同一份紀錄的識別資訊,並依該類紀錄的規則確認讀取完成;資料區位置可由標準解釋,廠商自訂內容則需要相應格式資料。

01 資料區如何排列與計算大小

用 Last Block 安排分段讀取

先建立共同座標

01.01.Telemetry 以 512 bytes 為一個 block,header 在 block 0。每個 Data Area 都從 block 1 開始,所以 Area 2 是較大的累積範圍;不能把它想成只放在 Area 1 後面的另一段資料。

從終點算出長度

01.02.假設 Area 1 的 Last Block=65,該 Area 的資料是 block 1 到 65,共 65×512=33,280 bytes。連同 header 讀取則是 66×512=33,792 bytes。數量差 1 來自有沒有包含 block 0,並非 Last Block 又套了一次從 0 起算的數量編碼。

選擇要讀的集合

01.03.若 Area 2 的 Last Block=1000,它包含 block 1 到 1000,已包含前面 65 個 blocks。若主機已取得 Area 1,只想補上到 Area 2 的資料,新增部分才是 block 66 到 1000。比較兩個終點,可以分清完整集合與新增區段。

確認哪些欄位與內容可解釋

01.04.Area 4 的可用性需要結合相應支援與主機宣告。Last Block、generation number 等標準欄位可用來建立讀取計畫;payload 的廠商自訂內容則需要相應格式文件,不能單靠位置把任意 bytes 當成溫度或錯誤碼。

來源:Base 2.4 §8.1.30; 5.2.13.1.8-5.2.13.1.9 · Base 2.4 §8.1.30; 5.2.30.1.15 · Base 2.4 §5.2.13.1.8-5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.13.1.8-5.2.13.1.9, 文件頁 232-237,733-737, PDF 頁 258-263,759-763

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.30.1.15, 文件頁 476,733-734, PDF 頁 502,759-760

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8-5.2.13.1.9, 文件頁 232-237, PDF 頁 258-263

Telemetry Data Areas 是累積範圍Header 位於 block 0。每個 Data Area 都從 block 1 開始,較大的 Area 包含較小 Area 的資料。HeaderBlock 0Area 1Area 2Area 3
Header 位於 block 0。每個 Data Area 都從 block 1 開始,較大的 Area 包含較小 Area 的資料。

把流程對回規格條件

01.06.Telemetry 的 header 為 block 0,每個 block 是 512 bytes;所有 Data Areas 都從 block 1 起算。Area 2/3/4 是更大的累積集合,不是接在 Area 1 後的獨立區塊。Last Block 是包含在內的最後 block 編號;payload 格式與大小由廠商定義。

來源:Base 2.4 §8.1.30; 5.2.13.1.8-5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.13.1.8-5.2.13.1.9, 文件頁 232-237,733-737, PDF 頁 258-263,759-763

01.07.Controller 以 LPA.TS 宣告 Telemetry 支援,以 LPA.DA4S 宣告 Area 4;Host 以 FID 16h Host Behavior Support 的 ETDAS=1 宣告支援。DA4S 與 ETDAS 一起決定 Area 4 是否適用;建立 Area 4 時也須建立有資料的 Area 3。

ETDAS
Extended Telemetry Data Area 4 Supported;Host Behavior Support 中由 host 宣告 Area 4 支援。
Host
主機;執行作業系統並送出 NVMe 命令的一端。
FID
Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。
來源:Base 2.4 §8.1.30; 5.2.30.1.15

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.30.1.15, 文件頁 476,733-734, PDF 頁 502,759-760

01.08.讀取 LID 07h/08h 時,offset 與 transfer length 必須是 512 bytes 的倍數,否則回報 Invalid Field in Command。Controller 回傳被要求的 blocks,但超過適用最後 Data Area 邊界的資料不具規格定義的內容。

offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。
LID
Log Page Identifier;指定要讀取哪一種 log page 的編號。
來源:Base 2.4 §5.2.13.1.8-5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8-5.2.13.1.9, 文件頁 232-237, PDF 頁 258-263

資料區如何排列與計算大小
資料區域包含哪些 blocksLast Block 數值的限制
Area 11 到 L1L1=0 表示沒有資料
Area 21 到 L2L2 >= L1
Area 31 到 L3L3 >= L2
Area 41 到 L4支援條件另行檢查
閱讀相關規格圖表 → 資料區如何排列與計算大小

02 建立快照、分段讀取與確認完成

取回同一個時間點的紀錄

決定這次要建立還是讀取

02.01.LID 07h 的 CTHID 決定是否要求建立新的 Host-Initiated capture。需要新紀錄時提出建立要求;後面的分段讀取沿用既有紀錄。若每段都要求重新建立,取得的資料就可能分屬不同時間。

CTHID
Create Telemetry Host-Initiated Data;07h 的 capture 要求,後續分段讀同一快照要清為 0。

先取得可比對的識別資訊

02.02.讀取 header 並保留相應 generation number,再依 Last Block 計畫每段長度和位置。Get Log Page 的 NUMD 決定本次回傳量,LPO 決定從哪個位置取;兩者與整份 capture 的大小不同。

NUMD
Number of Dwords,0's-based transfer dword count;實際 bytes = (NUMD + 1) × 4。

讀完後確認紀錄沒有被換掉

02.03.假設第一次 header 的 generation 是 7,資料取完後再讀 header 卻得到 8。這時不能把剛才各段當成一份完整的一致紀錄;應依該類 log 的規則重新取得相符的資料。兩次值相同也必須搭配正確的建立、保留及確認流程,而非任意跨時間拼接。

Controller-Initiated 另看可用狀態與確認時機

02.04.LID 08h 的資料由控制器建立。先看 TCDA 與相應通知,再依保留事件的設定讀取;需要解除保留或確認處理時,放在適當的完成步驟。過早確認可能改變後續可取得的資料或通知狀態。

TCDA
Telemetry Controller-Initiated Data Available;2.4 中表示自上次 RAE=0 acknowledgement 後是否有更新。
來源:Base 2.4 §5.2.13.1.8 · Base 2.4 §8.1.30 · Base 2.4 §5.2.13.1.9 · Base 2.4 §5.2.13.1.8-5.2.13.1.9 · Base 2.4 §8.1.30; 5.2.30.1.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, 文件頁 232-235, PDF 頁 258-261

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, 文件頁 734-735, PDF 頁 760-761

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.9, 文件頁 237, PDF 頁 263

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8-5.2.13.1.9, 文件頁 233,235,237, PDF 頁 259,261,263

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.30.1.6, 文件頁 734-735,466-468, PDF 頁 760-761,492-494

讓分段讀取對應同一份資料
  1. 讀取 header,記下 generation number。
  2. 依資料範圍分段讀取,沿用同一份快照。
  3. 再次讀取 header,比較 generation number。
  4. 兩次 generation 相符後,才把分段內容視為同一份資料。
Generation number 用來辨識資料版本;建立新快照與讀取既有快照是不同動作。

把流程對回規格條件

02.06.LID 07h 的 CTHID 是 CDW10 bit 8;設為 1 要求新 capture,0 不更新該 snapshot。MCDA 是 bits 11:9,只有 MCDAS=1 且 CTHID=1 時適用;001b 至 100b 分別要求建立至 Area 1 至 Area 4,000b 由 controller 決定。MCDAS 來自 Supported Log Pages 的 LID Specific Parameter。

controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
MCDAS
Maximum Created Data Area Supported;07h 的 LID Specific Parameter bit 0,宣告 MCDA 支援。
MCDA
Maximum Created Data Area;支援且要求 capture 時選擇建立的最大 area。
CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
來源:Base 2.4 §5.2.13.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, 文件頁 232-235, PDF 頁 258-261

02.07.Host 讀 header 記住 generation,以 RAE=1 分段收集,再重讀 header 比對 generation;不同就重新讀取。讀 08h 還需確認 TCDA 未被其他讀取者清除;完成後用 RAE=0 讀任一部分來 acknowledgement。Generation 是 8-bit,FFh 後回到 0h。

RAE
Retain Asynchronous Event;Telemetry 收集中用 1 保留通知狀態,完成後用 0 acknowledgement。
來源:Base 2.4 §8.1.30

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, 文件頁 734-735, PDF 頁 760-761

02.08.Base 2.4 的 TCDA=0 表示自上次成功 RAE=0 讀取後沒有更新。第一次 capture 前 header 可讀;capture 過後,即使 TCDA=0,仍回傳 header 與目前保存的 internal state。不能把舊版『0 表示只有 header』的解讀沿用至 2.4。

來源:Base 2.4 §5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.9, 文件頁 237, PDF 頁 263

02.09.07h 的 snapshot 不變,直到新的 CTHID=1、Firmware Commit 或 power-on reset。08h Areas 1–3 跨所有 resets 保留,Area 4 可跨 Controller Level Resets 保留;08h 的 TCDA、TCDGN 跨 power cycles 與 resets 保留。

TCDGN
Telemetry Controller-Initiated Data Generation Number;8-bit generation,完成更新最後才遞增。
來源:Base 2.4 §5.2.13.1.8-5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8-5.2.13.1.9, 文件頁 233,235,237, PDF 頁 259,261,263

02.10.Host 以 FID 0Bh 的 TLN bit 10 啟用 Telemetry Log Notices;controller 以 Notice 類型的 Telemetry Log Changed AER 通知,也可由 07h/08h 的 TCDA 得知資料更新。

AER
Advanced Error Reporting,PCIe 用來分類、遮罩與記錄 link/transaction error 的 capability。
來源:Base 2.4 §8.1.30; 5.2.30.1.6

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.30.1.6, 文件頁 734-735,466-468, PDF 頁 760-761,492-494

建立快照、分段讀取與確認完成
快照控制欄位執行或回報的動作分段讀取時須注意什麼
CTHID=1觸發新 07h capture後續分段讀不要再次 create
MCDA限制建立到哪個 area先看 MCDAS
RAE=1保留事件不保證沒有其他 reader
TCDA=0上次 acknowledgement 後未更新2.4 不等於 payload 消失
閱讀相關規格圖表 → 建立快照、分段讀取與確認完成

03 讀懂本篇的規格圖表

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

圖表組 01 · 資料區如何排列與計算大小 · 6 張圖表

03.02.把 header 放在 block 0,再讓各 Area 的長條都從 block 1 開始。比較終點而不累加長條;計算新增部分時才使用兩個 Last Block 的差。Area 4 的存在還需查對應支援能力。

回到本節的解釋與範例

建立要求、紀錄身分與累積資料區

03.03.先選 Host-Initiated 或 Controller-Initiated log,再由 header 規劃範圍並保留紀錄識別。資料區終點、資料是否可用及版本資訊共同決定能否組成完整 capture。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
CTHID/MCDA/MCDASCTHID 要求建立,MCDAS 回報是否支援建立範圍選擇,MCDA 選想建立到哪個 Area。分段讀既有紀錄時不反覆設 CTHID=1;MCDA 的使用還需符合支援條件。
THDA1LB–THDA4LB/TCDA1LB–TCDA4LB各 Area 的含終點 block 編號;每個 Area 都從 block 1 開始。終點 65 表示資料量 65×512 bytes;加上 header 才是 66×512 bytes。
THDGN/TCDGN/TCDAgeneration number 辨認版本;TCDA 指控制器發起資料是否可用。兩次讀 header 的 generation 不同時,不能直接把中間取得的各段視為同一份紀錄。
THS/TCS/RIDscope 與 Reason Identifier 補充紀錄範圍及建立原因;廠商定義部分仍需相應格式。知道資料區大小不會自動知道 payload 每個 byte 的用途;RID 也不能被當成一般 NVMe status code。
Last Block=0/相同終點要結合各 Area 的可用規則解釋沒有新增範圍的情形。Area 1=0、Area 2=1000 時,不可把 Area 2 的 1000 又加到 Area 1 後方。
THDGN
Telemetry Host-Initiated Data Generation Number;用來比對分段讀取是否仍屬同一快照。
NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
來源:Base 2.4 §5.2.13.1.8 · Base 2.4 §5.2.13.1.9 · Base 2.4 §8.1.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, Figure 220, 文件頁 232-233, PDF 頁 258-259

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, Figure 221, 文件頁 234-235, PDF 頁 260-261

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, Figure 222, 文件頁 235, PDF 頁 261

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.9, Figure 223, 文件頁 236-237, PDF 頁 262-263

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, Figure 780, 文件頁 736, PDF 頁 762

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, Figure 781, 文件頁 737, PDF 頁 763

Base Figure 221 · Telemetry Host-Initiated Log Page

一句話重點

Base221-1Host-Initiated Telemetry header 給出各資料區終點與紀錄版本。

來源:Base 2.4 §5.2.13.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, Figure 221, 文件頁 234-235, PDF 頁 260-261

用例子讀懂

Base221-2讀完第一段後若 generation 資訊改變,就要重新確認是否仍為同一份紀錄,不能僅按 byte offset 繼續串接。

Base Figure 223 · Telemetry Controller-Initiated Log Page

一句話重點

Base223-1Controller-Initiated Telemetry 由控制器建立並回報可讀取狀態。

來源:Base 2.4 §5.2.13.1.9

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.9, Figure 223, 文件頁 236-237, PDF 頁 262-263

用例子讀懂

Base223-2TCDA 表示有相應資料可供取得時,主機還要依 TCDGN 等資訊讀完同一份紀錄並遵守確認規則。

Base Figure 780 · Telemetry Log Example - All Data Areas Populated

一句話重點

Base780-1Telemetry 各資料區終點以 Last Block 描述,可由相鄰終點相減得大小。

來源:Base 2.4 §8.1.30

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, Figure 780, 文件頁 736, PDF 頁 762

用例子讀懂

Base780-2DA1 最後 block=65、DA2=1000 時,DA2 有 1000−65=935 blocks,即 478720 bytes;不用再加一次 header。

Base Figure 781 · Telemetry Log Example - Data Area 2 Populated

一句話重點

Base781-1未填入的資料區可由相同或零的終點表示。

來源:Base 2.4 §8.1.30

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, Figure 781, 文件頁 737, PDF 頁 763

用例子讀懂

Base781-2DA1 終點為 0、DA2 為 1000 時,資料區 2 從 header 後開始,占 1000×512=512000 bytes;不能憑「第二區」就假設前面一定有第一區資料。

讓控制器支援與主機可理解的資料區一致

03.04.Identify 回報 Telemetry 與 Area 4 的能力,Host Behavior Support 則宣告主機是否能處理延伸資料區。兩邊條件配合後,Area 4 欄位才按適用規則使用。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
LPA:Telemetry 支援/DA4STelemetry 的基本支援與 Data Area 4 支援是不同能力。能取得 LID 07h 不代表一定能取得 Area 4;先檢查 DA4S。
Host Behavior Support.ETDAS主機以 ETDAS 宣告能理解延伸 Telemetry Data Area。若控制器支援 Area 4 但主機未作相應宣告,不能直接使用 Area 4 大小推算應讀的最大範圍。
來源:Base 2.4 §5.2.14.2.1 · Base 2.4 §5.2.30.1.15

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

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.15, Figure 491, 文件頁 476-477, PDF 頁 502-503

Base Figure 338 · Identify - Identify Controller Data Structure, I/O Command Set Independent

一句話重點

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-382, PDF 頁 366-408

用例子讀懂

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

Base Figure 491 · Host Behavior Support - Data Structure

一句話重點

Base491-1Host Behavior Support 告知控制器主機能處理哪些延伸行為。

來源:Base 2.4 §5.2.30.1.15

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.15, Figure 491, 文件頁 476-477, PDF 頁 502-503

用例子讀懂

Base491-2裝置支援某功能與主機宣告已能使用它不同;先確認能力,再看主機是否按對應欄位啟用相容行為。

圖表組 02 · 建立快照、分段讀取與確認完成 · 15 張圖表

03.05.先選 07h 或 08h 流程,再區分建立、讀取和確認事件的步驟。07h 後續分段不再重複觸發建立;08h 同時檢查 generation 和資料可用狀態,不能只靠 generation 相等就忽略其他主機的確認操作。

回到本節的解釋與範例

Base Figure 220 · Telemetry Host-Initiated Log Specific Parameter Field

一句話重點

Base220-1Host-Initiated Telemetry 的參數選擇是否建立新資料及收集範圍。

來源:Base 2.4 §5.2.13.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, Figure 220, 文件頁 232-233, PDF 頁 258-259

用例子讀懂

Base220-2想分段讀同一份紀錄時,不應每段都要求重新建立,否則可能把不同時間的資料接在一起。

Base Figure 222 · Telemetry Host-Initiated Log Page - LID Specific Parameter Field

一句話重點

Base222-1MCDAS 回報主機發起 Telemetry 支援的收集資料區能力。

來源:Base 2.4 §5.2.13.1.8

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, Figure 222, 文件頁 235, PDF 頁 261

用例子讀懂

Base222-2打算要求較大的資料區前,先查支援能力,再設 MCDA;要求欄位與支援欄位不能互相取代。

從資料可用事件走到紀錄讀取

03.06.Asynchronous Event Request 留下一筆等待事件的命令;完成資訊指出事件種類與要讀的 log,詳細資料仍在 Telemetry log 內。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
FID 0Bh.TLN bit 10/TCDA 0→1TLN 決定當 Controller-Initiated Data Available 由 0 變成 1 時是否傳送 Telemetry Log Changed 事件。停用 TLN 是停用該通知,不能據此認定沒有 Telemetry 資料。
AET/AEI/LID/EVNTSP事件類型、事件資訊與 LID 共同辨認通知;EVNTSP 的解讀取決於事件種類。收到指向 LID 08h 的通知後,去讀 TCDA、TCDGN 與資料範圍,不把 AER 的完成項目當成完整 capture。
來源:Base 2.4 §5.2.2.1 · Base 2.4 §5.2.30.1.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2.1, Figure 151, 文件頁 184-185, PDF 頁 210-211

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2.1, Figure 152, 文件頁 185, PDF 頁 211

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2.1, Figure 155, 文件頁 186-189, PDF 頁 212-215

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.6, Figure 474, 文件頁 466-468, PDF 頁 492-494

Base Figure 151 · Asynchronous Event Request - Completion Queue Entry Dword 0

一句話重點

Base151-1AER 完成的 DW0 指出事件類型、事件資訊與相關 log。

來源:Base 2.4 §5.2.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2.1, Figure 151, 文件頁 184-185, PDF 頁 210-211

用例子讀懂

Base151-2收到通知後,以 AET 分類、AEI 看具體事件,再用 LID 找後續資料;單看 LID 不足以知道發生什麼事。

Base Figure 152 · Asynchronous Event Request - Completion Queue Entry Dword 1

一句話重點

Base152-1AER 的 DW1 提供事件專用的補充資訊。

來源:Base 2.4 §5.2.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2.1, Figure 152, 文件頁 185, PDF 頁 211

用例子讀懂

Base152-2同一個 EVNTSP 數值在不同事件中不一定同義;先由 DW0 辨識事件,再按該事件解釋 DW1。

Base Figure 155 · Asynchronous Event Information - Notice

一句話重點

Base155-1Notice 類事件告知主機有狀態或配置變更。

來源:Base 2.4 §5.2.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.2.1, Figure 155, 文件頁 186-189, PDF 頁 212-215

用例子讀懂

Base155-2收到 Firmware Activation Starting 通知,表示切換流程開始;要確認目前韌體仍須讀對應狀態及 log,而非把通知當完成證明。

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

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

DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
LSI
Log Specific Identifier,意義由所選 log page 定義的 identifier。
LSP
Log Specific Field,意義由所選 log page 定義的 command selector。
一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
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,不代表此裝置一定實作;先查支援再使用進階選項。
NUMDL
Number of Dwords Lower,Get Log Page 的 NUMD 低 16 bits。
NUMDU
Number of Dwords Upper,Get Log Page 的 NUMD 高 16 bits。
index
index;用來選取清單中的項目或格式。它回答「選哪一項」,不是「離起點多遠」。
BPID
Boot Partition Identifier;選取 0 或 1,與目前 active partition 分開。
LPOL
Log Page Offset Lower,Get Log Page byte offset 的低 32 bits。
LPOU
Log Page Offset Upper,Get Log Page byte offset 的高 32 bits。
CSI
I/O Command Set Identifier;選擇 I/O 命令集,NVM Command Set 使用 00h。
來源:Base 2.4 §5.2.13 · Base 2.4 §5.2.13.1.1

來源: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

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.1, Figure 210, 文件頁 217, PDF 頁 243

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.1, Figure 211, 文件頁 217-218, PDF 頁 243-244

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 210 · Supported Log Pages Log Page

一句話重點

Base210-1Supported Log Pages 列出裝置實際支援哪些紀錄。

來源:Base 2.4 §5.2.13.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.1, Figure 210, 文件頁 217, PDF 頁 243

用例子讀懂

Base210-2規格定義某個 LID,但裝置沒有支援時,不能把表中定義當成裝置能力;先查支援清單。

Base Figure 211 · LID Supported and Effects Data Structure

一句話重點

Base211-1每個 LID 的支援與效果描述子補上紀錄特性。

來源:Base 2.4 §5.2.13.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.1, Figure 211, 文件頁 217-218, PDF 頁 243-244

用例子讀懂

Base211-2LSUPP 表示是否支援,LID-specific parameter 另描述相應特性;不能只看一個 bit 就推論全部參數可用。

Base Figure 474 · Asynchronous Event Configuration - Command Dword 11

一句話重點

Base474-1Asynchronous Event Configuration 各 bit 選擇對應的通知類別。

來源:Base 2.4 §5.2.30.1.6

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.6, Figure 474, 文件頁 466-468, PDF 頁 492-494

用例子讀懂

Base474-2主機啟用本篇需要的通知時,只設定對應的事件 bit;一種通知已啟用,不會自動啟用其他通知。

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 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 模式與相關選擇。

UIDX
UUID Index,指向 UUID List 位置的 index;0 表示未指定 UUID。
來源: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 的結構表閱讀。

學完後想一想

1. Area 1 的 Last Block=3,Area 2 的 Last Block=7;Area 2 包含哪些 payload blocks?

04.01.Area 2 包含 blocks 1 到 7,共 7×512=3584 bytes,已包含 Area 1 的 blocks 1 到 3。Header 是 block 0,另占 512 bytes;Last Block 是包含在範圍內的最後編號。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.13.1.8-5.2.13.1.9, 文件頁 232-237,733-737, PDF 頁 258-263,759-763

2. 分段讀完 Telemetry 後,為何還要重讀 header?

04.02.分段期間可能出現另一代 snapshot。重讀 generation 可確認資料是否仍屬同一代;若改變便須重收。Controller-initiated 資料還要檢查 TCDA,避免忽略其他讀取者已確認資料的情況。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, 文件頁 734-735, PDF 頁 760-761

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.9, 文件頁 237, PDF 頁 263