事务层是 PCIe 总线层次结构的最高层,该层次将接收 PCIe 设备核心层的数据请求,并将其转换为 PCIe 总线事务,PCIe 总线使用的这些总线事务在 TLP 头中定义。PCIe 总线继承了 PCI/PCI-X 总线的大多数总线事务,如存储器读写、I/O 读写、配置读写总线事务,并增加了 Message 总线事务和原子操作等总线事务。

在 PCIe 总线中,Non-Posted 总线事务分两部分进行,首先是发送端向接收端提交总线读写请求,之后接收端再向发送端发送完成(Completion)报文。PCIe 总线使用 Split 传送方式处理所有 Non-Posted 总线事务,存储器读、I/O 读写和配置读写这些 Non-Posted 总线事务都使用 Split 传送方式。PCIe 的事务层还支持流量控制和虚通路管理等一系列特性,而 PCI总线并不支持这些新的特性。

在 PCIe 总线中,不同的总线事务采用的路由方式不相同。PCIe 总线继承了 PCI 总线的地址路由和 ID 路由方式,并添加了“隐式路由”方式。

PCIe 总线使用的数据报文首先在事务层中形成,这个数据报文也被称之为事务层数据报文,即 TLP,TLP 在经过数据链路层时被加上 Sequence Number 前缀和 CRC 后缀,然后发向物理层。

数据链路层还可以产生 DLLP(Data Link Layer Packet)。DLLP 和 TLP 没有直接关系,DLLP 是产生于数据链路层,终止于数据链路层,并不会传递到事务层。DLLP 不是 TLP 加上前缀和后缀形成的。数据链路层的报文 DLLP 通过物理层时,需要经过8/10b 编码,然后再进行发送。数据的接收过程是发送过程的逆过程,但是在具体实现上,接收过程与发送过程并不完全相同。

4.1 TLP 的格式

当处理器或者其他 PCIe 设备访问 PCIe 设备时,所传送的数据报文首先通过事务层被封装为一个或者多个 TLP,之后才能通过 PCIe 总线的各个层次发送出去。TLP 的基本格式如下图。

一个完整的 TLP 由1个或者多个 TLP Prefix、TLP 头、Data Payload(数据有效负载)和TLP Digest 组成。TLP 头是 TLP 最重要的标志,不同的 TLP 其头的定义并不相同。TLP 头包含了当前 TLP 的总线事务类型、路由信息等一系列信息。在一个 TLP 中,Data Payload 的长度可变,最小为0,最大为1024DW。

TLP Digest 是一个可选项, 一个 TLP 是否需要 TLP Digest 由 TLP 头决定。Data Payload也是一个可选项,有些 TLP 并不需要 Data Payload,如存储器读请求、配置和 I/O 写完成TLP 并不需要 Data Payload。

TLP 头由3个或者4个双字(DW)组成。其中第一个双字中保存通用 TLP 头,其他字段与通用 TLP 头的 Type 字段相关。一个通用 TLP 头由 Fmt、Type、TC、Length 等字段组成,如下图所示。

如果存储器读写 TLP 支持64位地址模式时,TLP 头的长度为4DW,否则为3DW。而完成报文的 TLP 头不含有地址信息,使用的 TLP 头长度为3DW。其中 Byte 4~Byte 15的格式与 TLP相关,下文将结合具体的 TLP 介绍这些字段。

(1)通用 TLP 头的 Fmt 字段和 Type 字段

Fmt 和 Type 字段确认当前 TLP 使用的总线事务,TLP 头的大小是由3个双字还是4个双字组成,当前 TLP 是否包含有效负载。具体情况如下图所示

其中所有读请求 TLP 都不带数据,而写请求 TLP 带数据,而其他 TLP 可能带数据也可能不带数据,如完成报文可能含有数据,也可能仅含有完成标志而并不携带数据。在 TLP 的Type 字段中存放 TLP 的类型,即 PCIe 总线支持的总线事务。该字段共由5位组成,其含义如下图所示。

由上表所示,存储器读写请求、IO 读写请求、配置读写请求的 type 字段相同,如存储器读和写请求的 Type 字段都为0b0 0000。此时 PCIe 总线规范使用 Fmt 字段区分读写请求,当 Fmt 字段是“带数据”的报文,一定是“写报文”;当 Fmt 字段是“不带数据”的报文,一定是“读报文”。

PCIe 总线的数据报文传送方式与 PCI 总线数据传送有类似之处。其中存储器写 TLP 使用 Posted 方式进行传送,而其他总线事务使用 Non-Posted 方式。

