PCIe总线-事物层之TLP格式介绍(五)

1.概述

PCIe总线事务层位于应用层和数据链路层之间。发送时将应用层的数据请求转换成PCIe总线事务,然后发送到数据链路层。接收时,从来自数据链路层报文中提取PCIe总线事务,并将数据提交到应用层。事务层使用TLP表示PCIe总线事务,其由头、数据(若有)和尾(可选)组成。下图展示了TLP的发送过程和接收过程。

TLP发送和接收过程

PCIe总线事务类型和地址空间对应关系如下表所示:

Address SpaceTransaction TypesBasic Usage
MemoryRead Request/Completion,Write Request,AtomicOp Request/CompletionTransfer data to/from a memory-mapped location
I/ORead Request/Completion,Write Request/CompletionTransfer data to/from an I/O-mapped location
ConfigurationRead Request/Completion,Write Request/CompletionDevice Function configuration/setup
MessageBaseline(including Vendor-Defined)From event signaling mechanism to general purpose messaging

2.TLP格式

TLP由前缀(TLP Prefixes,可选)、头(Header)、数据(Data,若有)和尾(TLP Digest,可选)组成,具体如下图所示。TLP前缀由PCIe V2.1总线规范引入,分为Local TLP Prefix和EP-EP TLP Prefix两类。用来实现PASID(Process Address Space ID) 、MR-IOV(Multi Root I/O Virtualization)、Peer-Peer及其他verndor自定义的功能。TLP头定义了事务类型、路由信息、数据长度和完成状态等信息,非常重要。TLP尾是可选的End‐to‐End CRC,用来校验整个TLP报文。

通用TLP格式

2.通用TLP头格式

TLP头定义了PCIe总线事务类型、路由、数据长度等信息。TLP头由12字节或者16字节组成,通用TLP头格式如下图所示。

通用TLP头格式

下面的表描述了TLP头各个位域的的意义。

位域意义
FMTTLP格式,定义TLP头的长度(12字节或者16字节)和是否携带数据
TypeTLP类型,和FMT一起定义总线事务类型
TC(Traffic Class)总共定义了TC0-TC7 8种传输类型,用来控制PCIe总线的QoS。TC0为通用的传输类型(必须支持),不保证实时性和顺序,TC1-TC7根据WRR或优先级区分。TC0和VC0对应,其他TC和VC的映射关系在VC Capability中
AttrAttr分为两个域,分别是Byte1的Attr[2]和Byte2的Attr[1:0]。Attr[2]和Attr[1]用于设置PCIe总线顺序属性,Attr[0]用于设置Cache一致性
TH(TLP Processing Hints)PCIe V2.1引入的一个重要功能,TH为1时表示TLP头部有TPH信息。发送端使用TPH信息通知接收端将要访问数据的类型,以便接收端合理的安排数据缓冲,降低访问延时
TD表示TLP是否包含TLP Digest,即End‐to‐End CRC
EP(Error Poisoned)表示TLP是否发生错误
AT( Address Type)对于Memory and Atomic请求,用于支持虚拟化系统地址转换。主要目的是方便多个虚拟机共享同一个PCIe设备。0x0-默认/不转换,0x1-转换请求,0x2-已转化,0x3-保留
LengthTLP报文中数据负载长度,单位为DW(4字节),Length=0表示最大1024个DW,即4KB,Length=0x3FF表示1023个DW。若长度不是DW的整数倍,需要借助DW BE字段
First DW BE(First DW Byte Enables)表示第一个DW的有效字节
Last DW BE(Last DW Byte Enables)表示最后一个DW的有效字节

2.1.FMT和Type

FMT和Type字段共同定义了PCIe总线事务类型,具体见下图。

事务类型

注:

  1. Msg和MsgD Type字段的bit[2:0](rrr)表示路由方式,由Byte1中的bit[7]、bit[3]、bit[1]决定。
  2. Local TLP Prefix的L3-L0由TYPE[3:0]决定。
  3. End‐to‐End TLP Prefix的E3-E0由TYPE[3:0]决定。
  4. TLP头为3DW/12字节时,若携带数据或者请求数据,则数据地址为32位。

2.2.Attr

Attr[2]和Attr[1]用于设置PCIe总线顺序属性。具体见下面的图。0x0为默认顺序,即PCI强序模式,后面的报文必须等待前面的报文传输完成。0x1为PCI-X弱序模式,允许总线对报文进行重新排序。0x2为基于ID的顺序模式。0x3为基于ID的弱序模式。

Ordering_Attributes

Attr[0]用于设置Cache一致性

