1.7 QoS/TC和仲裁
1.7.1 服务质量
PCIe体系结构的若干特性提供了使QoS得以实现的机制。支持QoS的PCIe特性包括:
流量类别(TC)
虚拟信道(VC)
端口仲裁
虚拟信道仲裁
链路流控制
PCIe使用这些特性支持两种常见类型的事务:同步事务和异步事务,这些事务可以从QoS的PCIe实现中受益。
1.8 流控制
1.8.1 流控制的概念
每一PCIe链路两端的端口都必须实现流控制。PCIe是点对点实现的,如果等待通过链路传输的只有一个事务流,那么流控制机制的效率可能非常低。PCIe通过为不同的事务流(虚拟信道)实现多个流控制缓冲区,而提高了链路的效率。对于给定的链路,由于要对所实现的每个虚拟信道单独进行管理,所有如果某一VC的流控制缓冲区已满,则发送器就可以使用另一个缓冲区并发送与该缓冲区相关的事务。
这种链路流控制机制使用了一种基于信用的机制,这种机制允许发送端口检查接收端口缓冲区空间的可用性。在初始化的时候,各个接收器向链路另一端的端口报告其缓冲区的大小。接收端口通过发送已经释放的信用数,继续周期性地更新发送端口。这些功能是通过流控制DLLP完成的。
流控制逻辑位于发送和接收设备的处理层上。每台设备的发送和接收部分都和流控制密切相关。
- 设备报告可以利用的缓冲区空间——每个节点的接收器都含有流控制缓冲区。每台设备都必须向链路另一端的设备报告它们所拥有的可利用缓冲区空间。缓存区空间的大小要以一种称为流控制信用的单位来报告。每个缓冲区中的流控制信用数都是从处理层转发至数据链路层的发送部分。链路创建一个流控制DLLP,将这一信用信息传送至链路另一端的接收器。对每个流控制缓存区都是如此。
- 接收信用——接收器也要接收链路另一端的设备发送的流控制DLLP。这些信息将被传送至处理层以更新流控制计数器,该计数器用来跟踪其他设备中的流控制缓冲区空间的大小。
- 检查信用——各发送器的检验逻辑负责检查流控制计数器,以核实可用的信用。如果有充足的信用可用来接收待发送的事务,则将事务转发至链路层并最终发送给另一端的设备。如果没有足够的信用可用,则暂时阻塞事务,直到接收设备报告有额外的流控制信用。
1.8.2 流控制缓冲区
1.8.2.1 VC流控制缓冲区的组织
在接收器中,要为流过虚拟信道的每一类事务管理每一个VC的流控制缓冲区。这些类包括:
报告事务——存储器写和消息
非报告事务——存储器读、配置读和写、I/O读和写
完成——读完成和写完成
这些类中的每一类又可以分为事务头和数据部分。VC流控制缓冲区的组织:
1.8.2.2 流控制信用
接收器以流控制信用为单位报告缓冲区空间的大小。头和数据的流控制信用单位的值可能不同,如下:
头FCC——最大的头 + 摘要:完成是4DW;请求时5DW。
数据FCC——4DW。
流控制信用通过链路层流控制数据包的头传送。由于DLLP源于并终止于链路层,所以不需要流控制信用。
1.8.2.3 流控制缓冲区的最大容量
对于事务的头和数据部分,通过流控制初始化和更新数据包能够报告的最大缓冲区容量是:
头,128个信用:2560字节的请求头,20字节/信用;2048字节的完成头,16字节/信用。
数据,2048个信用:32KB,16字节/信用。
1.8.3 流控制数据包
设备的发送部分通过接收缓冲区来报告流控制信用信息给另一端的设备。规范定义了3种类型的流控制数据包:
流控制Init1——用来报告给定虚拟信道的流控制缓冲区的大小。
流控制Init2——与流控制Init1相同,只是它可以用来验证链路各端的流控制初始化是否完成(接收设备忽略流控制信用信息)。
流控制更新——用来定期更新信用限额。
每一个流控制数据包都含有虚拟信道的头和数据流控制信用信息,同时还含有流控制数据包的类型。数据包中用来携带头和数据流控制信用的字段能够反映计数器的宽度。下图显示了这些数据包的格式及内容。
1.8.4 最小流控制通告
1.8.5 流控制初始化
PCIe定义了流控制初始化的两个阶段:FC_INIT1和FC_INIT2。这一过程的每一阶段都涉及流控制数据包(FCP)的使用。
流控制Init1——报告给定虚拟信道的流控制缓冲区的大小。
流控制Init2——验证发送Init2数据包的设备已经完成指定VC和缓冲区类型的流控制初始化。
FC Init1数据包通告可用的流控制信用:在FC Init1状态期间,设备连续输出由3个FC Init1流控制数据包组成的序列,分别通道其报告、非报告和完成接收缓冲区的大小。每台设备还等待其邻居发来的相似的序列。某一设备一旦受到全部序列并发送完自己的序列,它就初始化发送计数器,设置一个内部标志FI1并退出FC_INIT1。
FC_Init2数据包确认FC初始化成功:PCIe定义了InitFC2状态,用于反馈验证对给定VC的流控制初始化已经成功。在FC_INIT2期间,各台设备连续输出由3个InitFC2流控制数据包组成的序列,但在FC_INIT2状态,信用值将被丢弃。一进入FC_INIT2状态,就允许设备发送TLP。设备一旦受到任何类型缓冲区的FC_INIT2数据包,它就设置内部的一个标志(FI2)。FI2也可以在受到UpdateFC数据包或TLP时设置。
规范定义了发送FC_INIT DLLP之间的时间间隔:
VC0:初始化VC0流控制的硬件要求以可能的最高速率连续发送FC_INIT1和FC_INIT2数据包。要将重发定时器的值设为0。
VC1~VC7:如果是软件发起流控制初始化过程,则当没有其他TLP或DLLP要发送时,重复发送FC_INIT序列,但是两个序列之间的最大延时不能超过17us。
1.8.6 FC_INIT之后的流控制更新
1.8.6.1 FC_Update DLLP的格式和内容
与流控制初始化数据包一样,更新流控制数据包含有两个更新字段,一个用于头,一个用于所选择信用类型(P、NP和Cpl)的数据。在HdrFC和DataFC字段中报告的接收器的CREDITS_ALLOCATED计数值可能已经更新过很多次,也可能自上次发送后一次也没有更新过。