PCIe 总线规定所有 Non-Posted 存储器请求使用 Split 总线方式进行数据传递。当 PCIe设备进行存储器读、I/O 读写或者配置读写请求时,首先向目标设备发送数据读写请求 TLP,当目标设备收到这些读写请求 TLP 后,将数据和完成信息通过完成报文(Cpl 或者 CplD)发送给源设备。

其中存储器读、I/O 读和配置读需要使用 CplD 报文,因为目标设备需要将数据传递给源设备;而 I/O 写和配置写需要使用 Cpl 报文,因为目标设备不需要将任何数据传递给源设备,但是需要通知源设备,写操作已经完成,数据已经成功地传递给目标设备。

在 PCIe 总线中,进行存储器或者 I/O 写操作时,数据与数据包头一起传递;而进行存储器或者 I/O 读操作时,源设备首先向目标设备发送读请求 TLP,而目标设备在准备好数据后,向源设备发出完成报文。

(2)TC字段

TC 字段表示当前 TLP 的传送类型,PCIe 总线规定了8种传输类型,分别为 TC0~TC7,缺省值为 TC0,该字段与 PCIe 的 QoS 相关。PCIe 设备使用 TC 区分不同类型的数据传递,而多数 EP 中只含有一个 VC,因此这些 EP 在发送 TLP 时,也仅仅使用 TC0,但是有些对实时性要求较高的 EP 中,含有可以设置 TC 字段的寄存器。

(3)Attr 字段

Attr 字段由3位组成,其中第2位表示该 TLP 是否支持 PCIe 总线的 ID-based Ordering;第1位表示是否支持 Relaxed Ordering;而第0位表示该 TLP 在经过 RC 到达存储器时,是否需要进行 Cache 共享一致性处理。

强序模型:在数据的整个传送路径中,PCIe 设备在处理相同类型的 TLP时,如 PCIe 设备发送两个存储器写 TLP 时,后面的存储器写 TLP 必须等待前一个存储器写TLP 完成后才能被处理,即便当前报文在传送过程中被阻塞,后一个报文也必须等待。

Relaxed Ordering 模型:后一个存储器写 TLP 可以穿越前一个存储器写 TLP,提前执行,从而提高了 PCIe 总线的利用率。

(4)TH 位、TD 位和 EP 位

TH 位为1表示当前 TLP 中含有 TPH(TLP Processing Hint)信息,TPH 是 PCIe V2.1总线规范引入的一个重要功能。TLP 的发送端可以使用 TPH 信息,通知接收端即将访问数据的特性,以便接收端合理地预读和管理数据,

TD 位表示 TLP 中的 TLP Digest 是否有效,为1表示有效,为0表示无效。而 EP 位表示当前 TLP 中的数据是否有效,为1表示无效,为0表示有效。

(5)AT 字段

AT 字段与 PCIe 总线的地址转换相关。在一些 PCIe 设备中设置了 ATC(Address Translation Cache)部件,这个部件的主要功能是进行地址转换。只有在支持 IOMMU 技术的处理器系统中,PCIe 设备才能使用该字段。

(6)Length 字段

Length 字段用来描述 TLP 的有效负载(Data Payload)大小[3]。PCIe 总线规范规定一个TLP 的 Data Payload 的大小在1B~4096B 之间。PCIe 总线设置 Length 字段的目的是提高总线的传送效率。

在 PCIe 总线中,目标设备可以通过 Length 字段提前获知源设备需要发送或者请求的数据长度,从而合理地管理接收缓冲,并根据实际情况进行Cache 一致性操作。

Length 字段以 DW 为单位,其最小单位为1个 DW。如果 PCIe 主设备传送的单位小于1个 DW 或者传送的数据并不以 DW 对界时,需要使用字节使能字段,即“DW BE”字段。

4.2 TLP的路由

TLP 的路由是指 TLP 通过 Switch 或者 PCIe 桥片时采用哪条路径,最终到达 EP 或者 RC的方法。PCIe 总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于 ID的路由和隐式路由(Implicit)方式。

存储器和 I/O 读写请求 TLP 使用基于地址的路由方式,这种方式使用 TLP 中的 Address字段进行路由选径,最终到达目的地。

配置读写报文、“Vendor_Defined Messages”报文、Cpl 和 CplD 报文使用基于 ID的路由方式,这种方式使用 PCI 总线号[1](Bus Number)进行路由选径。在 Switch 或者多端口 RC 的虚拟 PCI-PCI 桥配置空间中,包含如何使用 PCI 总线号进行路由选径的信息。

