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

2023-11-01

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCIe热插拔:通知试热插拔&暴力热插拔 的相关文章

  • Anaconda创建虚拟环境

    题外话 对自己最近一年多的学习做一个总结 方便日后查看 也希望可以帮助到需要的人 所有内容亲测有效 win10系统下 1 win r 然后输入cmd 打开终端窗口 2 输入命令 conda env list 可以查看当前已经安装的pytho

随机推荐

  • Shell中的括号、方括号、花括号、双括号和双方括号使用场景总结

    前言 最近在学习Shell脚本编程时 发现别人程序的 if then代码块 中if的条件语句中存在 双括号 双中括号 的使用 因而查阅了相关资料 同时也看到了一篇不错的博文 对Shell脚本中括号的使用作出了总结 特此记录和分享 1 括号
  • 【C++】二维数组中数组名及其&、*操作

    目录 简介 场景 结语 简介 Hello 非常感谢您阅读海轰的文章 倘若文中有错误的地方 欢迎您指出 昵称 海轰 标签 程序猿 C 选手 学生 简介 因C语言结识编程 随后转入计算机专业 获得过国家奖学金 有幸在竞赛中拿过一些国奖 省奖 已
  • 使用matlab随机森林进行数据分类预测

    当使用MATLAB进行随机森林数据分类预测时 以下是一般的步骤 准备数据集 将数据集划分为特征和标签 确保数据集已经清洗并做好特征工程 拆分数据集 将数据集分为训练集和测试集 训练集用于建立随机森林模型 测试集用于评估模型性能 建立随机森林
  • 华为机试:胡杨树补种

    沙漠种植N棵胡杨树 编号1 N 一个月后有M棵未成活 现补种K棵 如何补种 只能补种 不能新种 可以得到最多连续胡杨树 int main N 总种植数量 M 未成活胡杨数量 M 个空格分隔的数 按编号从小到大 K 最多可以补种的数量 int
  • 使用timedatectl命令修改时间和时区

    使用timedatectl命令修改时间和时区 timedatectl是Linux下的一条命令 用于控制系统时间和日期 可以用来查询和更改系统时间设定 同时可以设定和修改时区信息 1 查看当前时间 日期 时区 命令 timedatectl或者
  • Chrome打印台输入就报错Uncaught EvalError: Possible side-effect in debug-evaluate

    问题 使用devtools调试console输入报错 解决方法 关闭chrome调试台中立即求值来解决 关闭此项
  • CDH安装常见问题

    为什么80 的码农都做不了架构师 gt gt gt 1 Intall Parcel 的时候 hash verification failure 首先使用命令以下命令查看其hash值 sha1sum CDH 5 12 0 1 cdh5 12
  • REW声学测试(一):麦克风校准

    更多文章请关注微信公众号 智能音箱设计 最近按照Room EQ Wizard 软件的推荐 购买了其推荐的麦克风 miniDSP UMIK 1 这款麦克风的优点在于它是一款USB麦克风 而非卡侬头麦克风 也就是说 它可以直插电脑 而不需要外接
  • MACOS 如何使用 MSSQL(SQL server)?

    文章目录 一 如何启动SQL Server 2012 数据库服务 记录运行情况和处理方法 二 用界面工具创建自己的数据库 名称自定 试着用界面工具在该数据库 一 如何启动SQL Server 2012 数据库服务 记录运行情况和处理方法 由
  • 数据分析岗位需求分析

    本文爬取了某招聘网站数据分析职位的相关数据 基于SQL和python分析数据分析的岗位需求 了解各个行业对数据分析岗位的招聘需求分布 增进对职业前景的了解 1 爬取数据 首先 基于python的requests get json爬取某招聘网
  • 梦想世界2014年5月29日服务器维护公告,《新梦想世界》8月6日更新:药包系统上线 服务器开放等级加快...

    梦想逍遥侠 带你仗剑走天涯 在2020 ChinaJoy结束之后 多益网络于本周四对 新梦想世界 的游戏内容进行了一波内容更新 此次的更新中最主要内容就是一直受玩家们期待的新收纳系统 并且官方还改进了经验果的使用规则 加快开放服务器等级的进
  • [OpenWRT系列]一、LUCI开发之luci.http.formvalue获取表单数据

    OpenWRT系列 一 LUCI开发之luci http formvalue获取表单数据 1 前言 2 luci http formvalue 3 实现思路 4 程序代码 1 前言 开发项目过程中需要获取页面的按钮点击动作并且通过传入的值进
  • flask多线程下,连接泄露的bug【转载】

    flask多线程下 连接泄露的bug 架构图 如图所示 底层使用mysql web服务使用flask SqlAlchemy的连接池 复用连接 减少创建销毁开销 逻辑层代码使用线程池 异步IO操作 如果要异步cpu操作 可以很方便改成进程池
  • 魔兽实名好友怎么显示服务器,跨服实名组队正式开启 可邀请实名好友

    跨服实名组队正式开启 可邀请实名好友 新浪游戏 2011 10 12 10 22 国服4 2 2版本已经开放 而其中有一项大家都比较关心的功能也悄悄的开放了 那就是跨服实名好友组队系统 当你挣扎在艾泽拉斯最惨无人道副本的深处时 身边能有几个
  • Flink原理与调优

    Flink提交流程 Yarn Per Job 1 client运行脚本提交命令 2 CliFrontend实例化CliFrontendParser进行参数解析 3 CliFrontend实例化YarnJobClusterExecutor并创
  • 【EI会议】2022年国际土木与海洋工程联合会议(JCCME 2022)

    2022年国际土木与海洋工程联合会议 JCCME 2022 重要信息 会议网址 www jccme org 会议邮箱 jccme iased org 会议时间 2022年10月21 23日 召开地点 中国 上海 截稿时间 2022年9月15
  • 动态网站开发学习笔记01:网页开发基础

    目录 一 HTML基础 一 HTML简介 1 HTML 2 HTML语言的基本格式 3 声明 4 html标签 5 head标签 6 body标签 7 编写第一个网页 8 关于编写HTML文件的工具 9 HTML标签概述 1 单标签 2 双
  • 微信小程序实现原生导航栏和自定义头部导航栏

    原生导航栏 可以在 app json 的 window 属性中或页面的 JSON 文件中设置 navigationBarTitleText 导航栏标题内容 navigationBarTextStyle 导航栏标题颜色 navigationB
  • AD修改铜皮的透明度

    AD软件有时候铺完铜皮后 无法知道焊盘的位置 这样在打孔时候 可能会打到焊盘上 这时后可以通过修改铜皮的透明度来解决这个问题 方法 1 快捷键L 找到Transparency 然后选择Polygons 拖动进度条 修改透明比例 完成效果如下
  • PCIe热插拔:通知试热插拔&暴力热插拔

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