2.6 Ordering and Receive Buffer Flow Control
流控FC用于防止接收缓存溢出,和满足2.4章节提到的序要求。注意,流控机制是由请求者跟踪链路另一端的可用缓存/队列空间实现的。如下图所示。流控作用于链路两端,并非端点到端点。流控不意味着请求已经到达它的最终点。
流控与数据完整性机制是正交的(可以理解不相干),数据完整性是为了在发送和接收器之间实现可靠的信息交换。流控可以视为TLP流从发送器到接收器是完美的,因为数据完整性机制保证了损坏和丢失的TLP通过重传机制被纠正,见3.6章节。
每个VC通道都有独立的流控credit池。链路两端用DLLP包传递FC信息。DLLP包中的VC ID字段用于不同VC通道流控credit计算。
在MFD(多function设备)中使用流控机制超出了本文范畴。
流控由DLL层和TL层协作完成。TL层为收到的TLP包执行流控的计算,基于可用的credit阻止发送TLP包,即使这些TLP包是无效的。
注意:流控是TL层的功能,因此,以下这些包类型和流控credit无关:LCRC,帧符号,其他特殊符号,DLL到DLL的内部通信包。这意味者接收器必须以线速率处理这些包。
任何TLP要从TL层发送到DL层和物理层,都必须通过流控的门控。因此,发送和接收流控机制对DLL层的重传都是无感的。(因为已经通过门控了,重传是DLL内部的事,接收方只会接收到1次正确的包,重复的包会丢掉)
2.6.1 Flow Control Rules
在本规范的这一部分和其他部分中,使用概念性“寄存器”来描述规则,设备可以使用这些“寄存器”来实现兼容的实现。此描述并不暗示或要求特定的实现,并且仅用于澄清需求。
- 流控信息用FCPs传输,这是一种DLLP包。见3.5章节
- 针对data,流控credit的单位是4dw。(假设有2KB缓存,2048/4/4=128,接收器就宣告自己有128个data的credit)
- 针对header
- 不支持TLP prefixes的接收器中,单位是1个最大的header+TLP Digest(ECRC)(4+1,2048/5/4=102个credit)
- 支持TLP prefixes的接收器中,单位是1个最大的header + TLP Digest + 最大的End-End TLP prefixes。
- 支持local tlp prefixes的流控管理,取决于local TLP prefixed类型。(不太懂)
- 每个VC通道有独立的流控
- 流控区分3种类型的TLP包。
- P
- NP
- Cpl
- 此外,流控还区分以下TLP信息
- Header(H)
- Data(D)
- 因此,总共有6种类型的流控信息需要跟踪。如下表所示:
- TLP消耗的流控credit 如下表所示
TLP | Credit消耗 |
---|---|
Memory,IO,cfg读请求 | 1 NPH |
Memory写请求 | 1PH + n PD |
IO,cfg 写请求 | 1NPH + 1 NPD |
原子操作请求 | 1NPH + n NPD |
消息不带数据 | 1PH |
消息带数据 | 1PH + n PD |
Memory读完成 | 1CplH + n CplD |
IO,cfg 读完成 | 1CplH + 1 CplD |
IO,cfg 写完成 | 1CplH |
原子操作完成 | 1CplH + 1 CplD |
-
组件必须为所有VC通道实现独立的流控
-
只有默认的VC0通道才会被硬件自动初始化。
- DLL层复位后,在DL_Init状态中初始化VC0 (3.2和3.4章节)
-
其他VC通道被软件使能时,都会按照流控协议初始化。
- 软件设置link 两端的VC Enable bit来使能VC通道。
注意:多个VC同时初始化是可能的,每个初始化都当成是独立的进程。
- 软件设置link 两端的VC Enable bit来使能VC通道。
-
软件关闭VC通道,通过清除link两端的VC Enable bit。
- 关闭VC通道,使组件复位流控追踪机制。
-
initFC1和InitFC2 DLLP包只用于流控初始化
-
如果某个VC通道关闭了,丢弃这个通道的initFC1和initFC2或者更新FC DLLP包没有影响。
-
在VC通道初始化期间,包括VC0的初始化,接收器必须宣告自己的VC credit大于等于下表的值。
- 如果不支持缩放,或者支持但没开启,用缩放因子1的那列的值
-
如果支持缩放,并且使能了,用下面表格列中的值作为相应的credit类型的缩放因子。
流控最小初始化宣告值
credit类型 | No scale or scale factor 1 | scale factor 4 | scale factor 16 |
---|---|---|---|
PH | 1 unit | 4 units | 16 units |
PD | 至少存放下1个Max payload size包.比如1024字节,1024/4=256dw,1个unit是4ddw,如果至少要宣告64个unit。 | 64/4+1=17 | 64/16+1 = 5 |
NPH | 1 unit | 1 = 4 units | 1 = 16 units |
NPD | 支持原子操作,2unit。其他 1 unit | 2 = 8 unit,1= 4 unit | 2=32 unit,1=16 unit |
CplH | RC或者switch,1 = 1 unit | ||
CplD |
-
RC的多端口不支持p2p时,每个RC必须宣告无限的Cpl credit。
-
RC的多端口支持p2p时,RC 可选在这些支持p2p的端口上,宣告有限的cpl credit。这种情况下,RC必须保证避免死锁,维护往RC方向的完成报文的进度。注意,短暂地阻止cpl流量(缺少credit)是可能的,因为由RC发起的NP请求可能没有明确地分配Cpl缓存空间。
-
不支持流控缩放地接收器不能宣告超过2047个没有使用的data credit或者127个header credit 给发送器。支持缩放的接收器不能宣告超过的值如下表所示。
- 组件可选检查这个违例。如果实现了检查,这是一个流量协议错误(FCPE)。
- 如果发生了,这个是一个接收端口相关的报告错误。
- 组件可选检查这个违例。如果实现了检查,这是一个流量协议错误(FCPE)。
-
如果初始化过程中宣告了无限credit(值为0),那么初始化结束后,就不再需要有FC更新DLLP发送。
- 如果更新FC dllp包发送了,接收器必须忽略它的credit值。接收器可选检查非0的更新值,如果检查到出现非0值,这是一个FCPE错误。
- 如果发生了,这个是一个接收端口相关的报告错误
- 如果更新FC dllp包发送了,接收器必须忽略它的credit值。接收器可选检查非0的更新值,如果检查到出现非0值,这是一个FCPE错误。
-
如果只有data或者header(仅有1个)针对特定的类型(P,NP,Cpl)在初始化阶段宣告了无限credit,仍然需要发送更新FC DLLP包,但是宣告为无限credit的 DLLP字段必须被设置为0,并且接收器必须忽略。
- 接收器可选检查非0的更新值。如果检查到非0值,这个是一个接收端口相关的报告错误。