NVMe · 規格與原理

NVMe Base 2.4:HMB、Doorbell Emulation 與 Vendor Commands

00.01.這篇說明主機如何把記憶體提供給控制器,以及如何理解 doorbell 位址與廠商命令長度。共同問題是:哪一方可以使用這塊記憶體、何時可以收回,以及欄位中的數值究竟用什麼單位。

這篇的主軸

01

把主機記憶體借給控制器

01-01HMB 的重點是記憶體使用權:如何提供、允許使用,以及何時能收回。

HMB
Host Memory Buffer,由 host 配置並在 enable 期間交由 controller 專用的 volatile memory ranges。
02

處理容量與生命週期

02-01用容量換算理解描述項,再比較電源轉換和重設對記憶體使用的影響。

03

讀懂另兩種編碼

03-01Doorbell Emulation 與廠商命令分別用位址和長度算例說明;它們是另外的介面機制。

把主軸連起來

00.02.HMB 的提供、使用與收回形成一個完整流程;電源轉換與 reset 會影響這個流程。Doorbell Emulation 與 Vendor Commands 另以位址和長度算例說明,不把它們當成 HMB 的必要步驟。

01 HMB 記憶體的提供、使用與收回

01.01.HMB 是主機提供給控制器使用的記憶體。主機先配置區域和描述子,再以 Feature 將它交給控制器;啟用期間,主機必須維持這些記憶體有效,不能當成一般空閒記憶體重新分配。配置者仍是主機,但可使用的時機受 HMB 規則限制。

01.02.停用要求已提交與停用命令已完成,是兩個不同時刻。在中間這段時間,控制器仍可能取回必要資料,因此主機不能提前收回區域。只有到規格定義的交接完成點,才可以修改或回收;這也是 HMB 的完成狀態與背景測試啟動成功不同之處。

來源:Base 2.4 §5.2.14.2.1, 8.2.4 · Base 2.4 §5.2.30.2.3, 8.2.4 · Base 2.4 §5.2.30.2.3 · Base 2.4 §8.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.2.4, 文件頁 357, 362, 744, PDF 頁 383, 388, 770

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 8.2.4, 文件頁 515-516, 744, PDF 頁 541-542, 770

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 515-516, PDF 頁 541-542

來源:NVME-BASE-2.4, Rev. 2.4, §8.2.4, 文件頁 744, PDF 頁 770

Host Memory Buffer 的使用期間
  1. Host 配置記憶體,建立 descriptor list。
  2. Host 透過 HMB Feature 將記憶體範圍提供給 controller。
  3. 啟用期間,host 維持描述的記憶體範圍有效。
  4. 停用並完成規格要求的交接後,host 才能回收記憶體。
記憶體屬於 host,但不能在 controller 仍可使用時提前回收。
controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
Host
主機;執行作業系統並送出 NVMe 命令的一端。

把流程對回規格條件

01.03.HMPRE=0 表示 HMB 不支援;非零時以 4 KiB units 表示 preferred size,HMMIN 表示 minimum request。HMMINDS 與 HMMAXD 是 descriptor 限制。即使 host 無法提供 HMB,controller 仍必須(shall)正常運作。

HMMINDS
Host Memory Buffer Minimum Descriptor Entry Size,每個可用 descriptor 的最低 4 KiB-unit 大小。
HMMAXD
Host Memory Maximum Descriptor Entries,controller 可使用的 descriptor entry 上限。
HMMIN
Host Memory Buffer Minimum Size,以 4 KiB units 回報 controller 要求的最低大小。
HMPRE
Host Memory Buffer Preferred Size,以 4 KiB units 回報 controller 偏好的配置大小。
來源:Base 2.4 §5.2.14.2.1, 8.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.2.4, 文件頁 357, 362, 744, PDF 頁 383, 388, 770

01.04.HMB 是 host 配置、controller 專用的記憶體租約。Set Features enable 成功後,host 必須(shall)停止寫入 descriptor list 與所有描述的 memory ranges,直到 disable command 完成;這是 ownership transfer,不只是 performance hint。

來源:Base 2.4 §5.2.30.2.3, 8.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 8.2.4, 文件頁 515-516, 744, PDF 頁 541-542, 770

