
隨著10月份國內各大SSD廠商以及芯片設計行業知名公司紛紛進入各個理工科高校進行搶人大戰,新一批的研究生將很快步入工作崗位成為研發、測試方面的工程師。但是,這些來自不同專業的學生可能有不少人在學校期間并沒有接觸過PCIe和NVMe協議,或者對于這些協議僅有一些模糊的認識,急需進行相關協議的一些基礎培訓。
Saniffer公司結合在SSD測試尤其是PCIe/NVMe協議分析領域的經驗,通過剖析一個PCIe Gen 4 NVMe SSD在主機上加電啟動過程的trace文件給大家就PCIe和NVMe初始化過程做一個簡單的介紹,希望大家對于這兩個初始化過程有個初步的認識。
說明:
本文講解使用的trace文件是由SerialTek PCIe 4協議分析儀抓取的臺灣Phison公司PCIe Gen 4 M.2 NVMe SSD在Gigabyte AMD Gen 4 CPU的主板上的加電初始化過程。由于篇幅關系,只能講述PCIe和NVMe初始化過程中的關節環節,如果想深入了解初始化過程的每個細節,可以添加下面的微信獲取SerialTek PCIe 協議分析軟件和完整的trace文件進行學習。

提示:對于Saniffer公司發布的Gen 4&5 NVMe SSD測試工具白皮書感興趣的朋友,可以訪問saniffer官方網站下面的連接下載最新更新的“PCIe Gen 4&5NVMe SSD測試環境搭建和常用工具圖解 5.1”文檔。如果有其它問題可以點擊本文左下角的“閱讀原文”留下你的聯系方式。
NVMe SSD底層使用PCIe總線,可以說PCIe總線是NVMe SSD的“高速公路”,NVMe SSD硬件同時實現了PCIe協議和NVMe協議,因此上電初始化分為兩步,首先是PCIe層的初始化,只有在PCIe初始化成功“路”通了以后,才進行第二步NVMe層的初始化。
注意:下面的PCIe初始化階段的“盤”可以理解為任意的PCIe end point device,例如網卡,GPU卡等
PCIe硬件初始化完成的標志是盤進入最大速率L0狀態,進入L0狀態后,主機和盤就能正常使用TLP報文進行數據傳輸。參見圖1。

圖1
從狀態機可以看到,盤進入L0只能是通過Configuration或者Recovery進入(L0s只能通過L0狀態進入,再退出到L0)。
下圖是抓取的一次盤的完整上電LTSSM跳轉,左邊是盤,右邊是槽位。參見圖2。

圖2
從整體的LTSSM可以看到,盤是從Detect --> polling --> configuration -->G1 L0-->Recovery-->G3-->G4 L0;
Detect狀態是設備上電復位或者熱復位后的第一個狀態,也就是LTSSM的入口狀態,當前設備檢測到對端設備在位后,就會往下進入polling狀態。檢測方法是發送端改變鏈路電壓對鏈路充電,根據充電時間長短來判斷對端是否在位。
進入此狀態,說明兩者已經相遇了,接下來就需要打個招呼,看下是否能夠正常交流。
在這個狀態下,兩端設備通過互相發送TS1和TS2來確認Bit Lock, Symbol Lock,Polarity Inversion等,參見圖3。

圖3
從Trace中可以看到這個過程中發送的內容都是F7,也就是PAD,無實際意義,只是通過發送一定數量的序列看是否滿足協議要求。參見圖4。

圖4
進入此狀態,說明兩者使用的是同一種語言,交流無障礙,為了能達成合作需要進行更深入的交流。
該階段兩邊通過TS1和TS2來確認Link number和Lane number。參見圖5。

圖5
從Trace中可以看到TS1,TS2里面的Training Lanes和Training Links都是確切的值,通過這些值來進行信息交換。參見圖6。

圖6
進入此狀態后,意味著雙方交流完成了,可以開始愉快合作了。也就是可以進行DLLP和TLP通信了。TLP packet承載真正的命令(例如MRd,CfgRd等)和響應,每一個TLP發出后,接收端要回復一個DLLP ACK表示收到了TLP,如果接收端收到的TLP有bit error或者CRC error,那么就會回復NAK,參見圖7一個CfgRd的一個transaction。

圖7
第一次進入的時候是GEN1的狀態,但期望的是最大協商能力的L0狀態,因此就需要再次重新交流一下,達到最佳合作狀態,也就是跳入Recovery狀態。
進入此狀態,說明雙方認為還能繼續交流一下,爭取達到合作共贏的最佳狀態。
這是一個重新訓練狀態,目的是達到最佳鏈路狀態,進入該狀態比如鏈路異常,未達到最大速率或者最大寬度。參見圖8。

圖8
從Trace中可以看到,兩端設備執行重協商動作都是通過TS序列中的一些特殊字段,比如Speed Change Bit,EqCmd Bit來指示實現的。參見圖9和圖10。

圖9

