先理解取捨
01-01等級調整的是讀取錯誤復原的程度。比較最多、預設與最少復原,並分清策略、實際延遲與成功結果。
NVMe · 規格與原理
00.01.讀取遇到難以復原的資料時,控制器應該再多試一些,還是少做一些復原、讓主機早點取得結果?Read Recovery Level 提供這項取捨。本文從等級與影響範圍開始,再把支援位元、設定命令、讀回格式和重設後的行為接起來,讓每個欄位都對應到一個具體問題。
01-01等級調整的是讀取錯誤復原的程度。比較最多、預設與最少復原,並分清策略、實際延遲與成功結果。
02-01先看是否有儲存集合,再找哪些 namespace 在同一集合內。這決定一次設定影響誰,以及哪些空間無法各自選不同等級。
03-01先查哪些等級受支援,再指定目標與新值,最後以正確的查詢格式讀回。支援清單、目前值與保存能力分別回答不同問題。
04-01以設定成功區分先前與後續命令;再判斷重設覆蓋範圍、目前值與已保存值。這樣才能解釋何時用新值、何時可能回到另一個值。
00.02.讀者已學過 OS、Computer Organization,並了解 SSD 的基本概念。本文的 Set 7/9、namespace A/B/C 與位元數值均為說明性範例;使用前須以實際裝置回報的集合與能力為準。
00.03.先用一個 Set 的設定情境串起觀念,再比較容易混淆的值與範圍;讀完應能解釋哪些空間共用設定,以及每次查詢究竟回答什麼。
00.04.可以用同一個問題貫穿全文:想讓 Set 7 內的讀取採用最少復原,需要查哪些能力、送出什麼參數,又要怎樣知道目前真的在用這個設定?先理解這條流程,再看每個欄位的位置。
00.05.後半部會刻意比較相同數值在不同格式下的意思,以及相同設定在不同重設範圍下的結果。這些對比能避免只背等級名稱,卻把查詢或持續性判斷用錯。
01.01.Read Recovery Level(RRL)在讀取完成時間與錯誤復原投入之間提供取捨。支援此功能時,Level 4 是必備的預設等級,Level 15 是必備的 Fast Fail;Level 0 若有支援,提供最多復原。等級越高,復原量越少;與 I/O 命令 LR 的互動由實作決定。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.23, 文件頁 689-690, PDF 頁 715-716
01.02.主機送出讀取後,控制器需要從媒體取得正確資料。當資料不容易讀出時,額外的復原工作會占用時間。RRL 讓主機選擇控制器要投入多少復原,而不是直接指定要讀哪個位置、回傳多少 bytes,或把媒體內容改成另一份資料。
01.03.規格定義 0~15 共 16 個可能的等級,數字往上走,復原量往下走。0 是最多復原,4 是一般程度且為預設,15 是最少復原。中間等級的差距不是固定比例:不能把 8 解讀成 4 的兩倍速度,也不能把等級當作重試次數。
01.04.RRL 本身不是每個控制器都必須具備的功能。一旦支援,subsystem 與所有控制器就必須支援 4、15,宣告能力與等級清單,並支援 FID 12h。0、1~3、5~14 是選用等級;表上列有這些數字,不代表手上的裝置全部能選。
01.05.Fast Fail 指最少的復原量。這兩節沒有替它指定 1 ms、10 ms 等上限,也沒有規定完全不做復原。它調整的是讀取困難時的處理策略;正常讀取可能根本用不到較深入的復原,因此不能承諾每筆 Read 都會變快。
01.06.I/O 命令中的 Limited Retry(LR)也是與復原有關的控制資訊,但 §8.1.23 明確把 LR 與 RRL 的互動留給實作。即使已選 Level 15,又送出帶 LR 的命令,仍不能由本規格推導成「一定零次重試」或「LR 一定蓋過 RRL」。兩者的共同效果需要對應實作資訊。
02.01.有 NVM Sets 時,FID 12h 以 NVM Set 為範圍,選中的集合共用一份 RRL。沒有 NVM Sets 時,範圍改為整個 NVM subsystem,所有 namespace 使用同一等級。改變 RRL 不會改變 namespace 中已有的資料。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, 文件頁 473, PDF 頁 499
02.02.在 NVM Set 內建立的 namespace 繼承該 Set 的 RRL;不支援 NVM Sets 時,所有 namespace 使用同一 RRL。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.23, 文件頁 689, PDF 頁 715
02.03.NVMSETID 是 subsystem 內的 16-bit Set 識別值;支援 NVM Sets 時 0 為保留,不支援時主機將此欄清為 0。
來源:NVME-BASE-2.4, Rev. 2.4, §3.2.2, 文件頁 80-82, PDF 頁 106-108
02.04.namespace 是主機存取的邏輯儲存空間;NVM Set 則是可包含一個或多個 namespace 的儲存集合。具有已格式化儲存空間的 namespace 完整位於一個 NVM Set 內,不橫跨多個 Set。RRL 是集合的屬性,所以要沿 namespace 的歸屬往上找,才知道它共用誰的設定。
02.05.例子裡 A、B 可以是不同大小、不同用途的 namespace,但兩者在同一個 Set,因此共用 RRL。這個關係只說明讀取復原策略的範圍,不表示 A 的資料會被複製到 B,或兩者的每一項設定都完全相同。
02.06.假設 Set 7 已經設為 15,之後又在其中建立 namespace D,D 繼承的是 Set 7 的 RRL。不能因為 D 是新建的,就推論它一定單獨回到預設 4;預設等級與目前 Set 正在使用的等級是不同概念。
02.07.若裝置不支援 NVM Sets,所有 namespace 使用 subsystem 的同一個 RRL。此時 FID 12h 不用 NVMSETID 選範圍;送入 7 並不會創造 Set 7。主機依 NVM Set 共通規則把 NVMSETID 填 0,控制器在本 Feature 忽略該欄。
02.08.從 4 改到 15 不會清除、格式化或重寫 namespace 中的資料。它可能改變後續遇到困難的讀取如何處理,不能當作修復既有資料的命令。主機也不能透過本 Feature 指定只改某一個 LBA 的策略。
03.01.Identify Controller 的 CTRATT.RRLVLS 表示是否支援功能,RRLS 的 16 個 bits 分別表示各等級是否支援。CTRATT.NSETS 決定使用 Set 或 subsystem 範圍;ONCS.SSFS 則決定能否使用非零 SEL 與 SV。這些能力不能互相替代。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 文件頁 344-347,371-372, PDF 頁 370-373,397-398
03.02.在 Identify Controller 資料結構 bytes 99:96 的 CTRATT 內,bit 3 是 RRLVLS。它為 1 才表示控制器支援 RRL;bit 2 的 NSETS 則是另一件事,說明有沒有 NVM Sets。RRLVLS=1、NSETS=0 是可以理解的組合:功能存在,但設定由整個 subsystem 共用。
03.03.RRLS 位於 bytes 101:100。要判斷等級 n 是否支援,計算 (RRLS >> n) & 1;結果 1 表示支援,0 表示不支援。範例 8011h 的 bit 8 是 0,因此即使 8 在 0~15 範圍內,也不能當成可選值。這個檢查與欄位放不放得下 8 是兩回事。
| 想選的等級 | 檢查 RRLS=8011h 的哪個 bit | 送進 RRL 的值 |
|---|---|---|
| 0 | bit 0 = 1,支援 | 0h |
| 4 | bit 4 = 1,支援 | 4h |
| 8 | bit 8 = 0,不支援 | 不選此值 |
| 15 | bit 15 = 1,支援 | Fh |
03.04.RRLS 用 16 個 bits 同時列出可用集合;設定命令的 RRL 只用 4 個 bits 放一個等級。選 15 時,RRLS 中應檢查的是 bit 15,也就是遮罩 8000h;實際送進 RRL 的卻是 Fh,不能把 8000h 塞進該欄。
03.05.ONCS 位於 bytes 521:520,其中 bit 4 是 SSFS。若為 0,不使用非零 SEL 或 SV,仍可以用 SEL=0 讀目前值。若為 1,可用 SEL=3 查本 Feature 是否可變更、是否可保存;這裡回的是另一組能力 bits,並不是 RRLS 支援等級清單。
04.01.Set Features 用 FID 12h 選 Read Recovery Level Config,CDW11 的低 16 bits 放 NVMSETID,CDW12 的低 4 bits 放 RRL。這個 Feature 不使用資料 buffer;NVM Set 或 subsystem 範圍的 NSID 應為 0。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, 文件頁 473, PDF 頁 499
04.02.NVM Set 與 subsystem 範圍的 Feature,NSID 應為 0;非零值使 Get/Set Features 被中止,不能用來縮小成單一 namespace。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 169, PDF 頁 195
04.03.FID 12h 不使用資料 buffer;Set 的 CDW10 帶 FID 與 SV。未使用的命令專用欄位保留,不可保存時要求 SV=1 會以 Feature Identifier Not Saveable 中止。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, 文件頁 456-459, PDF 頁 482-485
04.04.CDW10 bits 7:0 的 FID=12h 選本篇功能;bit 31 的 SV 控制是否提出保存要求。先用 SV=0 理解目前值的修改,得到 CDW10=00000012h。是否需要保存、是否支援保存,以及重設後如何處理,會在後面的生命週期單元分開說明。
04.05.CDW11 bits 15:0 是 16-bit NVM Set Identifier,高 16 bits 保留。已支援 NVM Sets 時要填既有 Set 的識別碼,0 是保留值,不是「全部 Set」。本篇例子用已知有效的 7;不把 namespace A 的 NSID 放到此欄。命令本身的 NSID 則依共通規則填 0,非零會被中止。
04.06.CDW12 bits 3:0 直接保存等級,bits 31:4 保留。15 的十六進位是 Fh,所以整個 CDW12 是 0000000Fh。這不是數量減 1 的欄位,選 Level 15 就填 15;填 14 會選到另一個等級。送出前先確認 RRLS 的對應 bit 為 1。
04.07.本 Feature 的屬性就在 CDW11、CDW12,不需要另外準備一份 data buffer。Set 的 DPTR 在此沒有用途,Get 的 DPTR 也會被忽略。其餘沒有供本 Feature 使用的命令專用欄位屬保留區;示例將保留位清 0,不自行塞入額外控制資訊。
04.08.Dword 是 4 bytes;命令的 CDW11 表示從 0 起算的第 11 個 Dword,起點是 byte offset 44,CDW12 起點則是 48。NVMSETID=7 是識別值,並不是 byte offset 7。命令欄位位置、欄位中的 Set 編號、欄位中的等級,各有不同用途。
05.01.成功的 Get Features 在 SEL≠3 時,以 CQE DW0 回傳 Figure 485 格式的 RRL。SEL=3 則改回 Supported Capabilities:CHANG、NSSPEC、SVBL。相同 DW0 數值可能有完全不同的意思;RRLS 等級清單仍應從 Identify Controller 取得。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, 文件頁 473, PDF 頁 499
05.02.SEL 的 0、1、2、3 分別選目前、預設、已保存與能力。沒有可用的 saved 值時,saved 查詢回 default;能力格式只表示 CHANG、NSSPEC 與 SVBL。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, 文件頁 209-212, PDF 頁 235-238
05.03.Get Features 的 CDW10 bits 10:8 是 SEL,bits 7:0 是 FID。查目前值用 SEL=0,因此 CDW10=00000012h;查 Set 7 仍用 CDW11=00000007h、NSID=0。Set 命令放新等級的 CDW12,不是 Get 命令拿來要求回傳等級的位置;Get 的未使用命令專用欄位保留。
05.04.確認 Get 命令成功,再讀完成項目的 DW0,取 bits 3:0 就得到 RRL。若 DW0=0000000Fh,讀回的是 Level 15。Figure 485 雖然以 Command Dword 12 為標題,§5.2.30.1.12 另明確指定:Get 成功且 SEL≠3 時,同一個格式放到 CQE DW0。
05.05.SSFS=1 時,SEL=1 查 default,SEL=2 查 saved,SEL=3 查 supported capabilities;4~7 保留。預設 RRL 為 4,但目前值可以是 15。若功能不可保存,或還沒有已保存值,SEL=2 依 Get 共通規則回預設;不能只因查到 4,就說主機曾把 4 保存過。
05.06.SEL=3 的 DW0 bit 2 是 CHANG,bit 1 是 NSSPEC,bit 0 是 SVBL,bits 31:3 保留。NSSPEC=1 才表示 namespace 範圍;為 0 時,這個 bit 不會告訴你其他範圍是哪一種。本篇應再看 NSETS 與 FID 12h 的定義,判定為 NVM Set 或 NVM subsystem,不能自行推成只影響一個控制器。
05.07.假設 SSFS=1,先用 CDW10=00000312h 查能力;能力允許後設定 Set 7。接著用 00000012h 查 current,預期讀回要求的 15;若改用 00000112h 查 default,回答的仍是 4。這三次是在問能力、目前值與預設值,不是控制器自相矛盾。
06.01.已提交而尚在執行的命令,可能套用或不套用剛改好的 Feature。Set Features 成功完成後才提交的命令,必須使用新設定。若希望明確區隔兩批讀取,主機宜先讓原有命令完成,再改設定。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1, 文件頁 459, PDF 頁 485
06.02.多個主機同時存取非 controller scope 的共享 Feature 值,需要主機間協調;Base 沒有指定協調程序。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 168, PDF 頁 194
06.03.主機把 Set Features 提交到佇列,只代表控制器可以開始處理它。不能在此刻就宣稱新的 RRL 已適用於之後所有命令;規格用成功完成作為後續提交命令的保證界線。設定失敗時,也不能把要求值當作有效的 current。
06.04.Read A 若在 Set 成功前就已提交,設定變更時它可能仍在執行。共通規則允許它套用或不套用新設定。教材中的時間圖因此把 A 標為不保證採新值,而不是擅自指定它一定用舊值。
06.05.先暫緩新的讀取,等已提交命令完成,再送 Set,等成功後才提交下一批。這樣做的目的,是讓每一批使用哪個 RRL 可被明確說明;不是說 RRL 會改寫舊資料。完成設定後,也宜重新確認與該 Feature 有關的能力及狀態。
06.06.RRL 不屬於單一控制器私有的設定。多個主機若同時管理同一 Set 或 subsystem,一個主機剛讀回 15,另一個主機仍可能隨後改成 4。Base 要求這類共享 Feature 存取有某種主機間協調,但沒有指定協調協定;不能把一次讀回當成永遠鎖住該值。
07.01.Figure 466 把 FID 12h 的持續性列為 Yes,但該欄只適用於不可保存的 Feature。若本 Feature 可保存,應依 current/saved 與重設範圍判斷:整個 subsystem 範圍的重設按 Figure 126,局部範圍按 Figure 127。例如多控制器的 subsystem 只重設一個控制器,Set/subsystem 的共用目前值維持不變;符合全體條件的重設則回到 saved,沒有 saved 才回 default。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 167-169, PDF 頁 193-195
07.02.FID 12h 的 Current Setting Persists 欄為 Yes,註腳 2 限定該欄僅供不可保存的 Feature 使用。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, 文件頁 458-459, PDF 頁 484-485
07.03.current 是正在使用的設定,saved 是主機要求保存後留下的設定。SSFS 支援不代表每一項 Feature 都可保存,還要看該 FID 的 SVBL。只有本 Feature 可保存時,成功的 SV=1 設定才同時更新 current 與 saved;SV=0 的成功設定只更新 current。
07.04.Figure 466 的 FID 12h 列為 Yes,註腳 2 說明這個持續性欄只用在不可保存時。因此不可保存的 RRL 目前值仍必須跨 power cycle 與 reset 保留。SV=0 的意義是沒有提出保存要求,不能直接翻成「這個設定斷電就沒了」。
| Feature 能力與原值 | 這次事件的判斷條件 | 之後的 current |
|---|---|---|
| 不可保存;current=15 | Power cycle 或 reset:FID12h 具持續性 | 15 |
| 可保存;current=15、saved=4 | Figure126 的全體範圍重設 | 4:取 saved |
| 可保存;current=15、沒有 saved | Figure126 的全體範圍重設 | 4:取 default |
| 可保存;current=15、saved=4 | Figure127 的局部範圍重設;Set/subsystem scope | 15:維持目前值 |
07.05.Figure 126 適用於只有單一控制器的 subsystem 發生 Controller Level Reset,或多控制器且無多 domain 的 NVM Subsystem Reset,或確實重設全部 domain 的 NVM Subsystem Reset。可保存的 Feature 在這些情況用 saved 恢復 current;沒有 saved 時用 default,本篇為 4。
07.06.Figure 127 適用於可支援多控制器的 subsystem 發生 Controller Level Reset,以及多 domain 的 NVM Subsystem Reset 未覆蓋整個 subsystem 的情況。對 NVM Set/NVM subsystem 範圍而言,表中結果是維持不變,除非另有規定。要用這張表,先確認配置與實際重設範圍,不能只看事件名稱裡有 Reset。
07.07.若已確認 SSFS=1、SVBL=1,Set 的 CDW10 加上 bit 31,得到 80000012h;NVMSETID 與 RRL 仍各放 CDW11、CDW12。若 Feature 不可保存卻送 SV=1,控制器必須以 Feature Identifier Not Saveable 中止,不能把該失敗當成已成功修改 current。
07.08.SVBL 告訴你能不能要求保存,SEL=2 告訴你保存查詢回什麼,SEL=0 才告訴你現在用什麼。判斷一次重設的結果時,把裝置能力、重設覆蓋範圍及前後值列在一起,才不會把 Figure 466 的一個 Yes 解讀成所有情境都永遠使用最後一次要求值。
08.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
08.02.Figure 755 先看 4 與 15 的 M,再看 0 的 O,最後沿箭頭確認數字增加時復原量減少。
回到本節的解釋與範例08.03.先確認功能受支援,再讀各列的 M/O,最後看復原量的方向。表裡沒有延遲單位或復原次數。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Level 0~15 | 16 個可能等級;數字較高,復原量較少。 | 不能把 Level 8 當 8 次重試或 8 ms。 |
| O/M | O 表示選用;M 表示支援 RRL 時必備。4、15 為 M,其餘為 O。 | 即使 Level 0 提供最多復原,也可能沒有實作。 |
| Definition:Default/Fast Fail | 4 為預設的一般復原量;15 為最少復原量。 | 目前讀回 15 與預設是 4 可以同時成立。 |
| 向下箭頭:Decreasing Amount of Recovery | 比較的是相對復原量,沒有定義等距、倍數、毫秒或成功率。 | 從 4 調到 15,只能說選擇較少復原,不能承諾每次 I/O 快幾倍。 |
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.23, Figure 755, 文件頁 690, PDF 頁 716
Base755-1等級增加代表復原量減少,M/O 說明支援要求,不是效能評分。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.23, Figure 755, 文件頁 690, PDF 頁 716
Base755-2若 RRLS=8010h,裝置只支援 4、15;雖然表裡畫了 0~15,不能要求 Level 0。0 提供最多復原的敘述,有「若支援」的前提。
08.04.Figure 67 說明集合與 namespace 的包含關係;Figure 484 把這個關係接到命令的 NVMSETID。
回到本節的解釋與範例08.05.這張圖沒有 bit 欄位;要讀的是外框、namespace 方塊與未配置空間三者的關係。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| NVM Set A/B/C 外框 | 各代表一個與其他集合邏輯分開的 NVM 集合;圖上的 A/B/C 是示意名稱。 | 實際命令使用 16-bit NVMSETID,不把字母 A 填進命令。 |
| NS A1~A3、B1~B2、C1 | 每個具有已格式化儲存空間的 namespace 完整位於一個 Set;同 Set 繼承共同屬性。 | A1 的讀取復原策略與 A2 共用 Set A 的 RRL。 |
| Unallocated 區域 | 屬於該 Set、但尚未配置給 namespace 的儲存空間。 | 之後從 Set A 建立新 namespace,仍繼承 A 的 RRL,不是從灰色區塊取得另一個等級。 |
來源:NVME-BASE-2.4, Rev. 2.4, §3.2.2, Figure 67, 文件頁 81, PDF 頁 107
Base67-1namespace 位於哪個 Set 內,決定它繼承哪一份 RRL。
來源:NVME-BASE-2.4, Rev. 2.4, §3.2.2, Figure 67, 文件頁 81, PDF 頁 107
Base67-2原圖的 A1、A2、A3 同在 Set A。若 A 的 RRL 為 15,三者共用 15;Set B 的 B1、B2 不因 A 的設定命令而一起改變。
08.06.Figure 338 很長,本篇只讀 CTRATT 的 RRLVLS/NSETS、RRLS,以及 ONCS.SSFS;逐圖區集中列出 byte 位置與算例。
回到本節的解釋與範例08.07.只讀本篇所需的欄位切片;其他能力 bit 有自己的定義,不能把未在此介紹的 bit 全當保留。位置全部以 Identify Controller 結構起點為準。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| CTRATT bytes 99:96:RRLVLS bit 3 | 1 支援 RRL;0 不支援。 | 用 (CTRATT >> 3) & 1 判斷,不直接比較整個 CTRATT 是否等於 8。 |
| CTRATT:NSETS bit 2 | 1 支援 NVM Sets,FID 12h 按 Set 選擇;0 則採 subsystem 範圍。 | CTRATT=8 的相關 bits 表示有 RRL、沒有 NVM Sets。 |
| RRLS bytes 101:100:bits 15:0 | 每一 bit 對應同編號等級;支援 RRL 時,bit 4、15 必須為 1。 | 11 80 → 8011h;(8011h >> 8) & 1 = 0,Level 8 不受支援。 |
| ONCS bytes 521:520:SSFS bit 4 | 1 支援非零 SEL/SV;0 不支援這些非零選項。 | SSFS=1 才繼續用 SEL=3 查本 Feature 的 SVBL;SSFS 本身不等於 SVBL。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 344-347,371-372, PDF 頁 370-373,397-398
Base338-1先讀支援功能的 bit,再用 RRLS 檢查候選等級,最後判斷可用的查詢方式。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 344-347,371-372, PDF 頁 370-373,397-398
Base338-2CTRATT 的相關 bits 為 0000000Ch 時,bit 3、2 同為 1,表示有 RRL 與 NVM Sets。RRLS=8011h 可選 0、4、15;ONCS bit 4 若為 0,仍只使用 SEL=0、SV=0。
08.08.Figures 484/485 對照看:前者回答對象,後者回答新值。共同命令外框與 SV 放在相應引用圖表中。
回到本節的解釋與範例08.09.本篇只用共同格式中的 NSID、資料指標位置與 CDW10~12;欄位序號不是欄位內的值。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| NSID:bytes 7:4 | 本 Feature 屬 NVM Set 或 subsystem scope,依 §4.4 應填 0;非零會被中止。 | 有 A、B 兩個 namespace 共用 Set 7,也仍填 NSID=0、NVMSETID=7。 |
| DPTR:bytes 39:24 | Figure 463 說明 Set 的資料指標;FID 12h 沒有屬性資料結構,因此不用此欄。 | 不把等級 Fh 當成記憶體地址。 |
| CDW10:bytes 43:40 | FID bits 7:0;SV bit 31;bits 30:8 保留。 | (1 << 31) | 12h = 80000012h,只在保存條件成立時使用。 |
| CDW11/12:bytes 47:44/51:48 | 分別放 NVMSETID 與 RRL;其欄位規則見 Figures 484/485 的共同說明。 | 相同數值 7 放在 CDW11 是 Set 7,放在 CDW12 則會選 Level 7。 |
| SV=1 的必要條件 | 需 SSFS 支援及本 Feature 可保存;不可保存時要求 SV=1,回 Feature Identifier Not Saveable。 | 收到失敗完成,不能把所要求的 15 當成設定成功的證據。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168
來源: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
Base93-1共同格式先交代欄位位置,FID 12h 再賦予 CDW11/12 專屬含義。
來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168
Base93-2CDW11 的 byte offset 為 11×4=44,NVMSETID=7 存在 bytes 45:44;CDW12 從 48 開始,低 4 bits 才是等級。NSID 則在 bytes 7:4,本 Feature 填 0。
Base463-1Set Features 的 DPTR 是否有用途,要看該 Feature 有沒有資料結構。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 463, 文件頁 456, PDF 頁 482
Base463-2本 Feature 的 Set 只要 CDW11 的 Set 編號與 CDW12 的等級,不需要把 Fh 放進一個 buffer 再提供地址。Figure 466 的 FID 12h 列明確標示不使用 data buffer。
Base464-1FID 與 SV 分別選功能和保存要求,SV 不決定作用範圍。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 464, 文件頁 457, PDF 頁 483
Base464-2SV=0、FID=12h 得 00000012h;確認可保存後,SV=1 得 80000012h。兩者仍用同一個 CDW11 選 Set,不能藉 SV 改成單一 namespace 設定。
08.10.兩張圖相鄰,但代表兩個不同問題。把 NVMSETID 與 RRL 合在同一個 Dword,會失去正確的欄位語意。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Figure 484:CDW11 bits 15:0 | NVMSETID 選 Set;bits 31:16 保留。沒有 Set 支援時忽略此欄,主機填 0。 | 7 是已存在 Set 的識別碼,不是第 7 個 namespace。 |
| Figure 485:Set CDW12 bits 3:0 | RRL 直接指定 0~15 的某個受支援等級;bits 31:4 保留。 | 15 填 Fh;沒有數量減 1 或再加 1 的換算。 |
| Figure 485:Get 成功且 SEL≠3 | 相同 RRL 格式出現在 CQE DW0;Get 命令的 CDW12 不承載這份回覆。 | 讀回值先取 DW0 & Fh,再依查詢的 SEL 說明是目前、預設或已保存。 |
| Reserved | 本範例將保留位清 0,不利用它們增加等級範圍或夾帶其他參數。 | 0000001Fh 的 bit 4 已落入保留區,不能稱作 Level 31。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, Figure 484, 文件頁 473, PDF 頁 499
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, Figure 485, 文件頁 473, PDF 頁 499
Base484-1CDW11 放目標 Set,不放 namespace 編號,也不放等級。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, Figure 484, 文件頁 473, PDF 頁 499
Base484-2Set 7 的 CDW11=00000007h;若裝置不支援 NVM Sets,填 0 且本 Feature 忽略此欄,命令影響整個 subsystem。支援 Sets 時 0 是保留識別值,不是全部 Set。
Base485-14-bit RRL 是直接的等級代碼;Get 回覆使用同一格式,但位置改在 CQE DW0。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, Figure 485, 文件頁 473, PDF 頁 499
Base485-2Level 15 在 Set 的 CDW12 填 0000000Fh。成功 Get 且 SEL=0 時,若 CQE DW0 也是 0000000Fh,低 4 bits 表示目前等級 15;這不是 RRLS 的 bit 15 遮罩 8000h。
08.11.Figure 198 決定問題;Figure 201 與 Figure 485 是兩種互斥的 DW0 解讀方式,先確認 SEL 再挑格式。
回到本節的解釋與範例08.12.Figure 198 是送出的命令;Figure 201 是 SEL=3 的回覆。SEL≠3 的成功回覆則回到 Figure 485 的 RRL 格式。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Get CDW10:SEL bits 10:8、FID bits 7:0 | SEL=0 current、1 default、2 saved、3 capabilities;4~7 保留,高位 31:11 保留。 | SEL3 的 3 需左移 8 bits,不是把 FID 從 12h 改成 15h。 |
| Get CDW11/DPTR | CDW11 沿用 NVMSETID 指定目標;DPTR 因無資料結構而忽略。 | 同一 Set 的設定與讀回,都使用相同 NVMSETID。 |
| 能力 DW0:CHANG bit 2 | 1 表示有可變更值;0 表示值不可變更。 | 它不表示支援 RRL Level 2。 |
| 能力 DW0:NSSPEC bit 1 | 1 表示 namespace scope;0 不能自行推成 controller scope。 | 本 Feature 的 Set/subsystem 範圍仍由 NSETS 與主範圍定義決定。 |
| 能力 DW0:SVBL bit 0;31:3 保留 | 1 可保存;0 不可保存。讀 saved 卻沒有 saved 值時,回 default。 | 能力值 4 表示可變更但不可保存;current 值 4 才表示 Level 4。 |
來源: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.2, Figure 201, 文件頁 212, PDF 頁 238
Base197-1沒有額外資料結構的 Feature,Get 會忽略 DPTR。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 197, 文件頁 209, PDF 頁 235
Base197-2查 RRL 後,主機應讀成功 CQE 的 DW0,不能在一份預先配置但未被使用的 buffer 裡找 Fh。DPTR 沒有資料,不表示 Get 沒有回覆。
Base198-1SEL 讓同一個 FID 分別回答目前、預設、已保存或能力。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 198, 文件頁 209-210, PDF 頁 235-236
Base198-2SSFS=1 時,FID12h 搭配 SEL=0/1/2/3,CDW10 依序是 00000012h、00000112h、00000212h、00000312h。只改這個選擇,就會改變回覆的問題或格式。
Base201-1SEL=3 回三個能力 bit,不回等級清單,也不回目前 RRL。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12.2, Figure 201, 文件頁 212, PDF 頁 238
Base201-2DW0=5 時,bit 2、0 為 1:可變更且可保存,NSSPEC=0。把 5 解讀成 Level 5 會用錯格式;讀目前值必須另送 SEL=0。
08.13.Figures 126/127 以列選可保存性、以欄選 Feature 範圍;Figure 466 的 FID 12h 列必須和註腳 2 合讀。
回到本節的解釋與範例08.14.先看 FID 12h 是否可保存。不可保存的持續性由 Figure 466 與 §4.4 直接決定;可保存者再用 Figures 126/127 的對應欄。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| Figure 466:Feature Identifier/Uses Data Buffer/Scope | 只取 FID12h 這列:不使用 buffer,範圍為 NVM Set 或 NVM subsystem。 | 不能因為 Set 命令經某個控制器送出,就改讀 controller scope。 |
| Figure 466:Current Setting Persists/註腳 2 | Yes 只適用不可保存的 Feature;可保存者不用此欄。 | 不可保存且目前為 15,跨 power cycle 與 reset 仍保留 15。 |
| Figure 126:Saveable 列 | 適用全體範圍重設;所有 Feature scope 的此列都回 saved,無 saved 回 default,除非另有規定。 | 目前 15、saved 4 → current 4。 |
| Figure 127:Saveable 列 × NVM Set/NVM subsystem 欄 | 適用局部範圍重設;這兩欄維持 current,除非另有規定。 | 目前 15、saved 4 → current 15;不能誤讀左側 controller 欄。 |
| 兩張重設表的另一列 | Non-saveable and non-persistent 同時要求不可保存與不具持續性;FID12h 的不可保存分支具持續性,不符合這一列。 | 不可只看到 Non-saveable,就忽略後面 and non-persistent 而套用預設值。 |
| 表格適用的配置與事件 | Figure126:單控制器的 Controller Level Reset,或覆蓋整個 subsystem 的適用 NVM Subsystem Reset。Figure127:多控制器的 Controller Level Reset,或多 domain 中未覆蓋全體的 NVM Subsystem Reset。 | 先寫出裝置配置與重設覆蓋範圍,再查結果;配置不是重設後的值。 |
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 126, 文件頁 167, PDF 頁 193
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 127, 文件頁 167-168, PDF 頁 193-194
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 466, 文件頁 458-459, PDF 頁 484-485
Base126-1全體範圍重設下,可保存的值回到 saved,沒有 saved 才回 default。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 126, 文件頁 167, PDF 頁 193
Base126-2可保存的 RRL 在 Set 7 目前為 15、saved 為 4。若這次重設符合 Figure 126 的整個 subsystem 條件,結果是 current=4,不是維持最後一次 SV=0 的 15。
Base127-1局部範圍重設下,RRL 所在的 NVM Set/subsystem 欄是維持不變。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, Figure 127, 文件頁 167-168, PDF 頁 193-194
Base127-2可支援多控制器的 subsystem 只對其中一個控制器做 Controller Level Reset,適用本表;current=15 的共用 RRL 維持 15,不因該控制器重設而套用 controller-scope 欄的恢復規則。
Base466-1FID 12h 列的 Yes 要連同註腳 2 讀,不能跳過可保存性判斷。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 466, 文件頁 458-459, PDF 頁 484-485
Base466-2不可保存的 FID 12h:Yes 表示目前值跨 power cycle 與 reset 保留。可保存的 FID 12h:這一欄不用,改查 current/saved 與適用重設表。
09.01.不能選 8,因為 bit 8 是 0。要選 15,先用 RRLS bit 15 確認支援,再在 4-bit RRL 欄填 Fh;8000h 是支援位元的遮罩,不是等級代碼。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 文件頁 344-347,371-372, PDF 頁 370-373,397-398
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, 文件頁 473, PDF 頁 499
09.02.不能。RRL 依 Set 共用,命令的 NVMSETID 選該集合;這種 scope 的 NSID 應為 0,非零不會縮小作用範圍,而會使命令被中止。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, 文件頁 473, PDF 頁 499
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 169, PDF 頁 195
09.03.還要看 SEL。SEL=0 才回 current;SEL=3 的 4 是 CHANG=1、NSSPEC=0、SVBL=0 的能力組合。若 SEL=1,4 說的是預設值。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.12, 文件頁 473, PDF 頁 499
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, 文件頁 209-212, PDF 頁 235-238
09.04.B 必須使用新設定;A 已先提交,可能套用或不套用新值。Level 15 本身也沒有固定毫秒上限。需要清楚區分兩批時,宜先完成 A,再修改設定。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1, 文件頁 459, PDF 頁 485
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.23, 文件頁 689-690, PDF 頁 715-716
09.05.不一定。不可保存的 FID 12h 本身具持續性;可保存者還要看重設範圍。Figure 126 的全體情況回 saved 或 default,Figure 127 的局部情況對 Set/subsystem scope 維持 current。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 167-169, PDF 頁 193-195
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, 文件頁 458-459, PDF 頁 484-485