01.05.HMB 已 enable 時再次送 EHM=1 必須以 Command Sequence Error 中止;尚未 enable 時送 EHM=0 則成功但不做事。disable completion 前 controller 應取回所需資料;CQE 被 posted 後才表示 host 可安全修改或回收 buffer。

CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
EHM
Enable Host Memory,啟用或停用 controller 使用 HMB 的 bit。
來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 515-516, PDF 頁 541-542

01.06.使用 HMB 時發生 surprise removal,controller 必須(shall)確保不造成 data loss 或 data corruption。這不代表 HMB 內容本身具有持久性,而是裝置不得把內部正確性依賴在 host 一定能先走正常 release 流程。

來源:Base 2.4 §8.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §8.2.4, 文件頁 744, PDF 頁 770

HMB 記憶體的提供、使用與收回
HMB 使用階段哪一方可以使用記憶體進入下一階段的條件
啟用之前主機配置記憶體並初始化描述子先核對位址對齊和描述子數量
啟用命令完成後控制器專用;主機不得修改host shall not write
停用命令尚未完成控制器仍可取回必要資料主機仍須等停用完成
停用命令完成後主機可修改或收回記憶體停用完成後才可修改或回收
閱讀相關規格圖表 → HMB 記憶體的提供、使用與收回

02 HMB 的描述子、大小與位址

由兩個區域算出完整 HMB

列出每份資料的單位

02.01.假設 CC.MPS 對應 8 KiB page,兩個 descriptor 的 BSIZE 都是 16,則各提供 128 KiB,合計 256 KiB。這個例子刻意不用 4 KiB page,讓固定單位與目前頁單位的差別看得出來。

BSIZE
Buffer Size,HMB descriptor 中以 CC.MPS pages 表示的連續範圍長度。
MPS
Memory Page Size,controller 使用的 memory page 大小設定;影響 queue address 與 PRP 對齊。
CC
Controller Configuration,host 用來選擇設定並啟用或停用 controller 的 property。

將清單加總對回 HSIZE

02.02.合計 32 個目前 page,因此 HSIZE=32。若 HMPRE=64,它使用固定 4 KiB 單位,也代表 256 KiB。HSIZE 與 HMPRE 原值不同,換成 bytes 後卻可能相同。

HSIZE
Host Memory Buffer Size,以 CC.MPS memory-page units 表示的 HMB 總大小。

再檢查位置與生命週期

02.03.HMDLAL、HMDLAU 指清單,BADD 指每個區域。主機不只要確保數量加總正確,也要讓清單與區域在控制器可使用期間保持有效,停用交接完成後才收回。

BADD
Buffer Address,HMB descriptor 中依 CC.MPS 對齊的 memory-page address。
來源:Base 2.4 §5.2.30, 5.2.30.2.3 · Base 2.4 §5.2.30.2.3 · Base 2.4 §5.2.12, 5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, 5.2.30.2.3, 文件頁 456-459, 516-518, PDF 頁 482-485, 542-544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 517-518, PDF 頁 543-544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-518, PDF 頁 542-544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, 5.2.30.2.3, 文件頁 209-212, 518-519, PDF 頁 235-238, 544-545

把流程對回規格條件

02.05.Set Features 使用 FID=0Dh;CDW11 放 EHM、MR、HMNARE,CDW12 放 HSIZE,CDW13/14 組成 64-bit HMDL address,CDW15 是 HMDLEC。HMDL address 必須 16-byte aligned;HMDLEC=0 必須回 Invalid Field in Command。

HMDLEC
Host Memory Descriptor List Entry Count,HMDL 中有效 entries 的數量。
HMNARE
Host Memory Non-operational Access Restriction Enable,配置 non-operational HMB access policy 的 bit。
HMDL
Host Memory Descriptor List,連續存放 16-byte HMB descriptors 的 host-memory array。
CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
FID
Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。
MR
Memory Return,表示 host 歸還完全相同的舊 HMB size、addresses、descriptors 與 contents。
來源:Base 2.4 §5.2.30, 5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, 5.2.30.2.3, 文件頁 456-459, 516-518, PDF 頁 482-485, 542-544

02.06.HMDL 是連續的 16-byte descriptor array;每個 entry 的 BADD 必須依 CC.MPS memory page size 對齊,BSIZE 以相同 page units 表示連續長度。BSIZE=0 的 entry 由 controller 忽略;HSIZE 應與可用 descriptors 的 page 數相符。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 517-518, PDF 頁 543-544

