描述符
事务描述符是一种在请求者和完成者之间携带事务信息的机制。事务描述符由三个字段组成:
•事务ID -标识未完成的事务
•属性字段-指定事务的特征
•流量类(TC)字段-将事务与所需服务类型相关联
下图显示了事务描述符的字段。请注意,这些字段一起显示,以突出显示它们作为单个逻辑实体部分的关系。这些字段在包头中不是连续的。
事务描述符-事务ID字段
事务ID字段由两个主要的子字段组成: Requester ID,Tag。
Request ID={BusNumber,Device Number,Function Number}
对于non-posted类型的请求如存储器读请求、配置读写请求、IO读写请求中,除了RequestID字段还需要Tag字段,Request ID字段和Tag字段合称为Transaction ID。
Transaction ID={Request ID,Tag};
Transaction ID的作用是使接收端分析报文的Transaction ID,确认报文到达的最终目的地。
对于non-posted类型的请求,在未收到目标设备的完成报文之前,TLP的发送端需要保存这个TransactionID(Tag字段),此时设备的Tag字段不能再次被使用,直到一次数据传输结束,即数据发送端收齐与该TLP对应的所有报文。
在同一段时间内,在当前的PCI总线域中不能存在两个及以上的Transaction ID相同存储器读请求。
在[PCIe-4.0]中引入的10位标签功能将总标签字段大小从8位增加到10位。两个额外的Tag位,Tag[8] (T8)和Tag[9] (T9),与TLP报头中的其他Tag[7:0]位不相邻。这两个额外的位在本规范的先前版本中是保留的。
•Tag[9:0]是由每个请求者生成的一个10位字段,它必须是唯一的所有未完成的请求,需要完成该请求者。不支持10位Tag Requester功能的请求者必须将Tag[9:8]设置为00b。
◦支持16.0 GT/s或更高数据速率的功能(包括交换机中的功能)必须支持10位标签补全功能。如果一个函数支持10-Bit Tag Completer capability,它可以选择支持10位标签请求功能。
◦包含指示支持 10-Bit Tag Completer capability 元素的 RC 必须正确处理所有寄存器和作为 PCIe Requesters 的目标所支持的内存区域的 10-Bit Tag Requests;例如,DMA Requests 的目标 host memory 或 RCiEP 中的 MMIO 区域。
◦如果 RC 包含支持 10-Bit Tag Requester capability 的 RCiEP,则 RC 必须正确处理来自这些 RCiEP 的 10-Bit Tag Requests,所有寄存器和内存区域支持作为这些 RCiEP 的目标; 例如,以 DMA Requests 为目标的 host memory 或 RCiEP 中的 MMIO 区域。
◦如果10-Bit Tag Requester Enable位为Clear, Extended Tag Field Enable位为Clear,则每个功能的最大未完成请求数应限制为32,并且仅使用Tag字段的低5位,剩余的高5位需要为0 0000b。
◦如果10-Bit Tag Requester Enable位为Clear,并且Extended Tag Field Enable位为Set,则最大值增加到256,并且仅使用Tag字段的低8位,其余的高2位需要为00b
◦如果10位标签请求者启用位设置,最大目标单个完成器增加到768。请求者被允许在向它认为合适的完成者发送10位标签请求时使用标签字段的所有10位,尽管请求者仍然被允许向其他完成者发送较小的标签请求。以下内容适用于设置了“10-Bit Tag Requester Enable”位的10-Bit Tag capable Requesters。
▪10位标签,有效的标签[9:8]值是01b, 10b,或11b。Tag[9:8]等于00b的10位Tag值是无效的,并且不能由请求者生成。这使请求程序能够确定它收到的应该具有10位标记的补全是否包含无效标记,这通常是由于补全程序不支持10位标记补全功能造成的。
▪如果一个请求者发送一个10位的标签请求给一个缺乏10位补全能力的补全者,返回的补全者将有一个标签[9:8]等于00b的标签。由于请求者被禁止为10位标签生成这些标签值,因此此类完成将为Unexpected Completions 处理
▪如果 Requester 支持同时向一些 Completers 发送 10-Bit Tag Requests 和向其他 Completers 发送 smaller-Tag Requests,则 Requester 必须遵守 smaller-Tag Requests 的 Extended Tag Field Enable 位设置。 即如果该位为Clear,则只有Tag字段的低5位可能为非0; 如果该位被Set,则只有 Tag 字段的低 8 位可能是非0的。
◦扩展标签字段启用位的默认值是具体实现的。10位Tag Requester Enable位的默认值为0b。
◦如果多个未完成的请求发出非唯一的标签值,接收/完成行为是未定义的。
• For Posted Requests ,Tag[9:8]字段是保留的。
•对于设置TH位的Posted Requests,Tag[7:0]字段被重新用于ST[7:0]字段。对于带有TH位Clear的Posted Requests, Tag[7:0]字段是未定义的,可以包含任何值。
◦对于带有TH字段Clear的Posted Requests,Tag[7:0]字段中的值不得影响请求的接收方处理。
◦对于设置TH位的Posted Requests, ST[7:0]字段的值可能会影响请求的Completer处理
•请求者ID和标签组合形成一个全局标识符,即层次结构中每个事务的事务ID。
•事务ID包含在所有请求和完成中。
•请求者ID是一个16位的值,对于一个层次结构中的每个PCI Express函数都是唯一的。
•Functions 必须捕获与 Function 完成的 Type 0 Configuration Write Requests 一起提供的 Bus 和 Device Number(在 ARI 设备中,Functions 只需捕获 Bus Number。ARI 设备可按 Device 或按 Function 保留捕获的 Bus Number。如果按 Device 保留捕获的 Bus Number,则所有 Functions 都必须更新和使用这个公用的 Bus Number。),并在 Device/Function 发起的所有请求的 Requester ID 的 Bus 和 Device Number 字段中提供这些编号(ARI Requester ID 不含 Device Number)。建议仅为成功完成的请求获取编号。
例外: Bus Number 和 Device Number 分配给 Root Complex 内的设备,以及 Device Numbers 分配给 Switch 内的 Downstream Ports,可按具体实施方式进行。
注意,总线号和设备号可能在运行时更改,因此有必要对每个配置写请求重新捕获此信息。
建议对未实现功能的配置写请求不影响捕获的总线号和设备号。
•当交换机代表自己生成请求时(例如,错误报告),交换机必须使用与桥的主端相关联的请求者ID,该主端逻辑上与端口相关联(参见章节7.1),从而生成请求。
•在 Function 初始化 Configuration Write 之前,Function 禁止发起 Non-Posted Requests。(需要有效的 Request ID 才能正确路由所产生的完成)。例外:根复杂中的功能被允许在软件启动配置访问系统启动设备之前发起请求。
请注意,此规则和例外与用于系统初始化和配置的现有PCI模型一致。
•与设备相关联的每个功能必须设计为响应针对该设备的配置请求的唯一功能号。
注意:每个non-ARI设备最多可以包含8个函数。每个ARI设备最多可以包含256个功能。
•Switch 必须在不修改 Transaction ID 的情况下转发请求。
•在某些情况下,PCI Express到PCI/PCI- x桥需要为它从PCI或PCI- x总线转发的请求生成Transaction id。