一个完整的TLP由1个或者多个TLP Prefix, TLP头, Data Payload 和 TLP Diseset组成。不同TLP头定义不同,TLP Data Payload的长度可变0-1024DW。TLP头由3个或者4个DW组成,第一个DW中保存通用TLP头,其他DW与通用TLP头的Type字段相关,通用头如下:
Fmt和Type字段:
Fmt和Type字段确认了当前TLP使用的总线事务和是否含有有效负载,TLP头的大小是由3个DW还是4DW组成,具体含义如下:
TLP类型 |
Fmt[2:0] |
Type[4:0] |
描述 |
MRd |
0b000/0b001 |
0b0_0000 |
存储器读请求,TLP头大小为3或者4DW,不带数据 |
MWr |
0b010/0b011 |
0b0_0000 |
存储器写请求,TLP头大小为3或者4DW,带数据 |
CplD |
0b001 |
0b0_1010 |
带数据的完成报文,TLP头大小为3个DW,包括存储器读,I/O读,配置读和原子操作读完成 |
CfgRd0 |
0b000 |
0b0_0100 |
配置0读请求,TLP头大小问3DW,不带数据 |
CfgRd1 |
0b000 |
0b0_0101 |
配置1读请求,不带数据 |
CfgWr0 |
0b010 |
0b0_0100 |
配置0写请求,TLP头大小为3DW,带数据 |
CfgWr1 |
0b010 |
0b0_0101 |
配置1写请求,带数据 |
Msg |
0b001 |
0b1_0R2R1R0 |
消息请求,TLP头大小为4DW,不带数据,RRR字段是消息请求报文的Route字段 |
Cpl |
0b000 |
0b_1010 |
部带数据的完成报文,TLP头大小为3个DW,包括存储器,配置读和I/O写完成 |
TC字段:
表示当前TLp的传送类型,PCIe总线规定了8种传输类型,分别为TC0-TC7,缺省值为TC0,不同的TC可以使用PCIe链路中不同的VC,而不同的VC的仲裁级别并不相同。EP或者RC通过调整其发出TLP的TC字段,可以调整TLP使用的VC,从而调整TLP的优先级。
Attr[2]字段:
Attr字段由三位组成,其中第二位表示该TLP是否支持PCIe总线的ID-baser Ordering;第一位表示是否支持Relaxed Ordering;而第0位表示该TLP在经过RC到达存储器时是否进行Cache共享一致性处理。
TLP支持的序
Attr[2] |
Attr[1] |
类型 |
0 |
0 |
缺省序,即强制模型 |
0 |
1 |
PCI-X Relaxed Oedering模型 |
1 |
0 |
ID-BaserOrdering(IDO)模型 |
1 |
1 |
同时支持Relaxed Ordering和IDO模型 |
当使用标准的强序模型时,在数据整个传送路径中,PCIe设备在处理相同类型的TLP时,如PCIe设备发送两个存储器写TLP时,后面的存储器写TLP必须等待前一个存储器写TLP完成后才能被处理,即便当前报文在传送过程中被阻塞,后一个报文也必须等待。
TH字段,TD字段,EP字段:
TH位为1表示当前TLP中含有TPH信息,TLP的发送端可以使用THP信息,通知接收端即将访问数据的特性,以便接收端合理预读和管理数据
TD位表示TLP中的TLP Digest是否有效,为1表示有效,为0表示无效。
EP位表示当前TLP中的数据是否有效,1表示无效,0表示有效。
AT字段:
AT字段与PCIe总线的地址转换相关。在一些PCIe设备中设置了(ATCAddress Translation Cache)部件,这个部件主要功能是进行地址转换。只有在支持IOMMU技术的处理器系统中,PCIe设备才能使用该字段。
Length字段:
Length字段用来描述有效负载(Data Payload)的大小。存储器读请求TLP中没有DataPayload字段,此时该TLP使用Length字段表示需要读取多少数据,单位为DW,范围0-1024DW。
存储器读写请求TLP(MRd,MWr)
存储器读写使用地址路由, TLP格式如下
Length范围为0-0X3FF,当Length为0时,表示数据长度为1024个DW。
Last DW BE[3:0] First DW BE[3:0]字段:
PCIe总线以字节为基本单位进行数据传递,但是Length字段以DW为最小单位。为此TLP使用Last DW BE和First DW BE 这两个字段进行字节使能,使得在一个TLP中,有效数据以字节为单位。
Last DW BE |
第3位 |
为1表示DataPayload的最后一个双子的字节3有效 |
第2位 |
为1表示DataPayload的最后一个双子的字节2有效 |
|
第1位 |
为1表示DataPayload的最后一个双子的字节1有效 |
|
第0位 |
为1表示DataPayload的最后一个双子的字节0有效 |
|
First DW BE |
第3位 |
为1表示DataPayload的第一个双子的字节3有效 |
第2位 |
为1表示DataPayload的第一个双子的字节2有效 |
|
第1位 |
为1表示DataPayload的第一个双子的字节1有效 |
|
第0位 |
为1表示DataPayload的第一个双子的字节0有效 |
使用规则:
·如果传送的数据长度在一个对界的双字之内,则Last DW BE字段为0b0000,而First DW BE的对应位置1;如果数据长度超过1DW,Last DW BE字段一定不能为0b0000。PCIe总线使用Last DW BE字段为0b0000表示所传送的数据在一个对界的DW之内。
·如果所传送的数据长度超过1DW,则First DW BE 字段至少有一个使能位。不能出现First DW BE为0b0000的情况。
·如果传送的数据长度大于等于3DW,则在First DW BE和Last DW BE字段中不能出现不连续的置1位。
·如果传送的数据在1DW之内时,在First DW BE字段中允许有不连续置1位、此时PCIe总线允许在TLP中传送1个DW的第1,3字节或者0,2,字节。
·如果传送数据长度在2DW之内时,则First DW BE字段和Last DW BE字段允许有不连续的置1位。
“Zero-Length”:当Length字段的长度为1DW,而First DW BE和Last DW BE 字段都为0b0000,即所有字节都不使能,此时TLP中不包含有效数据。
该操作为读刷新操作,能够确保之前使用Posted方式所传送的数据,到达最终的目的地,与“Zero-Length”读对应的读完成报文中不含有负载,从而提高PCIe链路利用率。
Requester ID字段:
Requester ID 包含“生成这个TLP报文”的PCIe设备Bus Number、Device Number 和 Function Number。
Request ID Tag
7:0 |
4:0 |
2:0 |
|
7:0 |
Bus Number Device Number Function Number
一个源设备在发送Non-Posted数据请求之后,如果没有收到目标设备回复的完成报文,TLP报文的发送端需要保存这个Non-Posted数据请求,此时该设备使用的Transaction ID(Tag字段)不能被再次使用,直到一次数据传送结束,即数据发送端收齐与该TLP对应的所有完成报文。
同意时间段断内,PCIe发出的每一个Non-Posted数据请求TLP,其Tag必须是唯一的。
源设备发送Non-Posted数据请求之后,在没有获得全部完成报文之前,不能释放这个Transaction ID占用的资源。在同一个PCie设备发送的TLP中,其Requester ID字段是相同的,因此PCIe设备的设计者所能管理的资源是Tag字段。
Tga的长度决定了能暂存多少个同类型的TLP。
完成报文TLP(CplD,Cpl)
完成报文TLP使用ID路由方式,格式如下
Completer ID |
Status |
BCM |
ByteCount |
||
Requester ID |
Tag |
R |
Lower Address |
||
Byte4
Byte8
完成报文一次最多能够传送的报文大小不能超过Max_Payload_Size参数。
Requester ID 和 Tag字段
完成报文使用Transaction ID进行ID路由,并将数据发送给源设备。
Completer ID字段
该字段存放“发送完成报文”的PCIe设备的ID号。PCIe设备进行数据请求时需要在TLP字段中包含Requester ID字段;而使用完成报文结束数据请求时,需要提供Completer ID字段。
Statue字段
该字段保存当前完成报文的完成状态,表示是否正常结束。
Status[2:0] |
描述 |
0b000 |
SC(successful Completion),正常结束 |
0b001 |
UR(Unsupported Request),不支持的数据请求 |
0b010 |
CRS(Configuration Request Retry Status),要求数据请求方进行重试,比如目标设备未准备好。 |
0b100 |
CA(Completion Abort),数据夭折,表示目标设备无法完成本次数据请求。 |
其他 |
保留 |
BCM位与Byte Count字段
BCM位由PCI-X设备设置,只对PCI-X设备有效。
Byte Count字段记录源设备还需要从目标中获得多少字节的数据就能完成全部数据传递,当前TLP中的有效负载也被ByteCount字段统计在内。该字段由12位组成,单位为字节,为0时表示还剩4096字节,为0xFFF表示还剩4095字节。
Low Address字段
如果当前完成报文为存储器读完成TLP,该字段存放在存储器读完成TLP中第一个数据所对应的最低位,值得注意的是,在完成报文中,并不存在First DW BE和Last DW BE字段,因此接收端必须使用存储器读完成TLP的Low Address字段,识别一个TLP中包含数据的起始地址。
一个MRd TLP发送给设备后,CplD TLP报文可能会有多个,但是这些报文将以地支顺序先后到达。因此,收到CplD字段后首先分析Tag字段,确定当前CplD TLP与那个MRd TLP请求对应。CplD TLP中的Length字段存放当前CplD TLP所包含的数据长度,但是可能会超过这个CplD TLP包含的有效数据长度,因为当前MRd的读地址可能不是1DW对齐的,但是Length的值却是按照1DW对齐。
但是CplD TLP中并不含有First DW BE字段,此时需要用Lower Address字段识别Data0中的有效字节。对于第一个CplD TLP Lower Address[1:0] = 0bA1A0,对于其他剩余的CplD TLP,Lower Address[1:0] = 0b00,Data0[A1A0]即为Data0中的有效数据。
配置读写请求TLP(CfgRd0,CfgRd1,CfgWr0,CfgWr1)
配置读写请求TLP由RC发起,用来访问PCIe设备的配置空间。配置请求报文使用ID的路由方式。PCIe总线也支持两种配置请求报文,分别为Type 00h和Type 01h配置请求。配置请求TLP的格式如下:
Byte4 |
Request ID |
Tag |
Last DWBE 0 0 0 0 |
First DW BE |
||||
Byte8 |
Bus Number |
Device Number |
Function Number |
Reserved |
Ext Reg Number |
Register Number |
R |
|
配置请求TLP中的4-7字节与存储器请求TLP类似,第8-11字节中的Bus,Device和Function Number中存放该TLP访问的目标设备的相应号码,Ext Register 和 RegisterNumber存放寄存器号。配置请求报文的其他字段必须为以下值。
·TC[2:0]必须为0,。
·TH位为保留位,Attr2位为保留,Attr[1:0]必须为“00b”,这表示I/O请求报文使用PCI总线的强序数据传送模式;AT[1:0]必须为“0b00”,表示不进行地址转换。
·Length[9:0]为“0b00_0000_0001”,表示配置读写请求最大Payload为1DW。
·Last DW BE字段为“0b0000”。而First DW BE字段根据配置读写请求的大小设置。
消息请求TLP(Msg)
在PCIe总线中多数消息报文使用隐式路由方式,其格式如下
Byte4 |
Requester ID |
Tag |
Message Code |
Byte8 |
除Vendor_defined Message之外,其Message不能使用Byte8-15 |
||
Byte12 |
PCIe总线对定了以下几类消息报文。
·INTx中断消息报文(INTx Interrupt Signaling)。
·电源管理消息报文(Power Management)。
·错误消息报文(Error Signaling)。
·锁定事务消息报文(Locked Transaction Support)。
·插槽电源限制消息报文(Slot Power Limit Support)。
·Vendor-Defined Messages。
INTx中断消息报文
PCIe总线,使用INTx中断消息报文模拟PCI原有的INTx信号,向RC提出中断请求。在PCIe总线中,总共有8种INTx中断消息报文。
名称 |
Code[7:0] |
Routing r [2:0] |
Requester ID |
描述 |
Assert_INTA |
0010_0000 |
100 |
包括总线号和设备号,功能号保留 |
置INTA#信号有效 |
Assert_INTB |
0010_0001 |
100 |
同上 |
置INTB#信号有效 |
Assert_INTC |
0010_0010 |
100 |
同上 |
置INTC#信号有效 |
Assert_INTD |
0010_0011 |
100 |
同上 |
置INTD#信号有效 |
Deassert_INTA |
0010_0100 |
100 |
同上 |
置INTA#信号无效 |
Deassert_INTB |
0010_0101 |
100 |
同上 |
置INTB#信号无效 |
Deassert_INTC |
0010_0110 |
100 |
同上 |
置INTC#信号无效 |
Deassert_INTD |
0010_0111 |
100 |
同上 |
置INTD#信号无效 |
当设备不使用MSI报文向RC提交中断请求时,可以首先使用Assert_INTx报文向处理器系统提交中断请求,当中断处理完毕,再使用Deassert_INTx报文。这下INTx中短消息报文的r [2:0]字段为0b100,即为Local消息报文。设备接收到该消息报文后,将结束收到的INTx中断消息报文,然后产生一个新的INTx中断消息报文。
TLP的路由
PCIe定义了三种路由方法,分别是基于地址的路由,基于ID的路由和隐式路由。
存储器和I/O读写请求TLP使用基于地址的路由方式,这种方式使用TLP总的Address字段进行路由选径,最终到底目的地。
配置读写报文,“Vendor_Defined Messages”报文,Cpl和CplD报文使用基于ID的路由方式。
Message报文中除了“Vendor_Defined Messages”报文,其他全部使用隐式路由方式。