1 PCIe两种错误报告机制
Baseline Error Reporting (基线错误报告):
这是所有PCIe设备必须支持的基本错误报告机制。基线错误报告提供了一组基本的错误检测和报告功能,它包括的功能有:
错误检测:能够检测到不同类型的错误,例如数据传输错误、信号完整性问题和协议违规等。
错误日志记录:捕获错误发生时的相关信息,并将这些信息存储在设备的配置空间的特定寄存器中。
错误指示:使用PCIe能力结构中的Status位来指示已检测到一个或多个错误。
该机制主要关注在系统中的关键和必须报告的错误,从而确保系统具有最基本的错误处理能力。
Advanced Error Reporting (AER,高级错误报告):
AER是一种可选的错误报告机制,为了能更详尽地检测、报告和管理错误而设计。AER提供了比基线错误报告更细粒度的错误检测和报告能力,这包括:
更详细的错误分类:AER能够识别和区分更多种类的错误,比如不可靠的数据传输、内部错误、头部日志信息等。
准确的错误定位:它能帮助系统确定错误发生在哪个具体的端点或链路上,这使得故障排除和维护工作更为直接和高效。
错误源标识:记录和报告引发错误的具体设备。
错误日志扩展:提供比基线错误报告更多的错误日志和信息记录,这有助于后续分析和问题解决。
可控的错误响应:允许系统管理员或管理软件来配置错误响应策略,比如根据情况决定是否忽略某些错误,或执行特定的恢复操作。
2 PCIe错误报告分类
由上图可知PCIe错误报告分类可分为可更正错误 (Correctable Errors) 和不可更正错误 (Uncorrectable Errors)。这两种错误类型反映了错误的严重性以及系统能否在不影响运行的情况下修复错误
可更正错误 (Correctable Errors):
可更正错误是指那些不会对系统的数据完整性造成影响,可以在不通知操作系统的情况下自动修复的错误。PCIe设备或交换机检测到这类错误后,通常会尝试自我修正,并可能记录错误事件以供之后分析。这种错误通常是由于瞬态问题,比如电磁干扰或小的信号完整性问题所引起的。PCIe中一些可更正错误的例子包括:
接收器错误 (Receiver Errors)
恢复的数据链路层错误 (Recovered Data Link Layer Errors)
坏的TLP (Bad TLP):Transaction Layer Packets传输结构错误,但被接收方成功解决。
坏的DLLP (Bad DLLP):Data Link Layer Packets传输结构错误,但被成功解决。
REPLAY_NUM Rollover:来自发出方的REPLAY_NUM计数器溢出,但成功被管理。
即使这类错误被认为是可更正的,设备仍会记录这些错误的发生,通常在相应的状态寄存器或错误日志中。这些日志信息可以帮助系统管理员识别和解决潜在的问题。
不可更正错误 (Uncorrectable Errors):
不可更正错误是指那些不能自动修正,且可能影响系统数据完整性或正常运行的错误。这些错误是更为严重的错误类别,通常需要操作系统或系统管理员介入来解决。不可更正错误会被系统记录下来,并通过中断或其他方式报告给操作系统或错误管理软件来采取恰当的错误恢复措施。根据PCIe规范,不可更正错误可以进一步细分为可致命 (Fatal) 和不可致命 (Nonfatal) 错误。以下是一些不可更正错误的例子:
数据包完整性错误 (Packet Integrity Errors)
流控制协议错误 (Flow-Control Protocol Errors)
坏的TLP (Bad TLP):传输结构错误,且未被接收方成功解决。
坏的DLLP (Bad DLLP):传输结构错误,且未被成功解决。
超时错误 (Timeout Errors):需要的响应在指定时间内未被接收。
已完成的TLP缓冲器溢出 (Completion Timeout on Buffered TLPs)
ECRC (End-to-end CRC) 错误:所检测到的CRC与传输的数据不匹配。
3 PCIe错误转发和报告
PCIe总线有三种错误报告方式,分别是:
Completions(完成):
在PCIe传输中,当一个设备向另一个设备发出请求 (Request) 后,响应 (Response) 通常以Completion TLP (Transaction Layer Packet) 的形式返回给请求者 (Requestor)。如果在处理请求过程中发生错误,Completion TLP将包含状态位,指示请求无法成功完成。例如,当被请求的数据无法被读取或写入时,或者请求的地址无效时,可能会返回带有错误指示的Completion TLP。请求者会检查Completion TLP中的状态位来确定操作是否成功或失败。
Poisoned Packet(中毒数据包,又称为错误传递,Error Forwarding):
当设备检测到一个数据错误(如由于信号问题引起的数据损坏),它可以标记相关的Transaction Layer Packet (TLP) 为"Poisoned"。中毒标记意味着在TLP的数据有效载荷中检测到潜在的错误,并将这一信息传递给TLP的接收端。接收设备在接收到中毒TLP后,可以采取适当的措施,这通常意味着不使用这些可疑的数据有效载荷,并根据错误报告策略来处理错误情况,例如向操作系统报告错误。
Error Message(错误消息):
当检测到错误时,设备可以生成一个特殊的TLP,称为错误消息,并将其发送给主机处理器。这些错误消息根据错误类型和严重性分为不同的类别,例如:Correctable Error Message(可更正错误消息)、Nonfatal Error Message(非致命错误消息)和Fatal Error Message(致命错误消息)。错误消息被直接发送到PCIe的Root Complex,并最终由主机处理器处理这些消息。错误消息使得错误能够以标准化的方式被上报给系统软件,由软件进行进一步处理,如记录错误,通知系统管理员,或采取恢复操作。
这些错误报告方式中,Completions 和 Poisoned Packets 更多用于通讯两端之间的错误通知,而 Error Messages 则提供了一种方法,允许设备将错误信息直接报告给操作系统或硬件错误管理体系。这使得PCIe能够适应不同的错误情况,并提供了丰富的错误处理能力,确保系统的稳定性和数据的可靠性。
错误消息的格式和对应的消息编码如下所示
4 PCIe高级错误报告(AER)
高级错误报告(Advanced Error Reporting, AER)是PCIe(Peripheral Component Interconnect Express)规范中一项可选功能,它允许设备提供比基线错误报告机制(Baseline Error Reporting)更详细和全面的错误检测、报告和处理能力。
4.1 AER寄存器结构
配置空间中的AER相关寄存器结构如下图所示:
ECRC的产生于校检需要AER的支持,相关控制bit位于高级错误功能控制寄存器中,如下图所示:
其中,最低5bits为当前错误指针(First Error Pointer),当相关错误状态更新时,该指针由硬件自动更新。一般情况下,当前错误指针指向的错误是优先级最高的错误,需要最先被处理的,往往也是其他错误的根源。PCIe Spec V2.1还支持多个错误的追踪(Tracking Multiple Errors)。
图中的ROS、RWS、RO等字符的意义如下:
· RO——只读(Read Only),由硬件控制
· ROS——只读且不被复位(Read Only and Sticky)
· RsvdP——保留且不可以用于其他用途
· RsvdZ——保留且只能被写0
· RWS——可读可写且不被复位(Readable,Writeable and Sticky)
· RW1CS——可读,写1清零,且不被复位
不被复位是指该bit的内容不会因为复位(断电后的上电复位除外)而发生改变。PCIe总线中有多种复位概念,Sticky bit(不被复位的位)不会受到功能层复位(Function Level Reset, FLR)、热复位(Hot Reset)和暖复位(Warm Reset)的影响,甚至不受冷复位(Cold Reset)的影响(当主电源切断后,Vaux等二级电源仍保持正常供电)。
4.2 AER 功能概览:
增强的错误检测:
AER 增加了对不同类型错误的检测能力,允许更精细地检查和区分错误。
详细的错误日志:
当检测到错误时,AER 支持的设备可以记录更多关于错误的上下文信息,包括错误类型、发生位置、涉及数据和可能的原因。
错误状态寄存器:
AER 定义了一系列的寄存器用于记录不同类型的错误状态。这些状态信息有助于系统管理员或软件确定错误的性质和位置。
错误信号:
如果发生错误,设备将发出信号(通常是通过错误消息或中断)来告知主机处理器错误的发生,需要进行错误处理。
AER 错误分类:
AER 将错误分为两大类:
不可更正错误(Uncorrectable Errors):
这种类型的错误通常表明硬件故障或其他严重问题,可能会影响系统的稳定性或数据的完整性。具体包括但不限于以下几种情况:
数据包解码错误(例如,无效的PCIe请求)
传输错误(例如,坏的TLP或DLLP)
响应接收超时
流控制协议违规
完成超时(无法在期望的时间内收到响应)
数据包有效负载的CRC错误(如果启用了端到端ECRC校验)
可更正错误(Correctable Errors):
这些错误可被硬件透明地修正,而不影响数据完整性或系统操作。这些错误可能包括信号或传输间歇错误。例如:
信号错误
数据链路层重传
报头日志溢出
AER 寄存器组成:
AER 定义了一组特定的寄存器来记录错误和协助错误处理,其中包括:
Uncorrectable Error Status (不可更正错误状态)
Uncorrectable Error Mask (不可更正错误屏蔽)
Uncorrectable Error Severity (不可更正错误严重性)
Correctable Error Status (可更正错误状态)
Correctable Error Mask (可更正错误屏蔽)
Advanced Error Capabilities and Control (高级错误能力和控制)
错误日志寄存器,比如 Header Log Register,记录引发错误的数据包头部信息
Root Error Command/Status,用于Root Port记录和管理错误
总结
PCIe的错误报告机制旨在确保系统在错误情况发生时能够迅速反应,减少数据损失和系统中断的可能性。通过结合硬件能力和软件逻辑,它为构建高可靠性计算环境提供了坚实的基础。