前言
PCIe总线中定义了四种复位名称:冷复位(Cold Reset)、暖复位(Warm Reset)、热复位(Hot Reset)和功能层复位(Function-Level Reset,FLR)。其中FLR是PCIe Spec V2.0加入的功能,因此一般把另外三种复位统称为传统的复位方式(Conventional Reset)。其中冷复位和暖复位是基于边带信号PERST#的,又被统称为基本的复位方式(Fundamental Reset)。
基本复位由硬件自动处理,会复位整个PCIe设备,初始化所有与状态机相关的硬件逻辑,端口状态以及配置空间中的配置寄存器等等。但是,也有一个例外,就是前面介绍PCIe错误报告机制的相关文章中提到过Sticky(不受复位影响)的概念。这里指的不受复位影响的前提是,PCIe设备的电源并未被完全切断。Sticky这一功能有助于系统定位错误与分析错误起因。
1 冷复位(Cold Reset)
冷复位相当于系统的电源复位(Power-on Reset),是最彻底的复位方式,会将整个系统恢复到初始电源上电状态。
在冷复位中,所有的硬件设备,包括PCIe设备,都会被初始化到它们的启动状态。这通常发生在系统的电源被完全断开然后再次接通时。
冷复位通常用于系统的硬件故障处理、系统的首次启动,或者是需要彻底重置系统状态时。
(需要注意的是,即使主电源断开了,如果PCIe设备仍有辅助电源Vaux为其供电,该复位仍不会影响到Sticky的bits。
PCIe Spec允许两种实现基本复位的方式。一是直接通过边带信号PERST#(PCI Express Reset);二是不使用边带信号PERST#,PCIe设备在主电源被切断时,自行产生一个复位信号。)
一个简单的冷复位例子如下图所示:
2 暖复位(Warm Reset)
暖复位不同于冷复位,它不需要完全断电。暖复位可以通过软件命令或特定的硬件机制触发,如重启按钮。
在暖复位过程中,系统的部分状态或配置可能被保持,但CPU和大部分硬件设备都会被重置到初始状态。
暖复位适用于系统的软件更新、错误恢复,或者其他需要重启系统但不需完全断电的情况。
暖复位(Warm Rest)是可选的,指的是在不关闭主电源的情况下,产生的复位。然而,PCIe Spec并未明确规定暖复位的产生机制,因此,如果产生暖复位完全是由系统设计者决定的。
3 热复位(Hot Reset)
热复位针对的是PCIe的链接或者端口,而不是整个系统。热复位可以重新初始化PCIe链接,但不会影响系统中的其它部分。
通过热复位,可以重新枚举链接上的设备,或者恢复错误状态的链接。热复位通常通过特定的信号或是通过更改PCIe配置寄存器来实现。
热复位尤其适用于PCIe设备的热插拔和错误管理,因为它可以在不干扰系统其他部分工作的情况下重置特定的PCIe链接。
热复位(Hot Reset)是一种In-band 复位,其并不使用边带信号。PCIe设备通过向其链路(Link)相邻的设备发送数个TS1 Ordered Set(其中第五个字符的bit0为1),如下图所示。这些TS1OS在所有的通道(Lane)上同时发送,并持续2ms左右。
需要注意的是,如果软件设置的是Switch的Upstream端口的二级总线复位bit,则该Switch会往其所有的Downstream端口广播热复位信号。而PCIe-to-PCI桥则会将接收到的热复位信号转换为PRST#置位,发送给PCI设备。
二级总线复位(Secondary Bus Reset)bit在配置空间的位置如下图所示:
PCIe Spec还允许软件禁止某个链路(Link),强制使其进入电气空闲状态(Electrical Idle)。如果将某个链路禁止,则该链路所有的下游PCIe设备都将收到链路禁止信号(通过TS1OS,如下图所示)。
4 功能层复位(Function-Level Reset,FLR)
FLR是针对PCIe设备内部的单个功能或端口的复位,是粒度最细的复位形式。它不会影响到设备的其他功能或整个系统。
FLR常用于快速重置设备中出现问题的特定功能,无需重置整个设备。这对于多功能设备、误操作或轻微错误的快速恢复特别有用。
FLR的实现依赖于设备的支持;并非所有PCIe设备都支持FLR。它通常通过向PCIe配置空间的相应寄存器写入特定值来触发。
4.1 FLR介绍:
PCIe总线自V2.0加入了功能层复位(Function Level Reset,FLR)的功能。该功能主要针对的是支持多个功能的PCIe设备(Multi-Fun PCIe Device),可以实现只对特定的Function复位,而其他的Function不受影响。当然,该功能是可选的,并非强制的,软件可以通过查询配置空间中的设备功能寄存器(Device Capability Register)来查询该PCIe设备是否支持FLR。如下图所示:
并可以通过设备控制寄存器(Device Control Register)中的将Initiate Function Level Reset bit置1,来产生FLR。
FLR只复位对应Function的内部状态和寄存器(使其暂时不变化,Making it quiescent),但是并不影响Sticky bits、有硬件初始化的值(Hardware-initialized bits)和链路专用寄存器(比如Captured Power,ASPM Control、Max Payload Size以及VC等寄存器)。如果该设备在FLR前,发出了Assert INTx中断消息,必须在开始FLR之前在发出对应的Deassert INTx消息,除非该INTx已经被与其他Function共享了。当收到FLR后,该Function的所有的其他功能都应被立即停止(Required to cease)。
此外,PCIe Spec还明确给出了FLR的完成时间应在100ms以内。
PCIe Spec还明确规定了,当某个Function处于FLR状态时的一些特性:
· 该Function不能有任何与外界通信的(外部)接口;
· 该Function必须将任何软件可读取的状态(可能包括加密信息等)打乱。换句话说,任何内部存储都必须被清零或者随机化;
· 该Function必须可以被另一个Diver配置为一般模式;
· 该Function必须为其收到的包含有FLR信息的配置写(Configuration Write)返回一个Completion,然后再进行FLR操作。
在进入FLR状态后,还需要:
· 该Function接收到的任何请求都应该被直接丢弃,且不登记(Logging),也不报错误。但是FC Credits必须要被更新,以维持链路的正常操作;
· 该Function接收到的任何Completion都应该被当做Unexpected Completions,然后直接丢弃,且不登记,也不报错。