在 PCIe 总线开发或调试过程中,掌握不同的复位机制至关重要。PCIe 协议定义了四种复位类型:冷复位(Cold Reset)、暖复位(Warm Reset)、热复位(Hot Reset)以及功能级复位(Function Level Reset, FLR)。前三种在规范早期版本就已定义,统称为“传统复位(Conventional Reset)”,而 FLR 则是 PCIe 2.0 规范新增的复位方式。理解它们的差异与应用场景,能帮助开发者更精准地进行系统控制和故障排查。更多关于底层 计算机系统架构 的知识,欢迎在 云栈社区 交流探讨。
1. 传统复位(Conventional Reset)
传统复位包括冷复位、暖复位和热复位。其中,冷复位和暖复位又统称为基本复位(Fundamental Reset);而热复位是一种非基本的带内(In-band)复位,由上游设备通过链路以数据包的形式向下游传递。
基本复位会将设备的状态机、硬件逻辑、端口状态以及大多数配置寄存器都初始化为默认状态。唯一例外的是那些依靠辅电源 Vaux 供电的“粘性(Sticky)配置寄存器”,它们即使主电源关闭也能保持状态。
1.1 冷复位
冷复位是指设备主电源上电时触发的复位,系统重启电源同样会导致冷复位。这是最彻底的一种硬件复位方式。
1.2 暖复位
暖复位是在系统电源保持稳定(不关闭或重新施加主电源)的情况下,由硬件触发的复位。例如,按下机箱的复位按钮就会产生暖复位。它通过触发系统电源电路的 POWERGOOD 信号来实现。需要留意的是,PCIe规范 并未明确定义暖复位的具体产生机制。
基本复位可以通过以下两种方法生成:
- 通过边带信号 PERST# 产生。PERST#(PCI Express Reset,低电平有效)是 PCIe 系统中专门用于传递复位信号的边带引脚。
- PCIe 设备也可以设计为不依赖 PERST# 信号,而是自行在检测到主电源上电(或重新上电)时,内部产生基本复位信号来复位自身电路。
下图展示了一个通过边带信号 PERST# 产生基本复位的典型例子。

1.3 热复位
热复位,或称带内复位,其信号并非来自边带引脚,而是通过发送特定的 TS1 有序集(Ordered Set)在数据链路中传播。这是一种由软件发起的复位,并且只能由根复合体(Root Complex)或交换开关(Switch)产生,从上游端口向下游端口逐级传播,端点设备(Endpoint)不会主动产生热复位。
当某个 PCIe 设备出现异常时,软件可以通过热复位手段对其进行恢复。
软件触发热复位的方法如下:
当软件需要在根复合体或交换开关的某个端口上发起热复位时,只需向该端口配置空间头部区域中桥控制寄存器(Bridge Control Register) 的 Secondary Bus Reset 位写入 1。这个操作会导致相应端口的物理层生成一个 Assert Hot Reset 位为 1 的 TS1 有序集,并向下游传输。

设备对热复位的响应流程:
设备接收到热复位命令后,其链路训练与状态状态机(LTSSM)会先进入 Recovery 状态,随后转入 Hot Reset 状态,最后返回 Detect 状态,并重新开始完整的链路训练与初始化。此时,除粘性寄存器外,设备的所有状态机、硬件逻辑、端口状态和配置寄存器都将被重置为默认状态。
2. FLR复位(功能级复位)
FLR 机制使软件能够以 Function(功能) 为粒度来复位 PCIe 端点设备。这意味着它仅作用于目标 Function,而不会影响同一物理设备上其他 Function 的正常工作。
与基本复位不同,FLR 不会对设备进行彻底的重置(例如,PCIe 链路状态保持不变),因此其完成所需的时间远少于基本复位。
FLR 功能的实现对于设备而言是可选的,但 PCIe 规范强烈建议支持。软件可以通过检查设备的 Device Capabilities Register[28] 位是否为 1 来确认其是否支持 FLR。
软件发起 FLR 的方法:
软件向目标 Function 的 Device Control Register 中的 Initiate Function Level Reset 位写入 1,即可触发 FLR。规范要求该 Function 必须在 100ms 内完成复位操作。

FLR 主要复位对应 Function 的内部状态和相关寄存器(如总线主控使能 BME、MSI 使能寄存器等),但不会影响粘性位(Sticky bits)、由硬件初始化的值(Hardware-initialized bits)以及链路专用的寄存器。
PCIe 协议除了规定 FLR 需在 100ms 内完成外,还对软件发起流程提出了明确要求:
- 软件需与其他可能访问该 Function 的进程协调,确保在 FLR 期间无人尝试访问。
- 软件清空整个 Command 寄存器,以停止该 Function 发起任何新的请求。
- 软件通过轮询检查 Device Status 寄存器中的 Transactions Pending 位是否被清零,以确保之前所有请求的完成报文(Completion)均已返回。或者,等待足够长的时间(如果启用了完成超时,则等待超时;如果禁用,则至少等待 100ms)。
- 软件发起 FLR 复位(写 Initiate Function Level Reset 位为 1)。
- 软件等待 100ms。
- 软件重新配置该 Function,使其恢复正常工作。
重要注意事项:
- FLR 完成后,Transactions Pending 位必须被清零。
- Function 必须对触发 FLR 的配置写操作返回一个完成响应,然后才开始执行 FLR 复位操作。
- 在 FLR 复位期间接收到的任何完成报文,都会被当作 Unexpected Completions 处理或被直接丢弃,既不记录也不报错。
参考文档:
- PCI Express Base Specification Revision 5.0
- 《PCI、PCI-X和PCI Express的原理及体系结构》