Cache_Coherency_Management_Attribute

2.3.First/Last DW BE

当数据的起始地址和结束地址没有按DW对齐时,需要使用First/Last DW BE字段。First/Last DW BE通常用于Memory、I/O和Configuration请求。First DW BE表示第一个DW的有效字节。Last DW BE表示最后一个DW的有效字节。

  1. 如果数据长度在1DW之内,则First DW BE对应的位设置为1,Last DW BE全为0。如果数据长度超过1DW,Last DW BE不能全为0。
  2. 如果数据长度超过1DW,则First DW BE字段至少有一个位设置为1,不能出现First DW BE全为0的情况。
  3. 如果传送的数据长度大于等于3DW,则First DW BE和Last DW BE字段中不能出现不连续的置1位。
  4. 如果数据长度在1DW(包括)之内,则First DW BE允许不连续的位置1,此时允许传输1DW的第1、3字节或者第0、2字节。
  5. 如果数据长度在2DW(包括)之内,则First DW BE和Last DW BE字段中允许出现不连续的置1位。
  6. 对于Zero-Length读请求,Length=0x1,而First DW BE和Last DW BE字段都为0,即所有字段都不使能,即读完成请求中不包含数据。Zero-Length读请求实现了读刷新,确保使用Posted请求(存储器写)的数据已完全写入目的地。
  7. 对于Zero-Length写请求,Length=0x1,而First DW BE和Last DW BE字段都为0。Zero-Length写用于某些明确的协议中,如LN协议。

First_Last_DW_BE

3.事务描述符

如下图所示,事务描述符由三部分组成,分别为TC、Attr和事务ID(Transaction ID)。TC和Attr前面描述过,这里不赘述。事务ID(Transaction ID)由Requester ID和Tag组成。

事务描述符

Requester ID记录了请求报文的来源,当源设备和目标设备需要交互时,则源设备将自己的Requester ID填到请求报文中发送给目标设备,目标设备根据源设备的Requester ID发送响应报文。只有TLP报文使用ID路由时,Requester ID才有真实意义。Requester ID字段描述了源PCIe设备Function的Bus Numner、Device Number和Function Number。对于Non-Posted请求(存储器读、I/O和配置读写请求,请求需要使用完成报文应答),其请求报文必须包含Requester ID,目标设备收到请求报文之后,使用完成报文进行响应,而完成报文中使用源设备的Requester ID。对于Posted请求(存储器写请求),PCIe总线规范没有明确规定是否需要Requester ID,但一般硬件都实现了该功能。与Requester ID类似的是Completer ID,只是Completer ID保存是发送完成报文PCIe设备Function的BDF。

Tag是一个标签,由源设备产生,和Requester ID一起组成Transaction ID。在一段时间内,同一个PCIe设备Function发送的Non-Posted请求,不能出现两个相同的Transaction ID,且在没有获取到完成报文之前,该Transaction ID不能释放。设计Tag字段的目的是应对报文出错或者丢失需要重传的场景。PCIe4.0版本将Tag字段扩展到10位。

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI Express® Base Specification Revision 5.0 Version 1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/593942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章,转载请注明原文出处。 此实验参考 《鲁班猫监控检测》,原代码有点BUG,已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

C++程序设计:C++的内存分布与管理

C的内存分布与管理 栈区堆区全局区代码区常量区 栈区 (1)什么是栈区? 栈区(Stack) 是用于存储函数调用,局部变量和函数参数的一种内存区域,它的特性就是先进后出(FILO)。…

ES数据存储与查询基本原理

Elasticsearch(ES)简介 Elasticsearch(ES)是一个分布式、可扩展、近实时的搜索和分析引擎,它基于Lucene,设计用于云计算中,处理大规模文档检索和数据分析任务,常用于实现内部搜索引…

【LAMMPS学习】八、基础知识(5.7)Drude感应偶极子

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

记录PR学习查漏补缺(持续补充中。。。)

记录PR学习查漏补缺 常用快捷键文件编辑素材序列标记字幕窗口帮助 效果基本3D高斯模糊查找边缘色彩颜色平衡超级键马赛克中间值变形稳定器轨道遮罩键 常用 快捷键 注意:比较常用的用红色字体显示 文件 快捷键作用Ctrl Alt N新建项目Ctrl O打开项目Ctrl I导入…

Samsung三星NP930XCJ-K01CN笔记本原厂Win10系统安装包下载

