PCIE笔记8:Transaction Layer---Flow Control

目录

Flow Control

Flow Control Concept

Flow Control Buffers and Credits

VC Flow Control Buffer Organization

Flow Control Credits

Initial Flow Control Advertisement

Infinite Credits

Special Use for Infinite Credit Advertisements

Flow Control Initialization

The FC Initialization Sequence

FC_Init1 Details

FC_Init2 Details

Rate of FC_INIT1 and FC_INIT2 Transmission

Introduction to the Flow Control Mechanism

The Flow Control Elements

Transmitter Elements

Receiver Elements

Flow Contr ol Example

Stage 1:Flow Control Following Initialization

Stage 2 — Flow Control Buffer Fills Up

Stage 3 — Counters Roll Over

Stage 4 — FC Buffer Overflow Error Check

主要参考《MindShare_PCI Express Technology 3.0》

Flow Control

        本节主要讨论流控协议的目的与操作细节。流控的目的是确保发送端不会发送接收端无法接受的事务层数据包。

Flow Control Concept

        每条PCIE链路两端的端口都必须实现流控机制。在发送一个数据包之前,流控机制必须检查接收端是否有足够的缓冲区空间可以接受它。而在诸如 PCI 等并行总线架构中,事务在不知道目标设备是否准备好接收数据的情况下就会尝试传输。如果因为缓冲空间不足而被拒绝,事务就会被重复发送(重试)直到成功为止。

        如果使用虚拟通道(VC),流控机制可以提升传输效率。PCIE最多支持8个虚拟通道。

        流控机制使用基于信用(credit-based)的方式,是发送端能够了解接收端的可用缓冲区空间。在链路初始化时,接收端向链路另一端报告缓冲区大小,在运行过程中,通过流控DLLP定期更新当前可用的信用数量。

        流控逻辑实际上是由两层共同负责的:事务层和链路层,链路层负责发送和接收承载这些信息的DLLP数据包。   

流程:接收TL \rightarrow接收LL\rightarrowDDLP\rightarrow发送LL\rightarrow发送TL

Flow Control Buffers and Credits

        PCIe 流控缓冲区(Flow Control Buffers)与虚拟通道(VC)之间的对应关系,以及它们在链路两端的配置原则。   

        每个端口支持的每个虚拟通道(VC)资源都会实现对应的流控缓冲区。链路两端的端口所支持的虚拟通道数量可能不相同,软件配置并启用的最大虚拟通道数量,是两个端口共同支持的最大数量。

VC Flow Control Buffer Organization

        接收端的每个 VC 流控缓冲区都会按不同类别的事务进行管理。

这些事务类别包括:

  • Posted 事务:如 Memory Write 和 Message

  • Non-Posted 事务:如 Memory Read、Configuration 读写、I/O 读写

  • Completion:对读写请求的返回响应(包括 Read Completion 和 Write Completion)

        此外,对于同时包含 Header 和 Data 的事务,每类事务还进一步分为 Header 和 Data 两部分。因此总共会有 6 种不同的缓冲区,每种都有自己的流控逻辑。发送方必须确保事务所需的 header 和 data 缓冲区空间都有剩余,才能发送该事务。

流控缓冲机制

Flow Control Credits

        接收方用单位“Flow Control Credit(FCC)”来报告自己的缓冲区空间。Header 和 Data 类型的缓冲区所对应的 Credit 单位大小如下:

  • Header 类型的 Credit 是按最大 header 大小加上 digest 来计量的。

  • Completion 类型 header:每个占 4 个 DW(32-bit 字)

  • Request 类型 header:每个占 5 个 DW

Data 类型的 Credit 按照每 4 个 DW(即 16 字节)为一个单位来计算。

Initial Flow Control Advertisement

        在流控初始化期间,PCIe设备通过流控信用(credits)“广告”它们的缓冲区大小。PCIe还定义了一种“无限”的流控信用值,用于某些缓冲区。

Infinite Credits

        流控信用值为0x00(十六进制)时,在初始化阶段被理解为“无限信用”。发起事务的设备必须为拆分事务(non-posted事务)返回的数据或状态信息预留缓冲空间。

Special Use for Infinite Credit Advertisements

        唯一允许的非发布(Non-Posted)写事务是I/O写和配置写,这些事务只允许出现在VC0上。因此,VC1到VC7不会使用非发布数据缓冲区,可以对这些缓冲区广告“无限信用”。但是,非发布头部缓冲区仍然需要正常工作,头部信用仍需被更新。
        就是说VC1-VC7可以进行非发布读事务,不可以进行非发布写事务。

Flow Control Initialization

        在发送事务前,完成流控初始化。在流控初始化前,需等待物理层链路训练完成后,当链路层检测到LinkUp被激活,就表明物理层就绪。

        流控初始化对所有虚拟通道基本相同,不同之处在于,VC0默认开启的,而其他虚拟通道需通过软件启用。

