Hot-Plug(四)
Spec为标准热插拔控制器定义了一套标准的寄存器组,即PCI Express Capbilities结构里面包含的内容。PCI Express Capbilities结构的Cap ID为0x10,可以容易的根据ID找到这个结构。这个结构里面包含Device Capability、Device Control/Status、Link Control/Status、Slot Capbility/Control/Status等多个寄存器。
不是每个PCIe设备都完全具备这个图里的所有寄存器的。我们关注的热插拔,其实主要是Root Complex和PCIe Switch的下行端口是有热插拔能力的。
在这些寄存器中,对于热插拔而言,我们重点关注Slot相关的几个寄存器:Slot Capabilities、Slot Status、Slot Control。在讲这几个寄存器之前,我们首先要了解一下Spec定义的关于热插拔可能产生的事件(中断,可以通过设置Slot Control寄存器的bit5Hot-Plug Interrupt Enable来使能):
插槽事件:即插槽检测到的一些动作或状态变化
• 按钮按下事件
• 检测到电源失效(Power Fault)
• MRL传感器变化事件
• 在位检测变化事件
命令完成事件:设置Slot Control的一些命令,Spec要求都必须要芯片执行完成后,返回一个命令完成。并且要求这些命令要在1秒内完成,否则超时。
数据链路层状态变化事件(Data Link Layer State Changed)这个事件主要告诉驱动软件Link是否建立成功。比如,新热插入的PCIe设备上电成功,并Link OK,上报此事件。根据协议,软件在获取到link成功后,需要等待100ms执行后续的配置等操作。
下面,我们简单看看几个相关的寄存器:
Slot Capabilities:表征了这个槽位的能力,是否支持热插拔。
比如,Bit0 Attention Button Present表示了这个槽位的按钮是否存在。其他bit位根据命名基本上都能清楚的看出来是做什么用的,不再赘述。注意一下Physical Slot Number这个字段,这个字段表征当前槽位的槽位号,往往是PCIe Switch/RC的内部定义端口号。
Slot control Register:主要控制热插拔功能的寄存器。
Slot Status Register:主要表示热插拔状态的寄存器。