对于Linux系统针对RAS的AER错误处理机制完成
PCIe RAS简单来讲就是PCIe的错误检测、纠正以及汇报的机制。它可以方便我们准确的定位,纠正和分析错误增强系统的健壮性和可靠性。
PCIe错误的分类
PCIe错误分为可校正的错误(Correctable)和不可校正的错误(Uncorrectable error), Uncorrectable又分为致命的(Fatal)和非致命的(Nonfatal)。
可校正的错误 :可校正错误可以自动地被硬件识别并被自动的校正或恢复。 致命错误:这类错误导致链路和硬件异常只有通过系统软件进行复位操作实现恢复。 非致命错误:这类错误可能会导致特定的传输变得不可靠,但是链路和硬件的其他功能不受影响。设备驱动软件提供恢复机制,并不会影响到链路和其他设备的运行。
PCIe错误范围
PCIe总线是分层实现的,它包含多个层次,从上到下分别是应用层,事务层, 数据链路层,物理层。其中应用层并不是PCIe Spec所规定的内容,另外三层都是PCIe Spec明确规范的。按照层来划分,每个层都有相应的错误。大部分的错误集中在事务层。
事务层错误主要有:ERCR校检失败,数据损坏,异常的TLP,不支持的请求,Completer Abort,不对应的返回包,返回包超时。
1. ERCR:
主要用于含有Switch的PCIe系统中,这个feature是可选的,只有支持AER的设备才具有这一功能。软件可以通过AER的控制寄存器enable。TLP包头中的TD位用来表示该TLP是否使用ECRC,1表示使用,0表示没有使用。在TLP包头中有两位不参与到ECRC的计算,TYPE中的bit0和EP,它们也被称为可变位,计算ECRC时时钟认为这两位为1.
a. 当接收端收到的TLP中存在ECRC错误时,它不会返回TLP Completion,并且会将配置空间的ECRC错误状态位设置起来。发送端由于长时间接收不到Completion会产生超时错误,软件有可能会选择重发。
b. 当发送端发送完请求后收到了来自接收端返回的TLP Completion,如果该TLP中存在ECRC错误,发送端会将配置空间中的状态寄存器的ECRC错误状态置位。除了标准的错误汇报机制,发送端也可以选择通过Function-specific interrupt汇报错误给设备驱动程序。发送端也可以重发之前的request。 以上两种情况如果使能了错误汇报功能,系统就会收到不可修复的非致命的消息。
2. 数据损坏:
也被称为错误传递,指的是TLP Data Payload被破坏的情况下,该TLP仍然被发送给其它的PCIe设备。
为什么Data payload已经被破坏了还需要发送给其它的设备呢?原因如下:
a. 用于发送端和系统分析错误。
b. 用于发现Switch或者是其它桥设备中的错误。
c. 有些应用允许接收存在错误的数据。
d. 数据可以通过应用层恢复。
3. 异常的TLP
主要包含以下几种可能得错误:
a. Data Payload超过了最大值
b. 数据长度与包头中的长度值不一致
c. 存储地址起始位置跨越了4KB边界
d. TLP Digest的值与ECRC是否使用不一致
e. 字节使能冲突
f. 未定义的类型值
g. Completion违反了Read Completion Boundary值
h. 针对非配置请求返回的Completion中的状态为配置请求重试状态
i. TC域包含了一个未被分配到当前使能的VC的值
j. IO或者配置请求冲突)
k. 中断Emulation消息向下发送
l. TLP前缀错误
4. 不支持的请求
主要包括:
a. 请求类型不被当前PCIe设备支持
b. 消息中使用了不支持或者未定义的消息编码
c. 请求的地址空间超出或者不在设备的地址空间中
d. 针对Completer的IO或者存储映射控制空间进行的Poisoned写操作
e. Root或者Switch的Downstream端口接收到针对其二级总线上的不存在的设备的配置请求
f. Endpoint接收到Type1型的配置请求
g. Completion中使用了保留的Completion状态编码
h. 设备处于D1、D2或者D3hot电源管理状态时,却接收到了除了配置请求和消息之外的内容
5. Completer Abort
主要包括:
a. Completer接收的特殊请求,只有在违背其规则的情况下才能对该请求进行响应
b. 因为某些的永久性的错误状态,导致Completer无法响应接收到的请求
c. Completer接收到存在访问控制服务错误的请求
d. PCIe-to-PCI桥接收到针对其连接的PCI设备的请求,但是该PCI设备无法处理该请求
6. 非预期的Completion
主要有:Requester接收到的Completion和其发出的Request不一致。
7. 返回包超时:
PCIe设备都支持Completion超时定时器,有一个设备控制寄存器2用于查看和设置超时时间。
数据链路层错误主要有:LCRC校检失败,序列号,DLLP中的16-bit CRC校检失败,链路层协议错误。
物理层错误主要有:8b/10b编解码异常,Framing异常,Elastic Buffer错误,起始字符失锁。
不同层的错误对应的错误种类如下表所示:
PCIe错误的汇报
PCIe总线有三种错误报告方式:
- 通过Completion中的状态位向Requestor返回错误信息。事务错误主要包括不支持的请求(Unsupported Request)、Completer Abort、非预期的Completion和Completion超时。该错误类型主要通过返回的Completion TLP包头中的Compl. Status通知请求者。
2. Poisoned Packet也被称为错误传递(Error Forwarding),指的是在已知TLP Data Payload被破坏 (Corrupted)的情况下,该TLP仍然被发送至其他的PCIe设备。此时,该TLP包头的EP位(Error Poisoned)被置位为1,表明该TLP已经被破坏。
3. Error Message(错误消息),用于向主机端报告错误信息。
PCIe错误处理机制
-
基本的错误处理机制。
- 兼容PCI总线寄存器的错误处理机制。PCI的错误处理机制是通过SERR#和PERR#信号实现的,其中PERR#主要对应的是普通数据奇偶校检错误(Parity Error),而SERR#主要指的是系统错误。PCIe为了兼容PCI的PERR# SERR#, PCIe会自动将CA、UR和Poisoned TLP转换为对应的错误信息将它的错误映射到了原来的PCI的配置空间寄存器上。寄存器描述如下图所示:
-
- 基于PCIe新增的寄存器的错误处理机制。PCIe通过Capability结构提供了一些新增加的寄存器,PCIe 的错误类型可以通过设备控制寄存器去enable/disable。出错之后可以通过设备状态寄存器查询出错原因。
-
高级错误报告机制(Advanced Error Reporting ) 该功能是可选的。高级错误报告机制使用了一组专用的配置寄存器。借助AER可以获得更多的错误信息,有助于软件定位错误源和分析错误原因。在已有的PCIe错误报告机制的基础上,它提供下述的特性:
- 在登记实际发生的错误类型时,有更好的粒度
- 区分Uncorrectable error的严重程度
- 支持登记包头中的错误
- 为Root通过中断报告接收到的错误消息提供了标准化的控制机制
- 可以定位错误源在PCIe体系结构中的位置
- 能够独立地屏蔽错误类型
ECRC需要AER的支持,可以通过AER的控制寄存器enable。
First Error Pointer 是由硬件更新,我们可以通过该指针在Error Status寄存器中方便的找到对应的错误。
AER包含高级可纠正错误处理以及高级不可纠正错误处理两个部分。可纠正和不可纠正分别有一组Status 和Mask寄存器用于读取状态和控制使能。只要当相关错误发生后,不管有没有被使能,硬件会自动地将Status寄存器对应bit置1。
另外软件可以通过高级不可修正错误严重度寄存器(Advanced Uncorrectable Error Severity Register)来修改不可校正错误是否被作为致命的(Fatal)错误处理。
AER结构中定义了一个4DW的Header Log Register,用于缓存收到的不可修正错误的TLP的包头方便进一步的分析,它支持如下的错误类型:
在PCIe总线中,所有的设备发生错误后都会讲错误报给给RC,RC收到错误消息以后根据设定选择是否以及如何向系统报告错误。软件可以通过设置根命令寄存器来使能或者禁止相关的错误是否被报告给系统。
这些错误消息会反应在根错误状态寄存器中。
另外高级错误源ID寄存器中记录了产生错误的设备的BDF信息,通过该信息我们可以准确的定位到具体的设备。
PCIe错误处理的流程如下图所示:
下图是软件处理AER错误的一个例子,如图所示,RC是0:28:0,它被配置成当收到Correct/Uncorrect 错误消息时会生成中断通知系统。假设这时我们收到了一个中断,这时错误处理程序被调用。
-
- MSI/MSIX中断,每个设备是惟一的,所以错误处理程序知道这时从RC 0:28:0产生的中断。
- 错误处理程序读取0:28:0 AER结构中根错误状态寄存器获得错误的类型,读到的是0800_007Ch,它表示收到了ERR_FATAL 和 ERR_NONFATAL的错误,而且第一个收到的error是 ERR_FATAL。
- 读取Source ID寄存器得到0500_0000h,这表示第一个产生ERR_FATAL错误消息的是BDF 5:0:0。
- 读取BDF 5:0:0 Uncorrectable Error Status得到0004_1000h表示该设备至少收到了一个Malformed TLP和一个Poisoned TLP。
- 读取BDF 5:0:0的Advanced Error Capability and Control 寄存器的First Error Pointer栏位得到12h表示第一个收到的错误是Malformed TLP (bit 18d)读取Header Log寄存器
参考:
《PCI Express Technology》
《PCI Express 体系结构导读》
PCIe扫盲——高级错误报告AER:
http://blog.chinaaet.com/justlxy/p/5100057839
PCIe error logging and handling on a typical SoC:
https://www.design-reuse.com/articl