文章目录
- [AER(Advanced Error Reporting)](#AER(Advanced Error Reporting))
- [aer_layer=Transaction Layer 的含义](#aer_layer=Transaction Layer 的含义)
-
- [常见 Transaction Layer 错误类型](#常见 Transaction Layer 错误类型)
- [aer_agent=Requester ID 的含义](#aer_agent=Requester ID 的含义)
-
-
- [Requester ID = 作为 TLP 发起者的设备 侦测到错误](#Requester ID = 作为 TLP 发起者的设备 侦测到错误)
-
- 日志示例解读
- [Requester ID 的意义 --- 如何定位设备?](#Requester ID 的意义 — 如何定位设备?)
- 在实际系统中的典型场景
-
-
- [DMA 发起非法访问](#DMA 发起非法访问)
- [RC 下发非法 TLP(Host 代码 Bug)](#RC 下发非法 TLP(Host 代码 Bug))
- [EP/RC 返回 Completion 异常](#EP/RC 返回 Completion 异常)
- [中间设备(PCIe Switch)校验失败](#中间设备(PCIe Switch)校验失败)
-
- 总结
AER(Advanced Error Reporting)
AER 是 PCIe 协议用于增强错误检测与报告的机制,主要用于捕捉:
-
链路级错误(Physical Layer)
-
数据链路级错误(Data Link Layer)
-
传输层错误(Transaction Layer)
-
协议违规(Protocol Violations)
-
TLP / DLLP 格式错误
当系统内核或 PCIe RC(Root Complex)侦测到错误时,会在 dmesg 或 AER trace 中打印:
makefile
AER: aer_layer=Transaction Layer, aer_agent=Requester ID
aer_layer=Transaction Layer 的含义
PCIe 是三层架构:
| 层级 | 作用 |
|---|---|
| Physical Layer | 电气、编码、SERDES |
| Data Link Layer (DLL) | ACK/NAK、重传、Sequence Number |
| Transaction Layer (TL) | 构造/解析 TLP,地址/命令协议,Completer 操作 |
所以 Transaction Layer 报错 表示:
错误发生在 PCIe TLP(Transaction Layer Packet)处理过程中,通常属于:
常见 Transaction Layer 错误类型
| 错误类型 | 说明 |
|---|---|
| Malformed TLP | TLP 格式非法(Header 无效、长度错误) |
| Unsupported Request | 接收到对端不支持的请求 |
| Completer Abort (CA) | Device 无法完成请求 Completioin |
| Completion Timeout (CTO) | 没收到 Completion,超时 |
| Unexpected Completion | 未请求却收到 Completion |
| Poisoned TLP (EP-bit) | TLP 被标记为 EP(poisoned) |
| ACS Violation | 隔离检查失败 |
当 aer_layer=Transaction Layer,就说明:
错误不是链路物理问题,而是协议级(TLP)的问题
通常与 Host、RC、Endpoint 的 TLP 处理有关。
aer_agent=Requester ID 的含义
AER 日志中会告诉你是哪一个"Agent"检测到错误:
| aer_agent | 含义 |
|---|---|
| Requester ID | 发起 TLP 的设备发现错误 |
| Completer ID | 作为 Completion 处理者的设备发现错误 |
| Receiver ID | 接收该 TLP 的设备检测到错误 |
| Transmitter ID | 发送该 TLP 的设备发现错误 |
其中:
Requester ID = 作为 TLP 发起者的设备 侦测到错误
Requester ID 在 PCIe 中代表:
vbnet
Bus:Device.Function of the device that initiated the request
解释:
-
此错误来源于 发起 TLP 的设备(Requester)
-
Requester 在收到 Peer/RC 返回的 Completion 或 DLL 错误指示时,发现了问题
-
因此 TLP 生命周期中,Requester 认为"我发出去的请求出现了异常"
日志示例解读
例如:
vbnet
AER: Corrected error received: id=00e0
AER: aer_layer=Transaction Layer
AER: aer_agent=Requester ID
AER: status=0x00000040 (Unsupported Request)
解释:
-
Transaction Layer → 收到的 Completion 或响应 TLP 在协议层非法
-
Requester ID → 错误是发起访问的一方(通常是 RC 或 EP endpoint DMA)发现的
-
Unsupported Request → 对端设备不支持此请求,返回 UR
此错误一般来源于:
-
DMA 发起无效地址访问
-
RC 下发了 EP 不支持的 TLP(如 I/O 访问)
-
TLP Format/Type 不符合规范
-
访问 BAR 未启用或窗口越界
Requester ID 的意义 --- 如何定位设备?
Requester ID 通常会打印为:
ini
id=00e0
PCIe ID 编码(PCI config space header)为:
javascript
Bits [15:8] = Bus Number
Bits [7:3] = Device Number
Bits [2:0] = Function Number
例:
ini
id=00e0 → Bus 00, Device 0x1c (28), Function 0
你可以用:
nginx
lspci -s 00:1c.0 -vvv
查看相关设备。
在实际系统中的典型场景
以下为常见导致 Transaction Layer + Requester ID 的情况:
DMA 发起非法访问
-
DMA Engine 发出的地址超出 BAR
-
未设置 IOMMU,虚拟地址非法
-
访问 RC 不允许的空间(如 PCIe 配置空间)
RC 下发非法 TLP(Host 代码 Bug)
-
内核驱动读写未映射地址
-
访问未启用的 BAR
-
I/O Space 访问 EP 不支持导致 UR
EP/RC 返回 Completion 异常
-
EP 返回了 Malformed TLP
-
Completion Lost 或 Timeout
中间设备(PCIe Switch)校验失败
-
Switch 判定 TLP 格式错误
-
ACS/ATS 请求不被允许
总结
| 字段 | 意义 |
|---|---|
| aer_layer=Transaction Layer | 错误发生在 PCIe 事务层(TLP 协议级错误) |
| aer_agent=Requester ID | 发起 TLP 的设备(DMA/RC/EP)发现错误 |
因此:
该 AER 日志表示:发起 PCIe 请求的设备在处理返回的 Completion 或协议时发现 TLP 错误。
多数情况由 非法访问、UR、格式错误、Completion Timeout 导致。