2 事务层
TLP的生成(发送)和解析(接收) TLP排序机制 基于信用值的流量控制机制 数据中毒(Data Poisoning)和ECRC完整性检测
2.1 地址空间
Address Space | Transaction Types | Basic Usage |
Memory | Read/Write | 数据传输到/从(to/from)存储映射位置 |
I/O | Read/Write | 数据传输到/从(to/from)I/O映射位置 |
Configuration | Read/Write | Function配置 |
Message | Baseline | 从事件信令机制到通用消息传递 |
2.1.1 存储事务
读取请求,读取完成(Read Request/Completion) 写入请求(Write Request) 原子请求,原子完成(Atomic Request/Completion)
2.1.2 I/O事务
读取请求,读取完成(Read Request/Completion) 写入请求,写入完成(Write Request/Completion)
2.1.3 配置事务
配置事务是主机(也就是RC)用来配置Function,访问Function配置寄存器。在系统平台上电后,所有的PCIe链路自动完成链路训练(Link Training);随后主机软件(不区分固件/设备驱动/操作系统,统称为软件)对PCIe拓扑结构进行探索,已发现所有的可用设备,并分配唯一标识ID,这一过程称为“枚举(Enumeration)”;必要时,主机软件需要通过配置事务来请求PCIe设备开启或禁用某些功能,配置设备参数等等。
读取请求,读取完成(Read Request/Completion) 写入请求,写入完成(Write Request/Completion)
2.1.4 消息事务
2.2 事务类型
Request Type | Non‐Posted or Posted | Abbreviation |
Memory Read | Non-Posted | MRd |
Memory Write | Posted | MWr |
AtomicOp | Non-Posted | AtomicOp |
IO Read | Non-Posted | IORd |
IO Write | Non-Posted | IOWr |
Configuration Read | Non-Posted | CfgRd |
Configuration Write | Non-Posted | CfgWr |
Message | Posted | Msg/MsgD |
2.3.1 TLP Header
2.3.1.1 通用的Header字段
其中各字段的含义如下:
Fmt[2:0]:TLP的格式,指示TLP的地址格式,或者是否为Prefix Type[4:0]:TLP的类型,Type字段通常与Fmt字段一起编码,来表示TLP的格式 TC[2:0]:流量等级(Traffic Class),PCIe协议支持最多8个TC值,通过TC来区分TLP的优先级,从而完成TLP保序和QoS的功能 T8 & T9:Tag[8]和Tag[9],最初的Tag只有8-bit,后来增加了2-bit。Tag[7:0]在Header的第二个DW中。此字段由请求者分配,用于区分不同的具体请求,完成者返回完成响应时需带上Tag,这样请求者就知道哪些发出去的请求已经完成,哪些尚未完成 Attr[2:0]:3-bit的属性定义,这三个字段有各自的含义,并没有一起做编码,其中Attr[2]表示基于ID排序(ID-Based Ordering),Attr[1]表示松散排序(Relaxed Ordering),Attr[0]表示非监听(No Snoop)。 LN:轻量级通知(Lightweight Notification),这是Gen 4中加入的特性,在Gen 6中被取消 TH:TLP处理提示(Processing Hints) TD:TLP Digest,指示TLP中是否存在有ECRC部分 EP:错误中毒(Error Poisoned),指示TLP Data部分的数据负载是否为“中毒” AT[1:0]:地址类型(Address Type),即地址是否经过转换,仅对带有地址的事务有效,如MRd,MWr,AtomicOp。对其它的事务,该字段保留。在轻量级通知中,该字段有其它含义 Length[9:0]:TLP Data部分的大小,数据是DW对齐的,如果实际数据是Byte,则需要借助Header中的其它字段指示。
Fmt[2:0] | TLP format |
000b | 3 DW header, no data |
001b | 4 DW header, no data |
010b | 3 DW header, with data |
011b | 4 DW header, with data |
100b | TLP Prefixes |
Other | 保留 |
TLP Type | Fmt[2:0] | Type[4:0] | Description |
MRd | 000 001 | 0 0000 | 存储读取请求 |
MRdLk | 000 001 | 0 0001 | 存储读取锁定请求 |
MWr | 010 011 | 0 0000 | 存储写入请求 |
IORd | 000 | 0 0010 | I/O读取请求 |
IOWr | 010 | 0 0010 | I/O写入请求 |
CfgRd0 | 000 | 0 0100 | Type 0配置读取请求 |
CfgWr0 | 010 | 0 0100 | Type 0配置写入请求 |
CfgRd1 | 000 | 0 0101 | Type 1配置读取请求 |
CfgWr1 | 010 | 0 0101 | Type 1配置写入请求 |
TCfgRd | 000 | 1 1011 | 不推荐的TLP类型,以前用于可信配置空间(Trusted Configuration Space),现在不再支持 |
TCfgWr | 000 | 1 1011 | 不推荐的TLP类型,以前用于可信配置空间(Trusted Configuration Space),现在不再支持 |
Msg | 001 | 1 0r2r1r0 | 不带数据的消息请求,r[2:0]指明消息路由机制 |
MsgD | 011 | 1 0r2r1r0 | 带数据的消息请求,r[2:0]指明消息路由机制 |
Cpl | 000 | 0 1010 | 不带数据的完成响应事务 |
CplD | 010 | 0 1010 | 带数据的完成响应事务 |
CplLk | 000 | 0 1011 | 用于存储读锁定,不带数据的完成响应事务 |
CplDLk | 010 | 0 1011 | 用于存储读锁定,带数据的完成响应事务 |
FetchAdd | 010 011 | 0 1100 | 先获取后相加的原子操作请求 |
Swap | 010 011 | 0 1101 | 无条件交换的原子操作请求 |
CAS | 010 011 | 0 1110 | 比较并交换的原子操作请求 |
LPrfx | 100 | 0 L3L2L1L0 | 本地Prefix,L[3:0]表示具体的Prefix类型 |
EPrfx | 100 | 1 E3E2E1E0 | 端到端Prefix,E[3:0]表示具体的Prefix类型 |
-- | -- | -- | Reserved |
AT[1:0] | Mnemonic | Description |
00b | Untranslated | TLP Header中的地址是未经翻译的,需要主机侧进行地址翻译 |
01b | Translation request | 地址翻译请求,主机侧的地址翻译代理(Translation Agent)需要返回地址翻译后的页表项给设备(如果支持的话) |
10b | Translated | TLP Header中的地址已经过翻译,主机侧可以直接响应该请求 |
11b | 保留 |
2.3.1.2 存储事务的Header
Requester ID[15:0]:请求者ID,这是主机分配的PCIe拓扑结构中的唯一值。Requester ID字段与Tag字段合起来组成了事务ID(Transaction ID) Tag[7:0]:事务标签,前面介绍过了 Last DW BE[3:0]:数据负载中最后一个DW中的字节使能,用于存储,I/O,配置请求 First DW BE[3:0]:数据负载中第一个DW中的字节使能,用于存储,I/O,配置请求 Address[64:2]:地址,最低两位强制是00b PH[1:0]:处理提示(Processing Hint),需要配合TH字段使用。如果TH无效,则PH[1:0]保留;TH有效,则PH字段编码表示处理提示,具体含义放到TPH功能部分讲解
2.3.1.3 I/O事务的Header
TC[2:0]字段必须是000b LN字段不适用,保留 TH字段不适用,保留 Attr[2]保留 Attr[1:0]必须是00b AT[1:0]必须是00b Length[9:0]必须是00 0000 0001b Last DW BE[3:0]必须是0000b(I/O事务只有一个DW的数据负载,这个字段没有意义)
2.3.1.4 配置事务的Header
Bus Number[7:0]:总线编号 Device Number[4:0]:设备编号 Fcn Number[2:0]:Function编号,与上面两组编号合起来称为BDF,是PCIe拓扑结构中的唯一标识 Register Number[5:0]:寄存器编号,与下面的字段一起使用,指示要访问的配置空间中的寄存器地址 Extended Register Number[3:0]:扩展寄存器编号
配置事务对TLP Header中各字段的限制:
TC[2:0]必须是000b LN字段不适用,保留 TH字段不适用,保留 Attr[2]保留 Attr[1:0]必须是00b AT[1:0]必须是00b Length[9:0]必须是00_0000_0001b Last DW BE[3:0]必须是0000b
2.3.1.5 消息事务的Header
Type[2:0] | Description | Byte 8-15 |
000 | 路由到RC | 保留 |
001 | 地址路由 | 地址 |
101 | ID路由 | BDF |
011 | RC广播消息 | 保留 |
100 | 本地路由,终止于接收端 | 保留 |
101 | 收集并路由到RC,仅适用于PME_TO_Ack消息 | 保留 |
110/111 | 保留 | 保留 |
Message Name | Message Code[7:0] |
Assert_INTA | 0010 0000 |
Assert_INTB | 0010 0001 |
Assert_INTC | 0010 0010 |
Assert_INTD | 0010 0011 |
Deassert_INTA | 0010 0100 |
Deassert_INTB | 0010 0101 |
Deassert_INTC | 0010 0110 |
Deassert_INTD | 0010 0111 |
PM_Active_State_Nak | 0001 0100 |
PM_PME | 0001 1000 |
PME_Turn_Off | 0001 1001 |
PME_TO_Ack | 0001 1011 |
ERR_COR | 0011 0000 |
ERR_NONFATAL | 0011 0001 |
ERR_FATAL | 0011 0011 |
Unlock | 0000 0000 |
Set_Slot_Power_Limit | 0101 0000 |
Vendor_Defined Type 0 | 0111 1110 |
Vendor_Defined Type 1 | 0111 1111 |
Ignored Message | 0100 0001 |
Ignored Message | 0100 0011 |
Ignored Message | 0100 0000 |
Ignored Message | 0100 0101 |
Ignored Message | 0100 0111 |
Ignored Message | 0100 0100 |
Ignored Message | 0100 1000 |
LTR | 0001 0000 |
OBFF | 0001 0010 |
PTM Request | 0101 0010 |
PTM Response | 0101 0011 |
PTM ResponseD | 0101 0011 |
2.3.1.6 完成事务的Header
Cpl Status[2:0]:完成状态 BCM(Byte Count Modified):仅对PCI完成者有意义 Byte Count[11:0]:请求的剩余字节数 Lower Address[7:0]:低位地址,对于存储读取请求,该字段是完成事务返回的第一个数据的第一个启用字节的地址
Cpl Status字段的编码见下表:
Cpl Status[2:0] | Completion Status |
000 | 成功完成(Successful Completion,SC) |
001 | 不支持的请求(Unsupported Request,UR) |
010 | 配置请求重试状态(Configuration Request Retry Status,CRS) |
100 | 完成者中止(Completer Abort,CA) |
Others | 保留 |
2.3.2 TLP Prefix
2.3.3 TLP Data
2.3.4 TLP Digest
【待续】