pcie 错误如何报告给 root 联合体?

How does pcie errors are reported to root complex?

假设一个 pci express 设备实现了 AER 功能以进行可靠的错误报告。因此,只要设备拦截到此类错误,它就会相应地填充其 AER 寄存器。这个错误将如何报告给root complex?我在规范中读到此类错误将通过“消息 TLP”报告。此“消息 TLP”是否意味着将触发 MSI 以向根复合体发送指示?同样的机制也用于报告 other/non AER 错误吗?

PCI-Express 错误通过称为消息请求(缩写为 Msg)的特定类型的 TLP(事务层数据包)报告。 Msg 是一种通用 TLP,用于多种用途(PCI 兼容性中断信号、电源管理、热插拔信号等,以及错误信号),并且与其他 TLP 类型(内存读取请求、内存写入请求、完成、配置 read/write,等等)。

错误消息 TLP 是来自检测到错误的设备的消息,指定检测到的错误 class 以及在哪个设备中检测到。发送设备可以通过多种不同的方式指定 Msg TLP 路由。其中一种方法是 "Route to root complex",它指示任何中间组件(例如交换机(网桥))将 TLP 上游转发到根联合体。错误详细信息记录在特定设备的 AER 功能中(如果它实现了一个——大多数 PCI-E 设备都这样做),然后一个 Msg 信号错误被向上游发送到根复合体。

到达根复合体后,有两种方法可以向平台报告错误。

  1. 如果在 PCI Express 能力的根联合体的根控制寄存器中启用,它可以被报告为 "system error"(这是 PCI- 和 PCI-X 兼容机制)。系统错误的具体处理方式因平台而异。在典型的 x86 机器上,无法纠正的错误会导致机器检查异常。 (主板上通常有一种机制可以在事件日志中记录发生的事情,之后软件可以访问这些事件日志。另请参阅此 link 了解更多信息:https://askubuntu.com/a/608156/470836
  2. 根联合体还可以通过 MSI 生成中断,如果在根联合体的根命令寄存器(根的 AER 能力的一部分)中启用的话。我不认为这是经常使用的。

"non-AER errors" 的错误并没有真正不同 class。但是,设备不必实现 AER 功能。在那种情况下,"Devices that do not support the Advanced Error Reporting capability log only the Device Status register bits indicating that an error has been detected." 因此错误的详细信息将会丢失。