跳转至

18_SystemReset系统复位

  • "PCIe"
  • "SystemReset系统复位"
  • "cold reset"
  • "warm reset"
  • "hot reset"
  • "function‐level reset"

介绍

前一章

​描述了PCIe函数产生中断的不同方式。旧的PCI模型使用引脚,但是边带信号在串行模型中是不受欢迎的,因此必须支持带内MSI(消息信号中断)机制。由于软件向后兼容的原因,PCI INTx引脚操作仍然可以使用PCIe INTx消息来模拟。描述了PCI传统INTx#方法和新版本的MSI/MSI‐X。

本章节

​介绍PCIe的四种复位类型: cold reset, warm reset, hot reset, and function‐level reset。讨论了使用边带复位信号PERST#来产生system reset,以及使用带内复位信号TS1来产生Hot Reset。

下一章

​下一章描述PCI Express热插拔模型。还为支持热插拔功能的所有设备和外形因素定义了标准使用模型。对于热插拔卡来说,电源也是一个问题,当在运行时将新卡添加到系统中时,确保其电源需求不超过系统所能提供的电量是很重要的。需要一种机制来查询和控制设备的功率需求,功率预算提供了这一点。


两类System Reset

PCI Express规范描述了四种类型的复位机制。其中三个是PCIe规范早期版本的一部分,现在统称为常规复位(Conventional Reset),其中两个称为基本复位(Function-Level Reset)。

随着2.0规范修订而增加的第四个类别和方法被称为Function级复位。

