Home PCIe 高级错误机制AER
Post
Cancel

PCIe 高级错误机制AER

在已有的PCIe错误报告机制上(之前文章介绍的),AER还支持以下特性:

  1. 在登记实际发生的错误类型时,有更好的粒度(Granularity,可以理解为区分度或者精确度)
  2. 区分各种不可校正错误的严重程度
  3. 支持登记包头中的错误
  4. 为Root通过中断报告接收到的错误消息提供了标准化的控制机制
  5. 可以定位错误源在PCIe体系结构中的位置
  6. 能够独立地屏蔽某种(或者多种)错误类型的报告
  7. 配置空间中的AER相关寄存器结构如下图所示:

PCIe_AER1

前面的文章中多次提到过,ECRC的产生于校检需要AER的支持,相关控制bit位于高级错误功能控制寄存器中,如下图所示:

PCIe_AER2

其中,最低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等二级电源仍保持正常供电)。


高级错误报告(Advanced Error Reporting,AER)关于可校正和不可校正错误的相关寄存器,以及Root如何处理来自其他PCIe设备的错误消息等内容。

高级可校正错误处理(Advanced Correctable Error Handling)

高级可校正错误状态

高级可校正错误状态寄存器如下图所示,当相关错误发生后,硬件会自动地将对应bit置1。软件可以通过向对应bit写1,来清零。

PCIe_AER3

高级可校正错误屏蔽

高级可校正错误屏蔽寄存器如下图所示,默认情况下,这些bit的值都是0。也就是说,只要发生相关错误,且该错误报告功能被使能, 则相关错误便会被报告(不被屏蔽)。当然,软件可以通过将相关bit置1,来屏蔽相关的错误报告信息。

PCIe_AER4

高级不可校正错误处理(Advanced Uncorrectable Error Handling)

高级不可校正错误状态

高级不可校正错误状态寄存器如下图所示,当相关错误发生时,不管这些错误会不会被报告到Root,相关的bit都会被置1。

PCIe_AER5

回顾一下,前一篇文章中的当前错误指针(First Error Pointer)。假设该指针的值为18d, 则表明不可校正错误状态寄存器中的第18位对应的错误——异常的TLP(Malformed TLP)将会被最先处理。 一旦该错误被处理后,软件将会向不可校正错误状态寄存器的第18位写1,来清除该bit。然后,当前错误指针将会被更新到下一个值。

软件可以通过高级不可校正错误严重度寄存器(Advanced Uncorrectable Error Severity Register)来修改不可校正错误是否被作为致命的(Fatal)错误处理, 进而使得这些错误得到区分处理。如下图所示,其中,0表示非致命的(Non-Fatal),1表示致命的(Fatal)。

PCIe_AER6

高级不可校正错误屏蔽

高级不可校正错误评级寄存器如下图所示,当相关bit被置1时,对应的错误类型将不会被报告。

PCIe_AER7

配置空间中的高级错误报告结构中包含有一个4DW的子空间,用于缓存接收到的,发生不可校正错误的(未被屏蔽的)的TLP的包头。 PCIe Spec规定,当设备支持AER功能时,必须有能力至少缓存一个TLP包头(4DW)。当然,有些设备可能支持缓存更多的TLP包头。 该子空间被称为包头缓存寄存器(Header Log Register),其支持的错误类型如下图所示。

PCIe_AER8

在PCIe总线拓扑结构中,Root是所有其他PCIe设备错误报告的目标(Target)。 当Root接收到来自其他PCIe设备的错误消息(Error Message)后,Root会根据系统的参数设置选择是否向系统报告错误,并以何种方式(中断等)报告。

当Root接收到错误消息后,便会将Root错误状态寄存器中的对应位置位。需要注意的时,由于Root自身也是PCIe设备, 当其自身发生错误时,也会导致Root错误状态寄存器中的对应位置位,就像是其收到了错误消息了一样。该寄存器如下图所示:

PCIe_AER9

前面的文章介绍过,错误消息也是消息(Message)的一种。错误消息中包含了错误源设备的ID信息(BDF,Bus,Device and Function), 根据ID信息,便可以确定错误源的位置等信息,同时将该信息缓存在高级源ID寄存器中,如下图所示。

PCIe_AER10

可以通过Root错误命令寄存器(Root Error Command Register)的相关bit来使能或者禁止相关类型的错误是否被报告至系统。如下图所示:

PCIe_AER11

This post is licensed under CC BY 4.0 by the author.