2.6 Ordering and Receive Buffer Flow Control

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同时初始化是可能的,每个初始化都当成是独立的进程。
  • 软件关闭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)。
      • 如果发生了,这个是一个接收端口相关的报告错误。
  • 如果初始化过程中宣告了无限credit(值为0),那么初始化结束后,就不再需要有FC更新DLLP发送。

    • 如果更新FC dllp包发送了,接收器必须忽略它的credit值。接收器可选检查非0的更新值,如果检查到出现非0值,这是一个FCPE错误。
      • 如果发生了,这个是一个接收端口相关的报告错误
  • 如果只有data或者header(仅有1个)针对特定的类型(P,NP,Cpl)在初始化阶段宣告了无限credit,仍然需要发送更新FC DLLP包,但是宣告为无限credit的 DLLP字段必须被设置为0,并且接收器必须忽略。

    • 接收器可选检查非0的更新值。如果检查到非0值,这个是一个接收端口相关的报告错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值