PCIe和NVMe SSD初始化過程簡介?
1.PCIe初始化流程
PCIe硬件初始化完成的標志是盤進入最大速率L0狀態(tài)芥喇,進入L0狀態(tài)后,主機和盤就能正常使用TLP報文進行數(shù)據(jù)傳輸启盛。參見圖1姊氓。
從狀態(tài)機可以看到凡桥,盤進入L0只能是通過Configuration或者Recovery進入(L0s只能通過L0狀態(tài)進入蟀伸,再退出到L0)。
下圖是抓取的一次盤的完整上電LTSSM跳轉(zhuǎn)缅刽,左邊是盤啊掏,右邊是槽位。參見圖2衰猛。
從整體的LTSSM可以看到迟蜜,盤是從Detect -->?polling-->configuration-->G1 L0?-->Recovery?-->G3?-->G4 L0;
接下來我們再來解釋一下初始化過程中的每一個狀態(tài)啡省。
1)Detect
Detect狀態(tài)是設(shè)備上電復位或者熱復位后的第一個狀態(tài)娜睛,也就是LTSSM的入口狀態(tài),當前設(shè)備檢測到對端設(shè)備在位后卦睹,就會往下進入polling狀態(tài)畦戒。檢測方法是發(fā)送端改變鏈路電壓對鏈路充電,根據(jù)充電時間長短來判斷對端是否在位结序。
2)Polling
進入此狀態(tài)障斋,說明兩者已經(jīng)相遇了,接下來就需要打個招呼,看下是否能夠正常交流垃环。
在這個狀態(tài)下邀层,兩端設(shè)備通過互相發(fā)送TS1和TS2來確認Bit Lock, Symbol Lock,Polarity Inversion等遂庄,參見圖3寥院。
從Trace中可以看到這個過程中發(fā)送的內(nèi)容都是F7,也就是PAD涛目,無實際意義只磷,只是通過發(fā)送一定數(shù)量的序列看是否滿足協(xié)議要求。參見圖4泌绣。
3)Configuration
進入此狀態(tài),說明兩者使用的是同一種語言预厌,交流無障礙阿迈,為了能達成合作需要進行更深入的交流。
該階段兩邊通過TS1和TS2來確認Link number和Lane number轧叽。參見圖5苗沧。
從Trace中可以看到TS1,TS2里面的Training Lanes和Training Links都是確切的值,通過這些值來進行信息交換炭晒。參見圖6待逞。
4)L0
進入此狀態(tài)后,意味著雙方交流完成了网严,可以開始愉快合作了识樱。也就是可以進行DLLP和TLP通信了。TLP packet承載真正的命令(例如MRd震束,CfgRd等)和響應(yīng)怜庸,每一個TLP發(fā)出后嗽测,接收端要回復一個DLLP ACK表示收到了TLP狂鞋,如果接收端收到的TLP有bit error或者CRC error,那么就會回復NAK栅干,參見圖7一個CfgRd的一個transaction嘉栓。
第一次進入的時候是GEN1的狀態(tài)宏榕,但期望的是最大協(xié)商能力的L0狀態(tài),因此就需要再次重新交流一下侵佃,達到最佳合作狀態(tài)麻昼,也就是跳入Recovery狀態(tài)。
5)Recovery
進入此狀態(tài)趣钱,說明雙方認為還能繼續(xù)交流一下涌献,爭取達到合作共贏的最佳狀態(tài)。
這是一個重新訓練狀態(tài)首有,目的是達到最佳鏈路狀態(tài)燕垃,進入該狀態(tài)比如鏈路異常枢劝,未達到最大速率或者最大寬度。參見圖8卜壕。
從Trace中可以看到您旁,兩端設(shè)備執(zhí)行重協(xié)商動作都是通過TS序列中的一些特殊字段,比如Speed Change Bit轴捎,EqCmd Bit來指示實現(xiàn)的鹤盒。參見圖9和圖10。
經(jīng)過Recovery后侦副,盤和主機以GEN4X4的期望狀態(tài)進入L0侦锯,達到了最佳合作狀態(tài)。
以上就是一次正常上電協(xié)商的狀態(tài)機跳轉(zhuǎn)秦驯,至于狀態(tài)機中的其他狀態(tài)可以參考協(xié)議尺碰。
至此PCIe硬件初始化已經(jīng)全部完成,接下來就是主機軟件對設(shè)備的處理译隘,主要是設(shè)備的枚舉以及資源分配亲桥,設(shè)備設(shè)置等。
從Trace中看到主機下發(fā)的第一個TLP報文固耘,配置讀取設(shè)備的Device ID题篷,這表明主機軟件已經(jīng)開始接管PCIe設(shè)備了。參見圖11厅目。
圖11
關(guān)于主機軟件對PCIe的初始化番枚,我們暫且跳過,這是對所有PCIe設(shè)備的通用流程璧瞬,接下來我們直接看一下NVMe層的初始化户辫。
2.NVMe初始化流程
主機軟件初始化完P(guān)CIe后,開始加載NVMe驅(qū)動嗤锉,也就是初始化NVMe渔欢。(因為抓取的是上電Trace,而這個主板BIOS支持NVMe設(shè)備瘟忱,因此下面的Trace是BIOS下NVMe初始化流程奥额,和OS下的NVMe驅(qū)動稍微有點差異,但整體原理和流程是一樣的)访诱。
首先看一下NVMe Controller的寄存器定義垫挨,有助于對照Trace解析。這些寄存器的基地址是設(shè)備的BAR0地址触菜。參見圖12九榔。
圖12
1)獲取NVMe設(shè)備的基本信息
參見圖13,可以看到BAR0基地址是0Xfc80000,讀取了偏移0,8哲泊,14剩蟀,1c寄存器,從寄存器狀態(tài)可以看到這是一個支持NVMe 1.3協(xié)議的控制器切威,并且NVMe層 Not Ready育特。
圖13
2)配置NVMe設(shè)備的Admin Queue
圖14-1
參見圖14-2,這是一個典型的NVMe storage的架構(gòu)圖先朦,從圖中可以看出需要有admin submission queue以及completion queue, 然后創(chuàng)建IO submission queue 和completion queue缰冤。
圖14-2
3)做NVMe Controller Reset,等待Reset完成
參見圖15喳魏,寫偏移14寄存器的Bit0,做NVMe Controller Reset棉浸,然后輪詢1C寄存器的Bit0,等待status為1刺彩,為1表明盤側(cè)NVMe reset完成涮拗,NVMe Controller Ready。
這一步完成后迂苛,主機和盤之間可以通過Admin Queue進行管理消息通信。
圖15
4)初始化NVMe字符設(shè)備
參見圖16-1&2鼓择,盤硬件NVMe初始化完成后三幻,盤能執(zhí)行Admin命令,主機給盤發(fā)送一些管理命令從而獲取到盤的信息呐能,包括set-feature和identify這些命令念搬。主機通過盤返回的信息,創(chuàng)建字符設(shè)備摆出,完成NVMe字符設(shè)備初始化朗徊。下面是一個Admin命令(set-feature)的Trace,從這個Trace中我們可以看到一個完整命令的執(zhí)行過程偎漫,這些地址都能和前面Trace看到的設(shè)置地址一致爷恳。其他命令,包括IO命令也是類似的象踊。
圖16-1
圖16-2
5)初始化NVMe塊設(shè)備
參見圖17~19温亲,主機對盤數(shù)據(jù)的讀寫IO操作是通過塊設(shè)備來完成的,盤的每個NS在主機上就是一個塊設(shè)備杯矩,并且IO是通過IO Queue來通信栈虚,和Admin Queue分離。
首先主機會創(chuàng)建IO CQ和IO SQ(queue的個數(shù)以及SQ/CQ綁定關(guān)系由主機軟件決定)史隆,然后發(fā)送identify ns枚舉所有的ns魂务,并且為每個ns創(chuàng)建一個塊設(shè)備,完成主機塊設(shè)備初始化。
圖17-1為一個創(chuàng)建IO submission queue 的解碼粘姜。
圖17-1
圖17-2為初始化過程中創(chuàng)建了多個IO submission queue和completion queue, 然后才開始進行read讀操作鬓照。
圖17-2
完成后主機就可以對盤上數(shù)據(jù)進行讀寫操作了,到此整個NVMe SSD初始化完成相艇。
以下是一個Read Cmd颖杏,其中圖18為transaction圖,圖19-1為NVMe command處理的過程坛芽,圖19-2為該Read Cmd的transaction 過程解碼留储。