NVMe · 規格與原理

NVMe over PCIe Transport 1.4:完整傳輸綁定

00.01.NVMe over PCIe Transport 說明 NVMe 的佇列、properties 與通知如何透過 PCIe 運作。本篇把作業系統熟悉的記憶體映射 I/O、DMA 與中斷,接到一筆 NVMe 命令的實際傳遞過程。

NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。

這篇的主軸

01

介面位置

01-01透過 BAR 與 configuration space 找到 NVMe 介面及能力。

BAR
Base Address Register,PCI configuration space 中用來找出裝置 memory space 的 register。
02

命令與通知

02-01區分佇列資料、Doorbell 與 interrupt 的作用。

03

平台行為

03-01理解 reset、電源、錯誤回報與鏈路量測各自的適用範圍。

00.02.Base 規格定義 NVMe 的共同命令與佇列模型;PCIe Transport 補上本機 PCIe 的連接方式。讀取記憶體中的 queue entry,與存取裝置的 MMIO register,是不同種類的存取。

MMIO
Memory-Mapped I/O,以 CPU memory access 形式讀寫裝置 register。

把主軸連起來

00.03.Base 定義的提交與完成機制,在 PCIe 上需要具體的位址、記憶體存取和通知方式。先找到控制器的暫存器空間,再看 SQ/CQ 如何交換命令,最後理解中斷及 PCIe 狀態回報。

CQ
Completion Queue,controller 放入完成結果的完成佇列。
SQ
Submission Queue,主機放入命令的提交佇列。

00.04.Configuration Space、錯誤紀錄與眼圖量測又提供不同層次的資訊:裝置如何呈現、傳輸發生了什麼、接收端量測資料如何排列。它們不等同 NVMe 命令完成狀態。學完應能沿一次交換辨認資料、Doorbell 和中斷的分工。

01 NVMe 如何使用 PCIe

01.01.PCIe Transport 把 NVMe 的共同命令機制落實到 PCIe 連接方式。主機可以透過記憶體映射的暫存器設定控制器及更新 Doorbell,控制器則依傳輸規則存取主機記憶體中的命令與資料。這讓「提交命令」成為實際的記憶體及通知操作。

01.02.命令要做什麼仍由 Base 或對應 Command Set 定義。PCIe 的錯誤狀態、組態能力和中斷格式則屬於另一層資訊。閱讀時要分開辨認操作結果和傳輸環境,才不會把某個 PCIe 狀態直接翻成 NVMe 命令狀態碼。

來源:PCIe Transport 1.4 §1.2 · PCIe Transport 1.4 §1.3 · PCIe Transport 1.4 §2

來源: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。

來源:PCIe Transport 1.4 §1.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.2, 文件頁 6, PDF 頁 6

01.04.本文件沿用 Base 的 conventions;register/property 表格中的 Reset 欄改表示依 PCI 或 PCIe 規格定義之 reset 後欄位值。

來源:PCIe Transport 1.4 §1.3

來源: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。

來源:PCIe Transport 1.4 §2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §2, 文件頁 8, PDF 頁 8

NVMe 如何使用 PCIe
規格層次負責的行為本篇如何使用它
Basecommand 與 completion 的共通語意最高優先序的 NVMe 定義
PCIe Transportaddress、register、doorbell、interrupt 綁定補充 PCIe-specific 要求
PCI-SIG 規格原生 PCIe capability/transaction 語意本報告只引用來源明載的 NVMe-specific 部分
閱讀相關規格圖表 → NVMe 如何使用 PCIe

02 BAR、MMIO 與 Doorbell 位址

把 queue 2 的通知寫到正確位置

由 BAR 取得 NVMe MMIO 基底

02.01.假設 BAR 配置出的 register base 是 A,Doorbell 區從 A+1000h 開始。A 是系統配置的地址,1000h 是規格 offset,不能把兩者當成同一個值。

offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。

由 DSTRD 與 y 選位置

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。

DSTRD
Doorbell Stride,CAP 中決定相鄰 doorbell register 間距的欄位。

寫入索引,而非 command address

02.03.假設新的 SQ Tail 是 3,主機把 3 寫到 A+1020h。SQE 已在 SQ 記憶體,Doorbell 不再攜帶整份命令,也不攜帶 SQE 的地址。

來源:PCIe Transport 1.4 §3.1 · PCIe Transport 1.4 §3.1.2.1-3.1.2.2

來源: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;違反時行為未定義。

controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
來源:PCIe Transport 1.4 §3.1

來源: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 計算。

CAP
Controller Capabilities,offset 00h 的 controller property,回報 queue、page size、timeout 與其他能力。
來源:PCIe Transport 1.4 §3.1.2.1-3.1.2.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1.2.1-3.1.2.2, 文件頁 10-11, PDF 頁 10-11

BAR、MMIO 與 Doorbell 位址
Doorbell 或寫入值位址或內容如何計算主機用它通知什麼
SQ y tail1000h + (2y) × (4 << DSTRD)host 公布新 SQ tail
CQ y head1000h + (2y+1) × (4 << DSTRD)host 公布已消費 CQ head
doorbell valuequeue pointer不含 SQE/CQE 本體
CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
閱讀相關規格圖表 → BAR、MMIO 與 Doorbell 位址

03 Host 與 Controller 的命令交換

03.01.PCIe 上的一次命令交換包含資料結構寫入及位置通知。主機先讓完整 SQE 可被控制器看見,再更新 SQ Tail Doorbell。控制器處理命令及資料後,寫入 CQE;主機讀完結果,再以 CQ Head Doorbell 釋放完成佇列位置。

03.02.SQ slot、命令資料 buffer 和 CQ slot 各有不同使用期間。控制器已取走某個 SQE,不等於它已完成對資料 buffer 的存取;主機讀到 CQE,也要依完成與可見性規則再重用相關資源。把三者分開追蹤,可以理解為什麼只有一個 head 或 tail 值不足以描述全部資源狀態。

來源:PCIe Transport 1.4 §3.4 · PCIe Transport 1.4 §3.2

來源: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

一筆命令如何往返
  1. Host 將命令寫入 SQ(提交佇列)。
  2. Host 更新 SQ Tail Doorbell,通知 Controller 有新命令。
  3. Controller 取出並執行命令,將結果寫入 CQ(完成佇列)。
  4. Host 讀取 CQE,再更新 CQ Head Doorbell,交還已讀取的位置。
命令與結果放在佇列;Doorbell 傳達佇列位置的更新。

把流程對回規格條件

03.03.command flow 是:寫 SQE、更新 SQ tail doorbell、controller 取走與執行、寫 CQE、發出 interrupt(若啟用)、host 處理 CQE、更新 CQ head doorbell。doorbell 只通告 pointer,不攜帶 command 本體。

來源:PCIe Transport 1.4 §3.4

來源: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。

來源:PCIe Transport 1.4 §3.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, 文件頁 11, PDF 頁 11

Host 與 Controller 的命令交換
需要重用的資源何時不再由原操作使用主機應觀察的資訊
SQ slot reusecontroller 已消費該 SQE由完成資訊的 SQHD 協助追蹤
command buffer reusecommand 已 completion 且資料可見依 command/data direction 核對
CQ slot releasehost 已完整消費 CQE之後才寫 CQ head doorbell
閱讀相關規格圖表 → Host 與 Controller 的命令交換

