PCIe协议之-TLP路由基础

✨前言:

在PCI Express (PCIe) 技术中,数据包的路由方式对于确保信息能够高效、准确地传送至目标设备至关重要。PCIe定义了几种路由方式,主要有以下几种。

🌟地址路由(Address Based Routing)

这是最基本的路由方式,PCIe设备利用目的地址信息来决定数据包的路由路径。目的地址通常包括目标设备的总线号、设备号和功能号。在经过每一个交换节点时,基于这些信息来决定数据包是向下一个交换节点转发,还是到达了最终目标。

🌟ID路由(ID Based Routing)

在这种路由方式中,每个PCIe设备或端点都有一个唯一的ID,这个ID在数据包中用于识别目标设备。这种方式常用于结束点到结束点的直接信号传输,在多点传输场景下,尤其是在那些具有复杂拓扑结构的系统中,ID路由可以非常有效。

🌟隐式路由(Implicit Routing)

这种路由方式主要用于处理某些特定类型的数据包,如功率管理事件或热管理事件。这些数据包不需要明确的目标地址,因为它们通常由系统中的所有设备或者由特定处理这类事件的设备处理。隐式路由依赖于系统硬件和固件的内建规则来正确地处理和转发这些数据包。

具体采用哪一种路由方式是由TLP的类型所决定的,如下表所示:
在这里插入图片描述
📌注:AtomicOp是PCIe Spec V2.1新增的内容,有兴趣的可以自行阅读V2.1的相关内容。
📌注:一般情况下,Message都是使用模糊路由(Implicitly Routing)的,但是也有PCIe设备厂商自定义的Message会使用地址路由或者ID路由。
可能有的人要有疑惑了,既然Message可以使用地址路由或者ID路由,为什么还要单独搞出来一个模糊路由呢?原因很简单,使用模糊路由可以广播Message到每一个设备,采用其他的路由方式必须明确指定是哪一个设备。
那么PCIe中是如何来判断TLP的类型的呢?又是如何判断其为Request还是Completion的呢?实际上是通过TLP Header的Format和Type部分来确定的,如下图所示:
在这里插入图片描述
在PCI Express (PCIe) 架构中,事务层数据包(Transaction Layer Packets, TLPs)是数据通信的基本单位。TLPs用于在设备间传输数据、内存读写请求以及控制信息。TLP的类型、是否为请求(Request)还是完成(Completion)报文等,都通过TLP的头部信息来识别。

⭐️TLP头部信息

TLP头部包含了多个字段,其中一些关键字段用于指示TLP的类型以及它是请求还是完成报文:

格式(Format):指示TLP头部的长度和布局,不同类型的TLPs(如内存读/写、I/O读/写、配置读/写等)会使用不同的头部格式。
类型(Type):这是一个关键字段,它直接指示了TLP是什么类型的数据包。例如,内存读请求、内存写请求、I/O读写请求、配置读写请求或者是完成报文(用于响应之前的某个请求)。
请求者ID(Requester ID):在请求TLPs中,这个字段指示了发起请求的设备。 目的ID(Destination ID):在完成TLPs中,这个字段用于指示响应应当发送到哪个设备。

⭐️区分请求和完成

通过类型(Type)字段区分:TLP头部中的类型字段是区分TLP是请求还是完成报文的关键依据。例如,内存读请求和内存写请求被明确标记为请求类型,而完成报文则有其特定的标识符来指明是作为之前某个请求的响应。
格式字段辅助判断:虽然格式字段主要描述的是头部的大小和布局,但通过它与类型字段的组合,可以更确切地识别TLP的具体类型和性质。

下面就跟着我来详细了解一下这三种路由

✨一、ID Routing