02.07.說明性範例:CC.MPS=0 代表 4 KiB page;HSIZE=64 代表 256 KiB。若 HMDL=00000012_34567000h、HMDLEC=2,CDW13=34567000h、CDW14=00000012h、CDW15=00000002h。兩個 descriptor 各 BSIZE=32 pages 時,合計正好 64 pages。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-518, PDF 頁 542-544

02.08.Get Features 使用 FID=0Dh;SEL≠supported-capabilities 成功時,CQE.DW0 回 EHM、HMNARE、HMNAR,data buffer 回 4 KiB Attributes data structure,包括 HSIZE、HMDL address 與 HMDLEC。『已啟用』與『目前正在限制 access』是不同狀態。

HMNAR
Host Memory Non-operational Access Restricted,回報 restriction 此刻是否實際生效的 state bit。
SEL
Select,Get Features 用來選 current、default、saved 或 supported-capabilities view 的欄位。
來源:Base 2.4 §5.2.12, 5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, 5.2.30.2.3, 文件頁 209-212, 518-519, PDF 頁 235-238, 544-545

HMB 的描述子、大小與位址
大小或位址欄位使用的單位或對齊描述的資源
HMPRE/HMMIN4 KiB unitscapability request
HSIZE/BSIZECC.MPS unitsconfigured memory
HMDL address16-byte alignedCDW13 low + CDW14 high
BADDCC.MPS alignedBSIZE=0 entry ignored
閱讀相關規格圖表 → HMB 的描述子、大小與位址

03 HMB 在電源轉換與 Reset 後的狀態

03.01.電源轉換與重設後,主機需要確認原本提供的 HMB 是否仍符合再次使用的條件。設定的限制政策與目前限制是否生效,分別由不同欄位表示;控制器處於不同電源狀態時,兩者的數值可能不同,而不代表設定被遺失。

03.02.MR=1 表示交回符合規格要求的原有 HMB,不只是「容量一樣」。記憶體範圍、描述子清單位置和內容等都要符合相同條件。若提供了一份新配置,即使大小相等,也不能直接用原有記憶體的方式宣告,因為控制器需要重新建立對其內容的理解。

來源:Base 2.4 §5.2.30.2.3 · Base 2.4 §8.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-519, PDF 頁 542-545

來源:NVME-BASE-2.4, Rev. 2.4, §8.2.4, 文件頁 744, PDF 頁 770

把流程對回規格條件

03.03.HMNARE 只有 Identify.CTRATT.HMBR=1 時可啟用。HMNARE 是 policy,HMNAR 是 controller 此刻是否真的因 non-operational state 而被限制;Admin commands 與其啟動的 background operations 有明文例外。NOPPME 不改變這項 HMB restriction。

NOPPME
Non-Operational Power State Permissive Mode Enable,控制 controller background work 能否暫時超過 non-operational power limit。
Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-519, PDF 頁 542-545

03.04.HMB 不會跨 Controller Level Reset 保存在 controller。reset 後 host 應重新提供資源;若 MR=1 表示歸還先前內容,size、descriptor-list address、descriptor-list contents 與 HMB contents 必須完全相同。RTD3 前宜先 disable,恢復後再依是否保留內容選 MR。

來源:Base 2.4 §8.2.4

來源:NVME-BASE-2.4, Rev. 2.4, §8.2.4, 文件頁 744, PDF 頁 770

HMB 在電源轉換與 Reset 後的狀態
HMB 狀態或設定描述的限制或記憶體來源何時可以採用這個值
HMNARE設定的使用政策需要 CTRATT.HMBR
HMNAR目前生效的限制狀態可能因 operational state 而為 0
MR=1交回符合相同條件的原有 HMBsize/address/list/content 全相同
MR=0新提供的記憶體,內容尚未初始化controller 重新初始化

04 DSTRD、NDT 與 NDM 的單位

04.01.DSTRD、NDT 與 NDM 都是編碼值,但換算方式不同。DSTRD 決定相鄰 Doorbell 的間距,使用指數關係;NDT 與 NDM 則以 Dword 計算資料與 metadata 的傳輸量。它們看起來都像長度,不能共用「全部加 1」或「全部直接當 bytes」的規則。