04 Interrupt 模式與通知行為

收到通知後,主機還需要做什麼

中斷向量指出服務入口

04.01.控制器依 CQ 設定使用選定的向量通知主機。多個 CQ 可以有相同或不同通知安排,因此收到向量不一定只對應一筆命令。

到 CQ 查找真正的完成項目

04.02.主機用 Phase 判斷可消費的新項目,再由 SQID、CID 對回原命令。SCT、SC 才提供 NVMe 結果;MSI 或 MSI-X 的訊息資料不是命令 status。

SQID
Submission Queue Identifier,辨識 command 所屬 SQ 的數值。
CID
Command Identifier,與 SQ identifier 合用以辨識 outstanding command。
SCT
Status Code Type;指定完成狀態碼所屬類別,需與 SC 一起解讀。
SC
Status Code;指定所選 SCT 類別中的完成結果。

消費後交還 CQ 空間

04.03.主機完成必要讀取,再更新 CQ Head Doorbell。通知、讀取 CQE 與交還位置是三個時刻,不能只收到中斷便視為 CQ 空間已釋放。

來源:PCIe Transport 1.4 §3.5 · PCIe Transport 1.4 §3.2 · PCIe Transport 1.4 §Annex A

來源: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)延遲。

Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
來源:PCIe Transport 1.4 §3.5

來源: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。

來源:PCIe Transport 1.4 §Annex A

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §Annex A, 文件頁 47-48, PDF 頁 47-48

Interrupt 模式與通知行為
中斷方式通知與遮罩如何安排影響的資源或限制
pin-based傳統共享線路共享與 masking 行為不同
single MSI單一 message/vector多個 CQ 可能共享服務路徑
multiple MSI一組連續 messages受 MME/MMC 等能力限制
MSI-Xtable-based 多 vectors、獨立 mask規格建議優先使用
閱讀相關規格圖表 → Interrupt 模式與通知行為

05 Configuration Space 與 PCIe 錯誤回報

05.01.Configuration Space 描述 PCIe 裝置呈現的能力與設定。它與 NVMe 的命令結構不同:CQE 回報某筆命令的結果,PCIe 狀態描述連接或 Function 的事件。遇到一個錯誤位時,要先確認它來自哪一層,才能找到正確的解釋。

05.02.錯誤紀錄中的狀態、遮罩、嚴重程度與相關交易資訊各有用途。某個狀態位被設起來,不會自動決定是否已通知主機,或對應哪個 NVMe SC。裝置介面回報結構則描述另一種配置資訊,也必須以自己的長度與欄位格式閱讀。

來源:PCIe Transport 1.4 §3.8.1-3.8.7 · PCIe Transport 1.4 §3.7 · PCIe Transport 1.4 §3.6

來源: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 規格為準。

AER
Advanced Error Reporting,PCIe 用來分類、遮罩與記錄 link/transaction error 的 capability。
來源:PCIe Transport 1.4 §3.8.1-3.8.7

來源: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 層級不同。

來源:PCIe Transport 1.4 §3.7

來源: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 未定義。

來源:PCIe Transport 1.4 §3.6

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.6, 文件頁 16, PDF 頁 16

Configuration Space 與 PCIe 錯誤回報
回報層次或能力描述的事件或資源必須連同哪些資訊閱讀
NVMe CQE statuscommand 執行結果由 NVMe command context 解
PCIe Device StatusPCIe Function 狀態摘要位於 PCIe capability
AERcorrectable/uncorrectable transport errorsstatus、mask、severity、header 一起看
power stateslot limit 與 device power 控制不得選超過 slot power limit 的 NVMe state
閱讀相關規格圖表 → Configuration Space 與 PCIe 錯誤回報

06 接收端眼圖量測資料的結構

06.01.接收端眼圖量測用來描述接收端在不同量測條件下取得的結果。這份報告的重點是如何讀懂 NVMe 提供的量測資料結構,而不是用眼圖外觀直接估算 SSD 的 IOPS。Lane 身分、量測設定和資料格式不同時,結果不能直接比較。

IOPS
Input/Output Operations Per Second;每秒 I/O 操作數,與每秒傳輸 bytes 的頻寬不同。

06.02.Header 描述整體長度與布局,lane descriptor 再帶到個別 lane 的結果。Printable Eye 是可供人閱讀的一種呈現方式,不是另一條實體 lane,也不能把字元數當成品質分數。要比較兩條 lanes,先確認量測條件與座標尺度相同。

來源:PCIe Transport 1.4 §3.9 · PCIe Transport 1.4 §Annex A

來源: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 解析。

EOM
Eye Opening Measurement,量測 PCIe receiver eye opening 的程序與 log data。
來源:PCIe Transport 1.4 §3.9

來源: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 讀懂本篇的規格圖表

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

圖表組 01 · NVMe 如何使用 PCIe · 2 張圖表

07.02.層次圖先區分命令語意、NVMe 在 PCIe 上的綁定及 PCIe 原生能力。用一筆命令依次找出 SQE、主機 buffer、Doorbell 和中斷的位置,而不是把三份規格當成依序執行的程式。

回到本節的解釋與範例

從命令的意思走到 PCIe 上的實際傳送

07.03.命令集決定 Read 要做什麼,Base 定義 SQE、CQE 等共同結構;PCIe Transport 再把佇列、MMIO 與中斷接起來。讀分層圖時,沿一筆命令穿過各層,便能看出每層負責的工作。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
SQE/DMA/CQE主機先在可供控制器存取的記憶體放好命令,控制器取走命令並搬運資料,最後寫回完成項目。Read 的資料進入 DPTR 指向的 buffer;CQE 則回到 CQ,兩者不是同一份資料。
Controller Properties/PCI Configuration SpacePCI 組態空間負責辨識與配置裝置,BAR 指向 NVMe 暫存器所在的 MMIO 空間。先從組態空間取得 BAR,再以該基底加上 NVMe property offset 找到暫存器。
DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
來源:PCIe Transport 1.4 §1.2 · PCIe Transport 1.4 §2 · PCIe Transport 1.4 §3.1 · PCIe Transport 1.4 §3.4.1

來源: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

PCIe Figure 1 · NVMe Family of Specifications

一句話重點

PCIe1-1PCIe Transport 補充 NVMe 共通機制在 PCIe 上的存取方式。

來源:PCIe Transport 1.4 §1.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §1.2, Figure 1, 文件頁 6, PDF 頁 6

用例子讀懂

PCIe1-2解釋 CC、CSTS 的狀態含義時看 Base;說明主機如何透過 PCIe 映射位置存取它們時看 Transport。

CSTS
Controller Status,controller 回報 ready、fatal status 與 shutdown 狀態的 property。
CC
Controller Configuration,host 用來選擇設定並啟用或停用 controller 的 property。

PCIe Figure 2 · Example of Transport Protocol Layers

一句話重點

PCIe2-1傳輸層次圖把 NVMe 操作與承載它的 PCIe 機制分開。

來源:PCIe Transport 1.4 §2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §2, Figure 2, 文件頁 8, PDF 頁 8

用例子讀懂

