下表为PCIe协议中给出的错误:
一、可纠正错误(Correctable Errors,8种)
检错机制
错误名称 | 检测层级 | 触发条件 |
---|---|---|
Receiver Error | Physical | 接收端均衡器(EQ)监测到眼图闭合/信号失真 |
Bad TLP | Link | LCRC校验失败 或 序列号不连续 |
Bad DLLP | Link | DLLP类型非法(如无效流控包)或控制字段错误 |
Replay Number Rollover | Link | 重放计数器达到最大值(0x3FF) |
Replay Timer Timeout | Link | 未收到ACK响应时间超过16μs(PCIe 3.0+) |
Advisory Non-Fatal | Transaction | TLP保留位非零、长度字段轻微异常(未导致功能失效) |
Corrected Internal | Device | 内部ECC/奇偶校验纠正缓存或寄存器错误 |
Header Log Overflow | Transaction | AER包头日志寄存器溢出(日志深度不足) |
解决方案
graph LR
A[物理层错误] --> B[触发LTSSM重训练]
C[链路层错误] --> D[NAK响应 + 重放缓冲区重发]
E[事务层错误] --> F[丢弃TLP + 更新AER日志]
G[设备内部错误] --> H[静默更新DevStatus寄存器]
二、不可纠正非致命错误(Uncorrectable Non-Fatal,10种)
检错机制
错误名称 | 检测层级 | 触发条件 |
---|---|---|
Poisoned TLP Received | Transaction | TLP头部EP位=1(发送端标记数据无效) |
ECRC Check Failed | Transaction | 端到端CRC校验不匹配 |
Unsupported Request | Transaction | 非法地址空间访问/不支持的TLP类型(如向RO BAR写入) |
Completion Timeout | Transaction | Requester等待完成包超时(默认50ms) |
Completer Abort | Transaction | Completer内部故障无法处理请求 |
Unexpected Completion | Transaction | 完成包与未完成请求无映射关系 |
ACS Violation | Transaction | 违反访问控制规则(如Endpoint间禁止通信) |
MC Blocked TLP | Transaction | 多播包被交换机路由过滤 |
AtomicOps Egress Blocked | Transaction | 原子操作(AtomicOp)超出设备处理能力 |
TLP Prefix Blocked | Transaction | 收到设备不支持的前缀类型(如IDE/TS前缀) |
解决方案
- 通用处理流:
- 立即中止当前事务
- 向Root Complex发送 ERR_NONFATAL 消息
- 更新AER状态寄存器(Uncorrectable Error Status)
- 软件策略:驱动重试请求/资源释放/日志告警
三、不可纠正致命错误(Uncorrectable Fatal,7种)
检错机制
错误名称 | 检测层级 | 触发条件 |
---|---|---|
Uncorrectable Internal | Device | 不可恢复的内部硬件失效(如核心逻辑崩溃) |
Surprise Down | Link | 物理链路意外断开(LTSSM从L0直接跳至Detect) |
Receiver Overflow | Transaction | 接收缓冲区溢出(信用计数失效) |
DLL Protocol Error | Link | 数据链路层状态机违例(如ACK/NAK序列混乱) |
Flow Control Protocol | Transaction | 流控信用计数器异常(负值/死锁) |
Malformed TLP | Transaction | TLP格式严重违规(如长度=0但含负载) |
Receiver Overflow | Transaction | 接收队列过载导致数据丢失 |
解决方案
graph TB
A[链路层协议错误] --> B[强制链路复位 LTSSM→Detect]
C[事务层协议错误] --> D[立即丢弃包 + 触发ERR_FATAL]
E[设备级灾难错误] --> F[Function Level Reset FLR]
G[物理链路崩溃] --> H[OS热插拔协议重枚举]
四、纠正机制解析
1. 物理层自主恢复(LTSSM状态机)
- 错误场景:Receiver Error/Surprise Down
- 动作:
L0 → Recovery → Config.Lanenum → Loopback(测试) → 重新协商速率/通道数
2. 链路层重传协议(重放缓冲区)
- 触发条件:Bad TLP/Replay Timer Timeout
- 重传逻辑:
if (收到NAK || 超时未响应) { 从Replay Buffer提取历史TLP重新发送; 序列号SEQ_NUM维持不变; // 防止接收端重复处理 }
3. AER高级错误报告流程
-
关键寄存器:
寄存器 作用 Uncorrectable Error Status 记录非致命/致命错误位图 Header Log Register 保存错误TLP包头(前4 DW) Root Error Status RC汇总总线错误 -
软件处理:
1. 读取AER寄存器定位错误源; 2. 清空错误标志位; 3. 决策:重试/复位/禁用设备。
⚠️ 重要原则:致命错误发生后,设备必须通过FLR(Function Level Reset)复位,避免错误状态残留。FLR操作通过设置PCI配置空间Device Control Register的Initiate Function Reset位实现。
FLR(Function Level Reset,功能级复位)是PCIe协议中一种针对多功能设备(Multi-Function Device)的精细化复位机制,允许仅复位特定功能模块(Function)而不影响设备其他功能或链路状态。以下从定义、触发条件及使用方法三方面详细解析:
4.FLR的定义与核心特性
-
精准复位范围
- 仅复位目标Function的内部状态、寄存器及逻辑电路,不改变以下内容:
- Sticky Bits(如熔断器配置等需断电才能重置的寄存器)
- 硬件初始化寄存器(由芯片引脚或EEPROM固化的值)
- 链路相关寄存器(如ASPM控制、流量控制参数)
- 保持PCIe链路活跃状态,其他Function可继续通信。
- 仅复位目标Function的内部状态、寄存器及逻辑电路,不改变以下内容:
-
强制时间约束
- 规范要求FLR操作必须在 100ms内完成,超时视为失败。
-
安全隔离设计
- 复位期间丢弃所有传入TLP(事务层包),避免残留错误状态污染。
- 复位后需清除敏感信息(如加密密钥),防止数据泄露。
4.1FLR的触发条件
FLR主要用于解决设备内部功能模块级故障,典型场景包括:
触发场景 | 具体案例 |
---|---|
不可纠正的硬件错误 | 核心逻辑崩溃、缓存ECC不可纠正错误(如Uncorrectable Internal Error ) |
协议层致命错误 | 畸形TLP(Malformed TLP )、流控协议死锁(Flow Control Protocol Error ) |
软件栈重建需求 | 驱动异常需重置Function状态(如虚拟机热迁移前的资源清理) |
安全隔离要求 | 多租户场景下,确保前一用户数据不残留至新租户 |
💡 与传统复位的区别:
- 全局复位(Cold/Warm/Hot Reset):影响整个设备或链路,中断所有通信;
- FLR:精准靶向故障模块,最小化业务中断。
4.2 FLR的使用方法
步骤1:确认设备支持FLR
# 通过lspci检查设备能力(Capabilities寄存器bit28)
lspci -vvv -s <BDF> | grep "FLReset+"
# 输出示例: Capabilities: [60] Express (v2) FLReset+
步骤2:执行FLR复位流程
sequenceDiagram
participant OS as 操作系统
participant Dev as 目标设备
OS->>Dev: 写Device Control Register (0x08) bit15=1
Note right of Dev: 进入FLR状态(100ms内完成)
Dev-->>Dev: 清空内部状态/敏感数据
Dev-->>OS: 复位完成(状态寄存器更新)
OS->>Dev: 重新配置Function(BAR/MSI-X等)
关键操作细节:
- 暂停访问目标Function
- 复位前需确保无待处理事务(轮询
Device Status Register
的Transactions Pending
位直至清零)。
- 复位前需确保无待处理事务(轮询
- 触发FLR
// 伪代码:置位FLR触发位 pci_write_word(bdf, 0x08, pci_read_word(bdf, 0x08) | 0x8000);
- 等待复位完成
- 至少等待 100ms(规范要求)。
- 重新初始化Function
- 配置BAR空间、MSI/MSI-X中断、DMA引擎等。
4.3 注意事项
- 复位超时处理
- 若100ms后无响应,需升级至热复位(Hot Reset)或冷复位(Cold Reset)。
- 驱动兼容性
- 驱动程序需保存关键上下文(如DMA映射),复位后重建I/O队列。
- 虚拟化环境适配
- 虚拟机监控器(Hypervisor)需拦截FLR请求,确保物理设备状态同步。
4.4 FLR的核心价值
维度 | 传统复位 | FLR |
---|---|---|
复位粒度 | 设备/链路级 | Function级🔍 |
业务影响 | 全功能中断 | 仅故障模块暂停 |
恢复速度 | 慢(≥1s) | 快(≤100ms)⚡ |
适用场景 | 全局灾难性故障 | 局部模块错误/安全隔离 |
在数据中心与高可用系统中,FLR是实现故障隔离与快速自愈的关键技术。结合AER(高级错误报告)日志自动触发FLR,可显著提升系统可靠性。