PCIe总线有三种错误报告方式,分别是:
1. Completions:通过Completion中的状态位向Requestor返回错误信息
2. Poisoned Packet(又称为错误传递,Error Forwarding):告知接收端当前TLP的Data Payload已经被破坏
3. Error Message(错误消息):向主机报告错误信息
前两种之前的文章都已经提及,本文主要介绍错误消息。错误消息的格式和对应的消息编码如下所示:
为了兼容PCI总线的错误报告机制(使用PERR#和SERR#),PCIe设备会自动将CA、UR和Poisoned TLP转换为对应的错误信息。具体这里就不详细介绍了,有兴趣的可以自行阅读PCIe Spec的相关章节。
PCIe设备的配置空间中的状态与控制寄存器如上图所示,通过这些寄存器可以使能(或禁止)通过错误消息(Error Message)发送错误报告、查询错误状态信息,以及链路训练和初始化状态等。
前面的文章介绍过,默认的错误分类如下表所示:
这些错误类型可以通过设备控制寄存器(Device Control Register)中的相关位,进行使能或者禁止:
也可以通过设备状态寄存器(Device Status Registers)相关位查询错误状态:
当然,当Root接收到错误消息后,怎么处理还要取决于Root Control Register的设置:
链路错误(Link Errors)一般发生在物理层与数据链路层通信的过程中。对于Downstream的设备,如果链路上发生了Fatal错误,此时,该设备并不能够向Root报告错误。这种情况下,需要Upstream设备向Root来报告错误。为了消除链路错误,一般需要对链路进行重新训练(Retrain)。如下图所示,在链路控制寄存器中,可以通过往Retrain Link这一位写1,来强制进行链路重训练。
当发起重训练请求后,软件可以检查链路状态寄存器(Link Status Register)中的Link Training位,来确认链路训练是否已经完成,如下图所示。当该位为1时,表明链路训练尚未完成(或者还没有开始),如果链路训练已经完成,硬件会自动将该位清零。
PCIe总线的错误登记与报告的流程图如下图所示:
没有回复内容