PCIe2-2同一個 NVMe Read 可能涉及多次 PCIe 交易;不能把一個 TLP 直接當成一筆完整 NVMe 命令。

TLP
Transaction Layer Packet,PCIe transaction layer 傳送的 packet。
圖表組 02 · BAR、MMIO 與 Doorbell 位址 · 4 張圖表

07.04.位址表把 BAR 基底、1000h 起點、queue ID 和 stride 分開計算。先找對暫存器,再解讀寫入的 head/tail 值,避免混淆暫存器位址與暫存器內容。

回到本節的解釋與範例

PCIe Figure 3 · PCI Express Registers

一句話重點

PCIe3-1PCIe 暫存器總覽把組態資訊、中斷能力與錯誤回報放在不同區域。

來源:PCIe Transport 1.4 §3.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.1, Figure 3, 文件頁 9, PDF 頁 9

用例子讀懂

PCIe3-2初始化時先找 BAR 與 capability list;讀 NVMe controller property 則走映射後的記憶體空間,兩者不是同一套 offset。

PCIe Figure 4 · PCI Express Specific Controller Property Definitions

一句話重點

PCIe4-1Doorbell 依 queue 編號與 DSTRD 交錯排列。

來源:PCIe Transport 1.4 §3.1

來源: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 位置。

由佇列編號算出 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/CQHSQT 通告已提交到哪裡;CQH 通告主機已消費到哪裡。寫入 Doorbell 的 3 是佇列索引 3,不是要控制器移動 3 bytes,也不是命令完成碼。
來源:PCIe Transport 1.4 §3.1.2.1

來源: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

PCIe Figure 5 · Offset (1000h + ((2y) * (4 << CAP.DSTRD))): SQyTDBL - Submission Queue y Tail

一句話重點

PCIe5-1SQ Tail Doorbell 通知控制器主機已提交到哪個位置。

來源:PCIe Transport 1.4 §3.1.2.1

來源: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 位址。

index
index;用來選取清單中的項目或格式。它回答「選哪一項」,不是「離起點多遠」。

PCIe Figure 6 · Offset (1000h + ((2y + 1) * (4 << CAP.DSTRD))): CQyHDBL - Completion Queue y Head

一句話重點

PCIe6-1CQ Head Doorbell 通知控制器哪些完成項目已被主機消耗。

來源:PCIe Transport 1.4 §3.1.2.1

來源: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,讓相應位置可再次使用。

圖表組 03 · Host 與 Controller 的命令交換 · 2 張圖表

07.06.交換流程分三條線看:SQE 的發布與取得、data buffer 的使用、CQE 的寫入與釋放。SQHD 協助追蹤 SQ 消費位置,SQID/CID 辨認完成命令,CQ Head 則釋放完成位置。

回到本節的解釋與範例

從 CQ 找到中斷向量與訊息

07.07.先選中斷機制,再由 Create I/O CQ 的 IV 連到向量。MSI 的訊息設定位於 capability;MSI-X 用表格保存各向量的位址、資料及遮罩。向量是通知路徑,CQE 才保存命令結果。

IV
Interrupt Vector,Completion Queue 指定的 interrupt vector 編號。
一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
IV/MME/MMCMSI 的 MMC 回報能力、MME 選已啟用向量數;IV 不能超出實際可用範圍。裝置能支援多個向量,不表示驅動程式已啟用全部向量。
MA/MUA/MD/C64MA 與必要的 MUA 組合訊息目的位址,MD 是寫往該位址的資料;C64 決定位址結構。控制器以訊息寫入觸發中斷,主機再讀 CQ;不能把 MD 當成 NVMe status。
PVM/MMASK/MPEND能力決定是否有逐向量遮罩;MASK 控制通知,PEND 表示被遮罩期間待處理的通知。解除遮罩前仍需按照所用機制處理 pending,不能假設遮罩會清除 CQE。
MXE/FM/TSMSI-X enable、整體遮罩與表格大小共同決定哪些向量可使用;TS 是從 0 起算的大小編碼。TS=3 對應 4 個 table entries;其中某筆仍可能被單獨遮罩。
TBIR/TO/PBIR/PBAOBIR 選 BAR,offset 選該 BAR 空間中的 Table 或 Pending Bit Array。若 Table 與 PBA 選不同 BAR,必須分別加到各自基底,不能沿用同一個地址。
IPIN/ILINE/NEXT/CID傳統中斷資訊與 capability 串列提供不同機制的入口;NEXT 串起 capability,CID 辨識類型。先沿 capability 串列確認 MSI-X 是否存在,再讀它的 MXC;不要依固定絕對 offset 猜位置。
PBAO
Page Base Address and Offset,第一個 PRP entry 中同時包含 page base 與 page 內 offset 的配置。
BIR
BAR Indicator Register,指出某個記憶體結構位於哪一個 PCIe BAR。
PBA
Pending Bit Array,MSI-X 中記錄尚待處理 vector 的 bit array。
來源:PCIe Transport 1.4 §3.2 · PCIe Transport 1.4 §3.5.1 · PCIe Transport 1.4 §3.8.1.20 · PCIe Transport 1.4 §3.8.2.3 · PCIe Transport 1.4 §3.8.3.1 · PCIe Transport 1.4 §3.8.3.2 · PCIe Transport 1.4 §3.8.3.3 · PCIe Transport 1.4 §3.8.3.4 · PCIe Transport 1.4 §3.8.3.5 · PCIe Transport 1.4 §3.8.3.6 · PCIe Transport 1.4 §3.8.3.7 · PCIe Transport 1.4 §3.8.4.1 · PCIe Transport 1.4 §3.8.4.2 · PCIe Transport 1.4 §3.8.4.3 · PCIe Transport 1.4 §3.8.4.4

來源: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

PCIe Figure 7 · Create I/O Completion Queue - Command Dword 11

一句話重點

PCIe7-1建立 CQ 時選擇其中斷向量,還要符合目前中斷模式能力。

來源:PCIe Transport 1.4 §3.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.2, Figure 7, 文件頁 11, PDF 頁 11

用例子讀懂

PCIe7-2IV=3 指向量 3;若目前只啟用不足的向量數,不能只因欄位放得下 3 就認定有效。

PCIe Figure 8 · Command Processing

一句話重點

PCIe8-1命令處理圖分開 SQ 取命令、資料交換與 CQ 回報結果。

來源:PCIe Transport 1.4 §3.4.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4.1, Figure 8, 文件頁 13, PDF 頁 13

用例子讀懂

PCIe8-2追一次 Write:主機提交 SQE、控制器取得資料並處理、最後寫 CQE;doorbell 更新只代表提交位置改變。

圖表組 04 · Interrupt 模式與通知行為 · 14 張圖表

07.08.先把 CQ 連到使用的 vector,再讀該中斷方式的 enable、mask 與 table。收到共用向量時沿所有相關連線查 CQ;合併門檻改變的是通知時機,不是 CQE 的狀態意義。

回到本節的解釋與範例

PCIe Figure 9 · Pin Based, Single MSI, and Multiple MSI Behavior

一句話重點

PCIe9-1Pin、MSI 與多 MSI 模式的通知行為需要分別理解。

