【PCIe】reset机制

1 reset概述
reset就是为了让寄存器恢复到初始状态。设备寄存器分为静态寄存器(不可改变的)和动态寄存器(可改变的)。静态寄存器的恢复到初始状态只能通过断电来完成,也叫做cold reset。动态寄存器的恢复到初始状态可以通过想reset寄存器写值来完成动态寄存器的恢复,也叫做hot reset。

PCIE device的reset,会按照不同的层次,程度从浅到深(flr < hot < warm < cold),不断升级,哪个层次的reset执行成功就直接返回,不需要执行更深层次的reset。

在这里插入图片描述
这些Reset之间是从属关系, 总线规定了两个复位方式:Conventional Reset和FLR(Function Level Reset),而Conventional Reset由进一步分为两大类:Fundamental Reset和Non-Fundamental Reset。Fundamental Reset方式包括Cold和Warm Reset方式,可以将PCIe将设备中的绝大多数内部寄存器和内部状态都恢复成初始值;而Non-Fundamental Reset方式为Hot Reset方式。(PCIe spec V4.0 6.6)

在这里插入图片描述
在这里插入图片描述
1.1 Cold Reset

Cold Reset复位是一种彻底的复位方式,属于Fundamental Reset,它使用的时间最长。

PCIe设备使用两种电源信号供电,分别是Vcc和Vaux,其额定电压为3.3V。其中Vcc是主电源,PCIe设备使用的主要逻辑模块均使用Vcc供电,而一些与电源管理相关的逻辑使用Vaux供电。当一个PCIe设备的Vcc电源供电后,处理器将设备的PERST信号置为有效,引发PCIe设备的复位操作,这种方式就是Cold Reset方式。

PCIe设备进行Cold Reset时,所有使用Vcc进行供电的寄存器和PCIe端口逻辑将无条件进入初始状态,但是无法复位使用Vaux供电的寄存器和逻辑,这部分辅助电源的功能只能在处理器完全下电才能被复位。

1.2 Warm Reset

在PCIe设备完成上电过程后,可能重新进行Fundamental Reset,无需移除供电或重新向组件供电,此时这种功能称为Warm Reset。比如:常用的看门狗复位Watchdog逻辑,对PCIe设备进行复位,这就是一种典型的Warm Reset方式。

1.3 Hot Reset

当PCIe设备出现某种异常时,可以使用软件手段对该设备复位,这种方式称为Hot Reset。这是一种带内的机制用于在链路上传播Fundamental Reset。比如:PCIe总线可以通过TS1和TS2序列对下游设备进行Hot Reset。在TS1和TS2序列中包含一个Hot Reset位。当下游设备收到一个TS1和TS2序列,且Hot Reset位为1时,使用Hot Reset方式进行复位操作。

在这里插入图片描述
1.4 FLR

系统软件通过寄存器控制方式,使用FLR方式进行复位。支持FLR方式的PCIe设备需要在其Bar空间提供一个寄存器,当系统软件对寄存器的Function Level Reset置为1,PCIe设备使用FLR方式复位PCIe设备的内部逻辑。

当PCIe设备使用FLR方式复位时,有些PCIe链路相关的状态和寄存器是不会被复位的,具体如下:

Sticky Register,这些只用当Vaux辅助电源移除后,寄存器中保存的数值才会被复位;
HwInit类型的寄存器,这些寄存器的数值通过芯片配置或者上电有外部存储器件获取,使用FLR方式无法复位这些寄存器;
一些特殊配置的寄存器不能被FLR方式复位,比如Max_Payload_Size、与电源管理、流量控制和链路控制直接相关的寄存器都不能复位;
FLR方式不会影响LTSSM状态机。
1.5 sticky register

在PCIe设备中,一些特殊的寄存器通常使用Vaux供电,比如sticky register(ROS, RWS, RW1CS),此时即使PCIe的Vcc被移除,这些于电源管理相关的逻辑状态和这些特殊寄存器的内容也不会发生变化。

在这里插入图片描述
1.6 reset完成时间

1.6.1 Conventional Reset

在这里插入图片描述
1.6.2 FLR的完成时间

按照spec, FLR的完成时间是在100ms以内。

在这里插入图片描述
2 hot reset

#!/bin/bash

dev=0000:0a:00.0
port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$dev")))
if [ ! -e "/sys/bus/pci/devices/$port" ]; then
	echo "Error: device $port not found"
	exit 1
fi

echo "Removing $dev..."
echo 1 > "/sys/bus/pci/devices/$dev/remove"

echo "Performing hot reset of port $port..."
bc=$(setpci -s $port BRIDGE_CONTROL)
echo "Bridge control:" $bc

setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $((0x$bc | 0x40)))  //set brige control reg, bit 6
sleep 0.01
setpci -s $port BRIDGE_CONTROL=$bc
sleep 0.5
echo "Rescanning bus..."
echo 1 > "/sys/bus/pci/devices/$port/rescan"


解析:
BRIDGE_CONTROL=0000
setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $((0x$bc | 0x40))) //set brige control reg, bit 6
BRIDGE_CONTROL=0040

方法二:
 dev=0000:0a:00.0
 port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$dev"))) ;
 [ -e "/sys/bus/pci/devices/$port" ] && {
            bc=$(setpci -s $port BRIDGE_CONTROL)
            setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $((0x$bc | 0x40)))
            sleep 0.01
            setpci -s $port BRIDGE_CONTROL=$bc
            sleep 0.5
  }

在这里插入图片描述
3 FLR
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,然后直接丢弃,且不登记,也不报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值