【52】Nvme暴力熱插拔對系統的要求

1、 SFF-8639
SFF-8639也叫U.2,物理結構可以兼容SAS/SATA/SATA Express/Nvme。SFF-8639詳細的引腳定義可以參考PCI Express SFF-8639 Module specification。
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
其中比較重要的sideband信號有PWRDIS、IfDet#、PERST#、DualPortEn。
PWDIS:該信號assert時,disable SFF-8639電路的供電。
IfDet#:長針信號,是SFF-8639的detect信號,當Nvme盤插入拔插時,作爲presence信號會被拉低拉高。
PERST#:PCIe的reset信號,PCIe Spec規定電源、時鐘和PESRT#信號的時序。
DualPortEn:雙端口盤(一般存儲上會用雙端口盤)該信號需要assert,如果是單端口盤則該信號de-assert。
2、 連接框圖
在這裏插入圖片描述
其中CPLD模擬的PCA9555可以由真正的PCA9555芯片代替,使用CPLD模擬PCA9555完全是基於成本考慮。
3、 Nvme盤的熱拔插
SFF-8639 spec定義的在位信號和PCIe的定義是有衝突的。SFF-8639規定PRSNT#和IfDet#這兩個帶外信號都是frist-to-mate and last-to-break的,也就是說SFF-8639規定的PRSNT#和IfDet#比PCIe帶內信號要長,而PCIe specification規定的恰好相反。
下面是PCIe SFF8639 Module Specification的原話:
The SFF-8639 interface includes the PRSNT# and IfDet# signals, as an out of band presence detect mechanism, to detect the presence of the SFF-8639 module. Since PRSNT# and IfDet# are not in the last-to-mate and first-to-break group, another vendor-specific mechanism is required to provide warning of module removal。
由於歷史原因(SAS盤上是沒有button按鈕)導致的客戶操作習慣(客戶換盤都是暴力拔出的),Nvme盤需要支持暴力熱插拔而不是通知式熱插拔。
暴力熱插拔是指不提前通知驅動停IO的情況下,就把PCIe設備從系統中拔出,這樣會導致存在未完成的IO。
支持暴力熱插拔要求switch或者RP(如果SSD接在switch下或RP下)可以協助處理這些未完成的請求,或者host有類似的機制,針對未完成的Non posted請求,返回completion包(PCIe協議要求Non posted請求需要completion包),從而阻止host等待未完成的請求導致的超時(超時可以能導致系統crash)。這就要用到PCIe 3.1協議新增的一個重要的capability:DPC。
4、 DPC是什麼
DPC全稱Downstream Port Containment,這個capability是PCIe 3.1協議針對root port和switch downstream port新增的。其作用是當檢查到下行口本身出現錯誤(什麼等級的錯誤會觸發DPC是可以配置的)或則下行口下面的設備上報錯誤message(什麼等級的error message會觸發DPC也是可以配的)可以關閉對應端口(讓該端口的LSTTM進入disable狀態),把PCIe traffic 攔截在該端口之下,從而阻止錯誤擴散。
針對未完成的Non posted的請求,root port或者switch downstream port根據DPC的設置返回completion包,completion包的狀態是UR或者CA。
DPC這種機制就爲系統恢復錯誤提供了機會,因此,可以用來實現Nvme盤的暴力熱插拔的需求。
5、 實現Nvme暴力拔插的準備工作
(1) BIOS
a. 爲每個端口預留資源
由於PCIe設備的枚舉是遵從深度優先的原則,如果系統啓動時沒有帶盤啓動,BIOS枚舉時不會爲RP或者switch下行口預留資源(bus資源、memory資源、prefetchable memory資源)。後面再插入Nvme盤,由於端口資源不足,盤無法枚舉進系統,除非軟件重新調整資源後再枚舉(這樣會影響其他盤的IO)。
如果是要做整機系統賣給客戶,BIOS必須要爲支持熱插拔的端口預留資源(按照系統支持的EndPoint需要的最大資源預留)。如果僅僅是驗證芯片功能,可以讓系統帶着Nvme盤或接口卡啓動,確保在枚舉時爲支持熱插拔的端口分配了資源。
b. PCI Express 配置空間設置
由於PCIe配置空間有些reg是HwInit的,驅動是無法訪問的,如果要支持Nvme盤的暴力熱插拔,需要BIOS或者Firmware初始化一些HwInit的reg。
在這裏插入圖片描述
在這裏插入圖片描述
如果PCI Express Capabilities中的slot implemented沒有實現,將會導致slot capability 無法實現。因此,PCI Express Capabilities中的slot implemented必須爲1。
在這裏插入圖片描述
在這裏插入圖片描述
Link Capabitlities reg中的surprise down error report capable必須要爲1,否則無法把surprise down的錯誤轉換成DPC(如果接Nvme盤的端口不支持surprise down,則不需要修改該bit)。
Data link layer link active reporting capable最好實現,這樣可以通過帶內linkup和linkdown方式輔助定位Nvme是否被拔出。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
Slot capabilities reg中的power controllerpresent最好能實現,這樣軟件可以控制槽位電源。
Hot-plug surprise必須爲0(如果接Nvme盤的端口不支持surprise down的錯誤可以不關注該bit),hot-plug surprise是DPC實現之前傳統的surprise down handling機制,其實有點掩耳盜鈴的意思。由於在某些,平臺上,RC收到uncorrectable error的message會導致系統crash,因此在支持熱插拔時就增加了hot-plug surprise bit,當出現surprise down error時,不向host報告錯誤,從而阻止系統crash。這個bit只能阻止surprise down error的上報,不能處理暴力拔出時未完成的IO的導致的CPU等待超時問題,並且會影響DPC功能,屬於歷史遺留問題。
針對這一點PCIe spec也有詳細的描述:
在這裏插入圖片描述
Hot-plug capable需要爲1,否則無法支持熱插拔的各種中斷。
(2) 軟件
在這裏插入圖片描述
當slot 有對應的能力時,軟件需要打開slot ctrl capabilities對應的bit。並且根據系統要求設置DPC ctrl。
在這裏插入圖片描述
6、 Nvme暴力拔插的軟件流程流程
在這裏插入圖片描述
從流程上可以看出,其實所謂的surprise add和正常的通知式熱插拔的hot add沒有太大區別,只是把button press中斷換成了presence detect change中斷。
在這裏插入圖片描述
Surprise remove流程由於沒有按按鈕通知Nvme驅動停止IO,將會導致有沒完成的IO,這將用到DPC特性來處理這些完成的IO。

發佈了35 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章