Pcie的复位方式分为两种: conventional resetfunction level reset
》》》pcie总线提供多种复位方式的主要原因是减少设备的复位延迟,conventional reset的延时大于FLR,Fundamental reset中,cold reset > warrm reset > hot reset《《《
1. conventional reset
其中conventional reset包含了2种: Fundamental Reset,Non-Fundamental Reset,这两者的区别在于是否使用边带信号PERST#(PCI Express Rest)
1.1 Fundamental reset
分为cold reset/warm reset, 这种复位方式是最基本的复位方式,主要是通过硬件实现,从而达到重置整个设备的效果,这种复位方式会初始化所有与状态机相关的硬件逻辑,端口状态以及配置空间中的配置寄存器等。
1.2 Non-Fundamental reset
又称为 hot reset

Cold Reset: 设备的主电源 VCC 上电时(Vaux可以不用断), 就会触发 Cold Reset
Warm Reset: 在 VCC 不断电的情况下, 系统可以触发 Warm Reset

pcie设备热插拔 bios_nvme

  1. 一个系统上电时,主电源稳定后会有“power good”信号
  2. 如果ICH发PERST#信号给下面挂的PCIe SSD
  3. 如果系统重启,power good信号的变化会触发PERST#的assert和deassert,就可以实现pcie device的cold reset
  4. 如果系统可以提供power good信号以外的方法触发PERST#,就可以实现warm reset
  5. PERST#信号会发送给所有的pcie device

hot reset:

当pcie设备出现某种异常的时候,可以使用软件手段对该设备进行复位,能将pcie设备的多数寄存器和状态恢复为初始值

实现方式有三种:

通过assert TS1的Symbol5的bit[0]实现

pcie设备热插拔 bios_ci_02


连续两个带hot reset 的TS1OS后,经过2ms的timeout

链路训练状态机(LTSSM)的跳转:RECOVERY -> HOTRESET -> DETECT

对RC的Bridge control register bit[6]-- Secondary Bus Reset写“1”

pcie设备热插拔 bios_链路_03


Secondary Bus Reset写“1”后,RC会开始发hot reset的 TS1,2ms后设备进入hot reset的状态,LTSSM的状态转换:L0 -> RCVERY -> HOTRESET, Secondary Bus Reset清0后,LTSSM的状态 HOTRESET -> DETECT, 重新开始link training

设置device的link control register——link disable

pcie设备热插拔 bios_nvme_04

当Device的Link Disable bit被置上以后,会进入LTSSM Recovery State EP开始向RC发送带Disable bit的TS1 RC端收到这样的TS1以后,其物理层会发送LinkUp=0的信号给链路层,之后所有的Lane都会进入电气空闲状态 2ms timeout以后,RC会进入LTSSM Detect mode Device会一直停留在LTSSM的Disable状态

2. function level reset

通过填写某些寄存器完成FLR。主要针对的是支持多个功能的PCIe设备(Multi-Fun PCIe Device),可以实现只对特定的Function复位,而其他的Function不受影响系统软件。PCIe Spec还明确给出了FLR的完成时间应在100ms以内

FLR支持查询:

pcie设备热插拔 bios_链路_05


FLR控制:

pcie设备热插拔 bios_寄存器_06

与PCIe链路相关的状态和寄存器并不会被复位: Sticky bits HwIint类型的寄存器(Cold和Warm Reset可以复位这些寄存器,然后从EEPROM中从新获取数据) 特殊的配置寄存器不能被FLR方式复位,如Max_Payload_Size、RCB和一些与电源管理、流量控制和链路控制直接相关的寄存器。

PCIe Spec还明确规定了,当某个Function处于FLR状态时的一些特性:
· 该Function不能有任何与外界通信的(外部)接口;
· 该Function必须将任何软件可读取的状态(可能包括加密信息等)打乱。换句话说,任何内部存储都必须被清零或者随机化;
· 该Function必须可以被另一个Diver配置为一般模式;
· 该Function必须为其收到的包含有FLR信息的配置写(Configuration Write)返回一个Completion,然后再进行FLR操作。
在进入FLR状态后,还需要:
· 该Function接收到的任何请求都应该被直接丢弃,且不登记(Logging),也不报错误。但是FC Credits必须要被更新,以维持链路的正常操作;
· 该Function接收到的任何Completion都应该被当做Unexpected Completions,然后直接丢弃,且不登记,也不报错。