Flow Control FCP+分析
Flow Control FCP+分析
Flow Control
名词缩写
TLP: 事务层包
FC: Flow Control 流量控制
VC: Virtual Channel
Ports: 端口
DLLP: Flow Control DLLPs
概述
发送端在发送前可以通过Flow Control机制知道接收端能否接收即将发送的TLP。
在PCI无FW机制,因此不能判断接收端能否接收对应的TLP,因此可能会造成等待或重发。
每个PCIe端口最多支持8个VC,并且每个VC的Flow Control Buffer是完全独立的,单个VC满后不会影响到其他VC。
Flow Control机制是通过相邻两个Ports的数据链路层之间发送DLLP来实现
在进行初始化的时候,接收端需要向发送端报告(reports)其Buffer的大小,在正常运行状态(Run-time)时,会周期性地通过Flow Control DLLPs来告知发送端,接收端的各个Buffer的大小。
Buffer和计数器(FC Counter)在事务层(Transaction Layer)中计算
TLP
分类
Posted Transactions:Memory Writes和Messages
Non-Posted Transactions:Memory Reads、Configuration Reads and Writes、IO Reads and Writes
Completions:Read and Write Completion
组成
Header, Data
Flow Control Buffer类型
Flow Control为了获得更高的数据传输效率,将这三类TLP分开存放,同时将Header与Data部分也分开存放。因此,一共存在六种不同的Flow Control Buffer类型
Flow Control Buffer的存储单元(Unit)被称作Flow Control Credits。对于Header来说,Requests TLP每个unit等于5DW,而Completions TLP每个unit等于4DW。对于Data来说,每个unit等于4DW,即Data Buffer是按照16个字节对齐的
Buffer最小值
Buffer最大值
注:0 unit表示无限(Infinite)
Flow Control初始化
在发送任何TPL之前,PCIe总线必须要先完成Flow Control初始化
物理层链路初始化—-LinkUp—-Flow Control初始化
由于VC0默认初始化,Flow Control会默认初始化VC0,其他通道在使能时才会初始化
Flow Control初始化步骤
FC_Init1:数据链路控制 Data Link Control
PCIe设备会连续地发送三个InitFC1类型的Flow Control DLLP来报告其接收Buffer 的大小。三个DLLP的顺序是固定的:Posted、Non-Posted、Completions
FC_Init2:管理状态机 Management State Machine
与FC_Init1类似,主要用于保证不同时间下每个设备都能初始化DLLP
FC DLLP Buffer更新
在完成FC初始化之后,相邻的两个设备之间会周期性的通过Updated FC DLLP更新接收Buffer的大小,Update FC DLLP的格式与FC_Init的格式是类似的