写在前面:
1、本文参考来源PCIe 6.2,2024.02.25
2、仅作为个人学习记录和分享,转载请注明出处
3、个人能力有限,协议的理解均基于个人,如有错误还望指出
目录
一、MPS/MRRS/RCB
1.MPS
MPS的全称为Max Payload Size,字面含义就是最大负载大小,一般应用在携带payload的TLP中,常见的有MWr和CPLD。在此以Single-Function的Endpoint为例说明, 就是其产生和接收到的携带数据负载的TLP包中的数据长度不可以超过MPS的限制。如果是多功能设备则建议采用所有function中的最小设置值(当然不建议配置不同的function为不同的MPS值),特别的对ARI设备必须采用Function 0的设置值。
MPS的配置主要涉及到三个寄存器,如图1.1和图1.2所示。
图1.1 Device Capabilities Register
图1.2 Device Control Register
Max_Payload_Size Supported:此寄存器的属性为RO,即表示当前function支持的最大负载大小,其编码与大小对应关系如下:
- 000b-128bytes
- 001b-256bytes
- 010b-512bytes
- 011b-1024bytes
- 100b-2048bytes
- 101b-4096bytes
- 110b-Reserved
- 111b-Reserved
注意在FM下,其最小配置值为512bytes
Rx_MPS_Fixed:此寄存器的属性为HwInt。根据协议解释其置1的时候Rx_MPS_Limit由Max_Payload_Size Supported域表示否则则由Max_Payload_Size域表示。在FM模式下其位必须置1。一般来讲,接收端需要支持所有function中最大的MPS设置。注意在FM下,需要支持接收length域指示的整个范围的TLP,用来确定TLP的总大小和确定下一个TLP的开始位置。
Mixed_MPS_Supported:此寄存器的属性位HwInt。当其置1时,function需要具备根据不同的目标实现并支持不同MPS配置的能力。在FM模式下此位必须置1。
Max_Payload_Size:此寄存器的属性为RW。一般来讲此寄存器的值表示了function的最大数据负载。其编码与大小对应关系如下:
- 000b-128bytes
- 001b-256bytes
- 010b-512bytes
- 011b-1024bytes
- 100b-2048bytes
- 101b-4096bytes
- 110b-Reserved
- 111b-Reserved
2.MRRS
MRRS的全称为Max Read Request Size,其主要是用来限制Memory读请求单次能请求的最大长度。
图1.3 Device Control Register
Max_Read_Request_Size:此寄存器的属性为RW。其编码与大小对应关系如下:
- 000b-128bytes
- 001b-256bytes
- 010b-512bytes
- 011b-1024bytes
- 100b-2048bytes
- 101b-4096bytes
- 110b-Reserved
- 111b-Reserved
3.RCB
RCB的全称为Read Completion Boundary,其主要是用来控制CPLD返回的个数,其需要根据地址和长度来判断。一般来说需要满足两个条件(当出现返回地址不是RCB的整数倍时):
- 从请求地址整包返回
- 除起始包和结尾包之外的均为RCB的整数倍(包括地址和数据)
切割示例:
Memory读请求地址为10020h且长度为100h(256d)时,并且操作对象为Ep时,切割可以存在如下几种情况:
- 256
- 96+160
- 96+128+32
- 224+32
图1.4 Link Control Register
Read Completion Boundary:此寄存器的属性对RP/Switch Port为RO,对Ep和Bridge为RW,其编码对应关系为:0b--64byte;1b--128byte,特别的对Ep来讲此寄存器值一般为1,即128byte
二、Routing Rules
路由规则主要分成三种,分别为地址路由、ID路由和隐式路由。其中隐式路由只适用于Message请求中。
1.地址路由
一般地址路由在Memory、IO和地址路由消息中使用。在NFM模式下,其具备3DW和4DW两种格式,如图2.1和图2.2所示。在FM模式下,其具备3/4/5/6/7DW(FM中定义的最大的Header Base的大小为7DW)五种格式,如图2.3/2.4/2.5所示,其中超过4个DW的长度只是在4DW之后根据不同的类型进行增加。
图2.1 32-bit Address Routing-NFM
图2.2 64-bit Address Routing-NFM
图2.3 32-bit Address Routing-FM
图2.4 64-bit Address Routing-FM
图2.5 64-bit Address Routing-FM-5/6/7DW
注意:在FM模式下AT域中编码为01b时为Reserved;对地址在4GB范围内的请求,requester必须使用32-bit格式。对于使用64-bit地址格式且高32bit为0的格式来访问地址小于4GB来讲,receiver的行为不进行规定;对所有地址路由的UIO请求、包含部分header加密的IDE TLPs和采用地址路由的FM模式的消息均必须使用64-bit地址格式(当地址访问小于4GB的空间时,高32bit为零)
2.ID路由
一般ID路由在配置请求、ID路由消息和完成包中使用。ID路由主要采用Bus、Device、Function Number来定义TLP的目的地。对Non-ARI设备来说BDF分别占用8-bit/5-bit/3-bit,对ARI设备来说为BF,其分别占用8-bit/8-bit。对FM来说,completion和ID路由消息采用Destination Segment(Destination BDF)来路由到目的Hierarchy中。NFM下采用的两种Header格式如图2.6和图2.7所示。FM下采用3/4/5/6/7DW,如图2.8/2.9所示。
图2.6 ID Routing For 3DW Header-NFM
图2.7 ID Routing For 4DW Header-NFM
图2.8 ID Routing For 3DW Header Base-FM
图2.9 ID Routing For 4/5/6/7DW Header Base-FM
3.隐式路由
隐式路由机制下没有地址或者ID来标识目的地,采用的 是Header中Type域的低3bit来表示路由类型,如表2.1所示。
表2.1 消息路由
r[2:0] | Description | Bytes 8-15(no VDM) |
---|---|---|
000b | 路由到RC | Reserved |
001b | 在FM下使用address+AT路由 | Address/AT |
010b | 通过ID路由 | 参考上一小节 |
011b | 从RC进行广播 | Reserved |
100b | local-terminate at Receiver | Reserved |
110b | Gathered and routed to RC | Reserved |
111b | Reserved-Terminate at Receiver | Reserved |
三、FDBE/LDBE
写在介绍前,在此不讨论TH bit置1的情况,即Memory Read中的FDBE/LDBE域为ST[7:0]
1.FM
FDBE/LDBE的全称为First/Last DW Byte Enables,理解就是表示数据负载中第一个DW和最后一个DW中那些bytes生效,置1表示有效,反之无效。LDBE和FDBE所处位置分别为TLP Header的Byte7的高4bit和低4bit。FDBE/LDBE只存在于Memory/IO/Configuration Request中。
相关规则如下:
1.1 长度为1DW时
- FDBE不可以为0000b
- LDBE必须为0000b
- FDBE允许空洞访问,例如1010b;0101b;1001b等
1.2 长度为2DW时
- LDBE必须不为0000b
- Memory请求地址为QW对齐时,FDBE和LDBE不允许出现空洞
- Memory请求地址为非QW对齐时,允许FDBE和LDBE组合为非空洞,但是其本身不可出现空洞,例如1100b-0011b;1000b-0111b
1.3 长度大于等于3DW时
- LDBE必须不为0000b
- Memory请求地址为非QW对齐时,允许FDBE和LDBE组合为非空洞,但是其本身不可出现空洞,例如1100b-0011b;1000b-0111b
特别的,允许出现零长度的读写,即Memory Write/Read Request请求中length域为1DW,但是FDBE/LDBE均为0000b,其中写请求不会对Completer产生任何影响,Completer会对读请求产生携带1DW数据的completion,其1DW数据可以为任何内容,同样的此特殊情况的读请求也不可以操作non-prefetchable空间。
2.NMF
基本上与FM类似。但是FDBE/LDBE只存在于OHC-A1/OHC-A2/OHC-A3中,相对的,需要使用FDBE/LDBE时需要包含对应OHC-A类型。
对Memory Request来说,其长度大于等于2DW,且没有包含OHC-A1则认为其LDBE和FDBE均为1111b,否则则必须包含OHC-A1。
注意:出于安全性的考虑,建议对DW中不生效的byte均填充0。
四、Transaction ID
Transaction ID是Transaction Descriptor的一部分,其主要是用来标识未完成的transctions(outstanding Transactions),一般用来将completions跟requests联系起来(在此不讨论在groups之间不需要采用唯一Transaction ID的三种特殊的completion groups)。Transaction ID主要包含Requester ID和Tag两部分,部分情况下还包含TC,如图所示。
图4.1 Transaction ID
1.Tag
Tag主要有四种大小:14-bit;10-bit;8-bit;5bit,对于一个Function来讲,其作为Reuqester或者Completer时可以支持不同的Tag大小。Tag在使用时需要遵循如下规则:
- 所有Function都必须支持8-bit Tag Completer能力,特别的对UIO Completer来说必须支持14-bit Tag
- 支持FM的Function必须支持14-bit Tag Completer能力,因此其自然支持10-bit Tag Completer
- 支持超过16GT/s数据速率的Function(包括Switch,除PCI/PCIX Bridge)必须支持10-bit Tag Completer能力
- Function在不可以支持10/14-bit Tag Requester能力,除非其支持10/14-bit Tag Completer能力
- 在NFM下,Tag[9]和Tag[8]在不支持10-bit Tag Requester能力下必须均为0b
- Receiver/Completer在处理Tag时,只关注对应Completer capability寄存器配置,不关注Requester Enable寄存器配置(8-bit Tag对应的为Extended Tag Field Enable)
- 如果在Ep中10/14-bit Tag Requester Enable均使能,则允许使用14-bit Tag来产生对host memory的访问。一般来讲不允许软件或者固件使能14-bit Tag Requester Enable,除非HOST支持14-bit Tag Completer
- 当Ep访问的是另一个Ep时,建议采用8/5-bit Tag,除非两者一致
- 对14-bit Tag来说,强烈建议认为非0000b的Tag[13:10]为有效值,且Requester不产生Tag[13:10]为0000b的Tag值。但是为了兼容此前的版本,可以产生Tag[13:8]为000000b之外的任意值,并认为其是有效的
- 对10-bit Tag来说,为00b的Tag[9:8]为无效值,且Requester不产生Tag[9:8]为00b的Tag值。
- 如果Requester产生了10/14-bit Tag的请求给没有对应Tag Completer能力使能的Completer则会产生无效的Tag Completion,此Completion被认为是UC,并且Requester会认为completion timeout
- 如果Requester支持同时向不同的completer发送10/14-bit Tag和8/5-bit Tag请求,则要求Extended Tag Field Enable的配置值与8/5-bit Tag请求保持一致
- 在FM下,要求Completer可以同时处理来自不同的Hierarchies的具备相同 Transaction ID的请求
- 对Posted请求来说,在NFM下,Tag[13:8]保留(实际上Tag只有10bit);在FM下,Tag[13:0]保留
- 在同一个Hierarchy下Transaction ID和Reuqester ID都是唯一的,并且Transaction ID被包含在Request和Completion中
表4.1 Tag使能配置对应允许Tag范围关系表
14-bit Tag Requester Enable | 10-bit Tag Requester Enable | Extended Tag Field Enable | Maximum Request Tag Size | 8-bit Tag Completer允许的范围 | 10-bit Tag Completer允许的范围 | 14-bit Tag Completer允许的范围 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 5-bit | 0-31 | 0-31 | 0-31 |
0 | 0 | 1 | 8-bit | 0-255 | 0-255 | 0-255 |
0 | 1 | 0 | 10-bit | 0-31 | 256-1023 | 256-1023 |
0 | 1 | 1 | 10-bit | 0-255 | 256-1023 | 256-1023 |
1 | 0 | 0 | 14-bit | 0-31 | 0-31 | 1024-16383 |
1 | 0 | 1 | 14-bit | 0-255 | 0-255 | 1024-16383 |
1 | 1 | 0 | 14-bit | 0-31 | 256-1023 | 1024-16383 |
1 | 1 | 1 | 14-bit | 0-255 | 256-1023 | 1024-16383 |
2.相关寄存器
图4.2 Device Capibilities Register
图4.3 Device Control Register
图4.4 Device Capibilities 2 Register
图4.5 Device Control 2 Register
图4.6 Device Capibilities 3 Register
图4.7 Device Control 3 Register
Extended Tag Field Supported:此寄存器的属性为RO。此寄存器在10-bit或者14-bit Tag Reuqester Supported位置1的时候置1,当其置1时标识其支持8-bit Tag,否则则支持5-bit Tag
Extended Tag Field Enable:此寄存器的属性为RW。在10-bit和14-bit Tag Requester Enable均失效的情况下,此寄存器置1表示requester可以产生8-bit Tag请求,否则则只可以产生5-bit Tag请求
10-Bit Tag Completer Supported:此寄存器的属性为HwInit。表示是否支持10-Bit Tag Completer,置1时表示支持,否则则为不支持
10-Bit Tag Requester Supported:此寄存器的属性为HwInit。表示是否支持10-Bit Tag Requester,置1时表示支持,否则则为不支持。对于10-Bit Tag Completer Supported清零时,此位不可置1
10-Bit Tag Requester Enable:此寄存器属性位RW。当此位置1时表示可以产生10-bit Tag范围的请求。在存在尚未执行完成的Non-Posted请求时,软件修改此寄存器的值其产生的结果是未定义的。对VF来说需要跟PF相关联(在此不展开)
14-Bit Tag Completer Supported:此寄存器的属性为HwInit。表示是否支持14-Bit Tag Completer,置1时表示支持,否则则为不支持。在FM下此寄存器必须置1。
14-Bit Tag Requester Supported:此寄存器的属性为HwInit。表示是否支持14-Bit Tag Requester,置1时表示支持,否则则为不支持。对于14-Bit Tag Completer Supported清零时,此位不可置1
14-Bit Tag Requester Enable:此寄存器属性位RW。当此位置1时表示可以产生14-bit Tag范围的请求。在存在尚未执行完成的Non-Posted请求时,软件修改此寄存器的值其产生的结果是未定义的。对VF来说需要跟PF相关联(在此不展开)