【PCIe 5.0 - 6】PCIe 事务层详解2 - 带Data Payloads的TLP封装规则

本节术语

术语词解释
ARIAlternative Routing-ID,用于Requester IDs,Completer IDs以及Routing ID。
ARI Device与Upstream Port关联的设备,其Functions均包含 ARI Extended
ARI Downstream Port支持 ARI 转发的Switch Downstream Port或Root Port。
little endian小端,一种存放二进制数据的格式,其中所有数字的低位组放在最前面
big endian大端,一种二进制数据储存和传输格式,位于前面的是最高位位元或位元组

带Data Payloads的TLP封装规则

  • Length表示DW的数目,为整数
  • 除了那些明确引用数据长度的消息,Length[9:0] 为所有Message保留
    • 请参阅第 2.2.8 节中的Message Code表。
  • 有 data payload的 TLP 发送器不允许TLP Length字段给出的data payload长度超过发送器Device Control寄存器 Max_Payload_Size 字段中的值指定的DW长度。
    • 对于ARI 设备,Max_Payload_Size 仅由Function 0 中的设置决定,忽略其他Function中的 Max_Payload_Size 设置。
    • 如果一个非ARI Multi-Function Device(MFD)中的所有Functions 的Max_Payload_Size完全相同,如果有个Upstream Port与这个MFD相关联,它传输的 TLP data payload不得超过通用 Max_Payload_Size 设置。
    • 如果一个非ARI Multi-Function Device(MFD)中的所有Functions 的Max_Payload_Size不完全相同,如果有个Upstream Port与这个MFD相关联,它传输的 TLP data payload不得超过我们自定义的 Max_Payload_Size 设置。
      • 推荐发送器实现使用生成事务的Function的 Max_Payload_Size 设置,或者所有Functions的最小 Max_Payload_Size 设置。
      • 除非软件知道具体实现,否则软件不应将不同Functions中的Max_Payload_Size设置为不同的值。
      • 注意:Max_Payload_Size 仅适用于有data payload的 TLP; Memory Read Request的长度不受 Max_Payload_Size 的限制,它的大小由 Length 字段控制。
    • 由 TLP 的 Length 字段给出的已接收 TLP 的data payload大小不得超过接收器设备Controller 寄存器的 Max_Payload_Size 字段中的值指定的长度。
      • 接收者必须检查是否违反此规则。 如果接收器确定 TLP 违反此规则,则该 TLP 是格式错误的 TLP,这是一个与接收端口相关的报告错误。
      • 对于 ARI 设备,Max_Payload_Size 仅由Function 0 中的设置确定。其他Function中的 Max_Payload_Size 设置将被忽略。
      • 如果一个非ARI Multi-Function Device(MFD)中的所有Functions 的Max_Payload_Size完全相同,如果有个Upstream Port与这个MFD相关联,接收器需要根据通用 Max_Payload_Size 的设置检查 TLP data payload大小。
      • 如果一个非ARI Multi-Function Device(MFD)中的所有Functions 的Max_Payload_Size不完全相同,如果有个Upstream Port与这个MFD相关联,接收器需要根据自定义的Max_Payload_Size 设置检查 TLP 的data payload。
        • 鼓励接收器实现使用事务目标Function的 Max_Payload_Size 设置,或者所有Function中最大的 Max_Payload_Size。软件不应将不同 Functions 中的 Max_Payload_Size 设置为不同的值,除非软件知道具体实现。
  • 对于包含数据的 TLP,Length字段中的值与 TLP 中包含的实际数据量必须匹配。同时,接收者必须检查是否违反此规则。 如果接收器确定 TLP 违反此规则,则该 TLP 是Malformed TLP,这是一个跟Receiving Port相关的Reported Error。
  • Length字段仅指示数据部分 - TLP Digest不包含在Length中。
  • 当与字节地址关联的data payload包含在 AtomicOp Request或 AtomicOp Completion以外的 TLP 中时,header后面的数据的第一个字节对应于最接近零的字节地址,随后的字节按递增的字节地址顺序排列。
    • 示例:对于位置 100h 的16 字节写入,header后面的第一个字节是要写入位置 100h ,第二个字节写入位置 101h,依此类推,最后一个字节将写入位置 10Fh。
  • AtomicOp Requests 和 AtomicOp Completions 中的data payload格式必须使 TLP header之后的第一个数据字节是第一个数据值的最低有效字节,并且后续数据字节的重要性严格增加。 对于Compare And Swap (CAS) Requests,第二个数据值紧跟在第一个数据值之后,并且必须采用相同的格式。
    • AtomicOp Completers 用于在目标位置读取和写入数据的字节存储次序格式取决于实现方式,并且可以是 Completer 确定的适合目标内存的任何内容(例如,little endian, big endian等)。
    • 小端示例:对于目标内存为小端格式的64位(8字节)Swap Request,目标内存为小端格式,header后面的第一个字节写入位置100h,第二个字节写入位置101h,并且依此类推,最后一个字节写入位置107h。请注意,在执行写入之前,Completer首先读取目标内存位置,以便它可以返回Completion中的原始值。Completion中数据的字节地址与Request对应相同。
LocationHeader100h101h102h103h104h105h106h107h
Order-->... -->
  • 大端示例:对于目标内存为大端格式的64位(8字节)Swap Request,目标内存为大端格式,header后面的第一个字节写入位置107h,第二个字节写入位置106h,依此类推,最后一个字节写入位置100h。请注意,在执行写入之前,Completer首先读取目标内存位置,以便它可以返回Completion中的原始值。Completion中数据的字节地址与Request对应中相同。
Location Header107h106h105h104h103h102h101h100h
Order-->... -->
  • 图1显示了针对 64 位(8 字节)FetchAdd 的 Completer 目标内存访问的小端和大端示例。 操作数和结果中的字节编号为 0-7,字节 0 最低有效,字节 7 最高有效。 每种情况,Completer 都使用适当的endian格式获取目标内存操作数。 接下来,Completer 中的 AtomicOp 计算逻辑使用原始目标内存值和 FetchAdd 请求中的“添加”值执行 FetchAdd 操作。 最后,Completer 使用与获取相同的endian格式将 FetchAdd 结果存储回目标内存。
    Examples of Completer Target Memory Access for FetchAdd
图1 FetchAdd Completer目标内存访问示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值