來源:PCIe Transport 1.4 §3.5.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.5.1, Figure 9, 文件頁 15, PDF 頁 15

用例子讀懂

PCIe9-2多個 CQ 共用一個通知來源時,主機可能需要檢查多個 CQ;中斷本身不攜帶每一筆 NVMe 完成結果。

PCIe Figure 34 · Message Signaled Interrupt Capability (Optional)

一句話重點

PCIe34-1MSI capability 把向量控制、通知位址與資料組在一起。

來源:PCIe Transport 1.4 §3.8.2.3

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.3, Figure 34, 文件頁 22, PDF 頁 22

用例子讀懂

PCIe34-2主機配置一組 MSI,既要決定啟用數量,也要提供訊息目的位址與資料;只設 enable 不足以描述完整通知。

PCIe Figure 35 · Offset MSICAP: MID - Message Signaled Interrupt Identifiers

一句話重點

PCIe35-1MSI 識別 header 讓主機在 capability list 中找到 MSI。

來源:PCIe Transport 1.4 §3.8.3.1

來源: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 開始。

MSICAP
MSI Capability,MSI capability 結構的基底位置。

PCIe Figure 36 · Offset MSICAP + 2h: MC - Message Signaled Interrupt Message Control

一句話重點

PCIe36-1MSI Message Control 區分支援的訊息數與實際啟用數。

來源:PCIe Transport 1.4 §3.8.3.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.2, Figure 36, 文件頁 23, PDF 頁 23

用例子讀懂

PCIe36-2裝置最多支援 8 個向量,主機仍可只啟用較少數量;讀 MMC 與 MME 時不要混為一個數字。

PCIe Figure 37 · Offset MSICAP + 4h: MA - Message Signaled Interrupt Message Address

一句話重點

PCIe37-1MSI Message Address 指定中斷訊息寫到的目的位址。

來源:PCIe Transport 1.4 §3.8.3.3

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.3, Figure 37, 文件頁 23, PDF 頁 23

用例子讀懂

PCIe37-2它不是 CQ buffer 位址;CQ 保存完成內容,MSI 位址用於送出通知,兩條資料流分開。

PCIe Figure 38 · Offset MSICAP + 8h: MUA - Message Signaled Interrupt Upper Address

一句話重點

PCIe38-164-bit MSI 位址需要 Upper Address 補齊高部。

來源:PCIe Transport 1.4 §3.8.3.4

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.4, Figure 38, 文件頁 23, PDF 頁 23

用例子讀懂

PCIe38-2啟用 64-bit 位址格式時,把 MA 與 MUA 合併後才是完整目的位置;不能在所有格式都假設 MUA 有效。

PCIe Figure 39 · Offset MSICAP + Ch: MD - Message Signaled Interrupt Message Data

一句話重點

PCIe39-1MSI Message Data 是中斷訊息攜帶的資料值。

來源:PCIe Transport 1.4 §3.8.3.5

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.5, Figure 39, 文件頁 23, PDF 頁 23

用例子讀懂

PCIe39-2DATA 與 Message Address 一起描述通知;它不是 NVMe CQE 的 CID,不能直接用來配對完成命令。

PCIe Figure 40 · Offset MSICAP + 10h: MMASK - Message Signaled Interrupt Mask Bits (Optional)

一句話重點

PCIe40-1MSI Mask Bits 可以遮罩相應訊息。

來源:PCIe Transport 1.4 §3.8.3.6

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.6, Figure 40, 文件頁 24, PDF 頁 24

用例子讀懂

PCIe40-2遮罩某個向量後,裝置仍可能產生待處理狀態;遮罩通知不等於讓 CQ 裡的完成項目消失。

PCIe Figure 41 · Offset MSICAP + 14h: MPEND - Message Signaled Interrupt Pending Bits (Optional)

一句話重點

PCIe41-1MSI Pending Bits 記錄相應的待處理訊息狀態。

來源:PCIe Transport 1.4 §3.8.3.7

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.7, Figure 41, 文件頁 24, PDF 頁 24

用例子讀懂

PCIe41-2向量被遮罩期間有事件,pending 可反映待處理情況;主機仍需到 CQ 取得實際命令結果。

PCIe Figure 42 · MSI-X Capability (Optional)

一句話重點

PCIe42-1MSI-X 把向量表與 pending bitmap 放到指定記憶體區域。

來源:PCIe Transport 1.4 §3.8.3.7

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.3.7, Figure 42, 文件頁 24, PDF 頁 24

用例子讀懂

PCIe42-2先定位 Table 與 PBA,才能理解每個向量的設定及待處理狀態;兩者不一定位於同一個 BAR 區段。

PCIe Figure 43 · Offset MSIXCAP: MXID - MSI-X Identifiers

一句話重點

PCIe43-1MSI-X capability header 用於識別與串接能力清單。

來源:PCIe Transport 1.4 §3.8.4.1

來源: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 的基底。

MSIXCAP
MSI-X Capability,MSI-X capability 結構的基底位置。

PCIe Figure 44 · Offset MSIXCAP + 2h: MXC - MSI-X Message Control

一句話重點

PCIe44-1MSI-X 控制欄位區分啟用、整體遮罩與表格大小。

來源:PCIe Transport 1.4 §3.8.4.2

來源: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 控制整體通知,不等於刪除向量表內容。

PCIe Figure 45 · Offset MSIXCAP + 4h: MTAB - MSI-X Table Offset / Table BIR

一句話重點

PCIe45-1MSI-X Table 的 BIR 選 BAR,offset 選 BAR 內位置。

來源:PCIe Transport 1.4 §3.8.4.3

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.3, Figure 45, 文件頁 25, PDF 頁 25

用例子讀懂

PCIe45-2TBIR 指 BAR2、TO 指該 BAR 內的表格起點;不能把 TO 單獨當成主機實體位址。

PCIe Figure 46 · Offset MSIXCAP + 8h: MPBA - MSI-X PBA Offset / PBA BIR

一句話重點

PCIe46-1PBA 有自己的 BAR 選擇與 offset。

來源:PCIe Transport 1.4 §3.8.4.4

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.4.4, Figure 46, 文件頁 25, PDF 頁 25

用例子讀懂

PCIe46-2Table 在 BAR0、PBA 在 BAR2 的配置需要分別定位;不能從 Table 地址加固定距離猜 PBA 在哪裡。

圖表組 05 · Configuration Space 與 PCIe 錯誤回報 · 46 張圖表

07.09.先辨認 PCIe capability 的種類,再將 status、mask、severity 和 header log 配對。TDISP 的 DEVICE_INTERFACE_REPORT 依其欄位布局閱讀,不能套用錯誤 log 或 NVMe CQE 的解讀方式。

TDISP
TEE Device Interface Security Protocol,平台隔離與裝置介面狀態相關的 PCIe 安全協定。
回到本節的解釋與範例

先辨識裝置,再配置可存取的資源

07.10.組態空間圖是一張地圖:識別欄位讓軟體選擇驅動程式,BAR 描述 MMIO 資源,Command 控制存取方式,Status 記錄裝置狀況。舊式 PCI 相容欄位仍在版面中,但不代表 NVMe 要用它們處理 I/O。

