2.6 流量控制(Flow Control FC)
流量控制(Flow Control FC)用于防止接收器缓冲区溢出,并确保遵守第2.4节中定义的排序规则。请注意,流量控制机制由请求者用来跟踪链路另一端组件中可用的队列/缓冲区空间,如图2-48所示。也就是说,流量控制是点对点的(跨链路),而不是端到端的。流量控制并不意味着请求已经到达其最终的完成器。
流量控制(Flow Control,FC)与用于在发送器和接收器之间实现可靠信息交换的数据完整性机制是正交的(正交意味着流量控制和数据完整性这两个机制是独立并行的,互不影响)。流量控制可以将从发送器到接收器的TLP信息流视为完美,因为数据完整性机制确保通过重传来更正损坏和丢失的TLP(见第3.6节)。
每个虚拟通道(Virtual Channel,VC)维护一个独立的流量控制信用池。使用数据链路层协议(Data Link Layer Protocol,DLLP)在链路的两侧之间传递FC信息。DLLP的VC ID字段用于携带进行适当的流量控制信用量计算所需的VC ID。
在多功能设备(Multi-Function Device,MFD)内部使用内部流量控制机制不在本规范范围内。
流量控制由事务层与数据链路层合作处理。事务层为接收到的TLP执行流量控制计算功能,并根据可用的传输信用“门控”TLP传输,即使这些TLP最终被取消。
注:流量控制是事务层的一个功能,因此,在接口上传输的以下类型的信息不与流量控制信用相关联:LCRC(长帧校验序列)、数据包帧符号、其他特殊符号以及数据链路层到数据链路层的通信数据包。这个事实的一个含义是,这些类型的信息必须由接收器按照它们到达的速率进行处理(除非本规范中明确指出)。
此外,从事务层传输到数据链路层和物理层的任何TLP(事务层数据包)都必须首先通过了流量控制的“门控”。因此,无论是发送还是接收的流量控制机制都不知道数据链路层是否由于链路上的错误而重复传输TLP。
2.6.1 流量控制规则
在本规范的本节和其他节中,使用概念上的“寄存器”来描述规则,设备可以使用这些寄存器来实现符合要求的实现。这种描述并不意味着或要求特定的实现方式,而仅用于阐明要求。
- 流量控制信息是使用流量控制数据包(Flow Control Packets,FCPs)传输的,FCPs是数据链路层协议(DLLP)的一种类型(见第3.5节)。
- 流量控制信用的单位为4个DW用于数据。
- 对于头标:
- 不支持TLP前缀的接收器的流量控制信用单位是一个最大尺寸的头标和TLP digest的总和。
- 支持端到端TLP前缀的接收器的流量控制信用单位是一个最大尺寸的头标、TLP digest和TLP中允许的最大数量的端到端TLP前缀的总和。
- 支持本地TLP前缀的接收器的流量控制管理取决于本地TLP前缀类型。 每个虚拟通道都有独立的流量控制。
- 流量控制区分三种类型的TLP(注意与排序规则的关系 - 见第2.4节):
- 转发请求(P) - 消息和内存写入
- 非转发请求(NP) - 所有读取、I/O写入、配置写入和原子操作
- 完成(Cpl) - 与相应的NP请求相关联
- 此外,流量控制在每种三种类型内部区分以下类型的TLP信息:
- 头标(H)
- 数据(D)
- 因此,如表2-42所示,每个虚拟通道由流量控制跟踪的六种类型的信息。
- TLPs 按照表2-43所示消耗流量控制信用。
- 组件必须为该组件支持的所有虚拟通道实现独立的流量控制。
- 流量控制仅由硬件自动初始化默认的虚拟通道(VC0)。
- 在重置后数据链路层处于DL_Init状态时VC0进行初始化(见第3.2节和第3.4节)。
- 当软件通过启用其他虚拟通道时,每个新启用的虚拟通道将遵循流量控制初始化协议(见第3.4节)。
- 软件通过在链路上的两个组件中为该虚拟通道设置VC使能位来启用虚拟通道(见第7.9.1节和第7.9.2节)。
注:可能同时有多个虚拟通道在遵循流量控制初始化协议 - 每个通道作为独立的过程遵循初始化协议。
- 软件通过在链路上的两个组件中清除该虚拟通道的VC使能位来禁用虚拟通道。
- 为组件禁用虚拟通道会重置该组件中该虚拟通道的流量控制跟踪机制。
- InitFC1和InitFC2 FCP(流量控制数据包)仅用于流量控制初始化(见第3.4节)。
- 指定已禁用的虚拟通道的InitFC1、InitFC2或UpdateFC FCP将被丢弃,不会产生效果。
- 在任何虚拟通道的流量控制初始化期间,包括作为链路初始化的一部分初始化的默认虚拟通道,接收器最初必须宣布等于或大于表2-44中所示的虚拟通道信用值。
- 如果不支持缩放流量控制,或者支持但不激活,使用“缩放因子1”列中的值。
- 如果支持并激活了缩放流量控制,使用与该信用类型相关联的缩放因子列中的值(见第3.4.2节)。
- 如果根复合体不支持根端口之间的点对点流量,则必须在每个根端口上宣布无限的完成信用。
- 支持根端口之间点对点流量的根复合体可以选择性地在这些根端口上宣布非无限的完成信用。在这种情况下,根复合体必须确保避免死锁并维持对根复合体定向的完成的前移进度。请注意,由于RC转发的非转发请求可能没有显式分配完成缓冲区空间,因此可能会暂时阻塞完成流量(由于暂时缺乏信用)。
- 不支持缩放流量控制的接收器在任何时候都不得向发送器累计发放超过2047个未使用的信用用于数据有效载荷,或127个用于头标。支持缩放流量控制的接收器在任何时候都不得向发送器累计发放超过表3-2中显示的Max Credits值的未使用数据或头标。
- 组件可以选择性地检查此规则的违规情况。如果实现此检查的组件确定违反了此规则,则违规是流量控制协议错误(FCPE)。
- 如果检查,这是与接收端口相关联的报告错误(见第6.2节)。
- 组件可以选择性地检查此规则的违规情况。如果实现此检查的组件确定违反了此规则,则违规是流量控制协议错误(FCPE)。
- 如果在初始化期间已经宣布了无限信用声明(值为00h或000h),则初始化后不需要流量控制更新。
- 如果发送了UpdateFC DLLPs,则信用值字段必须为清除状态,并且必须由接收器忽略。 接收器可以选择性地检查非零更新值(违反此规则)。如果实现此检查的组件确定违反了此规则,则违规是流量控制协议错误(FCPE)。
- 如果仅在初始化期间为给定类型(P、NP或Cpl)的数据或头标声明(但不是两者)声明了无限信用,则仍需要传输UpdateFC DLLPs,但对应于数据/头标(宣布为无限)的信用字段必须设置为零,并必须由接收器忽略。
- 接收器可以选择性地检查非零更新值(违反此规则)。如果实现此检查的接收器确定违反了此规则,则违规是流量控制协议错误(FCPE)。
- 如果已激活缩放流量控制,则UpdateFCs中的HdrScale和DataScale字段必须与初始化期间宣布的值匹配。
- 接收器可以选择性地检查此规则的违规情况。如果实现此检查的接收器确定违反了此规则,则违规是流量控制协议错误(FCPE)。
- 如果检查,这是与接收端口相关联的报告错误(见第6.2节)。
- 接收器可以选择性地检查此规则的违规情况。如果实现此检查的接收器确定违反了此规则,则违规是流量控制协议错误(FCPE)。
- 使用未启用的虚拟通道接收到的TLP是一个畸形TLP。
- VC0始终启用。
-
对于虚拟通道1-7,当相应的虚拟通道使能位在虚拟通道资源控制寄存器中被设置,并且一旦该虚拟通道的流量控制协商退出了FC_INIT1状态并进展到FC_INIT2状态时(见第3.4节),该虚拟通道就被视为已启用。
-
这是一个与接收端口相关联的报告错误(见第6.2节)。
- 在该虚拟通道的初始化通过退出FC_INIT2状态完成之前,不允许使用任何虚拟通道0-7进行TLP传输。
对于虚拟通道1-7,软件必须使用虚拟通道资源状态寄存器中的虚拟通道协商待定位来确保在链路上的两个组件中的虚拟通道协商都退出了FC_INIT2状态之前,不使用该虚拟通道。
在以下各节中使用的[字段大小]参数在表2-45中描述(见第3.4.2节)。
2.6.1.1 发送器跟踪的流量控制信息
对于每种跟踪的信息类型,发送器在流量控制TLP传输门控中跟踪两个数量:
- CREDITS_CONSUMED(消耗的信用)
- 自接口初始化以来,TLP传输消耗的FC单位的总数。
- 在接口初始化时设置为全0。
- 对于事务层允许通过流量控制门控进行传输的每个TLP,更新如下所示:
(其中增量是通过门控的TLP相应部分的FC信用大小,[字段大小]在表2-45中定义)
- CREDIT_LIMIT(信用限制)
- 接收器合法声明的最新FC单位数量。这个数量代表了自流量控制以来接收器提供的总FC信用数量。
- 在接口初始化时未定义
-
设置为流量控制初始化期间指示的值
- 对于每个接收到的FC(流量控制)更新:
- 如果CREDIT_LIMIT(信用限制)不等于更新值,则将CREDIT_LIMIT设置为更新值
- 如果发送器检测到它正在准备传输的是畸形TLP,强烈建议发送器丢弃该TLP并将其视为不可纠正的内部错误进行处理。
- 如果发送器检测到它正在准备传输的TLP看起来是正确形成的,但具有错误的ECRC(端到端校验),强烈建议发送器传输该TLP并相应地更新其内部流量控制信用。
- 发送器的门控功能必须确定是否已声明足够的信用以允许传输给定的TLP。如果发送器没有足够的信用来传输TLP,它必须阻止TLP的传输,可能会阻塞使用相同虚拟通道的其他TLP。发送器必须遵循第2.4节中指定的排序和避免死锁规则,这些规则要求某些类型的TLP必须在其他特定类型的TLP被阻塞时绕过它们。请注意,使用不同虚拟通道的TLP没有排序关系,并且不应互相阻塞。
- 发送器门控功能测试如下执行:
- 对于每种所需的信用类型,所需信用的数量计算如下:
- 除非在流量控制初始化期间将CREDIT_LIMIT指定为“无限”,否则发送器可以在满足以下等式(使用无符号算术)的情况下传输TLP(对于TLP中的每种信息类型):
-
如果在流量控制初始化期间将CREDIT_LIMIT指定为“无限”,则对于该类型的信用,门控功能无条件满足。
-
请注意,某些类型的事务需要一种以上的信用。(例如,内存写入请求需要PH和PD信用)
- 在计算信用使用和返回时,不同TLP的信息在一种信用内从不混合。
- 当由于缺乏FC信用而阻止某些TLP传输时,发送器在确定必须允许哪些类型的TLP绕过被阻塞的TLP时,必须遵循第2.4节中指定的排序规则。
- 对于事务的FC信用返回,不得将其解释为事务已完成或已达到系统可见性。
- 流量控制信用返回仅用于接收缓冲区管理,组件不得根据流量控制信息的返回或缺乏返回对事务的完成状态或系统可见性做出任何判断。
- 当发送器发送一个已取消的TLP时,发送器不会修改该TLP的CREDITS_CONSUMED(消耗的信用)(见第3.6.2.1节)。
2.6.1.2 接收器跟踪的FC信息
- 对于每种跟踪的信息类型,以下数量用于流量控制TLP接收方计算:
-
CREDITS_ALLOCATED(分配的信用)
-
自初始化以来授予发送器的信用总数。
-
根据接收器的缓冲区大小和分配策略进行初始设置。
-
此值包含在InitFC和UpdateFC DLLPs中(见第3.5节)。
-
当接收事务层通过处理接收到的TLP增加接收缓冲区空间时,此值会增加。 更新如下所示:
-
(其中增量对应于提供的信用,[字段大小]在表2-45中定义)
-
- CREDITS_RECEIVED(接收的信用,可选 - 用于下面描述的可选错误检查)
- 自流量控制以来,由有效的TLP接收消耗的FC单位的总数。
- 在接口初始化时设置为全0。
- 更新如下所示:
- (其中增量是接收到的TLP相应部分的FC单位大小,[字段大小]在表2-45中定义)
- 对于每个接收到的TLP,前提是TLP:
- 通过了数据链路层完整性检查
- 非畸形或者(可选地)是畸形的,但关于要释放哪个缓冲区要明确,并且映射到一个已初始化的虚拟通道
- 消耗的信用不超过已分配的信用(见以下规则)
- 对于一个ECRC检查失败错误的TLP,但关于要释放哪个缓冲区否则是明确的,强烈建议更新CREDITS_RECEIVED。
-
- 如果接收器实现了CREDITS_RECEIVED计数器,那么当接收到一个已取消的TLP时,接收器不会修改该TLP的CREDITS_RECEIVED(接收的信用)(见第3.6.2.1节)。
- 接收器可以选择性地通过检查以下等式(使用无符号算术)来检查接收器溢出错误(超过CREDITS_ALLOCATED的TLP):
- 如果实现了检查并且这个等式计算结果为真,接收器必须:
- 丢弃TLP而不修改CREDITS_RECEIVED
- 取消分配给TLP的任何资源
- 如果进行了检查,这是与接收端口相关联的报告错误(见第6.2节)
注:在接收器溢出错误之后,接收器的行为是未定义的,但鼓励接收器继续操作,处理流量控制更新并接受不超过分配信用的任何TLP。
- 对于非无限NPH、NPD、PH和CplH类型,每当以下事件发生时,必须安排UpdateFC FCP进行传输:
- a. 当未激活缩放流量控制,且某种特定类型的可用FC信用数量为零,并且通过处理的TLP使该类型的一个或多个单位变得可用时,
- b. 当未激活缩放流量控制,NPD信用降至2以下,接收器支持原子操作路由功能或128位CAS完成者功能,并且通过处理的TLP使一个或多个NPD信用变得可用时,
- c. 当激活缩放流量控制,某种特定类型的可用FC信用数量为零或低于缩放阈值,并且通过处理的TLP使该类型的一个或多个单位变得可用,使得可用信用数量等于或大于缩放阈值,该阈值为HdrScale或DataScale为01b时的0,HdrScale或DataScale为10b时的4,以及HdrScale或DataScale为11b时的16,
- d. 当激活缩放流量控制,用于NPD的DataScale是01b,NPD信用降至2以下,接收器支持原子操作路由功能或128位CAS完成者功能,并且通过处理的TLP使一个或多个NPD信用变得可用时。
- 对于非无限PD和CplD类型,当可用信用数量小于Max_Payload_Size时,每当通过处理的TLP使该类型的一个或多个单位变得可用时,必须安排UpdateFC FCP进行传输。
- 对于ARI设备,Max_Payload_Size仅由功能0中的设置确定。其他功能中的Max_Payload_Size设置被忽略。
- 对于所有功能中Max_Payload_Size设置相同的非ARI多功能设备(MFD),必须使用共同的Max_Payload_Size设置或更大的设置。
- 对于所有功能中Max_Payload_Size设置不相同的非ARI MFD,选定的Max_Payload_Size设置是特定实现的,但建议使用所有功能中最大的Max_Payload_Size设置。
- UpdateFC FCPs可以比要求的更频繁地安排进行传输。
- 当链路处于L0(空闲)或L0s(信号丢失)状态时,必须至少每30微秒(-0%/+50%)安排一次每种启用的非无限FC(流量控制)信用的Update FCP的传输,除非链路控制寄存器的Extended Synch位被设置,在这种情况下,限制是120微秒(-0%/+50%)。
- 可以选择性地实现一个超时机制。如果实现了这样的机制,该机制必须:
- 仅在链路处于L0或L0s链路状态时处于活动状态
- 使用一个计时器,限制为200微秒(-0%/+50%),该计时器通过接收任何Init(初始化)或Update FCP(更新流量控制数据包)来重置。或者,计时器可以通过接收任何DLLP(数据链路层协议包,见第3.5节)来重置
- 在计时器超时时,指示物理层通过LTSSM(链路训练和状态机)恢复状态(第4.2.6.4节)重新训练链路
- 如果在初始化期间对所有三种流量控制类别都声明了无限信用,则必须禁用此超时机制。
- 注:强烈鼓励实现这种可选机制。本规范的未来修订可能会将这种机制从可选更改为必需。
- 可以选择性地实现一个超时机制。如果实现了这样的机制,该机制必须: