棋子 · 6月3日

PCIe 复位:FLR(Function Level Reset)

1.如何发起FLR

作为Enpoint设备,PCIe 可以拥有多个PF(physical functions)和多个VF(virtual functions),每个function可以独自进行复位操作,这就是FLR(Function Level Reset)。

当一个多function设备(a multi function device)中的某个function出现问题时,如果通过传统复位方式将会影响所有function,此时可以通过FLR进行复位,不会对其他function造成影响。

并不是所有的 Device 都支持 FLR,需要检查 Device Capabilities Register[28] 进行确认,如图7-24所示,bit[28]为1则表示支持FLR。

Function Level Reset Capability - A value of 1b indicates the Function supports the optional Function Level Reset mechanism described in Section 6.6.2 . This bit applies to Endpoints only. For all other Function types this bit must be hardwired to 0b.

image.png

如果 Device 支持 FLR,那么软件就可以通过cfgwr请求将 Device Control Register 的bit [15] (Initiate Function Level Reset bit)写1来发起FLR,如图7-25所示。

Initiate Function Level Reset - A write of 1b initiates Function Level Reset to the Function. The value read by software from this bit is always 0b.    

image.png

2.FLR应用场景

FLR存在如下应用场景: 

Ø控制a Function的软件可能会遇到问题,并且已无法正常运行。防止数据损坏需要重置该Function,但该设备内的其他Function仍然正常工作,此时只需要reset有问题的Function

Ø在虚拟化环境中,应用程序可以从一个硬件迁移到另一个硬件。当应用程序从此Function 移除时,希望清除Function上关于此应用程序的information,以避免机密消息泄露。最简单方式是完成APP迁移后进行function reset。

Ø当软件为Function重建软件堆栈时,有时需要首先将此Function放入未初始化状态。此时进行FLR,不会影响到公用链路的其他function

Ø服务器上电时,有些版本的固件会尝试对支持FLR功能的Endpoint进行FLR,如果Endpoint没有在规定时间内完成FLR操作,会导致服务器启动失败。

3.复位作用范围

ØFLR 会复位对应 Function 的内部状态,寄存器,需要重点关注如下寄存器:

bme、mse、mrrs,10bit_tag_en,ser_en,ecrc_gen_en,sriov_ctl_vf_en。这些寄存器会影响TL层和用户逻辑对TLP的处理,例如,bus master en(bme)为0时,不允许Endpoint发起mwr、mrd请求,即俗称的dma请求。如果用户逻辑实现了此类控制寄存器(例如使用寄存器对信号打拍),在FLR复位期间,需要将此类寄存器进行清零。

ØFLR 会复位对应 Function 的内部状态,寄存器,但是以下寄存器不会受到影响:

Sticky bits(cold reset 和 warm reset 也对其不起作用)

hardware‐initialized bits(HwIint 类型的寄存器。在 PCIe 设备中,Vendor ID和Device ID 以及Device Capabilities 2 Register中的10-Bit Tag Requester Supported等等通常都是HwInit类型寄存器。常见的设计实现中,此类寄存器通常是由用户逻辑实现的可配置寄存器,连接到PCIe ctrl的输入接口上。)

link‐specific 寄存器,比如 Captured Power, ASPM Control, Max_Payload_Size 或者 Virtual Channel。   

FLR 不会改变 Device 的 LTSSM 状态。

NOTE: FLR复位function时,要求与function关联的外部活动停止;If an outstanding Assert INTx interrupt message was sent, a corresponding Deassert INTx message must be sent

4.FLR 流程要求与复位时间

协议规定一个FLR需要在 100ms 内完成。但是软件在启动 FLR 前,要注意是否有还没返回的CplD,遇到这种情况,要么等这些 CplD 返回再开始 FLR,要么启动 FLR 以后等 100ms 以后再重新初始化这个 Function。这种情况如果没有处理好,可能会导致 data corruption: 前一批请求的返回报文被当做了后一批请求的返回报文。

为了避免此类问题,协议要求软件进行FLR时需要满足如下要求:

1.与其他可能访问该功能的软件进行协调,以确保它在FLR期间不会尝试访问。

2.清除整个命令寄存器,从而使停止Function。

3.通过轮询Transactions Pending bit(in the Device Status register)被清零来确保先前请求的完成报文已返回,或等待足够长的时间来确保完成报文不会返回。(多久才够长了?如果正在使用完成超时,请等待超时时间后再发送FLR。如果禁用了超时,那么至少等待100ms)

4.启动FLR并等待100ms(此处的100ms确保)。

5.设置Function的配置寄存器,最后配置command enable使能,使其正常工作。

NOTE:一旦 FLR完成,  the Transaction Pending bit must be cleared

5.FLR复位期间,Endpiont需要遵守的规则

在FLR复位期间,function的行为需要满足协议如下规定:

Function 必须为产生FLR的配置写返回一个CPLD,然后启动FLR。

在FLR复位期间,接收到的完成报文被视为Unexpected Completions或者直接丢弃,既不记录也不报错。

在外部接口上,此Function体现为非活跃状态,不能响应请求。如何设计可以自定义,协议没有规定。(例如,在用户侧接口,如果收到dma请求,则返回err ack)

Function不能保留任何软件可读的状态,这些状态可能包括Function留下的秘密信息。例如,internal memory必须清零或者随机化。

下一个驱动程序必须可以正常地配置该Function 。

在FLR复位期间,function的对报文的响应需要满足如下要求:

FLR操作必须在100ms内完成,但之后的初始化可能需要更长的时间。如果在初始化完成之前出现了配置请求,则该Function 必须返回一个带有CRS(Configuration Retry Status)状态的完成报文。一旦完成返回任何其他状态,CRS状态将不再合法,直到功能重新重置。

Function收的mwr/mrd请求允许直接丢弃,而且不记录,也不产生错误信号。不过,Flow control credits must be updated to maintain the link operation

6.退出复位

退出复置状态后,链路训练和初始化必须在20ms内开始。不同的设备可能在不同的时间退出复置状态,因为复置信号是异步的,且必须在这段时间内开始训练。

被复位的组件需要执行内部初始化,系统软件在reset结束后至少等待100ms,才能向它们发起配置请求。如果软件在100ms等待时间之后向设备启动配置请求,但设备仍未完成自动初始化,设备会返回状态为CRS的完成报文。由于配置请求只能由CPU启动,所以状态为CRS的完成TLP将传送到到RC。作为响应,Root 可以自动重新发出配置请求或使故障对软件可见。该规范还指出,如果CRS Software Visibility已经启用,软件应该等待100个ms后就重新发起配置请求,避免长时间超时或处理器暂停。

设备在reset后1.0秒内(0%/+50%)必须对配置请求作出适当的响应,否则系统会认为此device已经损坏。

作者:IC小鸽
文章来源:IC芯视界

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
17656
内容数
1280
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息