一起判讀的欄位或標示如何共同決定操作或結果帶入情境後怎麼讀
VID/DID/RID/SSVID/SSID廠商、裝置、revision 與 subsystem 識別分別描述不同層次。同樣的 DID 可以出現在不同板卡配置;不能只由它推論 firmware 版本。
BCC/SCC/PI/HTYPEClass Code 辨識裝置類別及介面,Header Type 決定後續組態版面。這裡的 PI 是 Programming Interface,不是資料保護資訊 Protection Information。
CMD/STSCommand 中的存取控制與 bus mastering 等位元決定裝置可以採取的動作;Status 記錄條件及錯誤。改變控制位元與清除可寫 1 清除的狀態位元是不同操作,不能對整個區塊任意回寫讀值。
MLBAR/MUBAR/BA/TP/PF/RTE64-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 延伸自我測試。
Protection Information
資料保護資訊,縮寫 PI;包含 Guard 與 tags,用來檢查資料及其關聯資訊。
SSVID
Subsystem Vendor ID,辨識 subsystem vendor 的 PCI identifier。
DID
Domain Identifier,辨識 NVM subsystem 內 domain 的 identifier。
VID
Vendor ID,由 PCI-SIG 配置、辨識 vendor 的 identifier。
PF
Physical Function,具有完整 PCIe 設定能力、可管理相關 VF 的實體功能。
PI
Protection Information;用 Guard 與 tags 檢查資料及其關聯資訊的保護欄位。
來源:PCIe Transport 1.4 §3.8 · PCIe Transport 1.4 §3.8.1.1 · PCIe Transport 1.4 §3.8.1.2 · PCIe Transport 1.4 §3.8.1.3 · PCIe Transport 1.4 §3.8.1.4 · PCIe Transport 1.4 §3.8.1.5 · PCIe Transport 1.4 §3.8.1.6 · PCIe Transport 1.4 §3.8.1.7 · PCIe Transport 1.4 §3.8.1.8 · PCIe Transport 1.4 §3.8.1.9 · PCIe Transport 1.4 §3.8.1.10 · PCIe Transport 1.4 §3.8.1.11 · PCIe Transport 1.4 §3.8.1.12 · PCIe Transport 1.4 §3.8.1.16 · PCIe Transport 1.4 §3.8.1.17 · PCIe Transport 1.4 §3.8.1.18 · PCIe Transport 1.4 §3.8.1.19 · PCIe Transport 1.4 §3.8.1.21 · PCIe Transport 1.4 §3.8.1.22

來源: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

PCIe Figure 10 · PCI Express Type 0/1 Common Configuration Space

一句話重點

PCIe10-1PCIe configuration header 是尋找識別碼、BAR 與 capabilities 的入口。

來源:PCIe Transport 1.4 §3.8

來源: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,是兩個不同位址空間的操作。

PCIe Figure 11 · Offset 00h: ID - Identifiers

一句話重點

PCIe11-1VID 與 DID 識別 PCIe 廠商與裝置類型。

來源:PCIe Transport 1.4 §3.8.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.1, Figure 11, 文件頁 17, PDF 頁 17

用例子讀懂

PCIe11-2同一 DID 的兩張卡仍可有不同 serial number;這裡不是替每個 namespace 分配唯一 ID。

namespace
namespace,主機透過 controller 存取的一份已格式化非揮發性容量。

PCIe Figure 12 · Offset 04h: CMD - Command

一句話重點

PCIe12-1PCI Command register 控制 PCIe Function 的基本存取能力。

來源:PCIe Transport 1.4 §3.8.1.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.2, Figure 12, 文件頁 17, PDF 頁 17

用例子讀懂

PCIe12-2啟用相應記憶體與 bus-master 能力,和啟用 NVMe 的 CC.EN,是不同層的設定,不能互相取代。

EN
Enable,CC 中控制 controller enable state 的 bit。

PCIe Figure 13 · Offset 06h: STS - Device Status

一句話重點

PCIe13-1PCI Device Status 回報 PCI 層的狀態資訊。

來源:PCIe Transport 1.4 §3.8.1.3

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.3, Figure 13, 文件頁 18, PDF 頁 18

用例子讀懂

PCIe13-2此處的狀態不是 NVMe CQE 的 SCT/SC;收到傳輸層問題時,要先辨識是哪一套回報。

PCIe Figure 14 · Offset 08h: RID - Revision ID

一句話重點

PCIe14-1Revision ID 表示 PCI 裝置修訂識別。

來源:PCIe Transport 1.4 §3.8.1.4

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.4, Figure 14, 文件頁 18, PDF 頁 18

用例子讀懂

PCIe14-2RID 改變不必然等於 NVMe 規格版本改變;規格版本另看對應 Version 欄位。

PCIe Figure 15 · Offset 09h: CC - Class Code

一句話重點

PCIe15-1Class Code 以類別、子類別與程式介面識別裝置功能。

來源:PCIe Transport 1.4 §3.8.1.5

來源: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;兩個同名縮寫出現在不同空間,用途完全不同。

PCIe Figure 16 · Offset 0Ch: CLS - Cache Line Size

一句話重點

PCIe16-1Cache Line Size 欄位依 PCIe 綁定規則解釋。

來源:PCIe Transport 1.4 §3.8.1.6

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.6, Figure 16, 文件頁 18, PDF 頁 18

用例子讀懂

PCIe16-2不要把 CLS 當成 SSD 內部快取大小;即使欄位名稱有 Cache,也不提供 NAND 或 DRAM 容量資訊。

PCIe Figure 17 · Offset 0Dh: MLT - Master Latency Timer

一句話重點

PCIe17-1Master Latency Timer 是組態 header 中的既定欄位。

來源:PCIe Transport 1.4 §3.8.1.7

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.7, Figure 17, 文件頁 18, PDF 頁 18

用例子讀懂

PCIe17-2讀到此欄位時依本綁定的規則處理,不以名稱推論它限制每筆 NVMe Read 的完成時間。

PCIe Figure 18 · Offset 0Eh: HTYPE - Header Type

一句話重點

PCIe18-1Header Type 說明組態 header 類型及多功能資訊。

來源:PCIe Transport 1.4 §3.8.1.8

來源: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。

PCIe Figure 19 · Offset 0Fh: BIST - Built-In Self Test (Optional)

一句話重點

PCIe19-1PCI BIST 是 PCI 組態機制中的自我測試欄位。

來源:PCIe Transport 1.4 §3.8.1.9

來源: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 格式。

PCIe Figure 20 · Offset 10h: MLBAR (BAR0) - Memory Register Base Address, lower 32-bits

一句話重點

PCIe20-1BAR0 包含記憶體映射基底的低部與屬性位元。

來源:PCIe Transport 1.4 §3.8.1.10

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.10, Figure 20, 文件頁 19, PDF 頁 19

用例子讀懂

PCIe20-2取 BA 前先去除屬性 bits,再與 BAR1 組合;直接把 BAR0 原值當完整主機位址會混入型別資訊。

PCIe Figure 21 · Offset 14h: MUBAR (BAR1) - Memory Register Base Address, upper 32-bits

一句話重點

PCIe21-1BAR1 補上 64-bit 記憶體 BAR 的高位元。

