PCIE事务层-tlp包格式
事务层主要处理生成和接收TLP包,以及其他如交换流控信息,支持软件和硬件启动的电源管理,这里主要说TLP包。

TLP事务类型
主要包括四个类型,内存,IO,配置,消息。如下图

TLP包格式
TLP包有前缀,头,数据,摘要四个部分组成,如下图

详细的TLP包格式如下图

tlp prefix
对于TLP的包的前缀包含如下字段。

前缀默认只有1dword,也就是上述字段。这里注意的是prefix的fmt一定是100b,其中type位的4位代表前缀的类型。对于local tlp prefix的type字段如下

组合起来如下
- 1000 0000 ---> MR-IOV
- 1000 1110 ---> VendPrefixL0
- 1000 1111 ---> VendPrefixL1
对于end-end tlp prefix 的type字段如下

组合起来如下
- 1001 0000 ---> ExtTPH
- 1001 0001 ---> PASID
- 1001 1110 ---> VendPrefixE0
- 1001 1111 ---> VendPrefixE1
这里VendPrefix均是Vendor定义的TLP前缀字段
tlp header
和prefix一样,header的第一个dword也是固定格式

但是对于fmt字段,不是prefix的固定的100,而是如下定义

这里fmt的值代表整个header包含多少个dword,
而接下来的type字段确定tlp的类型,故fmt和type的对于tlp包的类型如下图


这里还有如下字段解释
- R:预留
- TC[2:0]: 流量控制,默认是0,最大流量,001-111是基于优先级的流量控制等级
- Attr[2]:是否支持ID-Based Ordering(设置允许不相关流量之间放宽排序要求,避免pcie在生产者和消费者模型中发送死锁)
- LN:对于内存请求中,指示是否为LN Read还是LN Write,对完成者指示LN是否完成
- TH:是否存在TPH(TLP Processing Hints)
- TD:确定是否存在1个dword的tlp digest
- EP:确定tlp的数据是否有效(CRC校验),1代表无效
- Attr[1:0]:bit5标识是否打开Relaxed Ordering,bit4标识是否打开硬件(cache)一致性管理
- AT: 与地址转换有关,00b=未转换的地址,01b=地址转换请求,10b=已转换的地址,11b=预留
关于length域,主要如下
- Length[9:0]:tlp的data payload的大小,以dword为单位

tlp data payload
对于data payload,需要注意如下
- 通常情况下,payload的size是length[9:0]大小的dword,但是在Device Control寄存器会设置一个Max_Payload_Size,length[9:0]的值不能超过这个size。
- header后面的数据第一个字节更趋近于0,后面的字节逐步增加(非AtomicOp Request和AtomicOp Completion)
- 如果是AtomicOp Request和AtomicOp Completion,则第一数据字节应该是数据的最低有效字节,如果涉及到小端,则是header-0x100-0x107。因为0x100是最低位字节,如果涉及大端,则是header-0x107-0x100。
如下图

对于数据 76543210,如果非AtomicOp Request和AtomicOp Completion,则0x100存放0,0x107存放7(第二点)
如果是AtomicOp Request和AtomicOp Completion,如果目标内存架构是小端,则100存放0,107存放7(小端数据高位存在低地址)。如果是大端,则100存放7,107存放0.
tlp digest
如上述可知,TD位如果是1,则tlp址出digest,并且digest域存放ecrc的值,当然,如果tlp本身不支持ecrc校验,则应该主动忽略digest域的内容
这里ECRC的意思是,end to end crc,端到端crc。ecrc与lcrc不同的点是,数据的内部转发不会对lcrc值进行校验,如果转发过程中出现错误,则可以通过ecrc来进行判断。