PCIe控制器——数据链路层——flow control

流控制,保证发送端的PCIe设备永远不会发送接收端PCIe设备不能接收的TLP(事务层包)。也就是说,发送端在发送前可以通过Flow Control机制知道接收端能否接收即将发送的TLP。

1. 概述

流控制的原理是根据TLP接收方缓冲区的容量,向发送端提供反馈,发送端根据反馈决定发送多少TLP报文。

在链路训练完成后,当物理层的link_active信号拉高,数据链路层会进入DL_init状态,此时将会初始化VC0,该过程会解析DLLP报文中的数据配置到posted/non-posted/complete的credit值。

每个VC(virtual channel)都会维持一个独立的Flow control信用池。

通过两个设备间的链路层发送DLLP来实现,Flow control的报文将在数据链路层被接卸处理,在事务传输层对TLP的发送作用

1.1 信用(credit)

PCIe协议中定义了一种计算Buffer剩余空间的单位,即信用。

  • FC信用类型

PCIe控制器——数据链路层——flow control_第1张图片

  • TLP信用消耗大小

PCIe控制器——数据链路层——flow control_第2张图片

  • infinite/limit信用
  1. 不支持rp间peer-to-peer传输的RC必须发送infinite completion credit
  2. 支持rp间peer-to-peer传输的RC可以发送non-infinite completion credit,但必须保证不出现死锁,并且后续必须维持发给RC的完成报文。因为当RC发出的nonposted时,如果完成报文被异常终止,确实可能没有明确的完成报文接收buffer

1.2 flow control error的因素

2. 运行机制

链路起来后,PCIe协议规定链路双方需要发送initFC报文(DLLP),初始化本设备在对方登记的credit值;在正常TLP传输阶段,request方需根据TLP的数量发送updateFC报文,不断把更新后的credit值发送给response方。
参考链接:流控制运行机制

2.1 初始化阶段

初始化阶段分为两个阶段分别为FC_INIT1和FC_INIT2阶段。

2.1.1 FC_INIT1

依次发送三个posted、nonposted、cpl三个initFC1报文,每34us传输一次报文,每种报文在没有其他TLP或者DLLP的时候可以多次传输。

接收方接收initFC1报文后,解析并记录FC值,当三组值都被记录后设置标志FI1,此时退出FC_INIT1状态进入FC_INIT2状态。

2.1.2 FC_INIT2

FC_INIT2传输方式和FC_INIT1基本相同,区别是FC_INIT2阶段发送initFC2报文,在接收方记录完所有FC值后设置标志FI2。
当VCx一旦有TLP报文传输,或者出现FC更新报文,FI2同样会被设置。

FI2被设置中退出FC_INIT2状态。

如图为pcisig提供的FC报文初始化案例:
PCIe控制器——数据链路层——flow control_第3张图片

2.2 更新阶段

3. FC规则

你可能感兴趣的:(PCIe,网络)