來源:PCIe Transport 1.4 §3.8.1.11

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.11, Figure 21, 文件頁 19, PDF 頁 19

用例子讀懂

PCIe21-2基底高部非零時,漏掉 BAR1 會把裝置映射到低 4 GiB 的另一個位置;低部相同不代表同一位址。

PCIe Figure 22 · Offset 18h: BAR2 - Index/Data Pair Register Base Address or Vendor Specific

一句話重點

PCIe22-1BAR2 的用途依裝置採用的配置解釋。

來源:PCIe Transport 1.4 §3.8.1.12

來源: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。

PCIe Figure 23 · Offset 28h: CCPTR - CardBus CIS Pointer

一句話重點

PCIe23-1CardBus CIS Pointer 是組態 header 中保留的既定位置。

來源:PCIe Transport 1.4 §3.8.1.16

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.16, Figure 23, 文件頁 20, PDF 頁 20

用例子讀懂

PCIe23-2看到 CCPTR 不代表 NVMe 裝置真的提供 CardBus 功能;依此 transport 的適用規則解釋它。

PCIe Figure 24 · Offset 2Ch: SS - Subsystem Identifiers

一句話重點

PCIe24-1Subsystem Identifiers 識別產品或 subsystem 的廠商與型號資訊。

來源:PCIe Transport 1.4 §3.8.1.17

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.17, Figure 24, 文件頁 20, PDF 頁 20

用例子讀懂

PCIe24-2同一 VID/DID 的產品可能有不同 SSVID/SSID;兩組 ID 不應只保留其中一組就認為資訊完全等同。

PCIe Figure 25 · Offset 30h: EROM - Expansion ROM (Optional)

一句話重點

PCIe25-1Expansion ROM 欄位描述選用的 ROM 映射資訊。

來源:PCIe Transport 1.4 §3.8.1.18

來源: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。

PCIe Figure 26 · Offset 34h: CAP - Capabilities Pointer

一句話重點

PCIe26-1Capabilities Pointer 指向 PCI capability 串列的入口。

來源:PCIe Transport 1.4 §3.8.1.19

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.19, Figure 26, 文件頁 21, PDF 頁 21

用例子讀懂

PCIe26-2先讀 CP 找第一個 capability,再沿 NEXT 找其他項目;不要把每個能力都假設固定出現在相同 offset。

PCIe Figure 27 · Offset 3Ch: INTR - Interrupt Information

一句話重點

PCIe27-1Interrupt Information 描述傳統中斷相關組態。

來源:PCIe Transport 1.4 §3.8.1.20

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.20, Figure 27, 文件頁 21, PDF 頁 21

用例子讀懂

PCIe27-2使用 MSI-X 時,通知位址与資料來自相應機制,不能只讀 IPIN/ILINE 就說明所有中斷路由。

PCIe Figure 28 · Offset 3Eh: MGNT - Minimum Grant

一句話重點

PCIe28-1Minimum Grant 是既定 PCI header 欄位,不是 NVMe 佇列保證。

來源:PCIe Transport 1.4 §3.8.1.21

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.21, Figure 28, 文件頁 21, PDF 頁 21

用例子讀懂

PCIe28-2不能把 GNT 值解釋成 SQ 每輪保證取得的命令數;NVMe 仲裁參數在不同機制中定義。

PCIe Figure 29 · Offset 3Fh: MLAT - Maximum Latency

一句話重點

PCIe29-1Maximum Latency 欄位不等於每筆儲存 I/O 的延遲上限。

來源:PCIe Transport 1.4 §3.8.1.22

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.22, Figure 29, 文件頁 21, PDF 頁 21

用例子讀懂

PCIe29-2想比較讀取延遲時,不能拿 MLAT 原值當微秒;先按本欄位在 PCIe 綁定中的規則閱讀。

PCI 電源狀態與 NVMe Power State 分開讀

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/NSFRSTPME Enable 控制事件通知,PME Status 記錄事件,重設相關欄位補充狀態轉移後的行為。通知被停用不表示事件狀態從來沒有成立;讀值與清除規則分別查表。
PS
Power State,controller 的功耗/效能 operating point;PS0 是最高 maximum-power state。
來源:PCIe Transport 1.4 §3.8.1.22 · PCIe Transport 1.4 §3.8.2.1 · PCIe Transport 1.4 §3.8.2.2 · PCIe Transport 1.4 §3.8.2.3

來源: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

PCIe Figure 30 · PCI Power Management Capabilities

一句話重點

PCIe30-1Power Management capability 將能力與目前控制狀態分開。

來源:PCIe Transport 1.4 §3.8.1.22

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.1.22, Figure 30, 文件頁 21, PDF 頁 21

用例子讀懂

PCIe30-2先讀 PC 看支援,再讀 PMCS 看目前設定;能進入某個狀態,和目前已在該狀態,是兩個資訊。

PCIe Figure 31 · Offset PMCAP: PID - PCI Power Management Capability ID

一句話重點

PCIe31-1Power Management 的 capability header 同時提供識別碼與下一項位置。

來源:PCIe Transport 1.4 §3.8.2.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.1, Figure 31, 文件頁 21, PDF 頁 21

用例子讀懂

PCIe31-2確認 CID 後沿 NEXT 找下一個 capability,不能把 NEXT 當成某個電源狀態的值。

PCIe Figure 32 · Offset PMCAP + 2h: PC - PCI Power Management Capabilities

一句話重點

PCIe32-1Power Management 能力 bits 描述可用電源狀態與相關事件能力。

來源:PCIe Transport 1.4 §3.8.2.2

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.2, Figure 32, 文件頁 22, PDF 頁 22

用例子讀懂

PCIe32-2裝置宣告某狀態支援後,主機才依規則選擇;不能只因 PS 欄位有該編碼就假設裝置支援。

PCIe Figure 33 · Offset PMCAP + 4h: PMCS - PCI Power Management Control and Status

一句話重點

PCIe33-1PMCS 的 PS 與事件 bits 控制、回報 PCI 電源管理。

來源:PCIe Transport 1.4 §3.8.2.3

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.2.3, Figure 33, 文件頁 22, PDF 頁 22

用例子讀懂

PCIe33-2PCI 電源狀態與 NVMe Power State 是不同層;把 PS 改變後,還要依相應轉換規則理解控制器可用性。

PCIe Figure 47 · PCI Express Capability

一句話重點

PCIe47-1PCI Express capability 將裝置能力、控制與連線資訊分組。

來源:PCIe Transport 1.4 §3.8.5

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5, Figure 47, 文件頁 26, PDF 頁 26

用例子讀懂

PCIe47-2先辨識這些欄位屬於 device 還是 link,再把能力值與目前狀態比較,避免把最大能力當實際連線結果。

PCIe Figure 48 · Offset PXCAP: PXID - PCI Express Capability ID

一句話重點

PCIe48-1PCIe capability header 提供識別與下一項能力位置。

來源:PCIe Transport 1.4 §3.8.5.1

來源: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。

PCIe Figure 49 · Offset PXCAP + 2h: PXCAP - PCI Express Capabilities

一句話重點

PCIe49-1PCIe Capabilities 欄位描述 port 類型、版本等能力資訊。

來源:PCIe Transport 1.4 §3.8.5.2

來源: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 版本。