metadata
隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
DSTRD
Doorbell Stride,CAP 中決定相鄰 doorbell register 間距的欄位。
Dword
Dword(Double word);32 bits,也就是 4 bytes。對比 word=16 bits;例如 zero-based dword count=3 代表 4 個 Dwords,也就是 16 bytes。
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 數。

04.02.例如 DSTRD=4 得到 4×2^4=64 bytes 的間距。NDT=0100h 則是 256 Dwords,也就是 1024 bytes,沒有加 1。廠商自訂命令還要先確認採用哪種標準格式及適用能力;長度欄位只描述傳輸量,不能據此猜測廠商資料的內容。

來源:Base 2.4 §3.1.4.1, 8.2.3 · Base 2.4 §5.2.14.2.1, 8.1.29 · Base 2.4 §4.1.1, 8.1.29

來源:NVME-BASE-2.4, Rev. 2.4, §3.1.4.1, 8.2.3, 文件頁 56, 744, PDF 頁 82, 770

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.1.29, 文件頁 356, 374, 733, PDF 頁 382, 400, 759

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 8.1.29, 文件頁 143, 733, PDF 頁 169, 759

把流程對回規格條件

04.03.CAP.DSTRD 的實際間距是 2^(2+DSTRD) bytes。DSTRD=0/2/4 分別得到 4/16/64 bytes;software emulation 可用 64-byte stride 把 doorbells 分散到 cacheline,硬體 NVMe interface 的 expected value 是 0h。

NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
CAP
Controller Capabilities,offset 00h 的 controller property,回報 queue、page size、timeout 與其他能力。
來源:Base 2.4 §3.1.4.1, 8.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §3.1.4.1, 8.2.3, 文件頁 56, 744, PDF 頁 82, 770

04.04.standard Vendor Specific command format 是 optional。AVSCC.VSCF 控制 vendor-specific Admin commands;ICSVSCC.SNVSCF 控制 vendor-specific I/O commands。兩個 capability 必須分開讀,不能因其中一個為 1 就假設另一類命令也使用 Figure 94。

ICSVSCC
I/O Command Set Vendor Specific Command Configuration,回報 vendor-specific I/O command format 的 Identify field。
SNVSCF
Same NVM Vendor Specific Command Format,ICSVSCC 中表示 I/O commands 是否使用 Figure 94 的 bit。
AVSCC
Admin Vendor Specific Command Configuration,回報 vendor-specific Admin command format 的 Identify field。
VSCF
Vendor Specific Command Format,AVSCC 中表示 Admin commands 是否使用 Figure 94 的 bit。
I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
來源:Base 2.4 §5.2.14.2.1, 8.1.29

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.1.29, 文件頁 356, 374, 733, PDF 頁 382, 400, 759

04.05.Figure 94 保留 common CDW0、NSID、metadata/data pointers 與 CDW12-CDW15,並把 CDW10/11 定義成 NDT/NDM。若 command 不使用 NSID,必須清為 0;invalid NSID 在使用時必須回 Invalid Namespace or Format,inactive NSID 行為仍是 vendor specific。

NSID
Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
來源:Base 2.4 §4.1.1, 8.1.29

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 8.1.29, 文件頁 143, 733, PDF 頁 169, 759

04.06.NDT 與 NDM 是實際 dword 數,不是 0's-based。NDT=00000100h 代表 256 dwords=1024 bytes;driver 可用 NDT/NDM 驗證 application buffer,避免 data 或 metadata transfer overflow。是否支援 standard format 仍先由 VSCF/SNVSCF gate。

0's-based
0's-based encoding,以 0 表示實際數量 1;依欄位換算公式通常是欄位值加 1。
來源:Base 2.4 §4.1.1, 8.1.29

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 8.1.29, 文件頁 143, 733, PDF 頁 169, 759

DSTRD、NDT 與 NDM 的單位
位址或長度欄位換算公式該值作用於哪個對象
DSTRD2^(2+x) bytes0→4 B;4→64 B
NDTvalue×4 data bytes不是 0's-based
NDMvalue×4 metadata bytes獨立 buffer bound
VSCF/SNVSCF格式選用條件Admin 與 I/O 分開
閱讀相關規格圖表 → DSTRD、NDT 與 NDM 的單位