graph TD
    A[PCIe Reset] --> B[Conventional Reset];
    A --> C[Function-Level Reset];
    B --> D[Fundamental Reset];
    B --> E[Non-Fundamental Reset];
    C --> F[PFLR] --> N[针对多Function设备 复位单Function不影响其他Function];
    C --> G[VFLR] --> N[针对多Function设备 复位单Function不影响其他Function];
    D --> H[Cold Reset] --> L[PERST#走管脚触发复位];
    D --> I[Warm Reset] --> L[PERST#走管脚触发复位];
    E --> J[Hot Reset] --> M[TS1/TS2走带内 OS触发复位];
    E --> K[Link Disable] --> M[TS1/TS2走带内 OS触发复位];
复位类型 触发方式
Cold Reset 设备的主电源进行上下电将触发冷复位。
Warm Reset 无需关闭主电源,更改服务器电源状态寄存器来触发PERST#管脚复位
Hot Reset 将RP/Switch的Bridge Control Register bit[6],即Secondary Bus Reset bit置1来触发
Link Disable 将device的Link Control Register bit [4],即Link Disable bit置1来触发
FLR 服务器加载的Function Driver会配置device各个PF Device Control Register bit[15],触发PFLR复位

复位域

Fundamental Reset:

​ 当Host上下电时或者通过配置Host内寄存器,实现assert PERST#管脚,通过PERST#管脚来复位对接的Switch/Device。

​ 当Fundamental Reset有效时,将复位整个设备,重新初始化每个状态机和所有硬件逻辑,端口状态和配置寄存器,其中需要注意:Sticky Reg的复位行为和辅助电源有关:

  • 存在辅助电源时,Sticky Reg不复位。
  • 不存在辅助电源时,Sticky Reg是否复位,spec未明确规定。

PERST#:

  1. PERST#复位撤离后,LTSSM必须在20ms内进入Detect状态;
  2. PERST#复位撤离后,主机软件至少在100ms之后才能开始发送Config Request;
  3. 若主机软件在等待100ms时直接开始发送Config Request,但设备初始化流程还未结束,设备会回复CRS。
  4. RC可以选择重新发送Config Request,或者上报给CPU提示设备尚未ready。
  5. 设备最多可以在1s内完成初始化,1s后必须要能正确处理Config Request,否则RC认为该设备出错,无法正常工作。

Fundamental Reset(ColdReset WarmReset)

​ 基本复位(Fundamental Reset) 在硬件中处理,复位整个设备,重新初始化每个状态机和所有硬件逻辑,端口状态和配置寄存器。该规则的例外是一组配置寄存器字段,它们被标识为粘性(sticky),这意味着它们保留其内容,除非所有电源被移除。这使得它们对于定位需要复位才能使Link再次工作的问题非常有用,因为该错误状态可以在复位后仍然存在,并且之后可用于软件。如果主电源被移除,但Vaux可用,这也将保持sticky bits,但如果主电源和Vaux都丢失,sticky bits将与其他一切一起重置。

​ 基本复位将发生在系统范围内的复位,但它也可以用于单个设备。

两种类型的基本复位(Fundamental Reset)定义如下:
  • 冷复位(Cold Reset): 设备的主电源进行上下电将触发冷复位。

  • 暖复位(Warm Reset)[可选]:无需关闭主电源,由系统特定的方式触发。例如,可以更改系统电源状态寄存器来触发PERST#管脚复位。Warm Reset的机制没有在规范中定义,所以系统设计师将选择如何完成。

当基本复位(Fundamental Reset) 发生时:
  • 对于正电压,接收器终端需要满足ZRX‐HIGH‐IMP‐DC‐POS参数。在2.5 GT/s的情况下,这一速度不小于10 KΩ /s。在较高的速度下,它必须不小于10kΩ 电压低于200mv下, 20kΩ电压高于200mv。These are the values when the termi‐ nations are not powered.
  • 类似地,对于负电压,ZRX‐HIGH‐IMP‐DC‐NEG参数,在每种情况下,其值最小为1kΩ。
  • 对于Gen1发射机终端需要满足输出阻抗ZTX - DIFF - DC从80到120Ω和对于Gen2和Gen3最大值120Ω,但可能会使驱动器处于高阻抗状态。
  • 发射机终端保持直流DC共模电压在0到3.6V之间。
当基本复位(Fundamental Reset) 退出时:
  • 当启用接收器终止时,接收器单端终止必须存在,以便接收器检测正常工作(对于Gen1和Gen2为40‐60Ω,对于Gen3为50Ω+/-20%)。输入“Detect”时,共模阻抗必须在50Ω+/-20%的适当范围内。
  • 必须重新启用100Ω的接收器终止ZRX - DIFF - DC,使其在训练期间被相邻的发射器检测到。
  • 发射机终端保持直流DC共模电压在0到3.6V之间。

定义了传递基本复位的两种方法。首先,它可以用一个称为PERST# (PCI Express Reset)的辅助边带信号auxiliary side-band signal进行信号。 其次,当没有为插件卡或组件提供PERST#时,当电源循环时,组件或插件卡将自动生成基本复位。

PERST# Fundamental Reset Generation

PERST# 基本复位的产生

中央资源设备(如PCI Express系统中的芯片组)提供这种reset。例如,图18‐1中的IO控制器集线器(ICH)芯片可以根据系统电源‘ POWERGOOD ’信号的状态生成PERST#信号,因为这表明主电源已打开且稳定。如果电源关闭,POWERGOOD切换并导致PERST#断言和取消断言,导致冷复位(Cold Reset)。系统还可以提供一种通过其他方式切换PERST#的方法来完成热重置(Warm Reset)。

PERST#信号馈送主板上的所有PCI Express设备,包括连接器和图形控制器。设备可以选择使用PERST#,但不是必须要求这样做。PERST#信号也馈送如图所示的PCIe-to-PCI-X桥。桥总是将主(upstream)总线上的复位转发到从(downstream)总线上,因此PCI‐X总线看到RST#断言。

Autonomous Reset Generation

自动复位的产生

一个设备必须被设计成在主电源应用时在硬件中产生自己的复位。spec没有说明这将如何实现,因此可以将自复位机制(self-reset)内置到设备中或作为外部逻辑添加。例如,检测到Power-On的插件卡可以使用该事件对其设备产生本地复位。如果设备检测到其功率(power)超出指定的限制,则必须自动复位。

链路从L2低功耗状态唤醒

作为需要自主复位的一个例子,如果一个设备的主电源作为电源管理策略的一部分被关闭,如果它被设计为发出唤醒信号,那么它可能能够请求恢复到全功率。设备恢复供电后,必须进行复位。系统的电源控制器可以将PERST#引脚断言到设备上,如图18 - 1所示,但是如果它不这样做,或者如果设备不支持PERST#,当设备检测到主电源重新应用时,它必须自动产生自己的基本复位

图18‐1:perst#生成

Hot Reset (In-band Reset)

热复位(带内复位)

通过发送几个TS1(其内容如图18‐2所示),使用symbol 5的bit 0断言,热复位在频带内从一个链路邻居传播到另一个链路邻居。这些ts1在所有Lane上发送,使用先前协商的Link和Lane号,时间为2毫秒。一旦被发送,热复位的发送方和接收方都将在 Detect LTSSM状态结束(参见第612页的“热复位状态”)。

图18‐2:TS1 Ordered‐Set显示热复位位

热复位是通过在桥的桥控配置寄存器中设置二次总线复位位(Secondary Bus Reset bit in a bridge’s Bridge Control configuration register)在软件中启动的,如图18‐5所示。因此,只有包含桥的设备,如Root Complex或Switch,才能做到这一点。在其上行端口(Upstream Port)接收到热复位的switch必须将其广播到所有的下行端口(Downstream Ports)并进行自身复位。接收热复位的switch下游所有设备将自行复位。

Response to Receiving Hot Reset

接收热复位响应

  • 设备的LTSSM经历Recovery 和Hot Reset state,然后回到Detect state,在Detect state开始链路训练过程。
  • 所有设备的状态机,硬件逻辑,端口状态和配置寄存器(除了粘性寄存器[sticky registers])初始化为默认条件。

Switches Generate Hot Reset on Downstream Ports

交换机(switch)的下行端口生成热复位

在以下情况下,交换机在所有下行端口上产生热复位:

  • switch的上行端口收到热复位。
  • 对于switch或网桥(bridge)的上行端口,如果数据链路层报告DL_Down state,其效果与热复位非常相似。当上游端口由于错误而无法通过物理层或数据链路层恢复时,可能会发生与上游设备失去连接的情况。
  • 软件设置与上游端口相关的桥控制配置寄存器的“Secondary Bus Reset”位,如图18 - 3所示

图18‐3:交换机在一个下行端口上产生热复位

Bridges Forward Hot Reset to the Secondary Bus

如果一个桥,如PCI Express-to-PCI(‐X)桥检测到其上游端口上的热复位,它必须在其secondry PCI(‐X)总线上断言PRST#信号,如图18‐4所示。

Software Generation of Hot Reset

软件通过在该关联端口配置头的桥控制寄存器中的“Secondary Bus Reset“位写1后0,在特定端口上生成热复位(参见840页的图18‐5)。

考虑838页图18‐3所示的例子。软件设置switch A的左下游端口的“Secondary Bus Reset“寄存器,使其发送带有热复位位设置的TS1有序集。switch B在其上行端口接收到此Hot Reset,并将其转发给所有下行端口。

图18‐4:交换机在所有下行端口上产生热复位

如果软件设置了switch上行端口的"Secondary Bus Reset"位,则switch会在其所有下行端口上产生热复位,如图18 - 4所示。在这里,软件在switch C的上行端口设置"Secondary Bus Reset"位,使其在所有下行端口上发送带有热复位位的TS1。PCIe-to-PCI桥接收此热复位,并通过断言PRST#将其转移到PCI总线上。

设置"Secondary Bus Reset"位导致端口的LTSSM转换到Recovery状态(有关LTSSM的更多信息,请参阅第519页的“LTSSM状态概述”),在那里它生成具有Hot reset位集的TS1。TS1连续产生2ms,然后端口退出到Detect状态,准备开始Link训练过程

Hot reset TS1的接收端(总是下游)也会进入Recovery状态。当它看到两个连续的TS1设置了Hot Reset位时,它将进入Hot Reset状态,超时2ms,然后退出到Detect。上游和下游端口都被初始化,最终处于检测状态,准备开始链路训练。如果下游设备也是交换机或网桥,它也会向其下游端口进行热复位,如图18 - 3所示。

"Secondary Bus Reset Register 产生 Hot Reset"

软件可以禁用链路

软件也可以禁用一个Link,迫使它进入电子空闲状态(Electrical Idle),并保持在那里,直到进一步通知。在这一点上提到的原因是,禁用Link也会对下游组件造成热复位(hot reset)的影响。通过在下行端口的链路控制寄存器(Link Control Register)中设置链路禁用位来实现禁用,如图18‐6所示。这将导致端口进入Recovery LTSSM状态,并开始发送设置了禁用位的TS1。由于这只能在链路被禁用的情况下对下行端口进行控制,因此该位保留给上行端口(如端点或交换机上行端口)。

图 18‐6: Link Control Register

当上行端口识别到有禁用位的TS1时,它的物理层向链路层发送LinkUp=0 (false)信号,所有的lane进入电空闲状态。在超时2ms后,上游端口将进入Detect状态,但下游端口将保持在Disabled LTSSM状态,直到被指示退出它(例如通过清除Link Disable位),因此链路将保持禁用状态,并且在此之前不会尝试训练。

图 18-7:TS1 Ordered‐Set Showing Disable Link Bit

Function Level Reset (FLR)

功能级复位

FLR 能力允许软件在一个多funtion设备中重置一个function,而不会影响它们所有人共享的Link。它的实现是强烈推荐的,但不是必需的,所以软件在尝试使用它之前需要通过检查Device Capabilities Register来确认它的可用性,如图18 - 8所示。如果设置了Function-Level Reset Capability位,则只需在Device Control Register中设置Ini-tiate Function-Level Reset位即可启动FLR,如图18 - 9所示。

Figure 18‐8: Function‐Level Reset Capability

Figure 18‐9: Function‐Level Reset Initiate Bit

该spec提到了几个例子,鼓励添加FLR:

  1. 控制Function的软件可能会遇到问题,不再正常运行。防止数据损坏需要重置该功能,但如果该设备内的其他功能仍然正常工作,则最好能够重置有问题的Function。
  2. 在虚拟化环境中,应用程序可以从一个硬件迁移到另一个硬件,因此,当应用程序从一个Function移出时,务必确保该Function不保留有关其正在执行的操作的任何信息。这可以防止一个应用程序使用的可能被视为机密的信息对运行在该函数上的新应用程序可见。迁移之前的应用程序后进行清理的最简单方法就是重置Function。
  3. 当软件为Function重新构建软件堆栈时,有时需要首先将Function置于未初始化状态。和前面一样,避免重置共享Link的所有Function是可取的。

另一个特点没有出现在spec的案例列表中,但它本身仍然是一个激励因素。虽然传统的重置(convention reset)将重新初始化设备内的所有东西,但它并不要求所有外部活动,例如网络接口上的流量,必须立即停止。FLR添加了这个要求,并且是唯一的重置。

FLR重置Function的内部状态和寄存器,使其静默,但不影响任何粘性位(sticky bits),或硬件初始化位,或Link上特殊的寄存器,如捕获电源,ASPM控制,Max_Payload_Size或虚拟通道寄存器。如果发送了未完成的Assert INTx中断消息,则必须发送相应的Deassert INTx消息,除非该中断被内部另一个仍然断言它的Function共享。当收到FLR时,该Function的所有外部活动都必须停止。

Time Allowed

时间允许的

Function必须在100ms内完成FLR。然而,如果有任何尚未返回的分割完成,软件可能需要延迟启动FLR(由Device Status Register中设置Transactions Pending位表示)。在这种情况下,软件必须在初始化FLR之前等待它们完成,或者在FLR之后等待100ms才能尝试重新初始化Function。如果不能做到这一点,就会出现潜在的数据损坏问题:Function可能拆分了未完成的事务,但重置会导致它失去对它们的跟踪。如果他们稍后返回,他们可能误以为是对自FLR以来发出的新请求的响应。为了避免这个问题,spec建议软件应该:

  1. 与其他可能访问该Function的软件协调,以确保它在FLR期间不会尝试访问。
  2. 清除整个命令寄存器(Command Register),从而暂停Function。
  3. 通过轮询Device Status Register中的事务等待位(Transactions Pending bit),确保先前请求的完成已返回,直到它被清除或等待足够长的时间以确保完成不会被返回。多长时间才够长?如果使用了“完成超时”,请等待超时时间后再发送FLR。如果完成超时被禁用,那么等待至少100ms。
  4. 启动FLR和等待100ms。
  5. 设置Function的配置寄存器并使其正常运行。

当FLR完成时,不管时间如何,Transaction Pending位必须被清除。

Behavior During FLR

FLR期间的行为

spec编写者选择用相当宽泛的术语来描述Function reset的行为,以便不排除设计人员可能希望采取的任何内部步骤。规范中列出了以下行为:

  • 该Function不能在外部接口上显示为具有活动主机的初始化适配器(adapter)。确保终止外部接口上的所有活动的步骤将是特定于设计的。例如,在此期间,网络适配器必须不响应需要活动主机的请求。
  • 该Function不能保留任何软件可读的状态,这些状态可能包含以前使用函数时留下的秘密信息。例如,必须清除或随机化任何内部内存。
  • 该Function必须由下一个驱动程序正常配置。
  • 该Function必须返回导致FLR的配置写入的完成,然后启动FLR。

当FLR正在进行时:

  • 任何到达的请求都允许被静默地丢弃,而不记录它们或发出错误信号。但是,必须更新流量控制积分以维持link操作。
  • 传入的完成(completions)可以被视为意外完成(Unexpected Completions),或者在不记录它们或发出错误信号的情况下被静默丢弃。
  • FLR本身必须在上述时间内完成,但之后的初始化可能需要更长的时间。如果一个配置请求(Configuration Request)在初始化完成之前进入,Function必须返回一个带有CRS (configuration Retry Status)状态的completion。一旦返回带有任何其他状态的completion,在函数再次重置之前,CRS状态将不再是合法的。

Reset Exit

重置退出

退出reset state后,链路训练和初始化必须在20ms内开始。设备可以在不同的时间退出复位状态,因为复位信号是异步的,但必须在这段时间内开始训练。

为了允许复位组件执行内部初始化,系统软件必须在复位结束后等待至少100毫秒,然后才能尝试向它们发送配置请求(Configuration Request)。如果软件在100毫秒的等待时间后向设备发起配置请求,但设备仍未完成其自我初始化,则返回一个带有状态CRS的Completion。由于配置请求只能由CPU发起,因此Completion将返回到根复合体(Root Complex)。作为响应,根用户(Root)可能会自动重新发出配置请求,或者使故障对软件可见。该规范还指出,如果启用了CRS软件可见性,则软件应该只使用100ms的等待时间,否则可能导致长时间超时或处理器停滞。

设备在复位后被允许有整整1.0秒(‐0%/+50%)的时间,然后它们必须对配置请求做出适当的响应。因此,系统必须小心地等待那么长时间,然后才能确定一个无响应的设备坏了。这个值是从PCI继承来的,造成这种长时间延迟的原因可能是一些设备将配置空间实现为本地内存,必须在配置软件正确看到它之前对其进行初始化。

它的初始化可能涉及从慢速串行EEPROM复制必要的信息,因此可能需要一些时间。

相关链接