主要介绍PCIe定义的四种重置类型:冷复位、温复位、热复位和功能级复位(cold reset, warm reset, hot reset, and function‐level reset)。
本文讨论了使用边带复位PERST#信号(side‐band reset PERST# signal)来产生系统复位,以及用于产生热复位(Hot Reset)的带内TS1(in‐band TS1)。
1:Conventional Reset(常规重置)
1.1 Fundamental Reset(基本复位)
基本重置在硬件中处理,并重置整个设备,重新初始化每个状态机以及所有硬件逻辑、端口状态和配置寄存器。
此规则的例外情况是一组一些配置寄存器字段,它们被标识为“粘性(sticky)”,这意味着除非删除所有电源,否则它们将保留它们的内容。
这使得它们对于诊断需要重置以使链接再次工作的问题非常有用,因为错误状态在复置后仍然存在,并且之后可以供软件使用。
如果主电源被移除,但Vaux可用,这也将保持粘性位,但如果主电源和Vaux都丢失了,粘性位将与其他一切一起被重置。
基本重置将发生在系统范围的重置,但也可以对单个设备进行。
定义了两种类型的基本重置:
• Cold Reset:当一个设备的主电源被打开时的结果。循环电源将导致冷复位。
• Warm Reset (可选): 由特定于系统的方式触发,而不关闭主电源。例如,可以使用系统电源状态中的更改来启动它。
生成温重置的机制不是由规范定义的,因此系统设计人员将如何选择这样做。
定义了两种实现基本重置的方法。首先,它可以用一个称为PERST#(PCI快速重置)的辅助侧带信号来启动。
第二,当PERST#没有提供给插件卡或组件时,当循环电源循环时,组件或插件卡自动生成一个重置。
PERST# Fundamental Reset Generation
PCI Express系统中的芯片组等中央资源设备提供了这种重置。
例如,下图18-1中的IO控制器中心(ICH)芯片可以根据系统电源电源信号的状态产生PERST#,
因为这表明主电源接通且稳定。如果电源循环关闭,电源良好切换并导致PERST#断言和取消断言。,
导致冷重置。该系统还可以提供一种通过一些其他方法来切换PERST#来完成热重置的方法。
PERST#信号提供给主板上的所有PCI快速设备,包括连接器和图形控制器(connectors and graphics controller.)。
设备可以选择使用PERST#,但不需要这样做。
PERST#还提供了图中所示的pcie到pci-X桥。桥始终将其主(上游)总线上的重置转发到次(下游)总线,
因此PCI-X总线看到RST#断言。
Autonomous Reset Generation(自动重置生成)
一个设备必须被设计成在应用主电源时在硬件中产生它自己的复位。
该规范没有描述如何做到这一点,因此可以内置到设备或添加作为外部逻辑。
例如,检测开机的插件卡可以使用该事件来生成对其设备的本地重置。
如果设备检测到其功率超出规定的限制,还必须产生自动复位。
Link Wakeup from L2 Low Power State(从L2低功率状态下的链路唤醒)
作为需要自主复位的一个例子,作为电源管理策略中关闭的设备,如果被设计为唤醒信号,则可以要求恢复全功率。
恢复电源后,设备必须重置。系统的电源控制器可以对设备维护PERST#引脚,如下图18-1所示,
但如果不支持,或者设备不支持PERST#,设备必须在感觉到主电源时自动生成自己的基本重置。

2. Hot Reset (In-band Reset) (热复位(带内复位))
通过发送bit 0 of symbol 5的多个TS1(其内容如图18-2所示),热复位在带内(in‐band)从一个链路邻居传播到另一个链路邻居。
这些ts1被发送在所有的通道(Lanes)上,使用之前协商的链路和通道号码(Link and Lane numbers),为2 ms。
一旦发送,热复位的发射器(Transmitter)和接收器(Receiver)都将处于检测(Detect)LTSSM状态。

在软件中,通过在桥的桥控制配置寄存器(bridge’s Bridge Control configuration register)中设置辅助总线重置位(Secondary Bus Reset bit)来启动热复位,
如下图18-5所示。因此,只有包含桥接器(bridges)的设备,如根复合体或交换机(Root Complex or a Switch),才能做到这一点。
在其上游端口(Upstream Port)上接收热复位的交换机(Switch) 必须将其广播到所有下游端口并自行复位。
接收热重置的开关(switch)下游的所有设备都将自己复位。
Response to Receiving Hot Reset(对接收热复位的响应)
1:该设备的LTSSM通过恢复(Recovery)和热复位(Hot Reset)状态,
然后回到检测(Detect)状态,在那里它开始了链路训练过程。
2:所有设备的状态机、硬件逻辑、端口状态和配置寄存器(粘性寄存器除外(except sticky registers))都将初始化为它们的默认条件。
Switches Generate Hot Reset on Downstream Ports(Switches在下游端口产生热复位)
在以下情况下,交换机(Switch)会在其所有下游端口(Downstream Ports)上产生热复位:
1:It receives a hot reset on its Upstream Port
2:对于交换机(Switch)或桥的上游端口(Bridge Upstream Port),如果数据链路层报告了DL_Down状态,
则其效果非常类似于热复位。当上游端口(Upstream Port)由于物理层或数据链路层无法恢复的错误而失去了与上游设备的连接时,就会发生这种情况。
3:软件设置与上游端口(Upstream Port)相关的桥控制配置寄存器(Bridge Control configuration register)的“辅助总线重置(Secondary Bus Reset)”位,
如下图18-3所示。

