把主機記憶體借給控制器
01-01HMB 的重點是記憶體使用權:如何提供、允許使用,以及何時能收回。
- HMB
- Host Memory Buffer,由 host 配置並在 enable 期間交由 controller 專用的 volatile memory ranges。
NVMe · 規格與原理
00.01.這篇說明主機如何把記憶體提供給控制器,以及如何理解 doorbell 位址與廠商命令長度。共同問題是:哪一方可以使用這塊記憶體、何時可以收回,以及欄位中的數值究竟用什麼單位。
01-01HMB 的重點是記憶體使用權:如何提供、允許使用,以及何時能收回。
02-01用容量換算理解描述項,再比較電源轉換和重設對記憶體使用的影響。
03-01Doorbell Emulation 與廠商命令分別用位址和長度算例說明;它們是另外的介面機制。
00.02.HMB 的提供、使用與收回形成一個完整流程;電源轉換與 reset 會影響這個流程。Doorbell Emulation 與 Vendor Commands 另以位址和長度算例說明,不把它們當成 HMB 的必要步驟。
01.01.HMB 是主機提供給控制器使用的記憶體。主機先配置區域和描述子,再以 Feature 將它交給控制器;啟用期間,主機必須維持這些記憶體有效,不能當成一般空閒記憶體重新分配。配置者仍是主機,但可使用的時機受 HMB 規則限制。
01.02.停用要求已提交與停用命令已完成,是兩個不同時刻。在中間這段時間,控制器仍可能取回必要資料,因此主機不能提前收回區域。只有到規格定義的交接完成點,才可以修改或回收;這也是 HMB 的完成狀態與背景測試啟動成功不同之處。
來源: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
01.03.HMPRE=0 表示 HMB 不支援;非零時以 4 KiB units 表示 preferred size,HMMIN 表示 minimum request。HMMINDS 與 HMMAXD 是 descriptor 限制。即使 host 無法提供 HMB,controller 仍必須(shall)正常運作。
來源: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。
來源: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。
來源: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 流程。
來源:NVME-BASE-2.4, Rev. 2.4, §8.2.4, 文件頁 744, PDF 頁 770
| HMB 使用階段 | 哪一方可以使用記憶體 | 進入下一階段的條件 |
|---|---|---|
| 啟用之前 | 主機配置記憶體並初始化描述子 | 先核對位址對齊和描述子數量 |
| 啟用命令完成後 | 控制器專用;主機不得修改 | host shall not write |
| 停用命令尚未完成 | 控制器仍可取回必要資料 | 主機仍須等停用完成 |
| 停用命令完成後 | 主機可修改或收回記憶體 | 停用完成後才可修改或回收 |
02.01.假設 CC.MPS 對應 8 KiB page,兩個 descriptor 的 BSIZE 都是 16,則各提供 128 KiB,合計 256 KiB。這個例子刻意不用 4 KiB page,讓固定單位與目前頁單位的差別看得出來。
02.02.合計 32 個目前 page,因此 HSIZE=32。若 HMPRE=64,它使用固定 4 KiB 單位,也代表 256 KiB。HSIZE 與 HMPRE 原值不同,換成 bytes 後卻可能相同。
02.03.HMDLAL、HMDLAU 指清單,BADD 指每個區域。主機不只要確保數量加總正確,也要讓清單與區域在控制器可使用期間保持有效,停用交接完成後才收回。
來源: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。
來源: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 數相符。
來源: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。
來源: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』是不同狀態。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, 5.2.30.2.3, 文件頁 209-212, 518-519, PDF 頁 235-238, 544-545
| 大小或位址欄位 | 使用的單位或對齊 | 描述的資源 |
|---|---|---|
| HMPRE/HMMIN | 4 KiB units | capability request |
| HSIZE/BSIZE | CC.MPS units | configured memory |
| HMDL address | 16-byte aligned | CDW13 low + CDW14 high |
| BADD | CC.MPS aligned | BSIZE=0 entry ignored |
03.01.電源轉換與重設後,主機需要確認原本提供的 HMB 是否仍符合再次使用的條件。設定的限制政策與目前限制是否生效,分別由不同欄位表示;控制器處於不同電源狀態時,兩者的數值可能不同,而不代表設定被遺失。
03.02.MR=1 表示交回符合規格要求的原有 HMB,不只是「容量一樣」。記憶體範圍、描述子清單位置和內容等都要符合相同條件。若提供了一份新配置,即使大小相等,也不能直接用原有記憶體的方式宣告,因為控制器需要重新建立對其內容的理解。
來源: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。
來源: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。
來源:NVME-BASE-2.4, Rev. 2.4, §8.2.4, 文件頁 744, PDF 頁 770
| HMB 狀態或設定 | 描述的限制或記憶體來源 | 何時可以採用這個值 |
|---|---|---|
| HMNARE | 設定的使用政策 | 需要 CTRATT.HMBR |
| HMNAR | 目前生效的限制狀態 | 可能因 operational state 而為 0 |
| MR=1 | 交回符合相同條件的原有 HMB | size/address/list/content 全相同 |
| MR=0 | 新提供的記憶體,內容尚未初始化 | controller 重新初始化 |
04.01.DSTRD、NDT 與 NDM 都是編碼值,但換算方式不同。DSTRD 決定相鄰 Doorbell 的間距,使用指數關係;NDT 與 NDM 則以 Dword 計算資料與 metadata 的傳輸量。它們看起來都像長度,不能共用「全部加 1」或「全部直接當 bytes」的規則。
04.02.例如 DSTRD=4 得到 4×2^4=64 bytes 的間距。NDT=0100h 則是 256 Dwords,也就是 1024 bytes,沒有加 1。廠商自訂命令還要先確認採用哪種標準格式及適用能力;長度欄位只描述傳輸量,不能據此猜測廠商資料的內容。
來源: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-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。
來源: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。
來源: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。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, 8.1.29, 文件頁 143, 733, PDF 頁 169, 759
| 位址或長度欄位 | 換算公式 | 該值作用於哪個對象 |
|---|---|---|
| DSTRD | 2^(2+x) bytes | 0→4 B;4→64 B |
| NDT | value×4 data bytes | 不是 0's-based |
| NDM | value×4 metadata bytes | 獨立 buffer bound |
| VSCF/SNVSCF | 格式選用條件 | Admin 與 I/O 分開 |
05.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
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 與主機回收 | 完成回覆的相關狀態與使用權交接連在一起。 | 控制器仍可使用記憶體時,主機不能提前把相同範圍拿去保存其他資料。 |
來源: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
Base545-1HMB 控制欄位分別表示啟用、記憶體返回及相關要求。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 545, 文件頁 516-517, PDF 頁 542-543
Base545-2EHM 啟用 HMB,MR 涉及先前記憶體返回的情境;兩個 bit 不是「新記憶體地址」與「舊地址」的編碼。
Base552-1HMB 完成回覆中的 HMNAR 要連回此次要求的條件。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 552, 文件頁 518-519, PDF 頁 544-545
Base552-2收到非零回覆前先確認 HMNARE 與 EHM 的設定;不能把任意 DW0 值都當成實際配置頁數。
Base553-1HMB Attributes 回報目前採用的大小及描述子清單資訊。
來源: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 廠商命令相同。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 340-364, PDF 頁 366-390
Base338-1Identify Controller 先告知能力與限制,主機再決定可使用的操作。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 340-364, PDF 頁 366-390
Base338-2規格列出某選用命令時,先查相應支援欄位再發出要求;「命令有定義」與「這台控制器支援」是不同證據。
05.05.命令圖先組合清單的高低位址及 HMDLEC,再讀每個 BADD/BSIZE。把 4 KiB 單位和 CC.MPS 頁單位分兩欄列出,確認換成 bytes 後總量一致。
回到本節的解釋與範例Base546-1HMB 的 HSIZE 以控制器設定的記憶體頁大小計算。
來源: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 不是描述子數量。
Base547-1HMDLLA 提供 HMB 描述子清單位址的低部。
來源: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 對齊。
Base548-1HMDLUA 補齊描述子清單位址的高部。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 548, 文件頁 517, PDF 頁 543
Base548-2清單位址=00000001_00001000h 時,高部為 1、低部為 1000h;只設定低部會指到不同記憶體。
Base549-1HMDLEC 指定 HMB 描述子清單包含多少項目。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.2.3, Figure 549, 文件頁 518, PDF 頁 544
Base549-2HMDLEC=2 表示清單有 2 個 entries;它不直接表示只有 2 個資料頁,因每個 entry 可以描述多頁。
Base550-1HMB Descriptor List 由固定大小 entries 組成。
來源: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 總容量是不同數量。
Base551-1每個 HMB 描述子用基底位址和頁數描述一段記憶體。
來源: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 與功能值是不同結構。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| FID/UIDX/DPTR | FID 選功能,必要時 UIDX 協助選 UUID,DPTR 傳輸該功能所需的資料結構。 | 不是每個 Feature 都只靠 CQE DW0 回覆;有 buffer 的功能還需讀其資料格式。 |
| SEL=000b/001b/010b/011b | 分別要求目前值、預設值、保存值、支援能力。 | 要確認裝置現在採用什麼值,應讀目前值;保存值不等於正在使用的值。 |
| CHANG/NSSPEC/SVBL → SV | 能力分別指出可變更、是否與 namespace 有關、可否保存;SV 是主機的保存要求。 | SVBL=0 時提出保存要求可能被拒絕;Set 成功也不能一律推論跨 power cycle 保留。 |
來源: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
Base197-1Get Features 的 DPTR 是需要資料結構時的回傳位置。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 197, 文件頁 209, PDF 頁 235
Base197-2查詢一個會回傳資料 buffer 的 Feature,先準備相應大小的目的空間;不是每個 Feature 都只靠 CQE DW0 回傳全部內容。
Base198-1Get Features 的 FID 選功能,SEL 選要查目前值、預設值等資訊。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 198, 文件頁 209-210, PDF 頁 235-236
Base198-2查 current 與查 saved 可以回不同內容;兩次 FID 相同不表示查詢完全相同。
Base200-1Get Features 清單列出 FID 與該功能回傳形式。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 200, 文件頁 210-211, PDF 頁 236-237
Base200-2先由想查的功能找到 FID,再看需要 CQE 結果還是資料結構;不能用上一個 Feature 的接收格式讀下一個。
Base463-1Set Features 的 DPTR 提供需要傳入的功能資料。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 463, 文件頁 456, PDF 頁 482
Base463-2設定 HMB 時傳入描述子相關資料,與單純只在 CDW11 放一個開關不同;先看該 Feature 是否使用資料 buffer。
Base464-1Set Features 的 FID 選功能,SV 表示是否要求保存。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 464, 文件頁 457, PDF 頁 483
Base464-2主機要求 SV=1 前先確認 Feature 可保存;設定成功與重設後仍保留,是需要分別核對的行為。
Base466-1Set Features 的識別碼清單指引每種功能的專屬欄位。
來源: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;欄位位置相同不表示內容相同。
05.07.換算表逐列寫出欄位原始值、公式和 bytes。DSTRD 連回 Doorbell 位址,NDT/NDM 分別連回 data/metadata buffer;VSCF/SNVSCF 先決定適用的命令格式。
回到本節的解釋與範例05.08.主機先讀 CAP 選合法設定,建立 Admin 佇列,再寫 CC 啟用;控制器以 CSTS 回報結果。CAP 是可選範圍,CC 是要求值,CSTS 是實際狀態,三者不能互相代替。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| CAP.MPSMIN/MPSMAX → CC.MPS | 能力給可支援的記憶體 page 範圍,主機選其中一個 page 大小。 | 後續 ASQ、ACQ 與資料指標的對齊都要使用選定的 page 大小。 |
| AQA.ASQS/ACQS → ASQ.ASQB/ACQ.ACQB | AQA 設定兩個 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 的教學步驟無須把它當成前提。 |
來源:NVME-BASE-2.4, Rev. 2.4, §3.1.4.1, Figure 36, 文件頁 55-58, PDF 頁 81-84
Base36-1CAP 描述控制器能力,主機設定必須落在其支援範圍。
來源: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 與命令集決定。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| OPC/FUSE/CID | OPC 選操作,FUSE 說明融合操作角色,CID 讓完成項目找回原命令。 | 相同的 CDW10 數值放在 Read 與 Set Features 中,可能完全不是同一種意思。 |
| PSDT → DPTR/MPTR | PSDT 決定指標依 PRP 或 SGL 等格式解讀;指標內的數值不可在未選格式時直接當成長度。 | 主機先選指標格式,再按該格式準備 buffer 描述,最後由命令語意判斷資料方向。 |
| NSID/CDW2–CDW15 | NSID 與命令專屬欄位共同決定對象、範圍及選項。 | Create 的 DPTR 指向建立參數;它不是新 namespace 的實體儲存位址。 |
| NDT/NDM/MDPTR | 廠商命令使用共同格式時,資料與 metadata 長度各有自己的欄位及指標。 | 先看廠商命令格式支援宣告,再依長度定義換算,不能把欄位上限直接加 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
Base93-1共通 SQE 固定各命令共用欄位的位置。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168
Base93-2同樣在 CDW10,Read 與管理命令可以有完全不同含義;先依 OPC 選命令,再查專屬欄位表。
Base94-1廠商命令格式另以 NDT、NDM 表達傳輸長度資訊。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 94, 文件頁 143, PDF 頁 169
Base94-2若依欄位定義 NDT=16 個 Dwords,資料長度為 64 bytes;此值不能套用別的命令從零起算的加 1 規則。
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
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