PCIe Figure 50 · Offset PXCAP + 4h: PXDCAP - PCI Express Device Capabilities

一句話重點

PCIe50-1Device Capabilities 描述 Function Level Reset 等硬體能力。

來源:PCIe Transport 1.4 §3.8.5.3

來源: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 重設方式都可用。

PCIe Figure 51 · Offset PXCAP + 8h: PXDC - PCI Express Device Control

一句話重點

PCIe51-1Device Control 設定 payload、read request 大小與相關行為。

來源:PCIe Transport 1.4 §3.8.5.4

來源: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 必須先看所在暫存器。

PCIe Figure 52 · Offset PXCAP + Ah: PXDS - PCI Express Device Status

一句話重點

PCIe52-1Device Status 回報 PCIe 交易相關狀態。

來源:PCIe Transport 1.4 §3.8.5.5

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.5, Figure 52, 文件頁 28, PDF 頁 28

用例子讀懂

PCIe52-2TP 表示交易仍有待處理情況時,不應把它當成 SQ 是否為空的直接判斷;兩個狀態來自不同層。

PCIe Figure 53 · Offset PXCAP + Ch: PXLCAP - PCI Express Link Capabilities

一句話重點

PCIe53-1Link Capabilities 描述連線能支援的速度、寬度與省電能力。

來源:PCIe Transport 1.4 §3.8.5.6

來源: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 看,不能只讀能力表。

PCIe Figure 54 · Offset PXCAP + 10h: PXLC - PCI Express Link Control

一句話重點

PCIe54-1Link Control 設定連線層的控制選項。

來源:PCIe Transport 1.4 §3.8.5.7

來源: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。

PCIe Figure 55 · Offset PXCAP + 12h: PXLS - PCI Express Link Status

一句話重點

PCIe55-1Link Status 回報目前協商的連線速度與寬度。

來源:PCIe Transport 1.4 §3.8.5.8

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.8, Figure 55, 文件頁 29, PDF 頁 29

用例子讀懂

PCIe55-2能力支援 x4,但 NLW 回報 x2 時,報告實際連線應寫 x2,並將能力與現況分開呈現。

PCIe Figure 56 · Offset PXCAP + 24h: PXDCAP2 - PCI Express Device Capabilities 2

一句話重點

PCIe56-1Device Capabilities 2 補充 LTR 等延伸能力。

來源:PCIe Transport 1.4 §3.8.5.9

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.9, Figure 56, 文件頁 30, PDF 頁 30

用例子讀懂

PCIe56-2主機希望使用 LTR 時先看 LTRS,再看控制欄位是否啟用;能力宣告不會自動替主機設定控制 bit。

PCIe Figure 57 · Offset PXCAP + 28h: PXDC2 - PCI Express Device Control 2

一句話重點

PCIe57-1Device Control 2 啟用相應延伸行為及 timeout 設定。

來源:PCIe Transport 1.4 §3.8.5.10

來源: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 prefixHeader Log 與選用 Prefix Log 保存封包相關片段,需按有效性及 log 格式重組。這是 PCIe 交易資訊,不是 NVMe Error Information Log 的一筆紀錄。
來源:PCIe Transport 1.4 §3.8.5.10 · PCIe Transport 1.4 §3.8.6.1 · PCIe Transport 1.4 §3.8.6.2 · PCIe Transport 1.4 §3.8.6.3 · PCIe Transport 1.4 §3.8.6.4 · PCIe Transport 1.4 §3.8.6.5 · PCIe Transport 1.4 §3.8.6.6 · PCIe Transport 1.4 §3.8.6.7 · PCIe Transport 1.4 §3.8.6.8 · PCIe Transport 1.4 §3.8.6.9

來源: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

PCIe Figure 58 · Advanced Error Reporting Capability (Optional)

一句話重點

PCIe58-1AER 把錯誤狀態、遮罩、嚴重度與記錄內容分開。

來源:PCIe Transport 1.4 §3.8.5.10

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.5.10, Figure 58, 文件頁 31, PDF 頁 31

用例子讀懂

PCIe58-2同一錯誤可以已發生但其回報被遮罩;不能只用遮罩值推論裝置從未出錯。

PCIe Figure 59 · Offset AERCAP: AERID - AER Capability ID

一句話重點

PCIe59-1AER extended capability header 提供 ID、版本及下一項位置。

來源:PCIe Transport 1.4 §3.8.6.1

來源: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 的基底規則不同。

AERCAP
Advanced Error Reporting Capability,AER extended capability 結構的基底位置。

PCIe Figure 60 · Offset AERCAP + 4: AERUCES - AER Uncorrectable Error Status Register

一句話重點

PCIe60-1Uncorrectable Error Status 記錄不可修正錯誤類型。

來源:PCIe Transport 1.4 §3.8.6.2

來源: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」就省略類型。

PCIe Figure 61 · Offset AERCAP + 8: AERUCEM - AER Uncorrectable Error Mask Register

一句話重點

PCIe61-1Uncorrectable Error Mask 控制對應錯誤的回報遮罩。

來源:PCIe Transport 1.4 §3.8.6.3

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.3, Figure 61, 文件頁 32, PDF 頁 32

用例子讀懂

PCIe61-2把 mask 設定後不會修好已存在的傳輸問題;它改的是回報處理,不是錯誤原因。

PCIe Figure 62 · Offset AERCAP + Ch: AERUCESEV - AER Uncorrectable Error Severity Register

一句話重點

PCIe62-1Uncorrectable Error Severity 區分對應錯誤的嚴重度。

來源:PCIe Transport 1.4 §3.8.6.4

來源: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 編號大小猜嚴重程度。

PCIe Figure 63 · Offset AERCAP + 10h: AERCES - AER Correctable Error Status Register

一句話重點

PCIe63-1Correctable Error Status 記錄可修正錯誤事件。

來源:PCIe Transport 1.4 §3.8.6.5

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.5, Figure 63, 文件頁 33, PDF 頁 33

用例子讀懂

PCIe63-2錯誤已被底層修正,仍可能留下記錄;有 status 不代表某筆 NVMe 資料命令一定失敗。

PCIe Figure 64 · Offset AERCAP + 14h: AERCEM - AER Correctable Error Mask Register

一句話重點

PCIe64-1Correctable Error Mask 控制可修正錯誤的回報。

來源:PCIe Transport 1.4 §3.8.6.6

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.6, Figure 64, 文件頁 33, PDF 頁 33

用例子讀懂

PCIe64-2主機調整回報頻率相關策略時要辨識 mask 語意;遮罩可修正錯誤不表示停止底層修正機制。

PCIe Figure 65 · Offset AERCAP + 18h: AERCC - AER Capabilities and Control Register

一句話重點

PCIe65-1AER Capabilities and Control 描述記錄與檢查功能的能力及設定。

來源:PCIe Transport 1.4 §3.8.6.7

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.7, Figure 65, 文件頁 34, PDF 頁 34

用例子讀懂

PCIe65-2First Error Pointer 用來協助找最先記錄的錯誤;它不是完整事件時間戳,不能直接推算所有錯誤的精確時間差。

PCIe Figure 66 · Offset AERCAP + 1Ch: AERHL - AER Header Log Register