三星SAMSUNG笔记本电脑原装出厂Windows10预装OEM系统,恢复开箱状态自带系统 链接:https://pan.baidu.com/s/1Y3576Tsp8MtDxIpJGDucbA?pwdt0ox 提取码:t0ox 三星原装W10系统自带声卡,网卡,显卡,指纹,蓝牙等所有驱动、三星出厂主题专用壁纸…

以太网基础-IP、ICMP、ARP协议

一、IP协议 参考:rfc791.txt.pdf (rfc-editor.org) IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议,提供不可靠的、无连接的、尽力而为的数据报传输服务。 IP报文数据头如下 Version:4bit,4表示…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们都知道,嵌入式应用一般都是为了某一个特定应用而存在的。也就是说,和pc不同,这个嵌入式板子一般都是为了解…

关于YOLO8学习(二)数据集收集,处理

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 简介 本文将会讲解: (1)如何通过三方网站,获取可用于训练的数据源 (2)通过三方网址,选择合适的手机,通过手动标注,转换为可用于训练的数据源 开发环境 win10、python 3.11、cmake、pytorch2.0.1+cu117…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

[C++核心编程-02]----C++引用详解和使用方法分析

前言 在C中,引用是一个别名,它允许将一个已存在的变量或对象用不同的名称来访问。引用在定义时必须初始化,并且一旦初始化就不能再绑定其他对象,因此引用在声明时被初始化后就不能再改变引用对象。引用使用&符号进行声明。 引…

Game Theory In Competitive Programming|Part1 (原创)

Game Theory In Competitive Programming|Part1 在算法竞赛中,博弈论是一个经常出现的题目类型。通常是两个人在给定规则下,每个人都按照最优策略进行博弈,我们的任务是找出获胜者。这通常是贪心算法、动态规划等算法的混合。下面&#xff0c…

Apache和Nginx的区别以及如何选择

近来遇到一些客户需要lnmp环境的虚拟主机,但是Hostease这边的虚拟主机都是基于Apache的,尽管二者是不同的服务器软件,但是大多数情况下,通过适当的配置和调整两者程序也是可以兼容的。 目前市面上有许多Web服务器软件,…

哈希表实现-哈希桶法

哈希桶方法 由于直接定值法实现哈希表有着明显的弊端——如果多个节点的hash值相同会往后堆积,所以衍生出哈希桶方法 我们的哈希表设置成一个结点指针数组,每个哈希值对应的是一串链表,形状就像一个一个的桶我们就会把hash值相同的节点放到一…

宝塔怎么配置nginx

宝塔怎么配置nginx 1.找到nginx配置位置 2.修改nginx.conf文件 3.重启nginx

21岁的人生赚51W!拒绝捞男捞女,翻身也要爱惜身体!——早读(逆天打工人爬取热门微信文章解读)

身体是革命的本钱 引言Python 代码第一篇 卢克文工作室 捞女在今天的中国是怎样的存在第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 我将我的健康视为生活的基石 不会为了短暂的成功而牺牲 我珍惜身体 知道健康是实现梦想的前提 引言 这里毕竟是一个程序员的代码学习平台…

基于SpringBoot实现各省距离Excel导出实战

目录 前言 一、列表及图表信息展示 1、数据过滤调整 2、信息列表及图表展示 3、Excel写入 二、界面可视化 1、Echarts图表和列表展示 2、城市详情和下载功能设计 三、成果展示 1、图表展示 2、部分城市数据分析 总结 前言 今天是五一黄金周假期第二天,不知…

Redis(Jedis和SpringBoot整合Redis)

文章目录 1.Jedis1.介绍2.环境配置1.创建maven项目2.pom.xml引入依赖3.新建一个包并创建一个文件 3.Jedis远程连接到Redis1.Redis放到服务器可以连接的前提条件2.为Redis设置密码1.编辑配置文件2.找到 requirepass3.设置密码为root4.重启Redis,在shutdown的时候报错…

R语言实战——中国职工平均工资的变化分析——相关与回归分析

链接: R语言学习—1—将数据框中某一列数据改成行名 R语言学习—2—安德鲁斯曲线分析时间序列数据 R语言学习—3—基本操作 R语言学习—4—数据矩阵及R表示 R语言的学习—5—多元数据直观表示 R语言学习—6—多元相关与回归分析 1、源数据 各行业平均工资变化 各地区平均工资…

常用算法介绍

1. 冒泡排序:冒泡排序是一种简单的排序算法,它的基本思想是比较相邻的两个元素,如果顺序错误就交换它们的位置,直到所有元素都按照升序排列。 2. 快速排序:快速排序是一种高效的排序算法,它的基本思想是选取…