05 讀懂本篇的規格圖表

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

圖表組 01 · HMB 記憶體的提供、使用與收回 · 4 張圖表

05.02.沿時間線標出 enable 完成、disable 提交與 disable 完成,對每個區間註明主機和控制器的使用權限。描述子中的位址在整個使用期間都必須保持有效,而不是只在送命令時有效。

回到本節的解釋與範例

描述記憶體清單與交接使用權

05.03.主機配置記憶體、建立描述子,再以 HMB Feature 提供清單。總容量、描述子數量、每段位址與每段大小都要互相一致。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
EHM/MR/CTZ/HMNARE啟用、記憶體返回及相關可選行為需依各 bit 的條件配合使用。重新提供原記憶體與提供新記憶體是不同情境,不能一概保留原內容假設。
HSIZE/HMDLEC總容量依 CC.MPS 的 page 單位解讀;HMDLEC 是清單中的描述子數。總容量為 16 pages,不代表必須有 16 個描述子;一個描述子可以描述多個 pages。
HMDLUA/HMDLLA;BADD/BSIZE高低欄位組成清單位址;每個描述子的 BADD 與 BSIZE 再給出實際記憶體段。清單位址要求與資料區域 page 對齊分別檢查,不能用其中一個通過替代另一個。
HMNAR 與主機回收完成回覆的相關狀態與使用權交接連在一起。控制器仍可使用記憶體時,主機不能提前把相同範圍拿去保存其他資料。
來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 545, 文件頁 516-517, PDF 頁 542-543

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 546, 文件頁 517, PDF 頁 543

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 547, 文件頁 517, PDF 頁 543

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 548, 文件頁 517, PDF 頁 543

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 549, 文件頁 518, PDF 頁 544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 550, 文件頁 518, PDF 頁 544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 551, 文件頁 518, PDF 頁 544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 552, 文件頁 518-519, PDF 頁 544-545

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 553, 文件頁 519, PDF 頁 545

Base Figure 545 · Host Memory Buffer - Command Dword 11

一句話重點

Base545-1HMB 控制欄位分別表示啟用、記憶體返回及相關要求。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 545, 文件頁 516-517, PDF 頁 542-543

用例子讀懂

Base545-2EHM 啟用 HMB,MR 涉及先前記憶體返回的情境;兩個 bit 不是「新記憶體地址」與「舊地址」的編碼。

Base Figure 552 · Host Memory Buffer - Completion Queue Entry Dword 0

一句話重點

Base552-1HMB 完成回覆中的 HMNAR 要連回此次要求的條件。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 552, 文件頁 518-519, PDF 頁 544-545

用例子讀懂

Base552-2收到非零回覆前先確認 HMNARE 與 EHM 的設定;不能把任意 DW0 值都當成實際配置頁數。

Base Figure 553 · Host Memory Buffer - Attributes Data Structure

一句話重點

Base553-1HMB Attributes 回報目前採用的大小及描述子清單資訊。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 553, 文件頁 519, PDF 頁 545

用例子讀懂

Base553-2讀回 HSIZE、HMDLAL/HMDLAU、HMDLEC 後,可與先前設定分別對照;成功設定命令的 CQE 不包含這份完整屬性表。

記憶體建議、最小要求與描述子限制

05.04.Identify 提供主機規劃 HMB 所需的大小與描述子限制;AVSCC 與 ICSVSCC 則是本篇另一主題的廠商命令格式能力,不能當成 HMB 啟用條件。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
HMPRE/HMMIN偏好與最小容量使用固定 4 KiB 單位;實際 HSIZE 使用 CC.MPS 指定的頁大小。HMPRE=64 是 256 KiB;若 page 是 8 KiB,提供同樣容量的 HSIZE 是 32。
HMMINDS/HMMAXD分別限制描述子所描述區域的最小大小與清單描述子數量;仍需按各欄位的零值及有效性規則使用。總容量已達要求,但被切成過多小區域,仍可能不符合描述子限制。
CTRATT.HMBR/HMNARE/HMNAR能力決定是否支援 non-operational 狀態下的 HMB 存取限制;設定政策與目前限制狀態分別觀察。能力存在不等於目前限制已生效;也不能把主機發起的 Admin 作業與控制器自主活動混為一類。
AVSCC.VSCF/ICSVSCC.SNVSCF分別描述 Admin 與 I/O 廠商命令採用的格式約定。先辨認命令種類和支援格式,再使用對應長度欄位;不能因 Admin 有標準格式就推論 I/O 廠商命令相同。
來源: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 · HMB 的描述子、大小與位址 · 12 張圖表

