*故事前传 *系统复位(System Reset) 一、故事前传 前面的文章针对PCIe的一部分内容已经做了解析。
二、系统复位(Reset) 在PCIe Spec中,Reset总共分为两类:Conventional Reset和Function Level Reset. 1. Conventional Reset 从字面上来讲,Conventional Reset是传统的Reset方式。这一类Reset功能是在PCIe Spec 2.0之前的Spec中定义的,所以称为传统的Reset。PCIe设备必须要支持这一类Reset。 Convential Resets包含了三种Resets: Cold Reset,Warm Reset 和 Hot Reset. 另外,还有一个概念: Cold Reset和Warm Reset又被称为Fundamental Reset, Hot Reset被称为Non-Fundamental Reset. 什么是Fundamental Reset呢? 这是PCIe最基本的复位方式,主要通过硬件实现,效果是重置整个设备,对每个状态机、所有硬件逻辑、端口状态和配置寄存器重新初始化。
一般来说,Fundamental Reset是针对整个系统做Reset,但是有时也可以针对某个单一设备进行重置。 在这里说明一下Fundamental Reset中的Cold Reset和Warm Reset。
另外,在PCIe Spec中,规定了两种触发Fundamental Reset方式。
举个例子,看看PERST#是如何生成的。
明白了Fundamental Reset,那Non-Fundamental Reset中的Hot Reset又是什么呢? 与Fundatmental Reset相反,Hot Reset是一种软件控制的复位方式。PCIe设备出现错误时,通常情况下用软件的方式对设备重置。软件可以通过在Bridge control中设置Secondary Bus Reset bit来触发Hot Reset. 另外,在PCIe总线中,通过发送TS1序列,并且在TS1序列中设置Hot Reset bit来对下游设备进行Hot Reset(如下图红色框).
同样,举个例子说明一下Hot Reset:
2. Function Level Reset 在传统复位方式的基础上,PCIe Sepc 2.0以后开始增加了新的复位方式FLR(Function Level Reset)。前面讲到的传统复位方式(Cold Reset, Warm Reset, Hot Reset)均属于全局复位方式,而FLR的优势则是对局部复位。 在PCIe协议中,一个PCIe设备可能包含多个功能模块(Function),每个功能模块相互对立,共用一个PCIe link。其中,某个功能模块出问题时,虽然可以采用传统复位方式对整个PCIe设备复位,但这个显然不友好,因为其他功能模块可能正在埋头苦干。这就好比如,在一个团体中,一个人犯错了,要团队所有人一起承担,这个肯定会影响团结呀。 所以,PCIe深得管理学的精髓,为了不影响团结,FLR允许只对其中出错的功能模块(Function)进行重置,其他功能模块正常工作。 不过,FLR复位方式对PCIe设备并不是必须的,在对PCIe设备使用FLR复位之前必须先检查是否支持FLR。这部分可以查看Device Capabilities Register是否将Funcion-Level Reset Capability bit置起。 如果PCIe设备支持FLR,那么就可以通过设置Device Control Register中的Function-Level Reset bit触发FLR复位咯~ 触发FLR之后,PCIe链路中都有哪些变化呢? 我们前面提到了,FLR是一个局部复位方式,只对出问题的那个Function起作用。所以说,FLR只会改变当下Function内部的状态和寄存器的内容。以下几个方面不会被影响:
另外,PCIe Sepc规定,某个Function的FLR必须在100ms之后完成。所以,PCIe Spec写了一封倡议书给要使用FLR复位方式的"人们"-软件:
在FLR执行的过程中,如果收到TLP或者Compeletions都会被默默的丢弃,而不会向系统报错。 举个栗子,看看FLR执行过程,
|
|