目录
Flow Control Buffers and Credits
VC Flow Control Buffer Organization
Initial Flow Control Advertisement
Special Use for Infinite Credit Advertisements
The FC Initialization Sequence
Rate of FC_INIT1 and FC_INIT2 Transmission
Introduction to the Flow Control Mechanism
Stage 1:Flow Control Following Initialization
Stage 2 — Flow Control Buffer Fills Up
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 接收LL
DDLP
发送LL
发送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,溢出,触发错误。