05.05.命令圖先組合清單的高低位址及 HMDLEC,再讀每個 BADD/BSIZE。把 4 KiB 單位和 CC.MPS 頁單位分兩欄列出,確認換成 bytes 後總量一致。

回到本節的解釋與範例

Base Figure 546 · Host Memory Buffer - Command Dword 12

一句話重點

Base546-1HMB 的 HSIZE 以控制器設定的記憶體頁大小計算。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 546, 文件頁 517, PDF 頁 543

用例子讀懂

Base546-2CC.MPS 對應 4096 bytes、HSIZE=16 時,提供 65536 bytes;HSIZE 不是描述子數量。

Base Figure 547 · Host Memory Buffer - Command Dword 13

一句話重點

Base547-1HMDLLA 提供 HMB 描述子清單位址的低部。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 547, 文件頁 517, PDF 頁 543

用例子讀懂

Base547-216-byte 對齊的清單位址,其低 4 bits 必為零;這是清單的對齊,不代表每個資料 buffer 只需 16-byte 對齊。

Base Figure 548 · Host Memory Buffer - Command Dword 14

一句話重點

Base548-1HMDLUA 補齊描述子清單位址的高部。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 548, 文件頁 517, PDF 頁 543

用例子讀懂

Base548-2清單位址=00000001_00001000h 時,高部為 1、低部為 1000h;只設定低部會指到不同記憶體。

Base Figure 549 · Host Memory Buffer - Command Dword 15

一句話重點

Base549-1HMDLEC 指定 HMB 描述子清單包含多少項目。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 549, 文件頁 518, PDF 頁 544

用例子讀懂

Base549-2HMDLEC=2 表示清單有 2 個 entries;它不直接表示只有 2 個資料頁,因每個 entry 可以描述多頁。

Base Figure 550 · Host Memory Buffer - Host Memory Descriptor List

一句話重點

Base550-1HMB Descriptor List 由固定大小 entries 組成。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 550, 文件頁 518, PDF 頁 544

用例子讀懂

Base550-22 個 16-byte entries 共占 32 bytes;清單本身的大小與它們描述的 HMB 總容量是不同數量。

Base Figure 551 · Host Memory Buffer - Host Memory Buffer Descriptor Entry

一句話重點

Base551-1每個 HMB 描述子用基底位址和頁數描述一段記憶體。

來源:Base 2.4 §5.2.30.2.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 551, 文件頁 518, PDF 頁 544

用例子讀懂

Base551-2BSIZE=8、頁大小 4 KiB 時,該項描述 32 KiB;BADD 指起點,不能把 BSIZE 當成 byte 長度。

查能力、讀取值與寫入值的區別

05.06.FID 指功能,Get 的 SEL 指要查哪一種資訊,Set 的 SV 指是否要求保存。支援能力回覆的 bits 與功能值是不同結構。

SV
Save,Set Features 要求 controller 同時保存所設定 value 的 bit。
一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
FID/UIDX/DPTRFID 選功能,必要時 UIDX 協助選 UUID,DPTR 傳輸該功能所需的資料結構。不是每個 Feature 都只靠 CQE DW0 回覆;有 buffer 的功能還需讀其資料格式。
SEL=000b/001b/010b/011b分別要求目前值、預設值、保存值、支援能力。要確認裝置現在採用什麼值,應讀目前值;保存值不等於正在使用的值。
CHANG/NSSPEC/SVBL → SV能力分別指出可變更、是否與 namespace 有關、可否保存;SV 是主機的保存要求。SVBL=0 時提出保存要求可能被拒絕;Set 成功也不能一律推論跨 power cycle 保留。
namespace
namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
NSSPEC
Namespace Specific,指出 Feature 是否具有 per-namespace scope 的 capability bit。
CHANG
Changeable,指出 Feature value 是否可由 Set Features 變更的 capability bit。
DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
SVBL
Saveable,supported-capabilities result 中指出 Feature 是否可保存的 bit。
UIDX
UUID Index,指向 UUID List 位置的 index;0 表示未指定 UUID。
UUID
Universally Unique Identifier,128-bit identifier;其實際關聯範圍仍由使用它的資料結構決定。
來源:Base 2.4 §5.2.12 · Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 197, 文件頁 209, PDF 頁 235

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 198, 文件頁 209-210, PDF 頁 235-236

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 200, 文件頁 210-211, PDF 頁 236-237

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 463, 文件頁 456, PDF 頁 482

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 464, 文件頁 457, PDF 頁 483

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 466, 文件頁 457-459, PDF 頁 483-485

