Completion完成规则
所有的Read, Non - Posted Write和AtomicOp请求都需要Completion。Completion包括一个Completion头,对于某些类型的完成,后面会跟着一些DW的数据。
•Completion通过ID路由,并使用3 DW头。
◦请注意,路由ID字段直接对应于与相应请求提供的请求者ID。因此,对于Completions,这些字段将被统称为请求者ID,而不是通常用于ID路由的不同字段。
•除了包含在所有TLPs和ID路由字段的报头字段,Completions包含以下附加字段(见图2-38):
◦Completer ID[15:0] -标识Completer
◦Completion Status[2:0] -指示一个Completion的状态(见表2-35)
◦BCM -字节计数修改-这个位不能由PCI Express Completers设置,只能由PCI- x Completers设置
◦字节计数Byte Count [11:0]-请求的剩余字节计数 如果一次发送完了,不需要剩余,那么此时指的是发送字节数
▪字节计数值指定为二进制数,用0000 0000 0001b表示1字节,1111 1111 1111b表示4095字节,并且0000 0000 0000b表示4096字节。
▪对于内存读完成,字节计数[11:0]是根据2.3.1.1节的规则设置的。
▪对于AtomicOp completions, Byte Count的值必须等于相关AtomicOp操作数的字节大小。
▪对于所有其他类型的Completions,字节计数值必须为4。
◦Tag[9:0] -与请求者ID字段相结合,对应于事务ID
◦Lower Address[6:0] -完成起始字节的较低字节地址
▪对于内存读取完成,该字段的值是与完成返回的数据的第一个启用字节的字节地址(参见2.3.1.1节中的规则)。
▪对于AtomicOp completion, Lower Address字段是保留的。
▪该字段设置为所有剩余类型的completions全部为0。接收方可以选择检查是否违反此规则。
Completer ID[15:0]是一个16位的值,对于一个层次结构中的每个PCI Express函数都是唯一的
(请求者ID和完成者ID一致,只是发起者不同的区别,都是BDF)
•功能必须捕获由该功能完成的所有Type 0配置写请求提供的总线号和设备号,并将这些数值提供在设备/功能生成的所有完成消息的总线和设备编号字段中。。
◦如果一个功能必须在初始设备配置写请求之前生成一个Completion,必须在总线号和设备号字段中输入0
◦注意总线号和设备号可能在运行时更改,因此有必要重新捕获每个配置写请求的此信息。
◦例外:在根复合体内的设备的总线号的分配可以在实现特定的方式完成。
•在某些情况下,具有UR状态的Completion可以由MFD生成,而无需将Completion与设备内的特定功能相关联-在这种情况下,功能号字段是保留的。
◦示例:MFD接收到一个读取请求,该请求不针对与设备的任何功能相关的任何资源-设备生成一个带有UR状态的Completion,并在Completer ID的Function Number字段中设置一个全0的值。
•完成报头必须为请求者ID、Tag和流量类TC提供与相应请求报头中提供的相同的值。
•Completion头必须为属性提供与相应请求头中提供的相同的值,除非明确允许:
◦当使用IDO时(参见第2.2.6.4节)
◦当在Translation Completion中使用RO时(参见第10.2.3节)
•如果Completer是LN Completer (LNC)并且目标内存区域支持寄存,则适用以下规则;否则LN位必须为Clear。
◦如果“Completion Status”为“Successful Completion”,且对应的“Request”为“LN Read”,则必须设置LN位。
◦否则,LN位必须是Clear。
•TH位预留。
•AT[1:0]必须是00b。不要求或不鼓励接收方检查此选项。
•在完成设备的软件初始化和配置(至少使用一个配置写请求)之前,完成ID字段是没有意义的,对于这种情况,请求者必须忽略完成ID字段返回的值。
•包含数据的Completion必须指定Completion中返回的实际数据量,并且必须包括指定的数据量。
◦这是一个TLP形成错误,包括更多或更少的数据比指定的长度字段,并由此产生的TLP是一个畸形的TLP。
注意:这只是一般规则要求TLP数据有效负载长度与length字段中的值匹配的特殊情况。