介面位置
01-01透過 BAR 與 configuration space 找到 NVMe 介面及能力。
- BAR
- Base Address Register,PCI configuration space 中用來找出裝置 memory space 的 register。
NVMe · 規格與原理
00.01.NVMe over PCIe Transport 說明 NVMe 的佇列、properties 與通知如何透過 PCIe 運作。本篇把作業系統熟悉的記憶體映射 I/O、DMA 與中斷,接到一筆 NVMe 命令的實際傳遞過程。
01-01透過 BAR 與 configuration space 找到 NVMe 介面及能力。
02-01區分佇列資料、Doorbell 與 interrupt 的作用。
03-01理解 reset、電源、錯誤回報與鏈路量測各自的適用範圍。
00.02.Base 規格定義 NVMe 的共同命令與佇列模型;PCIe Transport 補上本機 PCIe 的連接方式。讀取記憶體中的 queue entry,與存取裝置的 MMIO register,是不同種類的存取。
00.03.Base 定義的提交與完成機制,在 PCIe 上需要具體的位址、記憶體存取和通知方式。先找到控制器的暫存器空間,再看 SQ/CQ 如何交換命令,最後理解中斷及 PCIe 狀態回報。
00.04.Configuration Space、錯誤紀錄與眼圖量測又提供不同層次的資訊:裝置如何呈現、傳輸發生了什麼、接收端量測資料如何排列。它們不等同 NVMe 命令完成狀態。學完應能沿一次交換辨認資料、Doorbell 和中斷的分工。
01.01.PCIe Transport 把 NVMe 的共同命令機制落實到 PCIe 連接方式。主機可以透過記憶體映射的暫存器設定控制器及更新 Doorbell,控制器則依傳輸規則存取主機記憶體中的命令與資料。這讓「提交命令」成為實際的記憶體及通知操作。
01.02.命令要做什麼仍由 Base 或對應 Command Set 定義。PCIe 的錯誤狀態、組態能力和中斷格式則屬於另一層資訊。閱讀時要分開辨認操作結果和傳輸環境,才不會把某個 PCIe 狀態直接翻成 NVMe 命令狀態碼。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.2, 文件頁 6, PDF 頁 6
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.3, 文件頁 6-7, PDF 頁 6-7
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §2, 文件頁 8, PDF 頁 8
01.03.PCIe Transport 補充 Base Specification,定義 PCIe 專屬資料結構、延伸、要求與行為;通用 NVMe 行為仍由 Base 定義。規格衝突時 Base 的優先序高於 Transport。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.2, 文件頁 6, PDF 頁 6
01.04.本文件沿用 Base 的 conventions;register/property 表格中的 Reset 欄改表示依 PCI 或 PCIe 規格定義之 reset 後欄位值。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.3, 文件頁 6-7, PDF 頁 6-7
01.05.PCIe transport 使用 memory-mapped I/O 進行資料與 register 存取,並使用 PCIe configuration space 與 message-signaled interrupt。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §2, 文件頁 8, PDF 頁 8
| 規格層次 | 負責的行為 | 本篇如何使用它 |
|---|---|---|
| Base | command 與 completion 的共通語意 | 最高優先序的 NVMe 定義 |
| PCIe Transport | address、register、doorbell、interrupt 綁定 | 補充 PCIe-specific 要求 |
| PCI-SIG 規格 | 原生 PCIe capability/transaction 語意 | 本報告只引用來源明載的 NVMe-specific 部分 |
02.01.假設 BAR 配置出的 register base 是 A,Doorbell 區從 A+1000h 開始。A 是系統配置的地址,1000h 是規格 offset,不能把兩者當成同一個值。
02.02.若 DSTRD=1,間距是 8 bytes。y=2 的 SQ Tail offset=1000h+4×8=1020h,CQ Head offset=1000h+5×8=1028h。這裡的 4、5 來自交錯排列的 2y 與 2y+1。
02.03.假設新的 SQ Tail 是 3,主機把 3 寫到 A+1020h。SQE 已在 SQ 記憶體,Doorbell 不再攜帶整份命令,也不攜帶 SQE 的地址。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, 文件頁 9-10, PDF 頁 9-10
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1-3.1.2.2, 文件頁 10-11, PDF 頁 10-11
02.05.NVMe controller registers 位於 BAR0/BAR1 所指定的 memory space。host 必須(shall)使用 native width 或 aligned 32-bit access,不得發出 locked access;違反時行為未定義。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, 文件頁 9-10, PDF 頁 9-10
02.06.SQ tail 與 CQ head doorbell 從 offset 1000h 起,實際 stride 由 CAP.DSTRD 決定;queue identifier y 參與 offset 計算。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1-3.1.2.2, 文件頁 10-11, PDF 頁 10-11
| Doorbell 或寫入值 | 位址或內容如何計算 | 主機用它通知什麼 |
|---|---|---|
| SQ y tail | 1000h + (2y) × (4 << DSTRD) | host 公布新 SQ tail |
| CQ y head | 1000h + (2y+1) × (4 << DSTRD) | host 公布已消費 CQ head |
| doorbell value | queue pointer | 不含 SQE/CQE 本體 |
03.01.PCIe 上的一次命令交換包含資料結構寫入及位置通知。主機先讓完整 SQE 可被控制器看見,再更新 SQ Tail Doorbell。控制器處理命令及資料後,寫入 CQE;主機讀完結果,再以 CQ Head Doorbell 釋放完成佇列位置。
03.02.SQ slot、命令資料 buffer 和 CQ slot 各有不同使用期間。控制器已取走某個 SQE,不等於它已完成對資料 buffer 的存取;主機讀到 CQE,也要依完成與可見性規則再重用相關資源。把三者分開追蹤,可以理解為什麼只有一個 head 或 tail 值不足以描述全部資源狀態。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4, 文件頁 12-13, PDF 頁 12-13
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, 文件頁 11, PDF 頁 11
03.03.command flow 是:寫 SQE、更新 SQ tail doorbell、controller 取走與執行、寫 CQE、發出 interrupt(若啟用)、host 處理 CQE、更新 CQ head doorbell。doorbell 只通告 pointer,不攜帶 command 本體。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4, 文件頁 12-13, PDF 頁 12-13
03.04.PCIe 支援多個 Submission Queues 共用一個 Completion Queue。建立 CQ 時若啟用 interrupt,Interrupt Vector 必須(shall)初始化成對應 MSI-X 或 multiple-message MSI vector。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, 文件頁 11, PDF 頁 11
| 需要重用的資源 | 何時不再由原操作使用 | 主機應觀察的資訊 |
|---|---|---|
| SQ slot reuse | controller 已消費該 SQE | 由完成資訊的 SQHD 協助追蹤 |
| command buffer reuse | command 已 completion 且資料可見 | 依 command/data direction 核對 |
| CQ slot release | host 已完整消費 CQE | 之後才寫 CQ head doorbell |
04.01.控制器依 CQ 設定使用選定的向量通知主機。多個 CQ 可以有相同或不同通知安排,因此收到向量不一定只對應一筆命令。
04.02.主機用 Phase 判斷可消費的新項目,再由 SQID、CID 對回原命令。SCT、SC 才提供 NVMe 結果;MSI 或 MSI-X 的訊息資料不是命令 status。
04.03.主機完成必要讀取,再更新 CQ Head Doorbell。通知、讀取 CQE 與交還位置是三個時刻,不能只收到中斷便視為 CQ 空間已釋放。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.5, 文件頁 13-16, PDF 頁 13-16
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, 文件頁 11, PDF 頁 11
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §Annex A, 文件頁 47-48, PDF 頁 47-48
04.05.可用模式為 pin-based、single-message MSI、multiple-message MSI 與 MSI-X。規格建議 MSI-X;coalescing 可降低 interrupt rate,但通常增加 latency。Admin CQ 的 interrupt 不宜(should not)延遲。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.5, 文件頁 13-16, PDF 頁 13-16
04.06.Annex A 是 informative host checklist:提交時先寫 SQE 再 doorbell;完成時以 phase 判斷新 CQE,完成讀取後再推進 CQ head;interrupt handler 要處理同 vector 的所有相關 CQ。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §Annex A, 文件頁 47-48, PDF 頁 47-48
| 中斷方式 | 通知與遮罩如何安排 | 影響的資源或限制 |
|---|---|---|
| pin-based | 傳統共享線路 | 共享與 masking 行為不同 |
| single MSI | 單一 message/vector | 多個 CQ 可能共享服務路徑 |
| multiple MSI | 一組連續 messages | 受 MME/MMC 等能力限制 |
| MSI-X | table-based 多 vectors、獨立 mask | 規格建議優先使用 |
05.01.Configuration Space 描述 PCIe 裝置呈現的能力與設定。它與 NVMe 的命令結構不同:CQE 回報某筆命令的結果,PCIe 狀態描述連接或 Function 的事件。遇到一個錯誤位時,要先確認它來自哪一層,才能找到正確的解釋。
05.02.錯誤紀錄中的狀態、遮罩、嚴重程度與相關交易資訊各有用途。某個狀態位被設起來,不會自動決定是否已通知主機,或對應哪個 NVMe SC。裝置介面回報結構則描述另一種配置資訊,也必須以自己的長度與欄位格式閱讀。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1-3.8.7, 文件頁 16-35, PDF 頁 16-35
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.7, 文件頁 16, PDF 頁 16
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.6, 文件頁 16, PDF 頁 16
05.03.§3.8 逐欄定義 NVMe controller 的 PCI header、Power Management、MSI/MSI-X、PCIe capability 與 AER 額外要求。PCI/PCIe 原始欄位語意仍以 PCI-SIG 規格為準。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1-3.8.7, 文件頁 16-35, PDF 頁 16-35
05.04.NVMe command error 由 CQE status 回報;PCIe transport/link error 則依 PCIe 機制與本文件的 NVMe-specific 要求處理,兩者的 recovery 層級不同。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.7, 文件頁 16, PDF 頁 16
05.05.host 絕不可(shall never)選擇功耗高於 PCIe slot power limit 的 NVMe power state;違反時 power behavior 未定義。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.6, 文件頁 16, PDF 頁 16
| 回報層次或能力 | 描述的事件或資源 | 必須連同哪些資訊閱讀 |
|---|---|---|
| NVMe CQE status | command 執行結果 | 由 NVMe command context 解 |
| PCIe Device Status | PCIe Function 狀態摘要 | 位於 PCIe capability |
| AER | correctable/uncorrectable transport errors | status、mask、severity、header 一起看 |
| power state | slot limit 與 device power 控制 | 不得選超過 slot power limit 的 NVMe state |
06.01.接收端眼圖量測用來描述接收端在不同量測條件下取得的結果。這份報告的重點是如何讀懂 NVMe 提供的量測資料結構,而不是用眼圖外觀直接估算 SSD 的 IOPS。Lane 身分、量測設定和資料格式不同時,結果不能直接比較。
06.02.Header 描述整體長度與布局,lane descriptor 再帶到個別 lane 的結果。Printable Eye 是可供人閱讀的一種呈現方式,不是另一條實體 lane,也不能把字元數當成品質分數。要比較兩條 lanes,先確認量測條件與座標尺度相同。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9, 文件頁 39-46, PDF 頁 39-46
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §Annex A, 文件頁 47-48, PDF 頁 47-48
06.03.Physical Interface Receiver Eye Opening Measurement log page 以 header、lane descriptor 與 EOM data 回報量測;host 先查支援與大小,再依 lane/parameter 解析。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9, 文件頁 39-46, PDF 頁 39-46
| 量測資料區域 | 描述的量測與位置 | 比較前須先確認什麼 |
|---|---|---|
| specific parameter | 選量測動作與品質/狀態 | 先決定 request context |
| specific identifier | 選 lane/test context | 避免把不同量測混在一起 |
| header | 全域長度與配置 | 所有後續 offset 的基準 |
| lane descriptor | 每 lane 邊界/狀態 | 只在 buffer 內走訪 |
07.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
07.02.層次圖先區分命令語意、NVMe 在 PCIe 上的綁定及 PCIe 原生能力。用一筆命令依次找出 SQE、主機 buffer、Doorbell 和中斷的位置,而不是把三份規格當成依序執行的程式。
回到本節的解釋與範例07.03.命令集決定 Read 要做什麼,Base 定義 SQE、CQE 等共同結構;PCIe Transport 再把佇列、MMIO 與中斷接起來。讀分層圖時,沿一筆命令穿過各層,便能看出每層負責的工作。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| SQE/DMA/CQE | 主機先在可供控制器存取的記憶體放好命令,控制器取走命令並搬運資料,最後寫回完成項目。 | Read 的資料進入 DPTR 指向的 buffer;CQE 則回到 CQ,兩者不是同一份資料。 |
| Controller Properties/PCI Configuration Space | PCI 組態空間負責辨識與配置裝置,BAR 指向 NVMe 暫存器所在的 MMIO 空間。 | 先從組態空間取得 BAR,再以該基底加上 NVMe property offset 找到暫存器。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.2, Figure 1, 文件頁 6, PDF 頁 6
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §2, Figure 2, 文件頁 8, PDF 頁 8
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, Figure 3, 文件頁 9, PDF 頁 9
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, Figure 4, 文件頁 9-10, PDF 頁 9-10
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4.1, Figure 8, 文件頁 13, PDF 頁 13
PCIe1-1PCIe Transport 補充 NVMe 共通機制在 PCIe 上的存取方式。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.2, Figure 1, 文件頁 6, PDF 頁 6
PCIe1-2解釋 CC、CSTS 的狀態含義時看 Base;說明主機如何透過 PCIe 映射位置存取它們時看 Transport。
PCIe2-1傳輸層次圖把 NVMe 操作與承載它的 PCIe 機制分開。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §2, Figure 2, 文件頁 8, PDF 頁 8
PCIe2-2同一個 NVMe Read 可能涉及多次 PCIe 交易;不能把一個 TLP 直接當成一筆完整 NVMe 命令。
07.04.位址表把 BAR 基底、1000h 起點、queue ID 和 stride 分開計算。先找對暫存器,再解讀寫入的 head/tail 值,避免混淆暫存器位址與暫存器內容。
回到本節的解釋與範例PCIe3-1PCIe 暫存器總覽把組態資訊、中斷能力與錯誤回報放在不同區域。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, Figure 3, 文件頁 9, PDF 頁 9
PCIe3-2初始化時先找 BAR 與 capability list;讀 NVMe controller property 則走映射後的記憶體空間,兩者不是同一套 offset。
PCIe4-1Doorbell 依 queue 編號與 DSTRD 交錯排列。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, Figure 4, 文件頁 9-10, PDF 頁 9-10
PCIe4-2先找 SQ0 Tail、CQ0 Head,再按 stride 找 SQ1 Tail、CQ1 Head;queue 編號每加 1 會跨過兩個 doorbell 位置。
07.05.SQ Tail 與 CQ Head Doorbell 交錯排列。CAP.DSTRD 決定相鄰 Doorbell 的 byte 距離,佇列編號 y 決定要選哪一對;寫入值則是新的佇列索引。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| CAP.DSTRD/y | 間距是 4 << DSTRD bytes,SQ 使用 2y,CQ 使用 2y+1。 | DSTRD=0、y=2:SQ offset=1000h+4×4=1010h,CQ offset=1014h。 |
| SQT/CQH | SQT 通告已提交到哪裡;CQH 通告主機已消費到哪裡。 | 寫入 Doorbell 的 3 是佇列索引 3,不是要控制器移動 3 bytes,也不是命令完成碼。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1, Figure 5, 文件頁 10, PDF 頁 10
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1, Figure 6, 文件頁 10-11, PDF 頁 10-11
PCIe5-1SQ Tail Doorbell 通知控制器主機已提交到哪個位置。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1, Figure 5, 文件頁 10, PDF 頁 10
PCIe5-2DSTRD=0 時 stride=4 bytes,SQ1 Tail offset=1000h+2×4=1008h;寫入的是 tail index,不是命令 buffer 位址。
PCIe6-1CQ Head Doorbell 通知控制器哪些完成項目已被主機消耗。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1, Figure 6, 文件頁 10-11, PDF 頁 10-11
PCIe6-2DSTRD=0 時 CQ1 Head offset=1000h+3×4=100Ch;主機讀完 CQE 後推進 head,讓相應位置可再次使用。
07.06.交換流程分三條線看:SQE 的發布與取得、data buffer 的使用、CQE 的寫入與釋放。SQHD 協助追蹤 SQ 消費位置,SQID/CID 辨認完成命令,CQ Head 則釋放完成位置。
回到本節的解釋與範例07.07.先選中斷機制,再由 Create I/O CQ 的 IV 連到向量。MSI 的訊息設定位於 capability;MSI-X 用表格保存各向量的位址、資料及遮罩。向量是通知路徑,CQE 才保存命令結果。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| IV/MME/MMC | MSI 的 MMC 回報能力、MME 選已啟用向量數;IV 不能超出實際可用範圍。 | 裝置能支援多個向量,不表示驅動程式已啟用全部向量。 |
| MA/MUA/MD/C64 | MA 與必要的 MUA 組合訊息目的位址,MD 是寫往該位址的資料;C64 決定位址結構。 | 控制器以訊息寫入觸發中斷,主機再讀 CQ;不能把 MD 當成 NVMe status。 |
| PVM/MMASK/MPEND | 能力決定是否有逐向量遮罩;MASK 控制通知,PEND 表示被遮罩期間待處理的通知。 | 解除遮罩前仍需按照所用機制處理 pending,不能假設遮罩會清除 CQE。 |
| MXE/FM/TS | MSI-X enable、整體遮罩與表格大小共同決定哪些向量可使用;TS 是從 0 起算的大小編碼。 | TS=3 對應 4 個 table entries;其中某筆仍可能被單獨遮罩。 |
| TBIR/TO/PBIR/PBAO | BIR 選 BAR,offset 選該 BAR 空間中的 Table 或 Pending Bit Array。 | 若 Table 與 PBA 選不同 BAR,必須分別加到各自基底,不能沿用同一個地址。 |
| IPIN/ILINE/NEXT/CID | 傳統中斷資訊與 capability 串列提供不同機制的入口;NEXT 串起 capability,CID 辨識類型。 | 先沿 capability 串列確認 MSI-X 是否存在,再讀它的 MXC;不要依固定絕對 offset 猜位置。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, Figure 7, 文件頁 11, PDF 頁 11
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.5.1, Figure 9, 文件頁 15, PDF 頁 15
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.20, Figure 27, 文件頁 21, PDF 頁 21
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.3, Figure 34, 文件頁 22, PDF 頁 22
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.1, Figure 35, 文件頁 23, PDF 頁 23
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.2, Figure 36, 文件頁 23, PDF 頁 23
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.3, Figure 37, 文件頁 23, PDF 頁 23
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.4, Figure 38, 文件頁 23, PDF 頁 23
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.5, Figure 39, 文件頁 23, PDF 頁 23
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.6, Figure 40, 文件頁 24, PDF 頁 24
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.7, Figure 41, 文件頁 24, PDF 頁 24
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.7, Figure 42, 文件頁 24, PDF 頁 24
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.1, Figure 43, 文件頁 24, PDF 頁 24
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.2, Figure 44, 文件頁 24-25, PDF 頁 24-25
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.3, Figure 45, 文件頁 25, PDF 頁 25
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.4, Figure 46, 文件頁 25, PDF 頁 25
PCIe7-1建立 CQ 時選擇其中斷向量,還要符合目前中斷模式能力。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, Figure 7, 文件頁 11, PDF 頁 11
PCIe7-2IV=3 指向量 3;若目前只啟用不足的向量數,不能只因欄位放得下 3 就認定有效。
PCIe8-1命令處理圖分開 SQ 取命令、資料交換與 CQ 回報結果。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4.1, Figure 8, 文件頁 13, PDF 頁 13
PCIe8-2追一次 Write:主機提交 SQE、控制器取得資料並處理、最後寫 CQE;doorbell 更新只代表提交位置改變。
07.08.先把 CQ 連到使用的 vector,再讀該中斷方式的 enable、mask 與 table。收到共用向量時沿所有相關連線查 CQ;合併門檻改變的是通知時機,不是 CQE 的狀態意義。
回到本節的解釋與範例PCIe9-1Pin、MSI 與多 MSI 模式的通知行為需要分別理解。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.5.1, Figure 9, 文件頁 15, PDF 頁 15
PCIe9-2多個 CQ 共用一個通知來源時,主機可能需要檢查多個 CQ;中斷本身不攜帶每一筆 NVMe 完成結果。
PCIe34-1MSI capability 把向量控制、通知位址與資料組在一起。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.3, Figure 34, 文件頁 22, PDF 頁 22
PCIe34-2主機配置一組 MSI,既要決定啟用數量,也要提供訊息目的位址與資料;只設 enable 不足以描述完整通知。
PCIe35-1MSI 識別 header 讓主機在 capability list 中找到 MSI。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.1, Figure 35, 文件頁 23, PDF 頁 23
PCIe35-2由 NEXT 串列定位 MSI 後,其他欄位位置才以 MSICAP 為基底計算,不是永遠從 configuration offset 0 開始。
PCIe36-1MSI Message Control 區分支援的訊息數與實際啟用數。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.2, Figure 36, 文件頁 23, PDF 頁 23
PCIe36-2裝置最多支援 8 個向量,主機仍可只啟用較少數量;讀 MMC 與 MME 時不要混為一個數字。
PCIe37-1MSI Message Address 指定中斷訊息寫到的目的位址。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.3, Figure 37, 文件頁 23, PDF 頁 23
PCIe37-2它不是 CQ buffer 位址;CQ 保存完成內容,MSI 位址用於送出通知,兩條資料流分開。
PCIe38-164-bit MSI 位址需要 Upper Address 補齊高部。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.4, Figure 38, 文件頁 23, PDF 頁 23
PCIe38-2啟用 64-bit 位址格式時,把 MA 與 MUA 合併後才是完整目的位置;不能在所有格式都假設 MUA 有效。
PCIe39-1MSI Message Data 是中斷訊息攜帶的資料值。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.5, Figure 39, 文件頁 23, PDF 頁 23
PCIe39-2DATA 與 Message Address 一起描述通知;它不是 NVMe CQE 的 CID,不能直接用來配對完成命令。
PCIe40-1MSI Mask Bits 可以遮罩相應訊息。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.6, Figure 40, 文件頁 24, PDF 頁 24
PCIe40-2遮罩某個向量後,裝置仍可能產生待處理狀態;遮罩通知不等於讓 CQ 裡的完成項目消失。
PCIe41-1MSI Pending Bits 記錄相應的待處理訊息狀態。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.7, Figure 41, 文件頁 24, PDF 頁 24
PCIe41-2向量被遮罩期間有事件,pending 可反映待處理情況;主機仍需到 CQ 取得實際命令結果。
PCIe42-1MSI-X 把向量表與 pending bitmap 放到指定記憶體區域。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.7, Figure 42, 文件頁 24, PDF 頁 24
PCIe42-2先定位 Table 與 PBA,才能理解每個向量的設定及待處理狀態;兩者不一定位於同一個 BAR 區段。
PCIe43-1MSI-X capability header 用於識別與串接能力清單。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.1, Figure 43, 文件頁 24, PDF 頁 24
PCIe43-2找到 MSI-X 的 CID 後,再以 MSIXCAP 加上相對 offset 讀 MXC、MTAB,避免使用另一個 capability 的基底。
PCIe44-1MSI-X 控制欄位區分啟用、整體遮罩與表格大小。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.2, Figure 44, 文件頁 24-25, PDF 頁 24-25
PCIe44-2TS 原始值 7 表示 8 個 table entries;Function Mask 控制整體通知,不等於刪除向量表內容。
PCIe45-1MSI-X Table 的 BIR 選 BAR,offset 選 BAR 內位置。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.3, Figure 45, 文件頁 25, PDF 頁 25
PCIe45-2TBIR 指 BAR2、TO 指該 BAR 內的表格起點;不能把 TO 單獨當成主機實體位址。
PCIe46-1PBA 有自己的 BAR 選擇與 offset。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.4, Figure 46, 文件頁 25, PDF 頁 25
PCIe46-2Table 在 BAR0、PBA 在 BAR2 的配置需要分別定位;不能從 Table 地址加固定距離猜 PBA 在哪裡。
07.09.先辨認 PCIe capability 的種類,再將 status、mask、severity 和 header log 配對。TDISP 的 DEVICE_INTERFACE_REPORT 依其欄位布局閱讀,不能套用錯誤 log 或 NVMe CQE 的解讀方式。
07.10.組態空間圖是一張地圖:識別欄位讓軟體選擇驅動程式,BAR 描述 MMIO 資源,Command 控制存取方式,Status 記錄裝置狀況。舊式 PCI 相容欄位仍在版面中,但不代表 NVMe 要用它們處理 I/O。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| VID/DID/RID/SSVID/SSID | 廠商、裝置、revision 與 subsystem 識別分別描述不同層次。 | 同樣的 DID 可以出現在不同板卡配置;不能只由它推論 firmware 版本。 |
| BCC/SCC/PI/HTYPE | Class Code 辨識裝置類別及介面,Header Type 決定後續組態版面。 | 這裡的 PI 是 Programming Interface,不是資料保護資訊 Protection Information。 |
| CMD/STS | Command 中的存取控制與 bus mastering 等位元決定裝置可以採取的動作;Status 記錄條件及錯誤。 | 改變控制位元與清除可寫 1 清除的狀態位元是不同操作,不能對整個區塊任意回寫讀值。 |
| MLBAR/MUBAR/BA/TP/PF/RTE | 64-bit 記憶體 BAR 由高低部分組合,低位的型別屬性不屬於基底地址。 | 先遮去 BAR0 的屬性位元,再與 BAR1 組成基底,最後加上 NVMe register offset。 |
| BAR2/EROM/RBA/CAP.CP | 其他 BAR、選用 ROM 與 capability pointer 各有自己的用途及存在條件。 | CAP.CP 指向 capability 串列,與 NVMe CAP controller property 是兩個不同位置。 |
| BIST/CLS/MLT/CCPTR/MGNT/MLAT | 依各圖的固定值、選用性及存取屬性讀取相容欄位;PCI BIST 與 NVMe Device Self-test 不是同一個命令機制。 | 欄位存在於 PCI header,不足以證明控制器支援 NVMe 延伸自我測試。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8, Figure 10, 文件頁 16-17, PDF 頁 16-17
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.1, Figure 11, 文件頁 17, PDF 頁 17
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.2, Figure 12, 文件頁 17, PDF 頁 17
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.3, Figure 13, 文件頁 18, PDF 頁 18
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.4, Figure 14, 文件頁 18, PDF 頁 18
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.5, Figure 15, 文件頁 18, PDF 頁 18
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.6, Figure 16, 文件頁 18, PDF 頁 18
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.7, Figure 17, 文件頁 18, PDF 頁 18
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.8, Figure 18, 文件頁 19, PDF 頁 19
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.9, Figure 19, 文件頁 19, PDF 頁 19
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.10, Figure 20, 文件頁 19, PDF 頁 19
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.11, Figure 21, 文件頁 19, PDF 頁 19
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.12, Figure 22, 文件頁 20, PDF 頁 20
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.16, Figure 23, 文件頁 20, PDF 頁 20
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.17, Figure 24, 文件頁 20, PDF 頁 20
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.18, Figure 25, 文件頁 20, PDF 頁 20
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.19, Figure 26, 文件頁 21, PDF 頁 21
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.21, Figure 28, 文件頁 21, PDF 頁 21
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.22, Figure 29, 文件頁 21, PDF 頁 21
PCIe10-1PCIe configuration header 是尋找識別碼、BAR 與 capabilities 的入口。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8, Figure 10, 文件頁 16-17, PDF 頁 16-17
PCIe10-2從 offset 10h 讀 BAR 資訊,與在映射記憶體 offset 1000h 寫 doorbell,是兩個不同位址空間的操作。
PCIe11-1VID 與 DID 識別 PCIe 廠商與裝置類型。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.1, Figure 11, 文件頁 17, PDF 頁 17
PCIe11-2同一 DID 的兩張卡仍可有不同 serial number;這裡不是替每個 namespace 分配唯一 ID。
PCIe12-1PCI Command register 控制 PCIe Function 的基本存取能力。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.2, Figure 12, 文件頁 17, PDF 頁 17
PCIe12-2啟用相應記憶體與 bus-master 能力,和啟用 NVMe 的 CC.EN,是不同層的設定,不能互相取代。
PCIe13-1PCI Device Status 回報 PCI 層的狀態資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.3, Figure 13, 文件頁 18, PDF 頁 18
PCIe13-2此處的狀態不是 NVMe CQE 的 SCT/SC;收到傳輸層問題時,要先辨識是哪一套回報。
PCIe14-1Revision ID 表示 PCI 裝置修訂識別。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.4, Figure 14, 文件頁 18, PDF 頁 18
PCIe14-2RID 改變不必然等於 NVMe 規格版本改變;規格版本另看對應 Version 欄位。
PCIe15-1Class Code 以類別、子類別與程式介面識別裝置功能。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.5, Figure 15, 文件頁 18, PDF 頁 18
PCIe15-2此處 CC 是 PCI Class Code,Base 的 CC 是 Controller Configuration;兩個同名縮寫出現在不同空間,用途完全不同。
PCIe16-1Cache Line Size 欄位依 PCIe 綁定規則解釋。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.6, Figure 16, 文件頁 18, PDF 頁 18
PCIe16-2不要把 CLS 當成 SSD 內部快取大小;即使欄位名稱有 Cache,也不提供 NAND 或 DRAM 容量資訊。
PCIe17-1Master Latency Timer 是組態 header 中的既定欄位。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.7, Figure 17, 文件頁 18, PDF 頁 18
PCIe17-2讀到此欄位時依本綁定的規則處理,不以名稱推論它限制每筆 NVMe Read 的完成時間。
PCIe18-1Header Type 說明組態 header 類型及多功能資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.8, Figure 18, 文件頁 19, PDF 頁 19
PCIe18-2發現 multi-function 標記後,枚舉各 Function;不能把同一裝置的所有 Functions 只當成一個 NVMe queue。
PCIe19-1PCI BIST 是 PCI 組態機制中的自我測試欄位。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.9, Figure 19, 文件頁 19, PDF 頁 19
PCIe19-2它與 NVMe Device Self-test 命令不同,不能把 PCI BIST 的完成碼拿去查 NVMe 的 Self-test Result 格式。
PCIe20-1BAR0 包含記憶體映射基底的低部與屬性位元。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.10, Figure 20, 文件頁 19, PDF 頁 19
PCIe20-2取 BA 前先去除屬性 bits,再與 BAR1 組合;直接把 BAR0 原值當完整主機位址會混入型別資訊。
PCIe21-1BAR1 補上 64-bit 記憶體 BAR 的高位元。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.11, Figure 21, 文件頁 19, PDF 頁 19
PCIe21-2基底高部非零時,漏掉 BAR1 會把裝置映射到低 4 GiB 的另一個位置;低部相同不代表同一位址。
PCIe22-1BAR2 的用途依裝置採用的配置解釋。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.12, Figure 22, 文件頁 20, PDF 頁 20
PCIe22-2先確認這是 Index/Data Pair 還是廠商用途,再讀其欄位;不能假設所有 BAR 都指向同一套 NVMe properties。
PCIe23-1CardBus CIS Pointer 是組態 header 中保留的既定位置。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.16, Figure 23, 文件頁 20, PDF 頁 20
PCIe23-2看到 CCPTR 不代表 NVMe 裝置真的提供 CardBus 功能;依此 transport 的適用規則解釋它。
PCIe24-1Subsystem Identifiers 識別產品或 subsystem 的廠商與型號資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.17, Figure 24, 文件頁 20, PDF 頁 20
PCIe24-2同一 VID/DID 的產品可能有不同 SSVID/SSID;兩組 ID 不應只保留其中一組就認為資訊完全等同。
PCIe25-1Expansion ROM 欄位描述選用的 ROM 映射資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.18, Figure 25, 文件頁 20, PDF 頁 20
PCIe25-2裝置是否提供 ROM 與是否有 NVMe Boot Partitions 是不同能力,不能因 EROM 不存在就推論沒有 Boot Partition。
PCIe26-1Capabilities Pointer 指向 PCI capability 串列的入口。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.19, Figure 26, 文件頁 21, PDF 頁 21
PCIe26-2先讀 CP 找第一個 capability,再沿 NEXT 找其他項目;不要把每個能力都假設固定出現在相同 offset。
PCIe27-1Interrupt Information 描述傳統中斷相關組態。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.20, Figure 27, 文件頁 21, PDF 頁 21
PCIe27-2使用 MSI-X 時,通知位址与資料來自相應機制,不能只讀 IPIN/ILINE 就說明所有中斷路由。
PCIe28-1Minimum Grant 是既定 PCI header 欄位,不是 NVMe 佇列保證。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.21, Figure 28, 文件頁 21, PDF 頁 21
PCIe28-2不能把 GNT 值解釋成 SQ 每輪保證取得的命令數;NVMe 仲裁參數在不同機制中定義。
PCIe29-1Maximum Latency 欄位不等於每筆儲存 I/O 的延遲上限。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.22, Figure 29, 文件頁 21, PDF 頁 21
PCIe29-2想比較讀取延遲時,不能拿 MLAT 原值當微秒;先按本欄位在 PCIe 綁定中的規則閱讀。
07.11.PCI Power Management capability 先回報支援哪些 PCI D-states,再透過 PMCS 控制狀態及喚醒事件;NVMe 的 PS0、PS1 則由另一組命令與描述子管理。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| PC.D1S/D2S/PSUP/PMCS.PS | 能力與要求狀態要配合,不能選未支援的狀態。 | PMCS.PS 的 D3 編碼不是 NVMe PS3;兩者的數字碰巧相同不代表同一層。 |
| PMEE/PMES/NSFRST | PME Enable 控制事件通知,PME Status 記錄事件,重設相關欄位補充狀態轉移後的行為。 | 通知被停用不表示事件狀態從來沒有成立;讀值與清除規則分別查表。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.22, Figure 30, 文件頁 21, PDF 頁 21
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.1, Figure 31, 文件頁 21, PDF 頁 21
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.2, Figure 32, 文件頁 22, PDF 頁 22
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.3, Figure 33, 文件頁 22, PDF 頁 22
PCIe30-1Power Management capability 將能力與目前控制狀態分開。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.22, Figure 30, 文件頁 21, PDF 頁 21
PCIe30-2先讀 PC 看支援,再讀 PMCS 看目前設定;能進入某個狀態,和目前已在該狀態,是兩個資訊。
PCIe31-1Power Management 的 capability header 同時提供識別碼與下一項位置。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.1, Figure 31, 文件頁 21, PDF 頁 21
PCIe31-2確認 CID 後沿 NEXT 找下一個 capability,不能把 NEXT 當成某個電源狀態的值。
PCIe32-1Power Management 能力 bits 描述可用電源狀態與相關事件能力。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.2, Figure 32, 文件頁 22, PDF 頁 22
PCIe32-2裝置宣告某狀態支援後,主機才依規則選擇;不能只因 PS 欄位有該編碼就假設裝置支援。
PCIe33-1PMCS 的 PS 與事件 bits 控制、回報 PCI 電源管理。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.3, Figure 33, 文件頁 22, PDF 頁 22
PCIe33-2PCI 電源狀態與 NVMe Power State 是不同層;把 PS 改變後,還要依相應轉換規則理解控制器可用性。
07.12.Capability 說明能做什麼,Control 說明軟體選了什麼,Status 說明目前發生什麼。把三者並排,就能避免用宣告上限代替實際速度或寬度。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| PFS/MPS/MRRS | 支援的 payload 上限、選定 payload 大小及最大 read request 大小影響不同交易。 | MRRS 的 read request 大小不等於每一個返回 completion 都有同樣大小。 |
| FLRC/IFLR/TP | 能力決定能否發動 Function Level Reset,控制位元提出要求,Transaction Pending 補充未完成交易狀態。 | 支援 FLR 與目前已執行過 FLR 是不同結論。 |
| PXLCAP/PXLC/PXLS.NLW/CLS | 鏈路能力、ASPM 等控制及協商出的寬度速度需要一起看。 | 支援 x4 的裝置目前 NLW=x2 時,要以 x2 說明此次連線。 |
| L0SL/L1L/L0SEL/L1EL/ASPMC | 裝置可接受延遲與鏈路退出延遲配合省電狀態控制。 | 較深省電狀態要計入退出時間,不能只比較活動功耗。 |
| PXDS.CED/NFED/FED/URD | 狀態分開記錄可修正、非致命、致命及不支援要求等情況,完整原因可再對照 AER。 | PCIe 錯誤狀態不會直接等同 CQE 的 SC。 |
| PXDCAP2/PXDC2:LTR、OBFF、Completion Timeout | 第 2 組能力與控制延續相同配對:先確認支援,再解讀啟用及數值選擇。 | 有 LTRS 才能依對應條件使用 LTRME;不能看到控制位元就省略能力檢查。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5, Figure 47, 文件頁 26, PDF 頁 26
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.1, Figure 48, 文件頁 26, PDF 頁 26
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.2, Figure 49, 文件頁 26, PDF 頁 26
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.3, Figure 50, 文件頁 26-27, PDF 頁 26-27
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.4, Figure 51, 文件頁 27-28, PDF 頁 27-28
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.5, Figure 52, 文件頁 28, PDF 頁 28
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.6, Figure 53, 文件頁 28-29, PDF 頁 28-29
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.7, Figure 54, 文件頁 29, PDF 頁 29
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.8, Figure 55, 文件頁 29, PDF 頁 29
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.9, Figure 56, 文件頁 30, PDF 頁 30
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.10, Figure 57, 文件頁 30-31, PDF 頁 30-31
PCIe47-1PCI Express capability 將裝置能力、控制與連線資訊分組。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5, Figure 47, 文件頁 26, PDF 頁 26
PCIe47-2先辨識這些欄位屬於 device 還是 link,再把能力值與目前狀態比較,避免把最大能力當實際連線結果。
PCIe48-1PCIe capability header 提供識別與下一項能力位置。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.1, Figure 48, 文件頁 26, PDF 頁 26
PCIe48-2由 capability list 找到此項後,再讀相對位置的 Device Control;不要把 capability 的 CID 當 NVMe 命令 CID。
PCIe49-1PCIe Capabilities 欄位描述 port 類型、版本等能力資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.2, Figure 49, 文件頁 26, PDF 頁 26
PCIe49-2判斷裝置角色時讀 DPT;VER 是這個 capability 的版本,不是 NVMe Base Specification 版本。
PCIe50-1Device Capabilities 描述 Function Level Reset 等硬體能力。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.3, Figure 50, 文件頁 26-27, PDF 頁 26-27
PCIe50-2控制器要採用 FLR 前,先確認 FLRC;不能因 NVMe 支援重設,就假設每一種 PCIe 重設方式都可用。
PCIe51-1Device Control 設定 payload、read request 大小與相關行為。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.4, Figure 51, 文件頁 27-28, PDF 頁 27-28
PCIe51-2MPS 限制 PCIe payload 大小,與 NVMe CC.MPS 的記憶體頁大小不同;兩個 MPS 必須先看所在暫存器。
PCIe52-1Device Status 回報 PCIe 交易相關狀態。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.5, Figure 52, 文件頁 28, PDF 頁 28
PCIe52-2TP 表示交易仍有待處理情況時,不應把它當成 SQ 是否為空的直接判斷;兩個狀態來自不同層。
PCIe53-1Link Capabilities 描述連線能支援的速度、寬度與省電能力。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.6, Figure 53, 文件頁 28-29, PDF 頁 28-29
PCIe53-2支援 x4 不代表目前一定協商為 x4;實際結果到 Link Status 看,不能只讀能力表。
PCIe54-1Link Control 設定連線層的控制選項。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.7, Figure 54, 文件頁 29, PDF 頁 29
PCIe54-2改變 ASPM 相關設定時,影響的是 PCIe link 行為,不等於直接選擇 NVMe 的某個 power state。
PCIe55-1Link Status 回報目前協商的連線速度與寬度。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.8, Figure 55, 文件頁 29, PDF 頁 29
PCIe55-2能力支援 x4,但 NLW 回報 x2 時,報告實際連線應寫 x2,並將能力與現況分開呈現。
PCIe56-1Device Capabilities 2 補充 LTR 等延伸能力。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.9, Figure 56, 文件頁 30, PDF 頁 30
PCIe56-2主機希望使用 LTR 時先看 LTRS,再看控制欄位是否啟用;能力宣告不會自動替主機設定控制 bit。
PCIe57-1Device Control 2 啟用相應延伸行為及 timeout 設定。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.10, Figure 57, 文件頁 30-31, PDF 頁 30-31
PCIe57-2LTRME 與 LTRS 分別是啟用與支援資訊;前者不可脫離後者單獨解釋。
07.13.AER 用相同錯誤類型在多張暫存器表中對齊。Status 記錄發生,Mask 決定通報,Severity 決定不可修正錯誤的分類;Header Log 則保留相關交易的內容。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| AERUCES/AERUCEM/AERUCESEV | 以同一個錯誤位元位置讀 status、mask、severity,不能把三張表當成三種獨立錯誤。 | 例如 Completion Timeout:先查是否發生,再查是否被遮罩,最後查 fatal/non-fatal 分類。 |
| AERCES/AERCEM | 可修正錯誤也把記錄與遮罩分開,清除 status 要遵循 RWC 等存取屬性。 | 遮罩一種錯誤不代表從硬體上消除造成錯誤的條件。 |
| FEP/MHRC/MHRE/ECC/ECE/EGC/EGE | 第一筆錯誤指標、多重 header 記錄,以及 ECRC 檢查/產生的能力和啟用位元補充診斷關係。 | 先有對應 capability,再解讀 enable;不能把 enable=0 當作不支援。 |
| HB0–HB7/TPL prefix | Header Log 與選用 Prefix Log 保存封包相關片段,需按有效性及 log 格式重組。 | 這是 PCIe 交易資訊,不是 NVMe Error Information Log 的一筆紀錄。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.10, Figure 58, 文件頁 31, PDF 頁 31
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.1, Figure 59, 文件頁 31, PDF 頁 31
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.2, Figure 60, 文件頁 31-32, PDF 頁 31-32
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.3, Figure 61, 文件頁 32, PDF 頁 32
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.4, Figure 62, 文件頁 32-33, PDF 頁 32-33
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.5, Figure 63, 文件頁 33, PDF 頁 33
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.6, Figure 64, 文件頁 33, PDF 頁 33
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.7, Figure 65, 文件頁 34, PDF 頁 34
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.8, Figure 66, 文件頁 34, PDF 頁 34
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.9, Figure 67, 文件頁 35, PDF 頁 35
PCIe58-1AER 把錯誤狀態、遮罩、嚴重度與記錄內容分開。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.10, Figure 58, 文件頁 31, PDF 頁 31
PCIe58-2同一錯誤可以已發生但其回報被遮罩;不能只用遮罩值推論裝置從未出錯。
PCIe59-1AER extended capability header 提供 ID、版本及下一項位置。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.1, Figure 59, 文件頁 31, PDF 頁 31
PCIe59-2從 extended capability 串列定位 AER 後,再以 AERCAP 計算各狀態暫存器位置;它與一般 capability list 的基底規則不同。
PCIe60-1Uncorrectable Error Status 記錄不可修正錯誤類型。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.2, Figure 60, 文件頁 31-32, PDF 頁 31-32
PCIe60-2看到某個 status bit 後,連同 severity 與 header log 閱讀,不能只記一個「PCIe error」就省略類型。
PCIe61-1Uncorrectable Error Mask 控制對應錯誤的回報遮罩。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.3, Figure 61, 文件頁 32, PDF 頁 32
PCIe61-2把 mask 設定後不會修好已存在的傳輸問題;它改的是回報處理,不是錯誤原因。
PCIe62-1Uncorrectable Error Severity 區分對應錯誤的嚴重度。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.4, Figure 62, 文件頁 32-33, PDF 頁 32-33
PCIe62-2同一類錯誤是否視為 fatal,要看相應 severity 設定,而不是從 status bit 編號大小猜嚴重程度。
PCIe63-1Correctable Error Status 記錄可修正錯誤事件。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.5, Figure 63, 文件頁 33, PDF 頁 33
PCIe63-2錯誤已被底層修正,仍可能留下記錄;有 status 不代表某筆 NVMe 資料命令一定失敗。
PCIe64-1Correctable Error Mask 控制可修正錯誤的回報。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.6, Figure 64, 文件頁 33, PDF 頁 33
PCIe64-2主機調整回報頻率相關策略時要辨識 mask 語意;遮罩可修正錯誤不表示停止底層修正機制。
PCIe65-1AER Capabilities and Control 描述記錄與檢查功能的能力及設定。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.7, Figure 65, 文件頁 34, PDF 頁 34
PCIe65-2First Error Pointer 用來協助找最先記錄的錯誤;它不是完整事件時間戳,不能直接推算所有錯誤的精確時間差。
PCIe66-1Header Log 保存出錯交易的標頭資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.8, Figure 66, 文件頁 34, PDF 頁 34
PCIe66-2要理解是哪種 PCIe 交易出問題,先按 HB 欄位重組 header;這裡不是 NVMe SQE 的另一份完整副本。
PCIe67-1TLP Prefix Log 補充交易前綴資料。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.9, Figure 67, 文件頁 35, PDF 頁 35
PCIe67-2若相關交易使用 prefix,將這份記錄與 Header Log 合讀;單靠前綴不能重建所有使用者資料內容。
07.14.這份報告把處理當時的 NVMe 控制器設定與狀態記錄下來,並提供佇列狀態的雜湊。先確認格式版本,再將每個快照欄位連回它所代表的 property。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| TNI/TI.VER | TNI 固定為 4E564D65h,VER=1h 辨認此資料結構版本。 | 先確認識別值與版本,再讀後面的位元配置;版本不是 firmware revision。 |
| IOCQESV/IOSQESV/MPSV/CSSV | 保存當時佇列項目大小、記憶體頁大小與命令集選擇欄位的值,需按各原始欄位編碼換算。 | IOSQESV=6 表示項目大小編碼對應 64 bytes,不是 6 bytes。 |
| STV/SHSTV/SHNV/ENV/ACPS | 前四者保存關機與啟用狀態;ACPS 另描述從最近 controller reset 到 CONFIG_LOCKED 之間的 Admin 命令處理狀況。 | ACPS=1 包含未處理 Admin 命令及相應 head/tail 為 0 的條件,不能只讀 ENV 就代替這段歷史。 |
| AQV/ASV/ACV/CV/PMV/PCV | 分別對回 AQA、ASQ、ACQ、CMBMSC、PMRMSC、PMRCTL 的回報值。 | 以報告規定的欄位寬度及版本讀取快照,不將整段 bytes 直接當作一般 MMIO 空間重新映射。 |
| CU/VU/QH | CU、VU 指出產生 Queue Hash 所採用的 Controller State 格式;QH 對依序串接的相關欄位計算 SHA-384。 | 比較兩個 QH 前先確認它們使用的狀態格式及時點;QH 不會直接列出哪筆命令完成。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.10, Figure 69, 文件頁 38-39, PDF 頁 38-39
PCIe69-1DEVICE_INTERFACE_REPORT 結構描述裝置介面的相應回報資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.10, Figure 69, 文件頁 38-39, PDF 頁 38-39
PCIe69-2閱讀介面報告時按欄位區分描述與範圍,不把它當成一般 NVMe namespace 的 Identify buffer。
07.15.從 header 讀出結果布局,再循 lane descriptor 到量測資料。眼圖先看量測尺度和圖例,確認每個位置表示什麼;Printable Eye 與數值結果對應閱讀,不以圖上開口的像素寬度推論未定義的效能。
回到本節的解釋與範例07.16.先送出量測動作,再讀表頭確認結果與總長度,最後依 descriptor 大小逐條讀 Lane。眼圖代表接收端訊號餘裕;有效狀態與量測條件必須和圖一起保存。
| 一起判讀的欄位或標示 | 如何共同決定操作或結果 | 帶入情境後怎麼讀 |
|---|---|---|
| ACT/MQUAL/TC/EOMIP | 動作、品質與目標控制量測;進行中狀態決定結果是否已可使用。 | 發動量測後,先確認完成,再使用本次 lane descriptors;不能把舊結果當成新量測。 |
| Header/descriptor count/descriptor size | 表頭給出解析整份 log 所需的大小與數量;Get Log offset 指向 log 內位置。 | 取得表頭後計算下一段的 offset 與長度,避免把 Printable Eye 區誤認成下一個 descriptor。 |
| LN/MSTAT/MSCS/TOP/BTM/LFT/RGT | Lane number 指定對象,狀態與量測步數影響數值是否可用,四個方向描述開口邊界。 | 比較兩條 lane 前先確認量測成功及相同條件,再比較上下左右的餘裕。 |
| EYE/Printable Eye | 圖形是量測資料的呈現;座標、字元格式與縮放需依來源說明讀取。 | 圖看起來較寬不一定代表不同測試條件下的訊號更好,先核對量測尺度。 |
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.9, Figure 68, 文件頁 37, PDF 頁 37
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9, Figure 70, 文件頁 39, PDF 頁 39
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 71, 文件頁 40, PDF 頁 40
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 72, 文件頁 40-41, PDF 頁 40-41
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 73, 文件頁 41, PDF 頁 41
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 74, 文件頁 41, PDF 頁 41
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 75, 文件頁 42-43, PDF 頁 42-43
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 76, 文件頁 43-45, PDF 頁 43-45
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 77, 文件頁 46, PDF 頁 46
PCIe70-1PCIe 專屬 log 清單提供接收端眼圖量測的入口。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9, Figure 70, 文件頁 39, PDF 頁 39
PCIe70-2先由 LID 確定要讀 EOM log,再看它的參數及資料格式,不能拿 SMART log 的欄位解釋同樣大小的回覆。
PCIe71-1EOM log 大小由 header 與實際描述子內容共同決定。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 71, 文件頁 40, PDF 頁 40
PCIe71-2多一條 lane 或較多量測資料時,回覆長度可能增加;不要永遠用只容納一條 lane 的固定 buffer。
PCIe72-1EOM 的 ACT 與 MQUAL 分別指定量測動作與品質要求。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 72, 文件頁 40-41, PDF 頁 40-41
PCIe72-2要讀既有量測結果與要求開始新量測,是不同 ACT 情境;分段讀取時不要意外重啟量測。
PCIe73-1EOM 的識別參數選擇此次量測相關的目標。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 73, 文件頁 41, PDF 頁 41
PCIe73-2先選定控制器/實體介面相關 ID,再比較回覆;不同目標的眼圖不能只因 lane number 相同就直接合併。
PCIe74-1EOM log 將整體 header 與各 lane 量測分開。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 74, 文件頁 41, PDF 頁 41
PCIe74-2先讀整體資訊確認回覆範圍,再走各 lane descriptor;不能把第一條 lane 的狀態當成全部 lanes 都完成。
PCIe75-1EOM Header 提供解讀整份量測結果所需的基本資訊。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 75, 文件頁 42-43, PDF 頁 42-43
PCIe75-2主機先核對量測狀態與資料長度,再解析後續項目;取得一個有效 header 不等於每條 lane 都有有效結果。
PCIe76-1Lane Descriptor 把 lane 編號、狀態與眼圖邊界放在一起。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 76, 文件頁 43-45, PDF 頁 43-45
PCIe76-2LN=2 的 TOP/BTM/LFT/RGT 應與 lane 2 的量測狀態一起看,不能沿用 lane 1 的成功狀態替它背書。
PCIe77-1眼圖範例協助把數值邊界連回可視的開口形狀。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 77, 文件頁 46, PDF 頁 46
PCIe77-2把 Lane Descriptor 的四個方向對到圖上,觀察哪個方向開口較小;不能把這張接收端量測圖直接當成 SSD IOPS 圖。
PCIe68-1Printable Eye 範例用字元排列呈現接收端眼圖。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.9, Figure 68, 文件頁 37, PDF 頁 37
PCIe68-2先辨識水平與垂直方向,再看開口範圍;字元畫出的寬度是量測呈現,不能直接把字元數當吞吐量。
07.17.shall、may 與 should 的語氣仍由 Base 2.4 定義;Transport 摘要不得自行提高或降低規範強度。
來源:NVME-BASE-2.4, Rev. 2.4, §1.4.1, 文件頁 2-3, PDF 頁 28-29
07.18.PCIe reset 來源包含 Base 定義的 controller/reset 流程與 PCIe 層級 reset。Recovery 設計要以 reset 類型判斷 controller property、queue 與 PCI configuration state。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.3, 文件頁 11-12, PDF 頁 11-12
07.19.power-loss signaling、confidential computing 與 TDISP 把平台事件或隔離狀態映射到 NVMe controller 行為;實作仍需要本次未提供的外部 PCIe/TDISP 規格。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.8-3.8.10, 文件頁 35-39, PDF 頁 35-39
08.01.Properties 提供 controller 設定、狀態與 queue 通知介面;queues 承載命令和完成項目。將控制介面與資料結構分開,才能理解一次提交如何運作。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, 文件頁 9-10, PDF 頁 9-10
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, 文件頁 11, PDF 頁 11
08.02.Doorbell spacing 由 CAP.DSTRD 決定,stride 是 2^(2+DSTRD) bytes。只有 DSTRD=0 時才是 4 bytes;SQ Tail 與 CQ Head 的位置還需搭配 queue ID 計算。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1-3.1.2.2, 文件頁 10-11, PDF 頁 10-11
08.03.Interrupt 是通知,CQE 才包含命令識別與完成狀態。一個通知不必等於一個完成項目;host 應依 queue 的有效項目與進度處理完成。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.5, 文件頁 13-16, PDF 頁 13-16
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4, 文件頁 12-13, PDF 頁 12-13
08.04.前者描述命令處理結果,後者描述傳輸與裝置層的錯誤資訊。兩者可能相關,但解釋的對象不同,不能把某一層的成功當成所有層都沒有問題。
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.7, 文件頁 16, PDF 頁 16
來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1-3.8.7, 文件頁 16-35, PDF 頁 16-35