PCIe复位机制(FLR)

本文介绍了PCIe总线自V2.0加入的功能层复位(FLR)功能,该功能针对支持多功能的PCIe设备,可对特定Function复位。软件可查询设备功能寄存器判断是否支持,通过设备控制寄存器产生FLR。还说明了FLR的复位范围、完成时间、状态特性及进入状态后的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCIe总线自V2.0加入了功能层复位(Function Level Reset,FLR)的功能。该功能主要针对的是支持多个功能的PCIe设备(Multi-Fun PCIe Device),可以实现只对特定的Function复位,而其他的Function不受影响。当然,该功能是可选的,并非强制的,软件可以通过查询配置空间中的设备功能寄存器(Device Capability Register)来查询该PCIe设备是否支持FLR。如下图所示:

并可以通过设备控制寄存器(Device Control Register)中的将Initiate Function Level Reset bit置1,来产生FLR。

FLR只复位对应Function的内部状态和寄存器(使其暂时不变化,Making it quiescent),但是并不影响Sticky bits、有硬件初始化的值(Hardware-initialized bits)和链路专用寄存器(比如Captured Power,ASPM Control、Max Payload Size以及VC等寄存器)。如果该设备在FLR前,发出了Assert INTx中断消息,必须在开始FLR之前在发出对应的Deassert INTx消息,除非该INTx已经被与其他Function共享了。当收到FLR后,该Function的所有的其他功能都应被立即停止(Required to cease)。

此外,PCIe Spec还明确给出了FLR的完成时间应在100ms以内。

PCIe Spec还明确规定了,当某个Function处于FLR状态时的一些特性:

· 该Function不能有任何与外界通信的(外部)接口;

· 该Function必须将任何软件可读取的状态(可能包括加密信息等)打乱。换句话说,任何内部存储都必须被清零或者随机化;

· 该Function必须可以被另一个Diver配置为一般模式;

· 该Function必须为其收到的包含有FLR信息的配置写(Configuration Write)返回一个Completion,然后再进行FLR操作。

在进入FLR状态后,还需要:

· 该Function接收到的任何请求都应该被直接丢弃,且不登记(Logging),也不报错误。但是FC Credits必须要被更新,以维持链路的正常操作;

· 该Function接收到的任何Completion都应该被当做Unexpected Completions,然后直接丢弃,且不登记,也不报错。

### PCIe总线的复位机制与实现方法 PCIe(Peripheral Component Interconnect Express)总线定义了多种复位机制,以确保在不同场景下能够可靠地初始化设备或恢复链路状态。复位操作可以分为**全局复位**、**热复位**和**功能级复位(FLR)**等类型。 #### 全局复位(Global Reset) 全局复位是一种影响整个PCIe设备的复位方式。该复位通常由系统电源管理或平台固件触发,用于初始化整个设备或从严重错误中恢复。这种复位会清除设备的所有寄存器状态,并将设备恢复到初始上电状态。全局复位通常通过硬件信号(如PERST#)实现,该信号被拉低一定时间后释放,从而触发设备的复位流程[^3]。 #### 热复位(Hot Reset) 热复位仅作用于PCIe链路层,不影响设备的电源状态。它通常用于重新协商链路宽度和速率,或者在链路训练失败后尝试恢复通信。热复位可以通过软件向PCIe配置空间中的Link Control寄存器写入特定位来触发。当热复位生效时,链路两端的设备会重新进行物理层同步和训练,以建立稳定的通信通道。这种方式不会影响设备的功能寄存器内容,因此可以在不中断系统运行的情况下完成链路重置[^2]。 #### 功能级复位(Function Level Reset, FLR) 功能级复位是一种粒度更细的复位方式,允许单独复位设备的某个功能(Function)。该机制通过向PCIe扩展能力结构中的FLR控制寄存器写入特定值来启动。FLR会将指定功能的寄存器恢复到初始状态,但不会影响设备的其他功能或链路状态。该复位方式常用于虚拟化环境中,使得多个虚拟机共享同一个物理设备时,能够独立地复位各自的资源分配[^1]。 #### 实现方法 在硬件层面,复位信号如PERST#通常由主板上的芯片组或专用复位控制器驱动。这些信号通过金手指与PCIe插槽连接,确保在设备插入或拔出时能正确触发复位逻辑。此外,PRSNT1#和PRSNT2#引脚用于检测设备是否存在,并且其金手指长度较短,确保在插入或拔出过程中有适当的延时,以便系统软件处理热插拔事件[^3]。 在软件层面,操作系统通过访问PCIe配置空间中的相关寄存器来控制热复位和FLR操作。例如,热复位可通过设置Link Control寄存器中的Hot Reset位来发起;而FLR则需要访问扩展能力结构中的特定寄存器,并等待复位完成的确认信号。 ```c // 示例:触发功能级复位(FLR)的伪代码 void trigger_flr(int bus, int device, int function) { uint32_t cap_ptr = read_config_dword(bus, device, function, 0x34); // 获取扩展能力指针 while (cap_ptr != 0) { uint16_t cap_id = read_config_word(bus, device, function, cap_ptr); if (cap_id == PCI_EXP_CAP_ID_FLR) { // 检查是否为FLR能力结构 uint16_t flr_control = read_config_word(bus, device, function, cap_ptr + 0x02); flr_control |= 0x01; // 设置FLR触发位 write_config_word(bus, device, function, cap_ptr + 0x02, flr_control); // 等待FLR完成 do { flr_control = read_config_word(bus, device, function, cap_ptr + 0x02); } while ((flr_control & 0x01) != 0); break; } cap_ptr = (cap_ptr >> 8) & 0xFF; // 移动到下一个能力结构 } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值