The FC Initialization Sequence

        流控初始化过程涉及链路层的DLCMSM(数据链路控制与管理状态机)。

The Data Link Control & Management State Machine

        Reset使状态机进入DL_Inactive状态(初始状态是DL_Inactive,代表链路未激活或非活跃状态,处于此状态,会向链路层和事务层发送DL_Down信号,表示链路层不可用,事务层也不能发送或接收数据);状态机等待物理层发出LinkUp信号(表示物理层就绪),转到DL_Init状态(包括FC_Init1和FC_Init2)。

FC_Init1 Details

        在 FC_INIT1 状态期间,设备会持续发送一组由 3 个 InitFC1 类型的流控 DLLP 组成的序列,按照以下顺序发送:Posted(发布型)、Non-posted(非发布型)和 Completions(完成型)规范强烈建议频繁重复发送这组包,以便接收设备更容易看到它们。

        每个设备还应从其相邻设备接收这一序列,以便注册(记录)对方的缓冲区大小。一旦设备完成了自身值的发送,并多次完整地接收到来自对方的序列,确保这些值已被正确接收,就可以准备退出 FC_INIT1。为此,设备会将接收到的 credit 值写入其发送计数器,设置内部标志位 FL1,然后进入 FC_INIT2 状态,开始第二步初始化。

INIT1 Flow Control DLLP Format and Contents

FC_Init2 Details

        此状态发送InitFC2类型的DLLP,顺序与1相同。目的是为了告诉对端我准备好了。
同样也会接受对方的InitFC2,不会接受InitFC1。如果链路另一侧初始化未完成,该设备也可以开始发送TLP,此时链路层会向事务层发送DL_UP。设备只需要收到一种类型的FC2或一个TLP就可以完成FC2状态。

Rate of FC_INIT1 and FC_INIT2 Transmission

        对于VC0,FC_INIT1和FC_INIT2数据包必须尽可能快的速率发送。对于VC1-VC7,要求当没有TLP或DLLP发送时,重复发送。

Introduction to the Flow Control Mechanism

        PCIe 规范定义了流控机制的要求,依赖的组件包括:寄存器、计数器,以及用于报告、追踪和计算是否可以发送事务的机制。规范仅是提供了一个模型,而不是具体实现方式。

The Flow Control Elements

        下图展示了用于管理流控的元素。

        解释一下CL-CR <= 2^8/2。二进制的减法,原码的补码加1。

Flow Control Elements        

Transmitter Elements

Transactions Pending Buffer(待处理事务缓冲区):用于存放在同一个VC中等待发送的TLP。

Credits Consumed Counter(CC,已消耗信用计数器):记录缓冲区中已经发送的所有事务所消耗的credit总数。

Credit Limit Counter(CL,信用上限计数器):表示接收方为该类型TLP分配的buffer总量。

Flow Control Gating Logic(流控门控逻辑):判断接收方是否能够接受下一个TLP。

Receiver Elements

Flow Control Buffer(流控缓冲区):用于保存接收到的事务的Header或者Data。

Credit Allocated(信用分配计数器):追踪接收端目前可用的credit总量。

Credits Received Counter(CR,已接收信用计数器,可选):记录进入流控缓冲区的所有事务所使用的 credit 总数。

        还有一个参与流控管理的重要元素是:Flow Control Update DLLP(FC更新包)
这是唯一在正常传输期间会使用的流控包。它由接收端发送,告知发送端“我已经释放了一些 buffer,可再发 TLP”。

Types and Format of Flow Control DLLPs

Flow Contr ol Example

        非发布事务的头部流控缓冲区示例。

Stage 1:Flow Control Following Initialization

        一旦流控初始化完成,设备进入正常工作状态。示例中流控缓冲区大小为2KB,每个credit单位对应5个双字,即20字节。所以缓冲区可用信用单位为102,即0x66。

        在这个例子中,当前已消耗信用计数(CC = 0)与下一个待发送事务包(PTLP = 1)所需的信用相加,得到所需的总信用(CR),即 0x00 + 0x01 = 0x01。

Stage 2 — Flow Control Buffer Fills Up

        假设接收方在一段时间内无法从流控缓冲区中取出事务。最终,流控缓冲区被完全填满。

如果发送方想发送另一个事务层数据包(TLP),并检查流控信用:
信用限制(CL)= 0x66
所需信用(CR)= 0x67 = CC(0x66) + PTLP(0x01)。

Stage 3 — Counters Roll Over

CL 和 CR 只递增
CL 是接收端缓冲区大小的计数,表示允许发送方发送的最大信用额度。
CR 是发送方累计消耗的信用数。

Stage 4 — FC Buffer Overflow Error Check

1、流控缓冲区溢出错误检测可选,但推荐。

2、相关元素 CR、CA

3、接收端用CA计数器管理自己的缓冲区容量,接收端用CR计数器跟踪实际已经接收并占用信用的事务。如果CR>CA,溢出,触发错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值