【52】NVMe暴力热插拔对系统的要求

news/2024/11/16 8:31:03/

0、热插拔
  热插拔分为两种,一是通知式热插拔,一个是暴力热插拔,所谓通知式热插拔就是先通知driver卸载驱动,停止IO,然后再拔出。所谓暴力热插拔就是带着IO拔出
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、 连接框图
在这里插入图片描述
  整个热插拔最关键的是如何把带外信号(power ctrl、presence或者button press)和PCIe 配置空间的slot status reg关联起来。热插拔涉及到systemBIOS预留资源、linux driver中的pciehp service/Endpoint driver、芯片设计(需要root port或者switch有hotplug controller)、芯片firmware、单板硬件,是一个系统工程,不太好调试。
  其中CPLD模拟的PCA9555可以由真正的PCA9555芯片代替,使用CPLD模拟PCA9555完全是基于成本考虑。
  (1)当SSD被插入,IfDet#信号就被拉低,SFF8639后的IO端口改变,GPIO中断到FW,FW通过IIC接口读取SFF8639后的IO端口,然后和已经保存的IO端口状态对比,发现某个slot的IfDet#信号改变。
  (2)FW更改芯片配置空间的presence status和presence change status寄存器。presence change change中断(MSI中断)到CPU,CPU调用hotplug service注册的中断服务函数。
  (3)中断服务函数起线程或者工作队列读取配置控制的presence change status,presence status、power status,FW把配置空间的转换成IIC读取SFF8639对应的IO端口。
  (4)线程或者工作队列根据presence change status,presence status、power status来判断是否要热插拔,如果满足热插拔条件,则写配置空间的power ctrl把slot上电,然后等待PCIe链路linkup。
  (5)FW通过IIC写把配置空间的power ctrl写到SFF8639对应的IIO端口,NVMe SSD被上电,#PERST释放,PCIe链路link up。
  (6)线程或者工作队列等待PCIe链路linkup后,扫描NVMe,调用NVMe注册的probe。
  (7)NVMe driver配置芯片返回probe流程,热插入完毕。
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。对应Non posted的请求,在completion没有返回前,CPU认为该指令是未完成的。
  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也有详细的描述:
在这里插入图片描述
在这里插入图片描述
  关于slot cap中的hot plug surprise bit,intel的介绍的背景更多一些,不过原理上和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。


http://www.ppmy.cn/news/249181.html

相关文章

ACPI相关(5)- PCI热插拔(二)

ACPI热插拔在系统中的实现 1、系统初始化阶段 在上电阶段PCI设备的扫描节点,ACPI模式根节点(主桥)被PCI总线驱动枚举,从驱动程序的角度上来看可以把root看作一个PCI桥,包含4个地址区间用于描述PCI桥下次一级的总线的…

ACPI相关(5)- PCI热插拔(一)

PCI ACPI相关 1、热插拔流程 1) 设备状态模式检测的信号脚 ---- 对应的GPEx_STS的位 2) 在DSDT中编写对应的_LXX控制方法。(用于表示某个GPE事件中GPEx_STS状态响应位来指明当前的设备插入事件)来描述事件执行策略。并通过初始…

AGP与PCI-E的区别和PCI-E接口与PCI接口的区别

1. 主要区别是带宽不同,理论上PCI-E比AGP快4倍,因此在其他配置相同的情况下,同核心的PCI-E接口显卡要比AGP接口显卡明显要快。至于快多少就要看厂商了。 PCI E的带宽是agp 8x的2倍。 这里说的多少倍都是以pci为基准的。 pci e 为16x 2. PC…

什么是PCI插槽?

PCI插槽是基于PCI局部总线(Pedpherd Component Interconnect,周边元件扩展接口)的扩展插槽,其颜色一般为乳白色,位于主板上AGP插槽的下方,ISA插槽的上方。 一种由英特尔(Intel)公司1991年推出的用于定义局部…

计算机主板上的扩展插槽是什么的物理表现,电脑主板上的ISA插槽是起什么作用 关于电脑主板isa插槽知识...

一条长长的插槽,两排金光闪闪的引脚,这就是主板上最引人注意的一类接口,也是我们今天要谈的主角。那么这类接口叫什么名字?现在最常用的是PCI-E,在以前还有PCI、AGP等,这类接口都是PC的主要数据总线接口。由…

PCI、AGP、ISA是什么啊?

ISA是基于 PC/AT总线的由IEEE(美国电气电子工程师协会)1987年正式确立的标准。ISA槽是一个黑色的62+36线插槽,其中62线的一段基于8位的PC总线,可以独立使用,插接8位的扩展卡,而62线与…

PCIe系列专题之七:PCIe热插拔

当你准备在不断电的情况下插拔一块PCIe SSD时,你要小心了。如果在PCIe设备不支持热插拔的条件下,很可能会对主板或PCIe插槽造成损毁。 为了放置意外的发生,PCIe Spec设计了一种"No Surprise"热插拔机制,即,当…

pclexpress是什么主板_什么是PCI插槽 主板知识 ZOL术语

PCI插槽是基于PCI局部总线(Pedpherd Component Interconnect,周边元件扩展接口)的扩展插槽,其颜色一般为乳白色,位于主板上AGP插槽的下方,ISA插槽的上方。 一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准。此标准允许…