在PCIe总线的错误报告机制中,有如下四个比较重要的概念:
- 错误检测(Error Detection):指的是检测某个错误是否存在的过程。
- 错误登记(Error Logging):指的是将相关寄存器(配置空间中的)的对应为置位,以等待软件中的相关错误处理程序来处理该错误。
- 错误报告(Error Reporting):通知系统某个(或多个)错误发生了。在PCIe总线中,发生错误的设备会通过错误消息(Error Message)逐级将错误信息发送至Root,Root接收到错误消息后,会产生对应的中断通知系统。
- 错误发送(Error Signaling):指的是通过发送错误消息(或者带有UR,CA的Completion和Poisoned TLP)来传递错误信息的过程
PCIe总线Spec定义了两个错误报告等级。第一个为基本的(Baseline Capability),是所有PCIe设备都需要支持的功能。第二个是可选的,称之为高级错误报告(Advanced Error Reporting Capability)。
在基本的错误报告机制中,有两组相关的配置寄存器(配置空间中),分别为:
- 兼容PCI总线的寄存器(PCI-compatible Registers)
- PCIe总线中新增的寄存器(PCI Express Capability Registers)
高级错误报告机制(AER)中,又使用了一组专用的配置寄存器(配置空间中)。借助AER可以获得更多的错误信息,有助于软件定位错误源和分析错误原因。
PCIe总线的错误可以分为(Correctable Errors)和不可校正错误(Uncorrectable Errors)。其中,可校正错误可以自动地被硬件识别并被自动的校正或恢复。而不可校正错误又被分为非致命的(Non-Fatal)和致命的(Fatal)。非致命的错误一般有设备驱动软件(Device Specific Software)直接处理,且链路(Link)可恢复,甚至链路上的数据有可能得到恢复(不丢失数据)。致命的错误只能由系统软件(System Software)处理,且一般需要进行复位等操作,因此链路上的数据必然会丢失。
PCIe总线错误检测囊括了链路(Link)上的错误以及包传递过程中的错误,如右图所示。用户设计的应用程序层中的错误不属于链路传输中的错误,不应当通过PCIe的错误检测与处理机制处理,一般可借助设备特殊中断(Device Specific Interrupt)等合适的方式进行报告与处理。
包传递过程的错误主要通过CRC编码来检测。PCIe定义了两种CRC——LCRC和ECRC。其中LCRC(Link CRC)由数据链路层产生和校检,用于检测从一端的数据链路层发送到另一端的数据链路层的TLP是否发生的错误。而ECRC(End-to-end CRC)由事务层产生和校检,且ECRC是可选的。
一般情况下(尤其是没有Switch的简单PCIe总线系统中),ECRC的确是没有必要存在的。ECRC主要为解决Switch中传输的可能存在的传输错误问题的,换句话说,如果用户的设计中并没有Switch(只是简单的Root与Endpoint的端对端直连),完全可以不使用ECRC。
如右图所示,假设来自Endpoint的TLP被正确地传输到Switch的Downstream输入端口(Ingress Port),Downstream输入端口中的数据链路层也完成了对其的LCRC校检,且未发现错误。然后Switch会将该LCRC移除,并添加新的序列号(Sequence Number),随后重新计算LCRC,再将该TLP发送至Switch的Upstream输出端口(Egress Port)。显然,在此过程中TLP是不受保护的,一旦期间数据传输遇到错误等异常,可能会导致重新计算LCRC前的数据已经受到了破坏,且仅仅使用LCRC是无法发现这样的错误的。
ECRC是AER中的一部分,要想使用ECRC,该PCIe设备必须是支持AER的。
按照错误产生的层(Layer)来分,则可以分为物理层错误,数据链路层错误和事务层错误。
物理层错误(Physical Layer Errors)主要有:
(1)8b/10b编解码异常
(2)Framing异常(8b/10b编码中是可选的,128b/130b中是必选的)
(3)Elastic Buffer错误(可选的)
(4)起始字符失锁(Loss of Symbol Lock)或者通道对齐失锁(Lane Deskew)(可选的)
数据链路层错误(Data Link Layer Errors)主要有:
(1)LCRC校检失败
(2)序列号(Sequence Number)异常
(3)DLLP中的16-bit CRC校检失败
(4)链路层协议错误(Link Layer Protocol Errors)
事务层错误(Transaction Layer Errors)主要有:
(1)ERCR校检失败(可选的)
(2)异常的TLP(Malformed TLP)(即TLP的格式异常)
(3)流量控制协议异常(Flow Control Protocol Violation)
(4)不支持的请求
(5)数据损坏(Data Corruption,又称为Poisoned Packet)
(6)Completer Abort(可选的)
(7)接收端溢出(Receiver Overflow)(可选的)
(8)返回包超时(Completion Timeout)
(9)不对应的返回包(Unexpected Completion,即Completion与发出的Request不一致)