ID 路由(ID Routing)有的时候也被称为BDF路由,即采用Bus Number、Device Number和Function Number来确定目标设备的位置。这是一种兼容PCI和PCI-X总线协议的路由方式,主要用于配置请求(Configuration Request)的路由,在PCIe总线中,其还可以被用于Completion和Message的路由。
TLP的Header有3DW的和4DW的,其中4DW的Header一般只用于Message中。使用ID路由的TLP Header以下两张图所示,第一个为3DW Header,第二个为4DW Header:
在这里插入图片描述
在这里插入图片描述
对于Endpoint来说,其只需要检查TLP Header中的BDF是否与自己的BDF一致,如果一致,则认为是发送给自己的,否则便会忽略该TLP。
📌注:采用ID路由的TLP Header中并未包含Requester的ID(BDF),那么Completer怎么确定Requester的位置呢?实际上这个问题并不难回答,因为ID路由主要用于配置请求和Completion,偶尔也用于一些厂商自定义的Message。首先,配置请求的Requester只能是Root,所以不需要确定其位置;再之,Completion用于对其他路由方式的回应,如地址路由中包含了Requester的BDF;最后,Message是Posted型的,即其根本不需要Completion,自然也就不需要Requester的BDF了。
📌注:实际上PCIe是一种点对点(Point-to-Point)的通信方式,即每个链路只能连接一个设备,因此大部分情况下使用5bit的空间来描述Device Number完全是多余的。为此,PCIe Spec提出了ARI格式,这里暂时不详细介绍了,有兴趣的可以自行阅读PCIe Spec的相关内容。
对于Switch来说,则需要根据TLP Header中的BDF来判断,这个TLP是给自己的还是给自己下属的其他设备的。如下图所示:
在这里插入图片描述

🌟请求者ID的作用

请求者ID(Requester ID)是一个重要字段,用于标识发起TLP请求的设备。在PCIe中,每个设备拥有一个唯一的ID,称为Bus/Device/Function(BDF)编号。这个ID确保了即使在复杂的系统拓扑中,完成者也能够确定并发送响应到正确的请求者。

🌟TLP中的请求者ID

对于请求TLP,无论是用于读操作还是写操作,头部中都会包含请求者ID字段。这个字段确保了,当完成者完成操作并需要发回完成(Completion)TLP时,知道将响应发送至何处。
对于完成TLP,头部包含的是完成者ID(Completer ID),这是因为响应需要标识出是哪个设备完成了操作。同时,完成TLP还包含了一个标签(TAG)字段,这个标签在请求时由请求者生成,并由完成者在生成完成TLP时复制过去,这样请求者就可以匹配响应到它原始的请求。

✨二、Address Routing

地址路由(Address Routing)的地址包括IO和Memory。对于Memory请求来说,32bit的地址使用3DW的Header,64bit的地址使用4DW的Header。而IO请求则只能使用32bit的地址,即只能使用3DW的Header。
注:再次强调,IO请求是为了兼容早期的PCI设备的,在新的PCIe设备中禁止使用。
3DW和4DW的TLP Header分别如以下两张图所示:
在这里插入图片描述
在这里插入图片描述
当Endpoint接收到采用地址路由的TLP时,其会根据该TLP Header中的地址信息和自己的配置空间中的BAR寄存器来判断这个TLP是不是自己的。如下图所示:
在这里插入图片描述
Switch的地址路由机制如下图所示:
在这里插入图片描述

✨三、Implicit Routing

模糊路由(Implicit Routing,又译为隐式路由)只能用于Message的路由。PCIe总线相对于PCI总线的一大改进便是消除了大量的边带信号,这正是通过Message的机制来实现的。
PCIe定义的Message主要有以下几种类型:

1.Power Management(电源管理): 这类消息用于管理设备的电源状态,比如将设备置于不同的睡眠状态(L1, L2等),或者唤醒设备。这对于节能和热管理非常关键。
2.INTx Legacy Interrupt Signaling(INTx传统中断信号): 尽管PCIe设备推荐使用基于消息的中断(MSI或MSI-X),但为了向后兼容,PCIe也支持通过特殊消息来模拟传统的PCI中断线(INTA,
INTB, INTC, INTD)。
3.Error Signaling(错误信号): PCIe设备和交换机可以通过发送特定的错误消息来报告诸如不可纠正错误、可纠正错误等问题。这些消息对于确保系统稳定运行和及时诊断故障至关重要。
4.Locked Transaction Support(锁定事务支持): 用于支持特定类型的原子操作,在确保数据一致性和事务的原子性方面非常重要。
5.Hot Plug Signaling(热插拔信号): 这类消息支持系统动态地检测和配置新增或移除的设备,比如在不需要关闭电源的情况下添加或移除扩展卡。
6.Vendor‐Specific Signaling(厂商特定信号): 这使得厂商可以定义自己特定的消息类型进行通信和控制,为设备制造商提供了设计灵活性。
7.Slot Power Limit Settings(插槽功率限制设置): 用于传递有关插槽可提供给插入设备的最大功率限制的信息,有助于电源管理和避免过载。

所有采用模糊路由的TLP的Header都是4DW的,具体如下图所示:
在这里插入图片描述
其中Type决定了模糊路由的类型,具体如下图所示:
在这里插入图片描述

000b: 路由到RC
001b:使用地址路由
010b: 使用ID路由
011b:来自RC的广播报文
100b:本地消息,在接收端结束(legacy中断消息使用这种报恩格式,传递来自PCI总线的中断报文)。
101b:用于PCIe电源管理(PME_TO_Ack报文使用)
110b-111b:保留字段

当一个Endpoint收到一个Message TLP,检查TLP Header,如果是RC的广播Message(011b)或者该Message终结于它(100b),它就接受该Message。当一个Switch收到一个Message TLP,检查TLP Header,如果是RC的广播Message(011b),则往它每个下游端口复制该Message然后转发。如果该Message终结于它(100b),则接受该TLP。如果下游端口收到发给RC的Message,则往上游端口转发。

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

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

相关文章

自动驾驶系统中的数据闭环:挑战与前景

目录 自动驾驶概况 1.1自动驾驶分级 1.2自动驾驶国内发展 ​1.3自动驾驶架构模型 数据闭环的意义 2.1 搜集corner case的数据 2.2 提高模型的泛化能力 2.3 驱动算法迭代 数据闭环落地的痛点及对策 3.1 数据采集和使用的合规性问题 3.2 数据确权问题 3.3 数据采集…

【经验总结】 常用的模型优化器

优化器是一种用于优化模型权重和偏差的算法,它根据训练数据更新模型参数,以模型的预测结果更加准确。 1. 常见的优化器 SGD(Stochastic Gradient Descent):SGD是一种基本的优化算法,它在每次迭代中随机选择…

揭秘Ping32如何实现上网行为监控

企业上网行为管理软件在现代企业管理中扮演着举足轻重的角色。它不仅能够监控和记录员工的上网行为,还能有效防止数据泄露和不当使用,从而保障企业的信息安全。 一、Ping32上网监控软件的具体功能包括: 1.网页浏览监控:对Chrome…

jvm面试题30问