Bridges Forward Hot Reset to the Secondary Bus(桥向前热复位到辅助总线)
如果桥如PCI快速到PCI(-X)桥检测到其上游端口的热重置,
则必须在其辅助PCI(-X)总线上断言PRST#信号,如下图18-4所示。

Software Generation of Hot Reset(软件生成的热复位)
软件通过写入相关的桥控制寄存器(Bridge Control register)中的“次总线重置(Secondary Bus Rese)”位写一个1后然后写0(见图18-5),
在特定端口上生成热重置。
考虑一下,上图18-3中所示的示例。软件设置交换机A左下游端口(Switch A’s left Downstream Port)的“辅助总线复位(Secondary Bus Reset)”规则,
从而发送具有热复位位集的TS1命令集。交换机B接收其上游端口的热复位,并将其转发到所有下游端口。

如果软件设置了交换机上游端口的辅助总线重置位,则交换机在其所有下游端口上产生热复位,
如图839页的图18-4所示。在这里,软件在交换机C的上游端口中设置辅助总线重置位(Secondary Bus Reset),
导致它发送在所有下游端口上设置热重置位的ts1。
PCIe到PCI桥接收此热重置,并通过断言PRST#将其转移到PCI总线上。

设置辅助总线重置位(Secondary Bus Reset bit)会导致端口的LTSSM转换到恢复状态(Recovery state),在那里它生成设置了热复位位(Hot Reset bit)的TS1。
TS1连续生成2 ms,然后端口退出到检测状态(Detect state),在那里它准备开始链路训练过程。
热复位TS1(Hot Reset TS1s)的接收端(总是在下游(downstream))也将进入恢复状态。
当它看到两个连续的设置了热复位位的TS1时,它将进入热复位状态,进行2 ms的超时,然后退出到Detect。
上游和下游端口都被初始化,并最终处于检测状态,准备开始链接培训。
如果下游设备也是开关或桥(Switch or Bridge),它也将热复位到下游端口(Downstream Ports),如上图18-3所示。
2.1 Software Can Disable the Link(软件可以禁用该链路)
软件还可以禁用一个链路,迫使它进入电气空闲状态,并保持在那里,直到进一步通知。
现在提到这一点的原因是,禁用链路也会导致对下游组件进行热复位。
禁用(Disabling)是通过在下游端口(Downstream Port,)的链路控制寄存器(Link Control Register)中设置链路禁用位(Link Disable bit)来实现的,
如下图18-6所示。这将导致端口进入恢复(Recovery )LTSSM状态,并开始发送带有禁用位集的TS1(TS1s with the Disable bit set)。
由于只能对链路被禁用的下游端口(Downstream Ports )进行控制,
因此此位保留给上游端口(如端点或交换机上游端口((such as Endpoints or Switch Upstream Ports))。

当上游端口(Upstream Port)识别具有禁用位设置的输入TS1(TS1s with the Disabled bit set)时,
其物理层向链路层信号LinkUp=0(false),所有通道(Lanes)都进入电气空闲。
2 ms超时后,上游端口将进入检测(Detect),但下游端口将保持在禁用LTSSM状态(Disabled LTSSM state),
直到被指示退出(例如清除链路禁用位(Link Disable bit)),因此链路将保持禁用,在此之前不会尝试训练。

3. Function Level Reset (FLR)(功能级别复位)
FLR能力集允许软件在多Function设备中重置一个Function,而不影响他们所有人共享的链路。
强烈建议使用它的集成,但不需要,因此软件需要在尝试使用之前通过检查Device Capabilities register,来确认其可用性,
如下图的18-8所示。如果设置了功能级重置能力位(Function‐Level Reset Capability bit),
则可以通过在设备控制寄存器(Device Control Register)中设置Initiate Function‐Level Reset bit来启动FLR,
如下图18-9所示


该规范中提到了几个促使用户添加FLR的例子:
1.控制功能的软件可能会遇到问题,并且已无法正常运行。防止数据损坏需要重置该功能,
但如果该设备内的其他功能仍然正常工作,那么能够重置那个有问题的功能就好了。
2.在虚拟化环境中,应用程序可以从一个硬件迁移到另一个硬件,当应用程序脱离Function时,
Function不会保留关于它正在做什么的任何信息。
这将防止一个可能被认为是机密的应用程序所使用的信息对在该Function上运行的新应用程序可见。
在迁移上一个应用程序后进行清理的最简单方法是重置Function。
3.当软件为Function重建软件堆栈时,有时需要首先将Function放入未初始化状态。
与前面一样,避免重置共享链路的所有Function是可取的。
另一个特性没有出现在规范中的案例列表中,但它本身仍然是一个动态的因素。
虽然传统的重置将重新初始化设备内的所有东西,但它并不要求所有的外部活动,
如网络接口上的流量,必须立即停止。FLR添加了这个需求,并且是唯一可以实现的重置。
FLR重置Function的内部状态和寄存器,使其静止,但不影响任何粘性位(sticky bits),或硬件初始化位(hardware‐initialized bits),
或链路特定的控制器(link‐specific registers),
如捕获功率、ASPM控制、Max_Payload_Size或虚拟通道寄存器(Captured Power, ASPM Control, Max_Payload_Size or Virtual Channel registers.)。
如果发送了未完成的断言INTx中断消息,则必须发送相关的去断言INTx消息,
除非该中断被另一个内部仍然具有其断言的Function共享。当接收到FLR时,该Function的所有外部活动都必须停止
3.1 Time Allowed(时间宽限)
一个Function必须在100 ms的范围内完成一个FLR。
但是,如果有任何尚未返回的未完成的分割完成(这表明事务待处理位仍然在设备状态寄存器中被设置),软件可能需要延迟启动FLR。
在这种情况下,软件必须在启动FLR之前等待它们完成,或者在FLR之后等待100 ms,然后再尝试重新初始化Function。
如果没有对其进行管理,就会出现一个潜在的数据损坏问题:一个Function可能已经分割了未完成的事务,但重置会导致它无法跟踪它们。
为了避免这个问题,该规范建议软件应该:
1.与其他可能访问该Function的软件进行协调,以确保它在FLR期间不会尝试访问。
2.清除整个命令寄存器(Command register),从而使Function停顿下来
3.通过在设备状态寄存器(Device Status register)中轮询正在待定的事务处理位(Transactions Pending bit),
确保已经返回了先前请求的完成包,直到它被清除或等待足够长的时间来确保永远不会返回完成。
多久才够长了?如果正在使用完成超时(Completion Timeouts),请等待超时时间后再发送FLR。
如果禁用了完成超时(Completion Timeouts are disabled,),那么请等待至少100个ms
4.启动FLR并等待100 ms。
5.设置Function的配置寄存器(configuration registers),并使其能够用于正常的操作
当FLR完成后,无论时间如何,都必须清除事务待处理位(Transaction Pending bit must be cleared)。
3.2 Behavior During FLR(FLR期间的行为)
规范编写者选择用相当广泛的术语来描述Function重置的行为,
以避免排除设计人员可能希望采取的任何内部步骤。本规范中列出了以下行为:
1:该Function在外部接口上不能显示为它是具有活动主机的初始化适配器。
确保外部接口上的所有活动都被终止的步骤将是特定于设计的。例如,网络适配器不能响应需要活动主机的请求
2:该Function不能保留任何软件可读的状态,可能包括一些以前使用后留下的秘密信息的功能。
例如,必须清除或随机化任何内部内存。
3:该Function必须可由下一个驱动程序进行正常配置。
4:Function必须返回导致FLR的配置写入(configuration write)的完成包,然后启动FLR。
当一个FLR正在进行中时:
1:任何到达的请求都允许被无声地丢弃,而不记录它们或发出错误信号。
不过,必须更新流量控制积分,以维护链路操作。
2:传入的完成包可以被视为不期望的完成包,或者被无声地丢弃,而不记录它们或发出错误信号。
3:FLR本身必须在上述时间内完成,但此之后的其他初始化可能需要更长的时间。
如果在初始化完成之前出现了配置请求,则函数必须返回具有CRS(配置重试状态)状态的条件。
一旦完成返回任何其他状态,CRS状态将不再合法,直到Function重新重置。
3.3 Reset Exit
退出复位状态后,链路训练和初始化必须在20 ms内开始。
设备可能会在不同的时间退出复位状态,因为复位信号是异步的,但必须在这段时间内开始训练。
若要允许重置组件执行内部初始化,系统软件必须在重置结束后等待至少100 ms后,才能尝试向它们发送配置请求。
如果软件在100 ms等待时间之后向设备启动配置请求,但设备仍未完成自完成,则返回完成状态CRS。
由于配置请求只能由CPU启动,所以完成将返回到RC。作为响应,Root可以自动重新发出配置请求或使故障对软件可见。
该规范还指出,如果CRS软件可见性已经启用(CRS Software Visibility has been enabled),软件应该只使用100个ms等待周期,
否则可能会导致长时间超时或处理器暂停
设备在重置后整整1.0秒(-0%/+50%),然后必须对配置请求作出适当的响应。
因此,系统必须小心等待那么久才决定无响应设备损坏。
这个值是从PCI继承的,这个长延迟的原因可能是一些设备实现配置空间作为本地内存,
必须初始化,才能被配置软件正确看到。
它的初始化可能涉及从一个慢的串行EEPROM中复制必要的信息,因此可能需要一些时间。

439

被折叠的 条评论
为什么被折叠?



