PCIe扫盲——复位机制介绍(Fundamental & Hot)

本文深入探讨PCIe总线的四种复位机制:冷复位、暖复位、热复位和功能层复位。重点讲解了基于边带信号的基本复位方式,包括其对硬件逻辑和状态机的影响,以及Stickybits的特殊作用。此外,还介绍了热复位的触发机制及对PCIe设备状态的影响。

转载地址:http://blog.chinaaet.com/justlxy/p/5100057844

PCIe总线中定义了四种复位名称:冷复位(Cold Reset)、暖复位(Warm Reset)、热复位(Hot Reset)和功能层复位(Function-Level Reset,FLR)。其中FLR是PCIe Spec V2.0加入的功能,因此一般把另外三种复位统称为传统的复位方式(Conventional Reset)。其中冷复位和暖复位是基于边带信号PERST#的,又被统称为基本的复位方式(Fundamental Reset)。

基本复位由硬件自动处理,会复位整个PCIe设备,初始化所有与状态机相关的硬件逻辑,端口状态以及配置空间中的配置寄存器等等。但是,也有一个例外,就是前面介绍PCIe错误报告机制的相关文章中提到过Sticky(不受复位影响)的概念。这里指的不受复位影响的前提是,PCIe设备的电源并未被完全切断。Sticky这一功能有助于系统定位错误与分析错误起因。

基本复位中的冷复位(Cold Reset)指的是因为主电源断开后重新连接导致的复位。需要注意的是,即使主电源断开了,如果PCIe设备仍有辅助电源Vaux为其供电,该复位仍不会影响到Sticky的bits。

PCIe Spec允许两种实现基本复位的方式。一是直接通过边带信号PERST#(PCI Express Reset);二是不使用边带信号PERST#,PCIe设备在主电源被切断时,自行产生一个复位信号。一个简单的例子如下图所示:

image.png

暖复位(Warm Rest)是可选的,指的是在不关闭主电源的情况下,产生的复位。然而,PCIe Spec并未明确规定暖复位的产生机制,因此,如果产生暖复位完全是由系统设计者决定的。

热复位(Hot Reset)是一种In-band 复位,其并不使用边带信号。PCIe设备通过向其链路(Link)相邻的设备发送数个TS1 Ordered Set(其中第五个字符的bit0为1),如下图所示。这些TS1OS在所有的通道(Lane)上同时发送,并持续2ms左右。

image.png

注:关于Ordered Set以及LTSSM等相关内容,请参考前面介绍链路初始化与训练的相关文章。

主要注意的是,如果Switch的Upstream端口收到了热复位,则会将其广播至所有的Downstream端口,并复位其自己。如果PCIe设备的Downstream端口接收到热复位,则只需要复位其自己即可。

当PCIe设备接收到热复位后,LTSSM会进入Recovery and Hot Reset状态,然后返回值Detect状态,并重新开始链路初始化训练。其该PCIe设备的所有状态机,硬件逻辑,端口状态和配置空间中的寄存器(除了Sticky bits)都将被初始化值默认状态。

软件可以通过向桥设备的,特定端口的配置空间中的二级总线复位(Secondary Bus Reset)bit先写0再写1,来产生热复位,如下图所示:

image.png

需要注意的是,如果软件设置的是Switch的Upstream端口的二级总线复位bit,则该Switch会往其所有的Downstream端口广播热复位信号。而PCIe-to-PCI桥则会将接收到的热复位信号转换为PRST#置位,发送给PCI设备。

二级总线复位(Secondary Bus Reset)bit在配置空间的位置如下图所示:

image.png

PCIe Spec还允许软件禁止某个链路(Link),强制使其进入电气空闲状态(Electrical Idle)。如果将某个链路禁止,则该链路所有的下游PCIe设备都将收到链路禁止信号(通过TS1OS,如下图所示)。

image.png

### PCIe 复位信号解释与故障排查 PCIe(Peripheral Component Interconnect Express)是一种高速串行总线协议,广泛用于现代计算机系统中。复位信号在PCIe通信中起着至关重要的作用,用于初始化设备并确保其进入已知状态。PCIe复位机制主要包括**基本复位Fundamental Reset)**和**功能级复位(Function Level Reset, FLR)**两种类型。 基本复位通常由硬件触发,例如通过**PERST#**信号实现。该信号为全局复位信号,用于将整个PCIe设备恢复到初始状态。当该信号被拉并释放后,设备会重新初始化其配置空间和链路状态。基本复位常用于系统启动或设备热插拔场景中[^1]。 功能级复位则是一种更细粒度的复位方式,仅影响特定功能(Function),不会影响整个设备的其他功能模块。该复位方式通过向配置空间的**Command寄存器**写入特定值来触发,适用于设备驱动程序需要重新初始化某个功能而不影响其他功能的情况。 #### 常见的PCIe复位信号问题及排查方法 1. **复位信号未正确拉高或拉** 在硬件设计中,PERST#信号的驱动能力和时序必须满足PCIe规范。若该信号未能正确拉高(释放复位)或拉(触发复位),将导致设备无法正常初始化。可通过示波器检测PERST#引脚的电平变化,并确认其是否符合PCIe复位时序要求。 2. **复位信号延迟不足** PCIe设备在复位后需要一定时间完成内部初始化。若系统在复位释放后立即访问设备配置空间,可能会导致访问失败。可在驱动程序或固件中添加适当的延迟,确保设备有足够时间完成初始化。 3. **BIOS/UEFI未正确处理复位信号** 在系统启动过程中,BIOS/UEFI负责初始化PCIe设备。若BIOS未正确配置复位信号或未等待设备初始化完成,可能导致设备无法识别。可通过更新BIOS或修改相关配置(如复位延迟设置)解决该问题。 4. **操作系统驱动程序未正确触发FLR** 在某些情况下,操作系统可能无法正确执行功能级复位,导致设备状态异常。例如,Linux系统中可通过`echo 1 > /sys/bus/pci/devices/0000:xx:xx.x/reset`命令手动触发FLR,用于排查驱动程序是否支持该功能。 5. **硬件设计中复位信号路径存在干扰或竞争** 在高速电路设计中,复位信号的布线不当可能导致信号完整性问题,进而影响设备正常复位。应确保复位信号线远离高速时钟线,并采用适当的端接电阻和去耦电容。 #### 示例代码:在Linux中手动触发FLR 以下是一个在Linux系统中手动触发功能级复位的示例命令: ```bash echo 1 > /sys/bus/pci/devices/0000:01:00.0/reset ``` 该命令会向指定PCIe设备的功能模块发送复位信号,常用于调试或恢复设备状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值