【PCIe 5.0 - 8】PCIe 事务层详解4 - First/Last DW Byte Enables规则

First/Last DW Byte Enables规则
  Byte Enables包含在Memory、I/O 和Configuration Requests中。本节定义了相应的规则。Byte Enables出现在Request header中时,位于header的字节 7(见图1)。对于设置了 TH 位的Memory Read Requests,Byte Enables字段被重新用于承载 ST[7:0] 字段,Byte Enables的值隐含如下定义。当它可以完成这些Requests时,TH 位必须只在Memory Read Requests中设置,就好像请求数据的所有字节都已启用一样。


图1 Byte Enables在TLP Header中的位置
对于设置了 TH 位的Memory Read Requests,Byte Enables隐含以下值。
如果该请求的Length字段指示 1 个 DW长度,则 First DW Byte Enables 的值暗示为 1111b,Last DW
Byte Enables 的值暗示为 0000b。
如果该请求的长度字段指示大于 1 个 DW长度,则第一个 DW 字节启用和最后一个 DW Byte Enables的值暗示为 1111b。
设置 TH 位和目标Non-Prefetchable Memory Space的Memory Read Requests应在可以保证完成此类读取不会产生不良副作用的情况下发出。

First DW BE[3:0] 字段包含请求引用的第一个(或唯一)DW 的Byte Enables。如果请求的Length字段大于 1 DW,则该字段不得等于 0000b。
Last DW BE[3:0] 字段包含请求的最后一个 DW 的Byte Enables。
如果请求的Length字段 1 个 DW,则该字段等于 0000b。
如果请求的Length字段大于 1 DW,则该字段不等于 0000b。
对于Byte Enables字段的每一位:
0b 表示不得写入相应的数据字节,或者如果不可预取,则不得在Completer上读取。
1b 表示必须在Completer上写入或读取相应的数据字节。
对于长度为 1 DW 的所有Requests,在第一个 DW BE 字段中允许非连续Byte Enables(enabled字节由non-enabled字节分隔)。
非连续Byte Enables示例:1010b、0101b、1001b、1011b、1101b
在长度为2 DW的Quad Word (QW) 对齐Memory Requests的两个Byte Enables字段中都允许非连续Byte
Enables
长度为 2 DW (1 QW) 的所有非 QW 对齐的Memory Requests和长度为 3 DW 或更多的Memory
Requests必须仅enable与请求的第一个和最后一个 DW 之间的数据连续字节。
连续Byte Enables示例:
First DW BE:1100b,Last DW BE:0011b
First DW BE:1000b,Last DW BE:0111b
表1显示了 Byte Enables 字段bit、它们在Request header中的位置以及引用数据的相应字节之间的对应关系。
表1 Byte Enables对应关系
Byte Enables    Header Location    影响的数据字节
First DW BE[0]    Bit 0 of Byte 7    Byte 0
First DW BE[1]    Bit 1 of Byte 7    Byte 1
First DW BE[2]    Bit 2 of Byte 7    Byte 2
First DW BE[3]    Bit 3 of Byte 7    Byte 3
Last DW BE[4]    Bit 4 of Byte 7    Byte N-4, 假设引用的数据长度为 N 个字节
Last DW BE[5]    Bit 5 of Byte 7    Byte N-3
Last DW BE[6]    Bit 6 of Byte 7    Byte N-2
Last DW BE[7]    Bit 7 of Byte 7    Byte N-1
允许一个长度为 1 DW 且没有bytes enabled的Write Request,除非另有规定,否则在Completer上没有影响。
没有byte enabled的 1 DW Memory Write Request或“零长度写入”可被某些协议下的设备使用,以实现预期的副作用,如LN 协议。
没有enable byte的 1 DW Memory Read Request,或“零长度读取”,可以被设备用作flush Request的一种类型。 对于Requester,flush允许设备确保之前发出的 Posted Writes 已在其 PCIe目的地完成。 为了在所有情况下都有效,零长度读取的地址必须与正在flush的Posted Writes针对相同的设备。推荐的方法是使用与正在flush的 Posted Writes 之一相同的地址。

如果 1 DW 的Read Request指定没有enable byte的读取(第一个DW BE[3:0]=0000b),则相应的Completion 必须指定1个 DW 的长度,并包含1个DW的data payload,但未指定Completion packet中data payload的内容,它可以是任何值。

对于违反本文中指定的Byte Enables规则的 TLP,Receiver/Completer行为未定义。

Receiver可以选择检查是否违反了本节中指定的Byte Enables规则。这些检查都是独立可选,如果执行此类检查的Receiver确定 TLP 违反了一个或多个Byte Enables规则,则该 TLP 是Malformed TLP。

如果检查了Byte Enables规则,会报告与Receiving Port相关的违规错误。
flush语义具有广泛的应用,所有Completers都必须实现与此语义相关的功能。 由于Requester可能在不理解Completers特征的情况下使用flush语义,Completers必须确保零长度读取没有副作用。 这实际上只是规则的一个特定情况,即在不可预取空间中,不得在 Completer 处读取non-enabled bytes。 注意的是,flush仅适用与零长度读取相同的Traffic Class中的Traffic。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/BGONE/article/details/122091720

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值