4. Hot Reset 与 Conventional Reset 的区别:Cold Reset、Warm Reset、Hot Reset、Function Level Reset 对比
在 PCIe 协议中,复位机制是链路初始化和错误恢复的基础。不同的复位类型作用于不同的硬件层级,对链路状态、配置空间和功能行为的影响也各不相同。理解 Cold Reset、Warm Reset、Hot Reset 和 Function Level Reset (FLR) 的区别,是掌握链路重新训练和状态机转换的前提。
4.1 复位类型概览
PCIe 定义了四种主要的复位类型,按作用范围和触发方式可分为两大类:Fundamental Reset(基础复位)和 Non-Fundamental Reset(非基础复位)。
- Cold Reset:属于 Fundamental Reset,由系统上电或主电源(Vmain)从无效到有效触发。
- Warm Reset:属于 Fundamental Reset,由硬件逻辑(如平台复位信号 PERST#)在电源稳定的情况下触发。
- Hot Reset:属于 Non-Fundamental Reset,通过链路传输 TS1 或 TS2 有序集(Ordered Sets)中的 Hot Reset 位触发。
- Function Level Reset (FLR):属于 Non-Fundamental Reset,通过软件写配置空间中的设备控制寄存器触发,仅复位单个 Function。
关键概念: Fundamental Reset 会复位整个设备(包括物理层、数据链路层和事务层),而 Non-Fundamental Reset 通常只复位特定逻辑或功能,链路状态可能保持或重新训练。
4.2 四种复位类型的详细对比
下表从触发源、作用范围、链路状态影响、配置空间行为以及典型应用场景五个维度进行对比:
| 对比维度 | Cold Reset | Warm Reset | Hot Reset | Function Level Reset (FLR) |
|---|---|---|---|---|
| 触发源 | 主电源 Vmain 上电 | PERST# 信号断言 | 链路对端发送 TS1/TS2 有序集 | 软件写配置空间寄存器 |
| 作用范围 | 整个设备(所有 Function) | 整个设备(所有 Function) | 整个链路(所有连接设备) | 单个 Function |
| 链路状态 | 进入 Detect 状态 | 进入 Detect 状态 | 进入 Recovery 状态,然后重新训练 | 链路状态不变(可能进入 L0s) |
| 配置空间 | 全部复位为默认值 | 全部复位为默认值 | 保留(Sticky 位除外) | Function 特定寄存器复位 |
| 典型场景 | 系统开机 | 平台复位、热插拔 | 错误恢复、链路重训练 | 设备驱动重置、虚拟化 |
工程师提示: Hot Reset 是唯一一种通过链路协议触发的复位,它不会切断电源,也不会复位 Sticky 寄存器(如链路状态寄存器中的某些错误计数位)。这使得 Hot Reset 非常适合在链路错误后快速恢复,而无需重新枚举整个总线。
4.3 Hot Reset 与 Conventional Reset 的流程对比
为了更直观地理解 Hot Reset 与其他复位在链路状态机中的路径差异,下图展示了从触发到链路重新训练的关键流程:
4.4 Function Level Reset (FLR) 的特殊性
FLR 是 PCIe 协议中较晚引入的复位机制(从 PCIe 1.1 开始支持),它与其他三种复位有本质区别:
- 作用粒度最小:只复位一个 Function 的内部状态,不影响同一设备中的其他 Function,也不影响链路状态。
- 软件触发:通过写配置空间中的 Device Control 2 寄存器(偏移 0x48)的 Initiate Function Level Reset 位实现。
- 链路保持:FLR 期间链路可以保持在 L0 或 L0s 状态,对端设备无感知。
- 典型应用:在虚拟化环境中重置单个虚拟功能(VF),或在驱动卸载时清理设备状态。
注意事项: FLR 不会复位 Sticky 寄存器(如 Advanced Error Reporting 中的某些位),也不会复位链路训练和状态机状态。如果需要在 FLR 后重新训练链路,必须由软件显式触发 Hot Reset 或链路禁用/启用序列。
4.5 复位类型选择指南
在实际系统设计中,选择合适的复位类型取决于具体需求:
- 系统级初始化:使用 Cold Reset 或 Warm Reset,确保所有设备从已知状态开始。
- 链路错误恢复:优先使用 Hot Reset,因为它不会复位 Sticky 寄存器,可以保留错误统计信息,且恢复速度更快。
- 单个 Function 重置:使用 FLR,避免影响其他 Function 或链路。
- 热插拔事件:通常使用 Warm Reset(通过 PERST# 信号),配合链路训练完成设备枚举。
性能对比: Hot Reset 的 Recovery 状态转换时间通常在微秒级,而 Cold/Warm Reset 的 Detect 到 L0 完整训练可能需要毫秒级。在需要快速恢复的场景中,Hot Reset 是更优选择。