一句話重點

PCIe66-1Header Log 保存出錯交易的標頭資訊。

來源:PCIe Transport 1.4 §3.8.6.8

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.6.8, Figure 66, 文件頁 34, PDF 頁 34

用例子讀懂

PCIe66-2要理解是哪種 PCIe 交易出問題,先按 HB 欄位重組 header;這裡不是 NVMe SQE 的另一份完整副本。

PCIe Figure 67 · Offset AERCAP + 38h: AERTLP - AER TLP Prefix Log Register (Optional)

一句話重點

PCIe67-1TLP Prefix Log 補充交易前綴資料。

來源:PCIe Transport 1.4 §3.8.6.9

來源: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.VERTNI 固定為 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/QHCU、VU 指出產生 Queue Hash 所採用的 Controller State 格式;QH 對依序串接的相關欄位計算 SHA-384。比較兩個 QH 前先確認它們使用的狀態格式及時點;QH 不會直接列出哪筆命令完成。
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 在可定址記憶體中的基底位址。
來源:PCIe Transport 1.4 §3.8.10

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.10, Figure 69, 文件頁 38-39, PDF 頁 38-39

PCIe Figure 69 · NVMe TDISP DEVICE_INTERFACE_REPORT Reporting Structure

一句話重點

PCIe69-1DEVICE_INTERFACE_REPORT 結構描述裝置介面的相應回報資訊。

來源:PCIe Transport 1.4 §3.8.10

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.10, Figure 69, 文件頁 38-39, PDF 頁 38-39

用例子讀懂

PCIe69-2閱讀介面報告時按欄位區分描述與範圍,不把它當成一般 NVMe namespace 的 Identify buffer。

圖表組 06 · 接收端眼圖量測資料的結構 · 9 張圖表

07.15.從 header 讀出結果布局,再循 lane descriptor 到量測資料。眼圖先看量測尺度和圖例,確認每個位置表示什麼;Printable Eye 與數值結果對應閱讀,不以圖上開口的像素寬度推論未定義的效能。

回到本節的解釋與範例

從量測要求走到每條 Lane 的眼圖

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/RGTLane number 指定對象,狀態與量測步數影響數值是否可用,四個方向描述開口邊界。比較兩條 lane 前先確認量測成功及相同條件,再比較上下左右的餘裕。
EYE/Printable Eye圖形是量測資料的呈現;座標、字元格式與縮放需依來源說明讀取。圖看起來較寬不一定代表不同測試條件下的訊號更好,先核對量測尺度。
來源:PCIe Transport 1.4 §3.8.9 · PCIe Transport 1.4 §3.9 · PCIe Transport 1.4 §3.9.1.1

來源: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

PCIe Figure 70 · Get Log Page - Log Page Identifiers

一句話重點

PCIe70-1PCIe 專屬 log 清單提供接收端眼圖量測的入口。

來源:PCIe Transport 1.4 §3.9

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9, Figure 70, 文件頁 39, PDF 頁 39

用例子讀懂

PCIe70-2先由 LID 確定要讀 EOM log,再看它的參數及資料格式,不能拿 SMART log 的欄位解釋同樣大小的回覆。

LID
Log Page Identifier;指定要讀取哪一種 log page 的編號。

PCIe Figure 71 · Size of Physical Interface Receiver Eye Opening Measurement Log Page

一句話重點

PCIe71-1EOM log 大小由 header 與實際描述子內容共同決定。

來源:PCIe Transport 1.4 §3.9.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 71, 文件頁 40, PDF 頁 40

用例子讀懂

PCIe71-2多一條 lane 或較多量測資料時,回覆長度可能增加;不要永遠用只容納一條 lane 的固定 buffer。

PCIe Figure 72 · Physical Interface Receiver Eye Opening Measurement Log Specific Parameter Field

一句話重點

PCIe72-1EOM 的 ACT 與 MQUAL 分別指定量測動作與品質要求。

來源:PCIe Transport 1.4 §3.9.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 72, 文件頁 40-41, PDF 頁 40-41

用例子讀懂

PCIe72-2要讀既有量測結果與要求開始新量測,是不同 ACT 情境;分段讀取時不要意外重啟量測。

PCIe Figure 73 · Physical Interface Receiver Eye Opening Measurement Log Specific Identifier Field

一句話重點

PCIe73-1EOM 的識別參數選擇此次量測相關的目標。

來源:PCIe Transport 1.4 §3.9.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 73, 文件頁 41, PDF 頁 41

用例子讀懂

PCIe73-2先選定控制器/實體介面相關 ID,再比較回覆;不同目標的眼圖不能只因 lane number 相同就直接合併。

PCIe Figure 74 · Physical Interface Receiver Eye Opening Measurement Log Page

一句話重點

PCIe74-1EOM log 將整體 header 與各 lane 量測分開。

來源:PCIe Transport 1.4 §3.9.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 74, 文件頁 41, PDF 頁 41

用例子讀懂

PCIe74-2先讀整體資訊確認回覆範圍,再走各 lane descriptor;不能把第一條 lane 的狀態當成全部 lanes 都完成。

PCIe Figure 75 · EOM Header

一句話重點

PCIe75-1EOM Header 提供解讀整份量測結果所需的基本資訊。

來源:PCIe Transport 1.4 §3.9.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 75, 文件頁 42-43, PDF 頁 42-43

用例子讀懂

PCIe75-2主機先核對量測狀態與資料長度,再解析後續項目;取得一個有效 header 不等於每條 lane 都有有效結果。

PCIe Figure 76 · EOM Lane Descriptor

一句話重點

PCIe76-1Lane Descriptor 把 lane 編號、狀態與眼圖邊界放在一起。

來源:PCIe Transport 1.4 §3.9.1.1

來源: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 的成功狀態替它背書。

PCIe Figure 77 · Example of an Eve Diagram in the Printable Eye Field

一句話重點

PCIe77-1眼圖範例協助把數值邊界連回可視的開口形狀。

來源:PCIe Transport 1.4 §3.9.1.1

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.9.1.1, Figure 77, 文件頁 46, PDF 頁 46

用例子讀懂

PCIe77-2把 Lane Descriptor 的四個方向對到圖上,觀察哪個方向開口較小;不能把這張接收端量測圖直接當成 SSD IOPS 圖。

PCIe Figure 68 · Example of an Eve Diagram in the Printable Eye Field

一句話重點

PCIe68-1Printable Eye 範例用字元排列呈現接收端眼圖。

來源:PCIe Transport 1.4 §3.8.9

來源: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 摘要不得自行提高或降低規範強度。

來源:Base 2.4 §1.4.1

來源: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。

來源:PCIe Transport 1.4 §3.3

來源: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 規格。

來源:PCIe Transport 1.4 §3.8.8-3.8.10

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.8.8-3.8.10, 文件頁 35-39, PDF 頁 35-39

學完後想一想

1. PCIe MMIO properties 和 host memory 中的 queues 分別扮演什麼角色?

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

2. 為何不能假設所有 controller 的相鄰 doorbells 都相距 4 bytes?

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

3. 收到 interrupt 後,為何仍需讀取 CQ?

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

4. NVMe 命令的 status 與 PCIe 錯誤回報,為何需要分開看?

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