NVMe Base 2.4:HMB、Doorbell Emulation 與 Vendor Commands

8 minute read

English

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 的 value 不在『給 controller 一塊 cache』這句話,而在 ownership protocol。Host 配置 pages 與 descriptor list,enable 成功後停止寫入;controller 使用並初始化;host 要回收時先 disable,直到 CQE posted 才重新取得修改權。

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

01.02.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

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

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

02.01.HSIZE、BSIZE 與 BADD 都依 CC.MPS;HMPRE/HMMIN/HMMINDS 則依 4 KiB units。兩套 unit 不能混用。HMDL 本身要 16-byte aligned,entries 固定 16 bytes;HMDLEC 是 entry count,不是 0's-based,也不是 byte length。

0's-based
0's-based encoding,以 0 表示實際數量 1;依欄位換算公式通常是欄位值加 1。
HMDLEC
Host Memory Descriptor List Entry Count,HMDL 中有效 entries 的數量。
BSIZE
Buffer Size,HMB descriptor 中以 CC.MPS pages 表示的連續範圍長度。
HSIZE
Host Memory Buffer Size,以 CC.MPS memory-page units 表示的 HMB 總大小。
BADD
Buffer Address,HMB descriptor 中依 CC.MPS 對齊的 memory-page address。
HMDL
Host Memory Descriptor List,連續存放 16-byte HMB descriptors 的 host-memory array。
MPS
Memory Page Size,controller 使用的 memory page 大小設定;影響 queue address 與 PRP 對齊。
CC
Controller Configuration,host 用來選擇設定並啟用或停用 controller 的 property。

02.02.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。

HMNARE
Host Memory Non-operational Access Restriction Enable,配置 non-operational HMB access policy 的 bit。
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

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

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

03.01.HMNARE 是 access policy,HMNAR 是此刻 state;MR 則描述 reset/RTD3 後是否歸還完全相同的舊內容。這三者不能互換。Controller Level Reset 會讓 controller 丟失 HMB assignment,RTD3 前應先 release,而 non-operational restriction 只限制特定 state 下的 access。

HMNAR
Host Memory Non-operational Access Restricted,回報 restriction 此刻是否實際生效的 state bit。

03.02.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

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.software emulator 與 vendor command passthrough 都在處理 untrusted encoded values。DSTRD 要套 2^(2+x) 才是 bytes;NDT/NDM 已是實際 dword count,要乘 4、不能再加 1。正確公式不同,但目的相同:在 MMIO 或 DMA 前先證明 address 與 length。

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。
MMIO
Memory-Mapped I/O,以 CPU memory access 形式讀寫裝置 register。
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.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

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 分開
metadata
隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
SNVSCF
Same NVM Vendor Specific Command Format,ICSVSCC 中表示 I/O commands 是否使用 Figure 94 的 bit。
VSCF
Vendor Specific Command Format,AVSCC 中表示 Admin commands 是否使用 Figure 94 的 bit。
I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。

接著打開 Spec 看什麼

05.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。

要說明的觀念Spec 閱讀位置
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
HMB 的描述子、大小與位址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
HMB 在電源轉換與 Reset 後的狀態Base 2.4 §5.2.30.2.3 · Base 2.4 §8.2.4
DSTRD、NDT 與 NDM 的單位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
開啟完整中文教學與逐圖解釋 →

學完後想一想

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

採用的規格版本

NVM Express Base Specification, Revision 2.4

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...