目录
1. PCIe 传输层协议
2. TLP介绍
2.1 TLP包格式
2.2 TLP包的种类
2.3 TLP 包传输例子
2.4 TLP 路由规则
根据上一章的知识,对于PCIe的发展和基础知识有了大概了解,本章节将会讲解PCIe的一些工作原理,使用的协议,通信交互相关的内容,再下一章节将实际去查看驱动里面相关的内容。
注意:以下内容讲解版本为PCIe 6.0
1. PCIe 传输层协议
根据上一章的内容知道,逻辑分层分为事务层、数据链路层、物理层。
在它们三层的协议上具有一定的关系:
在往底层的每个操作都需要添加自己的相关头部和CRC等相关信息;
-
事务层需要注意有的TLP包可能没有Data,在Header 中的TD为1时候,会根据Header和Data计算出ECRC.
-
数据链路层对于发送的TLP数据都需要添加头部Sequence Number,并计算CRC放入至尾部;但对于接收来说首先检查CRC问题,如果有问题TLP包将不会上传至TLP数据,没有错的话将交给事务层处理;
-
物理层接收到链路层数据包,在头部添加Start和End来表示开始结束;在接收到就会除去Start和End交给数据链路层;
2. TLP介绍
事务层的数据包也就是距离用户最近的那一层,这一层的数据包称为TLP:Transaction Layer Packet;
TLP
-
事务层完成TLP的封包与解包
-
TLP有点类似TCP/IP协议中的IP包,事务层通过TLP实现路由与寻址功能
-
功能有硬件实现
2.1 TLP包格式
TLP包数据主要分为三个部分:
TLP Prefixes: 这个部分是一个可选区域(option)
TLP Header: 头部信息
Data Payload: 数据信息
TLP Digest: 摘要数据,可选(option)
2.2 TLP包的种类
按照事务或者地址空间类型分类:
-
Mermory 内存的读写,比如对内存的正常读写操作,内存使用不用地址格式操作(32位/64位)等等
-
I/O 支持I/O空间的读写
-
Configuration 配置空间的读写
-
Messag 消息事务
对于TLP包的分类主要通过头部前面4个字节中的第一个Byte进行决定的,如图
根据Fmt不同,可以决定Header长度大小,根据表中得到以下数据:
根据Tpye不同可以分为很多中不同的类:
-
memory 读写类
-
IO 读写类
-
cfg 读写类
-
message 读写类
-
completion 类
在Header最后的10给字节表示有效的负载长度。
2.3 TLP 包传输例子
这里以读取一个内存的地址为例子:
开始从Processor开始读取内存的地址,发起Root Complex requester,经过Switch A ,Switch B,根据CPID找到了右边那个Endpoint,根据接收的MRd,将返回内存地址数据经过Switch B, Switch A 再到Root Complex ,最后到达Processor。
2.4 TLP 路由规则
TLP 的数据包需要传输,如果在一个端点到另外一个端点的话,都是需要通过中间的桥设备进行承担路由功能,桥设备根据路由规则转发数据包,每一个桥设备都会把经过的数据包解析到事务层,然后按照TLP中的地址和路由进行转发。
TLP包路由转发方式有三种:
-
Address Routing: mermory 数据的读写
-
ID Routing: 配置空间读写
-
Implicit Routing: 消息类型
Address 路由:
TLP包会包含需要访问的mermory地址或者IO地址;
对于目标的Endpoint 会检查地址是否落在自己的BAR区间地址,如果是在这个区间则处理,如果不是则拒绝。
对于访问设备需要经过桥设备路由的方式,那么桥设备将会判断地址是否在区间内,在则转发,不在则不转发;
ID 路由:
TLP会包含目标端的Bus/device/function号,判断是落在ID范围内,在则转发,不在不转发;