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

11 minute read

English

NVM Express Base 2.4NVM Command Set 1.3NVMe over PCIe Transport 1.4

先沿一筆命令看全貌

命令放在主機記憶體,Doorbell 通知佇列位置作者依 NVMe over PCIe Transport 1.4 繪製。SQ 是 Submission Queue(提交佇列),CQ 是 Completion Queue(完成佇列);BAR 是 Base Address Register(基底位址暫存器)。圖中先分開主機記憶體與控制器暫存器;完整時序見下文。主機記憶體:SQ/CQNVMe 控制器BAR 指向的 Register 空間命令與完成項目的記憶體交換主機更新 Doorbell控制器接收通知
作者依 NVMe over PCIe Transport 1.4 繪製。SQ 是 Submission Queue(提交佇列),CQ 是 Completion Queue(完成佇列);BAR 是 Base Address Register(基底位址暫存器)。圖中先分開主機記憶體與控制器暫存器;完整時序見下文。

00.01.主機先把命令放進 SQ(提交佇列),再更新 SQ Tail Doorbell,通知控制器新的佇列位置。控制器取走並執行命令後,將完成結果放進 CQ(完成佇列)。Doorbell 不攜帶命令本體;中斷則提示主機有工作要處理,命令結果仍要讀 CQE。

CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
CQ
Completion Queue,controller 放入完成結果的完成佇列。
SQ
Submission Queue,主機放入命令的提交佇列。

00.02.Base 2.4 定義共通的命令與佇列模型;本文補上 PCIe 的位址、存取及通知方式。Transport 1.4 §1.5(p.7)引用 PCIe Base 6.2,本站 PCIe 課程則使用 6.0。查 PCIe 專屬細節時,請先確認適用版本。

PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。

沿這條路線讀下去

第一步:通知要寫到哪裡?

00.03.先沿 §3.1 找到 BAR0/BAR1 與存取規則,再看 §3.1.2:DSTRD 和 Queue Identifier 如何決定 Doorbell 的位移。

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

第二步:命令與結果怎麼往返?

00.04.沿 §3.4 的時序,依次看主機寫入 SQE、更新 Doorbell,控制器取命令、寫入 CQE,以及主機更新 CQ Head。SQE 與 CQE 分別是佇列中的命令項目和完成項目。

CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。
SQE
Submission Queue Entry,SQ 中的一筆命令資料結構。
CQ
Completion Queue,controller 放入完成結果的完成佇列。

第三步:收到通知後要讀什麼?

00.05.接著看中斷模式與完成佇列處理,並分開判讀 PCIe 錯誤和 NVMe 命令狀態。接收端眼圖量測則是另一個診斷入口。

NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
PCIe
PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
來源:PCIe Transport 1.4 §1.2 · PCIe Transport 1.4 §3.1 · PCIe Transport 1.4 §3.1.2.1-3.1.2.2 · PCIe Transport 1.4 §3.4

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

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

來源:NVME-PCIE-TRANSPORT-1.4, Rev. 1.4, §3.4, 文件頁 12-13, PDF 頁 12-13

01 NVMe 如何使用 PCIe

01.01.Figure 1 說明文件適用關係,Figure 2 再把 protocol responsibility 分層。工程上應把『command 語意』與『如何透過 host memory、MMIO、configuration space、interrupt 傳送』分開查證;Transport 發現衝突時不能改寫 Base。

Host
主機;執行作業系統並送出 NVMe 命令的一端。
MMIO
Memory-Mapped I/O,以 CPU memory access 形式讀寫裝置 register。

01.02.PCIe Transport 補充 Base Specification,定義 PCIe 專屬資料結構、延伸、要求與行為;通用 NVMe 行為仍由 Base 定義。規格衝突時 Base 的優先序高於 Transport。

NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
來源:PCIe Transport 1.4 §1.2

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

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

02 BAR、MMIO 與 Doorbell 位址

02.01.NVMe controller registers 位於 BAR0/BAR1 指定的 memory space。Doorbell 從 1000h 起,queue y 的 SQ tail 與 CQ head 依 CAP.DSTRD 計算間距。Figures 3-6 要連成 address derivation,而不是四張獨立 register 表。

controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
DSTRD
Doorbell Stride,CAP 中決定相鄰 doorbell register 間距的欄位。
CAP
Controller Capabilities,offset 00h 的 controller property,回報 queue、page size、timeout 與其他能力。
SQ
Submission Queue,主機放入命令的提交佇列。

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

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 本體

03 Host 與 Controller 的命令交換

03.01.SQE、doorbell、controller fetch、CQE、interrupt 與 CQ head 不是同一個事件的不同名稱,而是 host/controller 之間逐步移交 ownership。正確順序同時決定 memory ordering 與資源何時可重用。

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

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

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

04 Interrupt 模式與通知行為

04.01.pin-based、single-message MSI、multiple-message MSI 與 MSI-X 的差異不只效能。它們提供的 vector 數、masking 位置與 capability structure 不同;interrupt coalescing 另外決定多個 completion 何時合併通知。Figure 9 與 Figures 34-46 應配合 queue-to-vector mapping 閱讀。

MSI-X
MSI-X,提供較多 vectors、獨立遮罩與 table 的延伸 message-signaled interrupt 機制。
MSI
Message Signaled Interrupt,透過 memory write message 傳遞 interrupt 的 PCI 機制。

04.02.可用模式為 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

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

05 Configuration Space 與 PCIe 錯誤回報

05.01.Figures 10-67 從 Type 0 header 走到 Power Management、MSI/MSI-X、PCIe capability 與 AER。閱讀順序應先找 capability pointer/extended capability,再以該 capability base 加 offset;AER status/mask/severity/header log 應視為一組,不可只截取單一 error bit。

offset
offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。
AER
Advanced Error Reporting,PCIe 用來分類、遮罩與記錄 link/transaction error 的 capability。

05.02.§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

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

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

06.01.接收端眼圖量測 log 是變長結構。Header 描述整體資料,lane descriptors 描述各 lane;將結構層級與長度單位分開,才能理解每筆量測屬於哪條 lane。

06.02.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 內走訪

接著打開 Spec 看什麼

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

要說明的觀念Spec 閱讀位置
NVMe 如何使用 PCIePCIe Transport 1.4 §1.2 · PCIe Transport 1.4 §1.3 · PCIe Transport 1.4 §2
BAR、MMIO 與 Doorbell 位址PCIe Transport 1.4 §3.1 · PCIe Transport 1.4 §3.1.2.1-3.1.2.2
Host 與 Controller 的命令交換PCIe Transport 1.4 §3.4 · PCIe Transport 1.4 §3.2
Interrupt 模式與通知行為PCIe Transport 1.4 §3.5 · PCIe Transport 1.4 §3.2 · PCIe Transport 1.4 §Annex A
Configuration Space 與 PCIe 錯誤回報PCIe Transport 1.4 §3.8.1-3.8.7 · PCIe Transport 1.4 §3.7 · PCIe Transport 1.4 §3.6
接收端眼圖量測資料的結構PCIe Transport 1.4 §3.9 · PCIe Transport 1.4 §Annex A
MMIO
Memory-Mapped I/O,以 CPU memory access 形式讀寫裝置 register。
BAR
Base Address Register,PCI configuration space 中用來找出裝置 memory space 的 register。
開啟完整中文教學與逐圖解釋 →

把本篇的觀念接起來

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

採用的規格版本

NVM Express NVMe over PCIe Transport Specification, Revision 1.4

NVM Express Base Specification, Revision 2.4

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...