隐式路由方式主要用于 Message 报文的传递。在 PCIe 总线中定义了一系列消息报文,包括“INTx Interrupt Signaling”,“Power Management Messages”和“Error Signal Messages”等报文。在这些报文中,除了“Vendor_Defined Messages”报文,其他所有消息报文都使用隐式路由方式,隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式,或者用于 RC 向 EP 发出广播报文。

(1)基于地址的路由

在 PCIe 总线中,存储器读写和 I/O 读写 TLP 使用基于地址的路由方式。PCIe 设备使用的地址路由方式与 PCI 设备使用的地址路由方式类似。只是 PCIe 设备使用 TLP 进行数据传送,而 PCI 设备使用总线周期进行数据传送。使用地址路由方式进行数据传递的 TLP 格式下图。

在PCI桥的配置寄存器空间中,包含一个桥片能够接收的物理地址范围。PCIe 总线通过这个物理地址范围实现基于地址的路由。相关字段如下图所示

具体传输过程此处略。

(2)基于ID的路由

在 PCIe 总线中,基于 ID 的路由方式主要用于配置读写请求 TLP、Cpl 和 CplD 报文,此外 Vendor_Defined 消息报文也可以使用这种基于 ID 的路由方式。而在 PCI 总线中,只有配置读写周期才使用 ID 进行数据传递。

基于 ID 的路由方式与基于地址的路由方式有较大的不同,基于 ID 路由方式的 TLP 头格式也与基于地址路由方式的头格式不同,报文格式如下。

使用 ID 路由方式的 TLP 头,其 Byte8~11字段与基于地址路由的 TLP 不同。基于 ID 路由的 TLP,使用 Bus Number、Device Number 和 Function Number 进行路由寻址。从软件的角度上看,PCIe 总线与 PCI 总线兼容,只是在 PCIe 总线中,每一个 PCIe设备使用唯一的 PCI 设备号,但是每一个设备仍然可以有多个子设备(Function)。

配置读写请求 TLP 是使用“基于 ID 路由”的一组重要报文,其主要作用是读写 PCIe总线的 EP、Switch 及 PCIe 桥片的配置寄存器,以完成 PCIe 总线的配置。在处理器系统上电之后需要进行 PCI 总线系统的枚举,为 PCI 总线分配总线号,并设置 Switch、PCIe 桥片或者 EP 的配置寄存器,如 Limit 寄存器组、Base 寄存器组、BAR 寄存器、Subordinate Bus Number、Secondary Bus Number 和 Primary Bus Number 等一系列配置寄存器。

(3)隐式路由

PCIe 总线规定消息请求报文使用隐式路由方式。在 PCIe 总线中,有许多消息是直接发向 RC 或者来自 RC 的广播报文,这些报文不使用地址或者 ID 进行路由,而是使用 Msg 和 MsgD报文的 Route 字段进行路由,这种路由方式被称为隐式路由。

PCIe 总线定义了一些用于中断请求、错误状态处理、锁定总线事务、热插拔信号处理和“Vendor_Defined Messages”消息报文。这些消息报文需要使用隐式路由方式进行传递。消息报文的 Route 字段的含义如下图所示。

使用隐式路由方式的 TLP,其 Route 字段为“000”,“011”,“100”或者“101”。当一个报文使用隐式路由向 EP 发送时,EP 将对 Route 字段进行检查,如果这个报文是“来自 RC 的广播报文”,或者是“本地报文”,EP 将接收此报文。

如果 Switch 收到一条使用隐式路由的 TLP 时,将根据报文 Route 字段的不同而分别处理。如果 Switch 的上游端口接收了一条来自 RC 的广播消息,则将该报文发向所有的下游端口;如果 Switch 接收了一条来自下游端口发向 RC 的消息报文时,Switch 将此报文直接转发到上游端口,直至 RC;如果 Switch 接收了一条使用隐式路由方式的本地消息报文,则Switch 接收并终结此报文,不再上传或下推。

如果 RC 收到一个使用隐式路由的 TLP 时,将根据报文 Route 字段而分别处理这些 TLP。如果该 Route 字段为0b000和0b101,RC 将接收该 TLP,并作相应的处理;如果为0b100,RC将接收该 TLP,并结束该 TLP 报文的传递。

