首页 理论教育PCIExpress体系结构介绍VC的初始化

PCIExpress体系结构介绍VC的初始化

【摘要】:图9-12 FCP的格式Current节点使用以上报文向Upstream节点发送Credit信息,其中InitFC1和InitFC2与VC的初始化相关,而Update FC负责向Upstream节点反馈Credit信息。在各个节点能够正常使用之前,首先需要对VC0进行初始化。在VC的初始化过程中存在两个状态,FC_INIT1和FC_INIT2。当节点进入FC_INIT2状态时,与流量控制相关的缓存已经初始化完毕。当所有数据缓存的FI2状态位有效后,将完成PCIe链路流量控制机制的初始化。

PCIe总线使用FCP(Flow Control Packets)传递Credit信息,FCP是一种DLLP,该报文的使用与事务层的接收缓存直接相关,但是对事务层透明,该报文产生于数据链路层,终止于数据链路层。PCIe总线定义了以下FCP,如表9-4所示。

表9-4 PCIe总线定义的FCP

978-7-111-29822-9-Part02-128.jpg

①V2V1V0与VC对应,PCIe总线规定VC个数的最大值为8,因此使用3位存放VC号。

由上表所示FCP共分为三大类InitFC1、InitFC2和Update FC。在这三类报文中有3个重要的字段。其中HdrFC字段存放Header的Credit;DataFC字段存放Data的Credit;而VC ID字段存放不同的VC号。其报文格式如图9-12所示。

978-7-111-29822-9-Part02-129.jpg

图9-12 FCP的格式

Current节点使用以上报文向Upstream节点发送Credit信息,其中InitFC1和InitFC2与VC的初始化相关,而Update FC负责向Upstream节点反馈Credit信息。我们首先讲述Cur-rent节点如何使用InitFC1和InitFC2报文初始化VC的流量控制,并在第9.3.4节讲述如何使用Update FC报文实现PCIe总线的流量控制。

在各个节点能够正常使用之前,首先需要对VC0进行初始化。当VC0初始化完毕之后,PCIe设备可以对VC1~7进行初始化。在VC0初始化完成之前,设备不能接收任何TLP,而VC0初始化完毕后,PCIe总线的相应节点在使用VC0接收TLP的同时,初始化其他VC。在VC的初始化过程中存在两个状态,FC_INIT1和FC_INIT2。

PCIe总线的数据链路层共有三个状态,分别为DL_Inactive(PCIe链路无效状态,链路不可用或者链路上没有连接有效设备)、DL_Init(PCIe链路可用,此时将进行VC0的初始化)和DL_Active(链路可以正常使用)。(www.chuimin.cn)

当Current节点的数据链路层进入DL_Init状态时,该节点的VC0将进入FC_INIT1状态。Cur-rent节点将在FC_INIT1状态首先初始化VC0,之后才能初始化其他VC。其他VC的使能位在Current节点的配置空间中,当系统软件打开这些使能位时,Current节点将初始化其他VC。

当Current节点的VC进入FC_INIT1状态时,事务层需要首先禁止该VC发送数据报文,随后Current节点将向Upstream节点依此发送InitFC1-P、InitFC1-NP和InitFC1-Cpl[64]报文初始化Upstream节点使用的Credit。

此时Current节点还可能收到来自Downstream节点的InitFC1-P、InitFC1-NP和InitFC1-Cpl报文,并初始化Current节点的Credit。当Current节点收到这些来自Downstream节点的FCP后,将设置对应缓冲的FI1状态位为1。

当Current节点所有缓存的FI1状态位有效后,VC将进入FC_INIT2状态。Current节点进入FC_INIT2状态之前,Upstream节点获得的Credit和Current节点的空余缓存大小相等,Current节点获得的Credit和Downstream节点的空余缓存大小相等。这一点和其他流量控制机制类似,即Crd_Bal的初始值为Buf_Alloc。

PCIe总线还提供了FC_INIT2状态,该状态的主要功能是验证FC_INIT1的结果。当节点进入FC_INIT2状态时,与流量控制相关的缓存已经初始化完毕。PCIe总线设置FC_INIT1和FC_INIT2这两个状态与数据链路层的状态机相关。

如第7.1.1节所示,当数据链路层处于DL_Init状态时,将初始化PCIe总线的流量控制机制。当VC处于FC_INIT1状态时,数据链路层通知事务层DL_Down状态位有效,此时事务层不能向对端设备发送TLP,从而流量控制机制的初始化可以在一个“相对没有干扰的环境”下进行。

而当Current节点的VC进入FC_INIT2状态时,事务层需要首先禁止使用这条VC发送报文,之后Current节点向Upstream节点依此发送InitFC2-P、InitFC2-NP和InitFC2-Cpl报文初始化Upstream节点的发送缓冲。当Upstream节点收到这些报文之后,将丢弃这些报文中包含的Credit信息,并设置相应的FI2状态位。

同理Current节点也将收到来自Downstream节点的InitFC2-P、InitFC2-NP和InitFC2-Cpl报文,并设置Current节点的FI2状态位。当所有数据缓存的FI2状态位有效后,将完成PCIe链路流量控制机制的初始化。最后数据链路层通知事务层DL_Active状态位有效,此时事务层可以使用这个VC发送TLP。