NXP i.MX8系列平台开发讲解 - 3.9 Linux PCIe协议相关介绍(二)

发布于:2024-04-25 ⋅ 阅读:(12) ⋅ 点赞:(0)

目录

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范围内,在则转发,不在不转发;