圖10
經過Recovery后,盤和主機以GEN4X4的期望狀態進入L0,達到了最佳合作狀態。
以上就是一次正常上電協商的狀態機跳轉,至于狀態機中的其他狀態可以參考協議。
至此PCIe硬件初始化已經全部完成,接下來就是主機軟件對設備的處理,主要是設備的枚舉以及資源分配,設備設置等。
從Trace中看到主機下發的第一個TLP報文,配置讀取設備的Device ID,這表明主機軟件已經開始接管PCIe設備了。參見圖11。

圖11
關于主機軟件對PCIe的初始化,我們暫且跳過,這是對所有PCIe設備的通用流程,接下來我們直接看一下NVMe層的初始化。
主機軟件初始化完PCIe后,開始加載NVMe驅動,也就是初始化NVMe。(因為抓取的是上電Trace,而這個主板BIOS支持NVMe設備,因此下面的Trace是BIOS下NVMe初始化流程,和OS下的NVMe驅動稍微有點差異,但整體原理和流程是一樣的)。
首先看一下NVMe Controller的寄存器定義,有助于對照Trace解析。這些寄存器的基地址是設備的BAR0地址。參見圖12。

圖12
參見圖13,可以看到BAR0基地址是0Xfc80000,讀取了偏移0,8,14,1c寄存器,從寄存器狀態可以看到這是一個支持NVMe 1.3協議的控制器,并且NVMe層 Not Ready。

圖13
參見圖14-1,從Trace中可以看到主機寫了偏移14(Controller Configuration),24(Admin Queue Attributes),28(Admin SQ Base Addr Low),2C(Admin CQ Base Addr High),30(Admin CQ Base Addr Low),34(Admin CQ Base Addr High)寄存器,其中Admin SQ的基地址為0xbd551000,Admin CQ的基地址為0Xbd54c000。

圖14-1
參見圖14-2,這是一個典型的NVMe storage的架構圖,從圖中可以看出需要有admin submission queue以及completion queue, 然后創建IO submission queue 和completion queue。

圖14-2
參見圖15,寫偏移14寄存器的Bit0,做NVMe Controller Reset,然后輪詢1C寄存器的Bit0,等待status為1,為1表明盤側NVMe reset完成,NVMe Controller Ready。
這一步完成后,主機和盤之間可以通過Admin Queue進行管理消息通信。

圖15
參見圖16-1&2,盤硬件NVMe初始化完成后,盤能執行Admin命令,主機給盤發送一些管理命令從而獲取到盤的信息,包括set-feature和identify這些命令。主機通過盤返回的信息,創建字符設備,完成NVMe字符設備初始化。下面是一個Admin命令(set-feature)的Trace,從這個Trace中我們可以看到一個完整命令的執行過程,這些地址都能和前面Trace看到的設置地址一致。其他命令,包括IO命令也是類似的。


參見圖17~19,主機對盤數據的讀寫IO操作是通過塊設備來完成的,盤的每個NS在主機上就是一個塊設備,并且IO是通過IO Queue來通信,和Admin Queue分離。
首先主機會創建IO CQ和IO SQ(queue的個數以及SQ/CQ綁定關系由主機軟件決定),然后發送identify ns枚舉所有的ns,并且為每個ns創建一個塊設備,完成主機塊設備初始化。
圖17-1為一個創建IO submission queue 的解碼。

圖17-1
圖17-2為初始化過程中創建了多個IO submission queue和completion queue, 然后才開始進行read讀操作。

圖17-2
完成后主機就可以對盤上數據進行讀寫操作了,到此整個NVMe SSD初始化完成。
以下是一個Read Cmd,其中圖18為transaction圖,圖19-1為NVMe command處理的過程,圖19-2為該Read Cmd的transaction 過程解碼。

圖18

圖19-1

圖19-2
關于Saniffer公司 
Saniffer公司位于上海張江高科技園區,是國內唯一專注于SSD以及存儲系統測試工具領域的綜合服務提供商,涉及測試工具覆蓋了存儲生態的各個環節,從芯片開發,底層固件和驅動開發/驗證,測試工程,應用工程,RDT可靠性測試,一直到生產測試。測試的產品涉及存儲控制器IP,芯片,HDD/SSD,存儲系統,服務器,網絡設備研發,設計,生產和制造。
Saniffer提供的測試方案包括并不限于下面相關技術:
l計算/網絡/存儲相關總線技術
–PCIe Gen 4/5/6
–NVMe 1.4
–SAS 12/24G
–SATA 6G
–NAND 400MT/800MT/1.6GT
–LPDDR/DDR 4/5
–FC 32G
–FCoE
–iSCSI
–NVMoF (NVMe over Fabric)
–FC-NVMe (NVMe over FC)
l消費類/移動/汽車電子相關總線技術
–UFS 3.0/3.1 & 4.0
–eMMC 5.1
–SD/SDIO 3.0, SD 4.0
–USB 3.0/3.1/3.2/4.0
–CAN
–LIN
–FlexRay
–Display Port 2.0
–100Base-T1
–TTE
–TSN
–I2C/SPI, QSPI
–I3C
–SPMI
–RFFE
–WIFI
–… …