PCIe热插拔:通知试热插拔&暴力热插拔

PCIE热插拔

某些特殊的应用场合可能要求PCIe设备能够以高可靠性持续不间断运行,为此,PCIe总线采用热插拔(Hot Plug)和热切换(Hot Swap)技术,来实现不关闭系统电源的情况下更换PCIe卡设备。

热切换和热插拔的主要区别是应用领域不同,热插拔主要应用于PC以及服务器的主板上的板卡连接,而热切换主要针对的是CPCI(CompactPCI ,一种常用于仪器仪表的接口)应用的。

热插拔分为两种,一是通知式热插拔,一个是暴力热插拔,
通知式热插拔 就是先通知 driver 卸载驱动,停止 I / O ,然后再拔出。
暴力热插拔 就是带着 I / O 拔出(比如:NVME硬盘热插拔)

它有如下3个重要功能

  1. 不必关闭系统就可以替换发生故障的扩展卡。
  2. 修复期间可保证 OS和其他服务继续运行。
  3. 可关闭和重启与故障设备相关的软件。

实现pcie热插拔的前提
1). BIOS

  1. 为每个端口预留资源
    由于 PCIe 设备的枚举是遵从深度优先的原则,如果系统启动时没有带热拔插的设备,BIOS 枚举时不会为 RP 或者 switch 下行口预留资源( bus 资源、memory 资源、prefetchable memory 资源)。后面再插入该设备,由于端口资源不足,设备无法枚举进系统。

  2. PCI Express 配置空间设置
    由于 PCIe 配置空间有些 reg 是 HwInit 的,驱动是无法访问的,如果要支持热插拔,需要 BIOS 或者 Firmware 初始化一些 HwInit 的 reg。
    Link Capabilities Reg,PCIe Capabilities ,Slot Capabilities 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功能,属于历史遗留问题。
Hot-plug capable需要为1,否则无法支持热插拔的各种中断。

2)软件
在这里插入图片描述
当slot 有对应的能力时,软件需要打开slot ctrl capabilities对应的bit。并且根据系统要求设置DPC ctrl。
在这里插入图片描述

软硬件要求

热插拔不仅仅需要硬件支持,也需要软件协同实现。要想实现热插拔功能,操作系统、主板热插拔驱动器、PCIe卡设备驱动以及PCIe卡硬件功能都必须支持热插拔,缺一不可。

红色方框是软件要求
绿色方框是硬件要求

软件要求:
User Interface(用户接口): 这部分由系统OS提供。主要允许用户可以请求插拔PCIe设备
Hot-Plug Service(热拔插服务): 这部分也是由系统OS提供。主要负责处理用户插拔PCIe设备的请求。
Standardized Hot Plug System Driver(标准热拔插系统驱动程序): 这部分驱动可以由系统OS或者主板提供。
Device Driver(设备驱动程序): 这部分主要有适配卡提供。

硬件要求:
Hot-Plug Controller(热拔插控制器): 主要负责接收和处理来自Hot Plug System Driver的指令。
Card Slot Power Switching Logic(卡插槽电源交换逻辑): 主要被Hot Plug Controller控制,用于turn-on/off电源。
Card Reset Logic(卡重启逻辑): 按照Hot-plug System Driver的指示,Hot Plug Controller向需要插拔PCIe设备的插槽(Slot)传送PERST#信号。
Power Indicator(电源指示器): 主要负责指示设备连接器上面的电源状态。
Attention Indicator(警告指示器): 这个是警示灯,提醒用户热插拔失败状态,所以一般情况下处于关闭状态。
Card Present Detect Pins(卡在位检测引脚): PCIe设计了两个用于检测PCIe设备是否存在的信号PRSNT1#和PRSNT2#。 PRSNT#1接地,当PCIe设备存在时,PRSNT#2拉高。

