上一节讲到,Spec定义的热插拔是把一个PCIe卡(设备)从一个正在运行的背板或者系统中插入/或者移除。这个过程需要不影响系统的其他功能。插入的新的设备可以正确工作。

    显然,这里面需要考虑的问题有硬件和软件两方面的事情。

硬件上看,很显然,一个新的设备插入系统,肯定是需要硬件上支持识别到这个插入动作的。因此,Spec定义了一个在位(Present)的pin脚,硬件上用作判断卡是否插入。卡插入时,这个pin被拉低。当然,因为PCIe金手指的长度较长,插入卡时有可能前后高低差异。因此,需要有前后多个present pin来确保金手指完全插入。

需要注意的是,检测卡是否在位,除了使用Present Pin之外,也可以通过链路的负载检测等来完成。也就是所谓带内检测在位。或者一些特殊的场景比如NT-NT背靠背,就没有Present信号。NT-NT的插入时,链路自动重新Link。

除了在位,硬件上还需要实现的是:电源控制(不用多讲,这个是基础),复位逻辑(可控的给出PERST信号复位新插入的设备)。另外,Spec定义的热插拔是graceful的,也就是可控的、优雅的,不是突然地、暴力的。因此,热插拔的控制逻辑,需要一个按钮,来告诉系统我需要插入/拔出了。另外,人机界面上,一个LED指示灯来提示用户热插拔的工作状态也是蛮友好的事情。

综上,热插拔所需要的的硬件基本元素如下:

ElementPurpose
Power Indicator绿色的LED灯,表示电源On/Off
Attention Indicator黄色LED等。热插拔过程的一些状态表示。亮或是闪烁。
MRLManually-operated Retention Latch  锁止开关,用户固定卡。
MRL Sensor检测锁止开关是否打开的光传感器。协议定义的MRL和MRL传感器。但实际应用基本没什么用。反正我没见过。属于可选的。
Electromechanical Interlock机电联锁。一种确保不能随意移除卡的机制。同上MRL,我没见过。属于可选的。
Attention Button按钮。用于告诉系统开始/取消 热插拔过程。
Slot numbering热插拔槽位标号,这个取决于每个公司的自定义。
Power Controller上下电控制部分。包括电源故障检测。

    上面是Spec定义的一些元素,实际应用中,可以根据自己的实际项目需求来取舍。下图是一个支持热插拔的PCIe Switch的典型信号示意图:

软件方面的元素,其实简单来说就两个:

  1. 热插拔驱动:系统的驱动程序,支持PCIe的热插拔过程、移除拔出卡的资源、重新分配插入卡的资源、控制上下电等等。
  2. 支持热插拔的设备驱动:主要是需要支持插入时的初始化和移除时的资源释放。典型的是linux设备驱动的probe/remove。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注