NVMe盘暴力热插拔 学习记录

1、 SFF-8639
SFF-8639也叫U.2,物理结构可以兼容SAS/SATA/SATA Express/Nvme。SFF-8639详细的引脚定义可以参考PCI Express SFF-8639 Module specification。

其中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。

6、 Nvme暴力拔插的软件流程流程

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月5日
下一篇 2020年4月5日

相关推荐