卡在位检测机制:
在这里插入图片描述
PCIe卡有两个用于热插拔机制的引脚——PRSNT1#和PRSNT2#。
PCIe卡设备上的这两个信号之间是短路的,下方部分PCIe插槽的PRSNT1#被固定地连接到地,PRSNT2#则被上拉。
当PCIe卡设备未被完全插入插槽时,插槽的PRSNT2#信号由于上拉的作用,将一直处于高电平状态。当PCIe卡设备被完全插入插槽后,PRSNT1#与插槽上接地的PRSNT1#连接,同时插槽上的PRSNT2#信号则会被PCIe卡设备的短路线连接到地,从而使得其变为低电平。从插槽的角度看,当PRSNT2#位高电平时,则认为PCIe卡设备未能正确插入或者无PCIe卡设备;当PRSNT2#位低电平时,表明PCIe卡设备被正确地插入插槽中。

通知试热插拔

PCIe插槽的On/Off状态:

PCIe Slot ON:
上电;
RefClk参考时钟打开;
PCIe链路是激活状态或者处于ASPM状态(L0s/L1);
PERST#信号处于无效状态。

PCIe Slot OFF:
断电;
RefClk参考时钟关闭;
PCIe链路是关闭状态或;
PERST#信号处于有效状态。

调整Slot上的状态:

PCIe Slot ON转为OFF:
先关停PCIe链路。主要发送EIOS序列进入高阻态;
其次,向slot发送PERST#信号;
然后,关掉RefClk参考时钟;
最后,给slot断电。

PCIe Slot OFF转为ON:
先上电;
其次,打开RefClk参考时钟;
然后,解除slot上PERST#信号。

卡拔出流程:

按Attention Button按钮或者通过软件的命令。通知热插拔控制器开始进行热拔出操作。
闪烁LED灯,表示这张卡准备从系统中移除。五秒内没有其他异常,流程继续。五秒内可以取消此次操作。
系统把这个PCIe设备在系统中拥有的资源删除,如总线资源、Memory资源等。确保再没有流程访问这种卡。
关闭这个卡所在槽位的电源。关闭LED灯,表示该卡可以从系统中拔出了。
(可选操作)打开MRL(锁止开关)。
用户移除这张卡。

如果过程中有错误,则跳出移除过程,可以点LED红灯表示错误。需要人工干预处理。
在这里插入图片描述
卡插入流程:

PCIe设备插入槽位,触发硬件检测到Present在位。
(可选操作)关闭MRL。
按Attention Button按钮或者通过软件命令,通知热插拔控制器开始进行热插入操作。
闪烁LED灯,表示这张卡准备在这个槽位插入。五秒内可以取消此次操作。否则继续。
打开这个槽位的电源。
时钟打开、复位信号生效。插入的PCIe设备硬件可以正常工作,链路link up。
系统重新枚举插入槽位的总线,分配相应的资源。系统可以正常识别新插入的PCIe设备。
插入PCIe设备对应的驱动进行相关的配置和初始化。PCIe设备对应功能初始化完成,可以正常工作。

如果过程中有错误,则跳出插入过程,可以点LED灯表示错误。
在这里插入图片描述

暴力热插拔

由于历史原因( SAS 盘上是没有 button 按钮)导致的客户操作习惯换盘都是暴力拔出的,Nvme 盘需要支持 暴力热插拔 而不是 通知式热插拔。支持暴力热插拔要求 switch 或者 RP( 如果 SSD 接在 switch 下或 RP 下)可以协助处理这些未完成的请求,或者 host 有类似的机制,针对未完成的 Non posted 请求,返回 completion 包( PCIe 协议要求 Non posted 请求需要 completion 包),从而阻止 host 等待未完成的请求导致的超时(超时可以能导致系统 crash )。这就要用到 PCIe 3.1 协议新增的一个重要的 capability:DPC 。

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 盘的暴力热插拔的需求。

Nvme暴力拔插的软件流程

在这里插入图片描述
和通知试热插拔区别就是button press中断换成了presence detect change中断

在这里插入图片描述
暴力热插拔流程由于没有按按钮通知Nvme驱动停止IO,将会导致有没完成的IO,这将用到DPC特性来处理这些完成的IO。

参考文章链接:
https://www.pcietech.com/362.html/
https://www.pcietech.com/367.html/
https://www.pcietech.com/372.html/
https://www.pcietech.com/381.html/
https://blog.csdn.net/linjiasen/article/details/104361350
https://blog.csdn.net/zhuzongpeng/article/details/127134943
https://blog.csdn.net/qq_33632004/article/details/105972147

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值