Base Figure 197 · Get Features - Data Pointer

一句話重點

Base197-1Get Features 的 DPTR 是需要資料結構時的回傳位置。

來源:Base 2.4 §5.2.12

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 197, 文件頁 209, PDF 頁 235

用例子讀懂

Base197-2查詢一個會回傳資料 buffer 的 Feature,先準備相應大小的目的空間;不是每個 Feature 都只靠 CQE DW0 回傳全部內容。

Base Figure 198 · Get Features - Command Dword 10

一句話重點

Base198-1Get Features 的 FID 選功能,SEL 選要查目前值、預設值等資訊。

來源:Base 2.4 §5.2.12

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 198, 文件頁 209-210, PDF 頁 235-236

用例子讀懂

Base198-2查 current 與查 saved 可以回不同內容;兩次 FID 相同不表示查詢完全相同。

Base Figure 200 · Feature Identifiers for Get Features

一句話重點

Base200-1Get Features 清單列出 FID 與該功能回傳形式。

來源:Base 2.4 §5.2.12

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 200, 文件頁 210-211, PDF 頁 236-237

用例子讀懂

Base200-2先由想查的功能找到 FID,再看需要 CQE 結果還是資料結構;不能用上一個 Feature 的接收格式讀下一個。

Base Figure 463 · Set Features - Data Pointer

一句話重點

Base463-1Set Features 的 DPTR 提供需要傳入的功能資料。

來源:Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 463, 文件頁 456, PDF 頁 482

用例子讀懂

Base463-2設定 HMB 時傳入描述子相關資料,與單純只在 CDW11 放一個開關不同;先看該 Feature 是否使用資料 buffer。

Base Figure 464 · Set Features - Command Dword 10

一句話重點

Base464-1Set Features 的 FID 選功能,SV 表示是否要求保存。

來源:Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 464, 文件頁 457, PDF 頁 483

用例子讀懂

Base464-2主機要求 SV=1 前先確認 Feature 可保存;設定成功與重設後仍保留,是需要分別核對的行為。

Base Figure 466 · Feature Identifiers for Set Features

一句話重點

Base466-1Set Features 的識別碼清單指引每種功能的專屬欄位。

來源:Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 466, 文件頁 457-459, PDF 頁 483-485

用例子讀懂

Base466-2FID 02h 的 CDW11 是 Power Management,FID 0Ch 的相同位置是 APST;欄位位置相同不表示內容相同。

APST
Autonomous Power State Transition;依設定的閒置條件自動轉換電源狀態。
圖表組 04 · DSTRD、NDT 與 NDM 的單位 · 3 張圖表

05.07.換算表逐列寫出欄位原始值、公式和 bytes。DSTRD 連回 Doorbell 位址,NDT/NDM 分別連回 data/metadata buffer;VSCF/SNVSCF 先決定適用的命令格式。

回到本節的解釋與範例

能力、主機設定與控制器狀態的往返

05.08.主機先讀 CAP 選合法設定,建立 Admin 佇列,再寫 CC 啟用;控制器以 CSTS 回報結果。CAP 是可選範圍,CC 是要求值,CSTS 是實際狀態,三者不能互相代替。