PCI相关(4)- PCIe总线事务-TLP格式及路由相关推荐

  1. PCI相关(5)- PCIe总线事务-TLP报文

    4.3 存储器.I/O 和配置读写请求 TLP 在 PCIe 总线中,存储器读写,I/O读写和配置读写请求TLP 由以下几类报文组成. 存储器读请求 TLP 和读完成 TLP 当 PCIe 主设备,R ...

  2. PCIE——第6章——PCIe总线的事务层

    摘要:PCIE--第6章--PCIe总线的事务层 目录 第 6 章 PCIe 总线的事务层 6. 1 TLP 的格式 6. 1. 1 通用 TLP 头的 Fmt 字段和 Type 字段 6. 1. 2 ...

  3. Linux 操作系统原理 — PCIe 总线标准

    目录 文章目录 目录 总线系统 PCIe 总线 PCIe 总线的传输速率 PCIe 总线的架构 PCIe 外设 PCIe 设备的枚举过程 PCIe 设备的编址方式 BDF(Bus-Device-Fun ...

  4. PCIE——第 8 章——PCIe 总线的链路训练与电源管理

    摘要:PCIE--第 8 章--PCIe 总线的链路训练与电源管理 目录 第 8 章 PCIe 总线的链路训练与电源管理 8. 1 PCIe 链路训练简介 8. 1. 1 链路训练使用的字符序列 8. ...

  5. 简单概述PCIe总线协议

    初步认识pcie协议 PCI总线在PC界已然一统江湖多年,应用已然广泛,PCI的总线已蔚然成风.科技日益发展,需求不断膨胀,经过计算机技术10年的发展,包括摩尔定律的不断验证,PCI总线已渐渐感觉力不 ...

  6. PCI相关(6)- PCIe中断-MSI/MSIX

    在 PCI 总线中,通过INTx 引脚提交中断请求,而 MSI 机制是一个可选机制.而在 PCIe 总线中,PCIe 设备必须支持 MSI 或者 MSI-X 中断请求机制,而可以不支持 INTx 中断 ...

  7. PCI相关(3)- PCIe概述

    介绍PCIe之前要搞清楚的问题,为什么要用PCIe总线? 首先PCI总线存在的下列缺陷: (1)带宽问题 PCI 总线的最高工作频率为66M,最大位宽为64b,从理论上讲,PCI 总线可以提供的最大传 ...

  8. PCI总线和PCIe总线

    PCI总线结构 PCI是共享总线,一个总线上可以挂接多个设备,速率越高可挂接的设备越少: PCIe总线结构 与PCI总线不同,PCle总线使用端到端的连接方式,在一条PCle链路的两端只能各连接一个设 ...

  9. 【总线】【PCI】【PCIe】【转】配置空间

    PCI Express,是计算机总线PCI的一种,它沿用现有的PCI编程概念及通信标准,但建基于更快的串行通信系统:PCIE总线使用的是高速差分总线,并采用端到端的连接方式, 现在的高速总线基本上都是 ...

最新文章

  1. LabVIEW纹理分析(基础篇—9)
  2. 刚毕业就20w年薪,这个项目太牛逼了!
  3. 02搭建cdh版本控制
  4. mybaits二十六:mybatis,spring整合
  5. Google上面有自己给你标注好的数据集
  6. C程序运用递归求阶乘
  7. css叠层_CSS 中重要的层叠概念
  8. C#综合揭秘——深入分析委托与事件(上)
  9. python中闭包的作用_Python闭包及其作用域
  10. Linux下C++开发系列(一)序——我是如何开始linux下C++开发的
  11. Eclipse 使用
  12. 自动驾驶仿真:VTD自定义超声波雷达FOV
  13. 搜狗输入法的桌面图标消失,无法打开设置怎么办
  14. Java 大厂面试必刷题 Day1:何为面向对象编程的思想?面向对象三大特征是什么?
  15. 40000字 Matplotlib 实操干货,真的全!
  16. 第十二届noc网络机器人赛项成绩_我省在第十二届中小学NOC活动决赛中获佳绩
  17. 点击劫持漏洞修复(前端、后端)
  18. 邮件群发数量多少?如何邮件群发数量日发10W?
  19. 读懂企业的七步成诗法
  20. 单样本t检验中指标分析

热门文章

  1. Gson源码解析之-toJson
  2. 什么是敏捷项目管理,为什么要使用敏捷管理?
  3. 安卓打开rpm文件_在PC上如何运行Android系统?
  4. Python数据分析——pandas数据结构(DataFrame)
  5. 【业务数据分析】——Excel数据透视表(四)
  6. Python语音基础操作--10.2隐马尔科夫模型的孤立字识别
  7. 体验Windows自带远程桌面 局域网外网
  8. 高仿【华为消费者业务官网】和精彩动画剖析:练习在低代码平台中嵌入JS代码
  9. 有点想法系列:借助海尔平台打造智能家居的一点想法
  10. 使用IPv6格式的URL访问HTTP服务器