本文将mark下PCIe Error Message机制的相关notes,内容主要转载自Error message控制

Introduction

error signaling: One agent notifying another agent of an error either by (1) sending an error Message, (2) sending a Completion with UR/CA Status, or (3) poisoning a TLP.

PCIe Error Signaling Messages是一种带内(In-band)错误上报机制,通过专用的Message TLP(TLP Type is Msg)将错误信息从检测点传递给Root Complex,进而通知系统软件。

Error Signaling Messages are used to signal errors that occur on specific transactions and errors that are not necessarily associated with a particular transaction. These Messages are initiated by the agent that detected the error.

Message类型的TLP,使用隐式路由(Routed to Root Complex),即无论从拓扑中哪个设备发出,都会沿上行方向逐跳传递,最终到达Root Complex。

分类

流程

The initiator of the Message is identified with the Requester ID of the Message header. The Root Complex translates these error Messages into platform level events.

如果Root Port支持AER(Advanced Error Report),RC从message中提取Requester ID字段,并记录的Root port的Error Source Identification寄存器中,这个BDF号就是出错的设备。不过很多时候这个BDF是捕获不到的,或者出现多个错误,RC只能提取第一个错误的Requester ID。因此,需要driver遍历Root Port下的所有设备,检查哪些设备出现了错误。

如果Root Port支持AER,则收到error message(根据error code可以分为ERR_COR/ERR_NONFATAL/ERR_FATAL)或者Root port自己检查到对应错误时,会记录到Root Port的Root Error Status寄存器。

Error message从PCIe设备产生到路由到对应Root Por涉及一系列的控制寄存器和状态寄存器。

PCIe Error Message产生MSI中断

Root Port下面的设备或Root Port本身发生PCIe错误想产生MSI中断话,需要关注哪些寄存器呢?

整条链路上所有bridge的Bridge ctrl reg的SERR# bit

如果该bit没有使能,则bridge不会往上游转发下游的设备上报的error message。如果是Root port本身产生的错误的则不需要关注该bit。

整条链路上支持DPC的设备(DP和RP)是否使能了DPC

如果使能了DPC trigger enable,下游设备发送的ERR_FATAL或ERR_NONFATAL的error message会被DPC拦截。

整条链路上的所有PCIe设备的Device ctrl reg的对应bit是否使能

Device ctrl reg的低4bit是一个比较大的控制开关,分布控制ERR_COR message、ERR_NONFATAL message、ERR_FATAL message和Unsupported Request的发送。

Root port的Root error command reg对应bit是否为1

如果Root error command reg对应bit为1,则Root port本身或者Root port收到下游设备上报错误时才会产生中断。

Root Port的Root ctrl reg对应bit是否清零

如果Root ctrl reg对应bit没有清零,则会走左边的分支产生system error,对X86而言这是一条带外的pin。

整个链路上的PCIe设备error mask reg是否置1

如果error mask reg为1,则产生对应错误时,只会更新PCIe CAP的error status寄存器,不会产生error message。

Command寄存器的memory space enable bit和bus master enable bit是否为1,interrupt disable是否为1

MSI中断本质上是一个memory write请求,Command寄存器的memory space enable bit和bus master enable bit负责MSI中断的产生和转发。

Interrupt disable是禁止INTx中断。由于,INTx优先级比MSI中断要高,该bit需要禁止。

Root Port的MSI enable是否为1

Error message会路由到Root Port,如果想产生MSI中断,root port的MSI enable bit需要为1。


参考资料:

  1. Error message控制
  2. PCI Express® Base Specification Revision 5.0 Version 1.0