什么是JVM的跨平台? 什么是JVM的语言无关性? 什么是JVM的解释执行 什么是JIT? JIT:在Java编程语言和环境中,即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(…

流量卡就该这么选,用起来性价比真的超高!

很多朋友会私信小编,让小编给大家推荐几款流量卡,在这里小编告诉大家,流量卡可以推荐,但是每个人的喜好不同,小编也忙不过来,今天,小编整理了一篇选购指南,大家可以参考选择&#xf…

2024 B2B企业出海营销白皮书(展会篇)

来源:科特勒&微吼 根据36氪研究院发布的《2023-2024年中国企业出海发展研究报告》中指出,随着全球化浪潮席卷以及中国智造的崛起,中国企业出海主力从过去的低附加值行业逐步扩展至信息技术、先进制造、医疗健康、汽车交通、新消费等附加…

106短信平台疑难解答:为何手机正常却收不到短信?

当您使用群发短信平台发送消息时,有时尽管系统提示发送成功,但手机却未能收到短信。这背后可能隐藏着一些不为人知的原因。 首先,我们要明确,在正常情况下,只要手机状态正常,都应该能够接收到短信。然而&am…

为什么站长们喜欢使用新加坡站群服务器呢?

为什么站长们喜欢使用新加坡站群服务器呢? 站群优化一直是站长们追逐的目标之一,而新加坡站群服务器则备受站长们的青睐。为什么会如此呢?让我们深入了解一下。 为什么站长们喜欢使用新加坡站群服务器呢? 站群,简单来说,就是一组相互关联…

Python专题:十、字典(1)

数据类型:字典,是一个集合性质的数据类型 字典的初始化 字典{关键字:数值} 新增元素 修改元素 字典元素访问 字典[关键字} in 操作符 字典关键字检测 字典元素遍历 ①遍历关键字

Android build.prop生成过程源码分析

Android的build.prop文件是在Android编译时刻收集的各种property【LCD density/语言/编译时间, etc.】&#xff1b;编译完成之后&#xff0c;文件生成在out/target/product/<board【OK1000】>/system/目录下&#xff1b;在Android运行时刻可以通过property_get()[c/c域] …

深度学习论文: LightGlue: Local Feature Matching at Light Speed

深度学习论文: LightGlue: Local Feature Matching at Light Speed LightGlue: Local Feature Matching at Light Speed PDF: https://arxiv.org/pdf/2306.13643 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/…

python数据分析——数据预处理

数据预处理 前言一、查看数据数据表的基本信息查看info&#xff08;&#xff09;示例 查看数据表的大小shape&#xff08;&#xff09;示例 数据格式的查看type()dtype&#xff08;&#xff09;dtypes&#xff08;&#xff09;示例一示例二 查看具体的数据分布describe()示例 二…

机器人学【一、刚体运动】

机器人学 文章目录 机器人学1. 刚体运动1.1 刚体变换刚体刚体变换 1.2 三维空间中的旋转运动群求质点坐标的相对变换旋转矩阵的合成法则用线性算子来计算叉积叉积的右手法则叉积用于计算线速度旋转的指数坐标Rodrigues公式计算旋转矩阵的例子四元数 1.3 三维空间中的刚体运动齐…

二分查找入门、二分查找模板

二分查找的具体实现是一个难点&#xff0c;挺复杂的&#xff0c;可以背住一个模板&#xff0c;然后以后再慢慢学习。下面是y总的二分模板(比较难懂&#xff0c;之后再学) y总的模板 二分的本质是在一个边界内&#xff0c;定义了两种不同的形状&#xff0c;其中某点是这两个性…

Golang | Leetcode Golang题解之第68题文本左右对齐

题目&#xff1a; 题解&#xff1a; // blank 返回长度为 n 的由空格组成的字符串 func blank(n int) string {return strings.Repeat(" ", n) }func fullJustify(words []string, maxWidth int) (ans []string) {right, n : 0, len(words)for {left : right // 当前…

详细解析DBC文件

《AUTOSAR谱系分解(ETAS工具链)》之总目录_autosar的uart模块-CSDN博客

Docker Desktop 修改容器的自启动设置

Docker Desktop 允许用户控制容器的自启动行为。如果你不希望某个容器在 Docker 启动时自动启动&#xff0c;你可以通过以下步骤来更改设置&#xff1a; 1. 打开 Docker Desktop 应用。 2. 点击右上角的设置&#xff08;Settings&#xff09;按钮&#xff0c;或者使用快捷键 Cm…

Hive Aggregation 聚合函数

Hive Aggregation 聚合函数 基础聚合 增强聚合

找最大数字-第12届蓝桥杯国赛Python真题解析

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第60讲。 找最大数字&#…

67万英语单词学习词典ACCESS\EXCEL数据库

这似乎是最多记录的英语单词学习词典&#xff0c;包含复数、过去分词等形式的单词。是一个针对想考级的人员辅助背单词学英语必备的数据&#xff0c;具体请自行查阅以下的相关截图。 有了数据才能想方设法做好产品&#xff0c;结合权威的记忆理论&#xff0c;充分调动用户的眼…