CSTS
Controller Status,controller 回報 ready、fatal status 與 shutdown 狀態的 property。
一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
CAP.MPSMIN/MPSMAX → CC.MPS能力給可支援的記憶體 page 範圍,主機選其中一個 page 大小。後續 ASQ、ACQ 與資料指標的對齊都要使用選定的 page 大小。
AQA.ASQS/ACQS → ASQ.ASQB/ACQ.ACQBAQA 設定兩個 Admin 佇列的大小;ASQ、ACQ 給它們在主機記憶體的位置。大小編碼與基底位址分別設定,不能只配置 buffer 就認為控制器已知道位置。
CC.EN/CSS/AMS → CSTS.RDY/CFS主機選命令集、仲裁方式並要求啟用,控制器回報就緒或致命狀態。CC.EN=1 是要求,仍需等待符合規則的 RDY,才能進入下一階段。
CRMS/CRIME/CRTO;SHN/SHST前一組連接就緒模式與逾時;後一組連接關機要求與進度。寫入關機要求後依 SHST 確認處理,不能把要求值当作完成結果。
CAP.BPS/DSTRD/CMBS/PMRS;NSSR/NSSD分別用於 Boot 支援、doorbell 間距、記憶體能力與 subsystem 層級控制。Doorbell 間距由 DSTRD 推算;不使用 doorbell 的教學步驟無須把它當成前提。
CRTO
Controller Ready Timeouts,回報特定 ready mode 所需等待時間的 property。
NSSD
NVM Subsystem Shutdown,控制較大範圍 subsystem shutdown 的 property。
NSSR
NVM Subsystem Reset,觸發 NVM subsystem reset 的 property。
SHST
Shutdown Status,CSTS 中由 controller 回報 shutdown 進度的欄位。
ACQ
Admin Completion Queue Base Address,Admin CQ 在可定址記憶體中的基底位址。
AQA
Admin Queue Attributes,描述 Admin SQ 與 Admin CQ 大小的 property。
ASQ
Admin Submission Queue Base Address,Admin SQ 在可定址記憶體中的基底位址。
RDY
Ready,CSTS 中表示 controller 是否已準備正常處理 command 的 bit。
SHN
Shutdown Notification,CC 中由 host 宣告 shutdown 類型的欄位。
EN
Enable,CC 中控制 controller enable state 的 bit。
來源:Base 2.4 §3.1.4.1

來源:NVME-BASE-2.4, Rev. 2.4, §3.1.4.1, Figure 36, 文件頁 55-58, PDF 頁 81-84

Base Figure 36 · Offset 0h: CAP - Controller Capabilities

一句話重點

Base36-1CAP 描述控制器能力,主機設定必須落在其支援範圍。

來源:Base 2.4 §3.1.4.1

來源:NVME-BASE-2.4, Rev. 2.4, §3.1.4.1, Figure 36, 文件頁 55-58, PDF 頁 81-84

用例子讀懂

Base36-2設定記憶體頁大小前,先比對 MPSMIN 與 MPSMAX;主機偏好的頁大小不一定就是控制器接受的大小。

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

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

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 後存回同寬整數。
PSDT
PRP or SGL for Data Transfer,CDW0 中決定 DPTR 應按 PRP 或 SGL 解讀的欄位。
CID
Command Identifier,與 SQ identifier 合用以辨識 outstanding command。
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

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 94, 文件頁 143, PDF 頁 169

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 選命令,再查專屬欄位表。

Base Figure 94 · Common Command Format - Vendor Specific Commands (Optional)

一句話重點

Base94-1廠商命令格式另以 NDT、NDM 表達傳輸長度資訊。

來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 94, 文件頁 143, PDF 頁 169

用例子讀懂

Base94-2若依欄位定義 NDT=16 個 Dwords,資料長度為 64 bytes;此值不能套用別的命令從零起算的加 1 規則。

學完後想一想

1. HMB 記憶體原本由 host 配置,host 是否能在 controller 使用時直接重用?

06.01.不能。提供給 controller 的期間必須維持記憶體與描述資訊有效;應完成規定的停用及交還程序後才回收。實體配置者與目前可使用者是不同概念。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 8.2.4, 文件頁 515-516, 744, PDF 頁 541-542, 770

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 515-516, PDF 頁 541-542

2. 知道 HMB descriptor 有 4 筆,就知道總容量了嗎?

06.02.還需要每筆 buffer size 和 page size。Descriptor 數只計算分段數;總容量是各段 page 數乘 page size 後加總,並需符合 HSIZE 與能力限制。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 517-518, PDF 頁 543-544

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, 文件頁 516-518, PDF 頁 542-544