3.4 流控初始化协议
在电源启动或互连复位后开始正常操作之前,必须初始化默认虚拟通道VC0的流量控制(见第6.6节)。此外,当额外的虚拟通道(VCs)被启用时,在使用每个新启用的VC之前,必须完成流量控制初始化过程(见第2.6.1节)。本节描述了所有VCs使用的初始化过程。请注意,由于VC0在所有其他VCs之前被启用,因此在VC0初始化之前,不会有任何类型的TLP流量处于活动状态。然而,当额外的VCs正在被初始化时,通常其他已经启用的VCs上会有TLP流量。这种流量对额外VCs的初始化过程没有直接影响。
虚拟通道初始化过程中有两个状态,这些状态是:
- FC_INIT1
- FC_INIT2
本过程的规则在下一节中给出。
3.4.1 流量控制初始化状态机规则
- 如果在VCs 1-7的初始化过程中的任何时候VC被禁用,则该VC的流量控制初始化过程将被终止。
- 状态FC_INIT的规则:
- 当需要初始化VC(VCx)时进入此状态。
- 当进入DL_Init状态时(VCx = VC0)
-
当软件启用一个VC(VCx = VC1-7)(见第7.9.1节和第7.9.2节)时。
- 在FC_INIT1状态下:
- 事务层必须阻止使用VCx的TLPs传输。
- 以下列相对顺序传输针对VCx的以下三个InitFC1 DLLPs:
- InitFC1-P(首先)
- InitFC1-NP(其次)
- InitFC1-Cpl(最后)
- 这三个InitFC1 DLLPs必须至少每34微秒传输一次。
- 在恢复或配置LTSSM状态中花费的时间不计入此限制。
- 强烈建议在没有其他TLPs或DLLPs可供传输时,频繁重复InitFC1 DLLP传输。
- 如果链路上激活了缩放流量控制,设置InitFC1 DLLPs中的HdrScale(头标缩放)和DataScale(数据缩放)字段为01b、10b或11b,以指示它在相应的HdrFC(头标流量控制)和DataFC(数据流量控制)值上使用的缩放因子。
- 如果发送器不支持缩放流量控制,或者链路上未激活缩放流量控制,将HdrScale和DataScale字段设置为00b。
- 除了确保至少达到InitFC1 DLLP传输所需的频率外,数据链路层不得阻止其他传输
- 请注意,这包括所有由物理层发起的传输(例如,有序集),Ack/Nak DLLPs(适用时),以及使用已初始化的VCs的TLPs(适用时)。
- 处理接收到的InitFC1和InitFC2 DLLPs:
- 记录指示的HdrFC和DataFC值。
- 如果接收器支持缩放流量控制,记录指示的HdrScale和DataScale值。
- 一旦为VCx的P、NP和Cpl记录了FC单位值,设置标志FI1。
- 退出到FC_INIT2状态的条件:
- 如果设置了标志FI1,表明已为VCx的P、NP和Cpl记录了FC单位值
- 当需要初始化VC(VCx)时进入此状态。
-
FC_INIT2状态的规则:
- 在FC_INIT2状态下:
- 事务层必须阻止使用VCx的TLPs传输。
- 以下列相对顺序传输针对VCx的以下三个InitFC2 DLLPs:
- InitFC2-P(首先)
- InitFC2-NP(其次)
- InitFC2-Cpl(最后)
- 这三个InitFC2 DLLPs必须至少每34微秒传输一次。
- 在恢复或配置LTSSM状态中花费的时间不计入此限制。
- 强烈建议频繁重复InitFC2 DLLP传输,特别是当没有其他TLPs或DLLPs可供传输时。
- 如果链路上激活了缩放流量控制,设置InitFC2 DLLPs中的HdrScale(头部缩放)和DataScale(数据缩放)字段为01b、10b或11b,以指示它在相应的HdrFC(头部流量控制)和DataFC(数据流量控制)值上使用的缩放因子。
- 在FC_INIT2状态下:
- 如果发送器不支持缩放流量控制,或者链路上未激活缩放流量控制,将HdrScale和DataScale字段设置为00b。
- 除了确保至少达到InitFC2 DLLP传输所需的频率外,数据链路层不得阻止其他传输。请注意,这包括所有由物理层发起的传输(例如,有序集)、确认(Ack)和否认(Nak)DLLPs(适用时),以及使用已初始化的VCs的TLPs(适用时)。
- 处理接收到的InitFC1和InitFC2 DLLPs:
- 忽略接收到的HdrFC、HdrScale、DataFC和DataScale值。
- 在接收到任何VCx的InitFC2 DLLP时设置标志FI2。
- 在接收到VCx的任何TLP或任何UpdateFC DLLP时设置标志FI2。
- 完成信号和退出条件:
- 如果设置了标志FI2。
- 如果链路上激活了缩放流量控制,发送器必须在所有VCx的UpdateFC DLLPs中为HdrScale和DataScale发送01b、10b或11b。
- 如果不支持缩放流量控制,或者链路上未激活缩放流量控制,发送器必须在所有VCx的UpdateFC DLLPs中为HdrScale和DataScale发送00b。
3.4.2 缩放流量控制
当可用的流量控制信用不足以计算链路往返时间时,链路性能可能会受到影响。在更高的链路速度下,这种影响变得更加明显,127个头标信用和2047个数据信用的限制可能会限制性能。缩放流量控制机制旨在解决这一限制。
所有端口都被允许支持缩放流量控制。支持16.0 GT/s及以上数据速率的端口必须支持缩放流量控制。缩放流量控制的激活不会影响在16.0 GT/s及以上数据速率下的操作能力。
当链路未激活缩放流量控制时,适用以下规则:
- InitFC1、InitFC2和UpdateFC DLLPs必须在HdrScale和DataScale字段中包含00b。
- HdrFC计数器是8bit 位宽,HdrFC DLLP字段包括计数器的所有位。
- DataFC计数器是12bit 位宽,DataFC DLLP字段包括计数器的所有位。
当链路激活缩放流量控制时,适用以下规则:
- InitFC1和InitFC2 DLLPs必须在HdrScale字段中包含01b、10b或11b,该值由表3-2中定义的该类型信用的最大未完成头标信用数量确定。
- InitFC1和InitFC2 DLLPs必须在DataScale字段中包含01b、10b或11b,该值由表3-2中定义的该类型信用的最大未完成数据有效载荷信用数量确定。
- 如果在FC_INIT1状态中记录的接收HdrScale和DataScale值非零,则在此VC上启用缩放流量控制,并且UpdateFC DLLPs必须在HdrScale和DataScale字段中包含01b、10b或11b。
- 如果在FC_INIT1状态中记录的接收HdrScale和DataScale值为零,则在此VC上未启用缩放流量控制,并且UpdateFC DLLPs必须在HdrScale和DataScale字段中包含00b。
3.5 数据链路层包(DLLPs)
以下是用于支持链路操作的数据链路层包(DLLPs):
- Ack DLLP:TLP序列号确认;用于指示成功接收了一定数量的TLPs。
- Nak DLLP:TLP序列号否定确认;用于启动数据链路层重试。
- InitFC1、InitFC2和UpdateFC DLLPs;用于流量控制。
- 用于电源管理的DLLPs。
3.5.1 数据链路层包规则
当形成DLLP时,所有标记为保留(有时缩写为R)的DLLP字段必须用全0填充。接收方必须忽略这些字段中的值。对编码字段中保留值的处理针对每种情况都有指定。 所有DLLPs包括以下字段:
- DLLP类型 - 指定DLLP的类型。定义的编码显示在表3-3中。
- 16位CRC 见图3-4。
- 对于Ack和Nak DLLPs(见图3-5):
- AckNak_Seq_Num字段用于指示受影响的TLPs是什么。
- 数据链路层根据第3.6节中提供的规则处理传输和接收。
- 对于InitFC1、InitFC2和UpdateFC DLLPs:
- HdrFC字段包含指示类型的头标(P、NP或Cpl)的信用值。
- DataFC字段包含指示类型的有效载荷数据(P、NP或Cpl)的信用值。
- HdrScale字段包含指示类型的头标的缩放因子。编码在表3-4中定义。
- DataScale字段包含指示类型的有效载荷数据的缩放因子。编码在表3-4中定义。
- 如果激活了缩放流量控制,所有传输的InitFC1、InitFC2和UpdateFC DLLPs中的HdrScale和DataScale字段必须设置为01b、10b或11b。
- 在UpdateFCs中,只有当发送方支持缩放流量控制,并且在它接收到的InitFC1s和InitFC2s中为HdrScale和DataScale接收到了非零值时,才允许发送方在HdrScale和DataScale字段中发送非零值。
- 数据包格式显示在图3-7、图3-8和图3-9中。
- 当数据链路层初始化虚拟通道(VC)的流量控制时(见第3.4节),以及事务层根据第2.6节中的规则初始化流量控制后,触发传输。
- 数据链路层在接收时检查完整性,如果正确,DLLP的信息内容将传递给事务层;如果检查失败,则信息将被丢弃。
- 注意:InitFC1和InitFC2 DLLPs仅用于VC初始化。
- 对于电源管理(PM)DLLPs(见图3-10):
- 传输由组件的电源管理逻辑根据第5章中的规则触发。
- 数据链路层在接收时检查其完整性,然后将其传递给组件的电源管理逻辑。
- 对于特定供应商的DLLPs(见图3-11):
- 建议接收方在未通过特定实现机制启用的情况下静默忽略特定供应商的DLLPs。
- 建议发送方在未通过特定实现机制启用的情况下不要发送特定供应商的DLLPs。
- 对于NOP DLLPs(见图3-6):
- 接收方应在检查数据完整性后无动作地丢弃此DLLP。
- 对于数据链路特性DLLPs(见图3-12):
- 特性确认位被设置为表示发送端口已接收到数据链路特性DLLP。
- 特性支持位表示发送端口支持的特性。这些位等于本地数据链路特性支持字段的值(见第7.7.4.2节)。
以下是与数据链路层包(DLLPs)相关的特性和规则:
- 当DLLPs呈现给物理层或从物理层接收时,它们与TLPs(事务层包)是不同的。
- DLLP数据完整性通过使用16位CRC(循环冗余校验)来保护。 CRC值的计算遵循以下规则(见图3-13):
- 用于CRC计算的多项式的系数表示为100Bh。
- 种子值(CRC存储寄存器的初始值)是FFFFh。
- CRC计算从字节0的位0开始,并逐位进行到每个字节的位7。
- 注意,CRC计算使用DLLP的所有位,无论字段类型如何,包括保留字段。
- 计算结果取反,然后放置到DLLP的16位CRC字段中,如表3-5所示。