Home PCIe 复位机制
Post
Cancel

PCIe 复位机制

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这一功能有助于系统定位错误与分析错误起因。

基本复位中的冷复位(Cold Reset)指的是因为主电源断开后重新连接导致的复位。 需要注意的是,即使主电源断开了,如果PCIe设备仍有辅助电源Vaux为其供电,该复位仍不会影响到Sticky的bits。

PCIe Spec允许两种实现基本复位的方式。一是直接通过边带信号PERST#(PCI Express Reset); 二是不使用边带信号PERST#,PCIe设备在主电源被切断时,自行产生一个复位信号。一个简单的例子如下图所示:

PCIe_复位介绍1

暖复位(Warm Rest)是可选的,指的是在不关闭主电源的情况下,产生的复位。 然而,PCIe Spec并未明确规定暖复位的产生机制,因此,如果产生暖复位完全是由系统设计者决定的。

热复位(Hot Reset)是一种In-band 复位,其并不使用边带信号。 PCIe设备通过向其链路(Link)相邻的设备发送数个TS1 Ordered Set(其中第五个字符的bit0为1), 如下图所示。这些TS1OS在所有的通道(Lane)上同时发送,并持续2ms左右。

PCIe_复位介绍2

主要注意的是,如果Switch的Upstream端口收到了热复位,则会将其广播至所有的Downstream端口,并复位其自己。 如果PCIe设备的Downstream端口接收到热复位,则只需要复位其自己即可。

当PCIe设备接收到热复位后,LTSSM会进入Recovery and Hot Reset状态,然后返回值Detect状态,并重新开始链路初始化训练。 其该PCIe设备的所有状态机,硬件逻辑,端口状态和配置空间中的寄存器(除了Sticky bits)都将被初始化值默认状态。

软件可以通过向桥设备的,特定端口的配置空间中的二级总线复位(Secondary Bus Reset)bit先写0再写1,来产生热复位,如下图所示:

PCIe_复位介绍3

需要注意的是,如果软件设置的是Switch的Upstream端口的二级总线复位bit,则该Switch会往其所有的Downstream端口广播热复位信号。 而PCIe-to-PCI桥则会将接收到的热复位信号转换为PRST#置位,发送给PCI设备。

二级总线复位(Secondary Bus Reset)bit在配置空间的位置如下图所示:

PCIe_复位介绍4

PCIe Spec还允许软件禁止某个链路(Link),强制使其进入电气空闲状态(Electrical Idle)。 如果将某个链路禁止,则该链路所有的下游PCIe设备都将收到链路禁止信号(通过TS1OS,如下图所示)。

PCIe_复位介绍5

PCIe总线自V2.0加入了功能层复位(Function Level Reset,FLR)的功能。 该功能主要针对的是支持多个功能的PCIe设备(Multi-Fun PCIe Device),可以实现只对特定的Function复位,而其他的Function不受影响。 当然,该功能是可选的,并非强制的,软件可以通过查询配置空间中的设备功能寄存器(Device Capability Register)来查询该PCIe设备是否支持FLR。 如下图所示:

PCIe_复位介绍6

并可以通过设备控制寄存器(Device Control Register)中的将Initiate Function Level Reset bit置1,来产生FLR。

PCIe_复位介绍7

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,然后直接丢弃,且不登记,也不报错。
This post is licensed under CC BY 4.0 by the author.