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.
如果 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.
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芯视界
推荐阅读
- 一文了解NLDM与CCS
- IC各细分领域公司简介以及薪资调研(CPU篇)~欢迎补充
- 数字IC中后端设计中的“三化”升维
- 芯片设计中SPEF文件的作用、基本信息及实例解析
- IC各细分领域公司简介以及薪资调研(FPGA篇)
更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。