【PCIE体系结构六】TLP路由

news2024/11/26 18:44:28

👉个人主页:highman110

👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 

参考书籍:PCI_Express体系结构导读

目录

 TLP路由

 地址路由

 ID路由

 隐式路由


 TLP路由

        在一个有switch或多端口RC的多endpoint PICE总线拓扑中,TLP在传输时必然会遇到路径选择问题,这个路径选择就叫路由。PCIE总线定义了三种TLP路由方法:基于地址(address Routing)的路由、基于ID的路由(ID Routing,即BDF Routing,Bus Number + Device Number + Function Number)和隐式路由(Implicitly Routing)。

        PCIE设备根据TLP的类型(TLP Header的Format和Type字段)来进行路由方式的选择:

TLP type

路由方式

存储器读写、IO读写(传统PCI设备用)

address Routing

配置读写、Vender_defined Messages、CPl、CPlD

ID Routing

Message报文:包括INTx Interrupt Signaling、Power Management Messages、Error Signal Messages等

Implicitly Routing

        一般情况下,Message都是使用隐式路由(Implicitly Routing)的,但是也有PCIe设备厂商自定义的Message会使用地址路由或者ID路由。可能有的人要有疑惑了,既然Message可以使用地址路由或者ID路由,为什么还要单独搞出来一个模糊路由呢?原因很简单,使用模糊路由可以广播Message到每一个设备,采用其他的路由方式必须明确指定是哪一个设备。

 地址路由

        前面我们介绍了PCIE设备的配置空间内容,这里面就包含了TLP路由的地址信息。基于地址的路由很好理解,TLP报文中包含了目的地址信息,当Endpoint或switch接收到采用地址路由的TLP时,其会根据该TLP Header中的地址信息和自己的配置空间中的BAR寄存器来判断这个TLP是自己的还是我下游设备的。

        地址信息包含在TLP头中,对于Memory read或Memory write请求来说,32bit的地址使用3DW的Header,64bit的地址使用4DW的Header。而IO请求则只能使用32bit的地址,即只能使用3DW的Header,如下图:

        当一个Switch上游端口收到一个Memory Read或者Memory Write TLP,它首先把TLP Header中的地址跟它自己Configuration当中的所有BAR寄存器比较,如果TLP Header当中的地址落在这些BAR的地址空间,那么它就认为该TLP是发给它的,于是接收该TLP(这个过程与Endpoint的处理方式一样);如果不是,则看这个地址是否落在其下游设备的地址范围内(是否在Memory Base和Memory Limit之间,switch上游端口的这两个寄存器存放的是与其连接的下游所有设备的地址空间),如果是,说明该TLP是发给它下游设备的,因此它要完成路由转发;如果地址不落在下游设备的地方范围内,说明该TLP不是发给它下游设备的,则不接受该TLP,如下图所示:

 

        那在switch内部,上游端口接收TLP后,再如何到达下游对应的某个设备呢?其实switch的每个端口都对应一个虚拟的PCI to PCI桥,上游的PCI桥通过PCI总线连接下游的PCI桥,每个PCI桥都有其配置空间,当桥P1收到TLP后,判断了此TLP目的地址在其下游设备地址空间范围内,它就将此报文发送到PCI BUS1上,下游的PCI桥都会收到此TLP,然后每个桥都判断目的地址是否在其所连接设备的地址空间内,如果在则接收报文并发给下游设备,如果不在则忽略此TLP。如下图TLP1到达EP1的路径:

 

        前面描述的是从上游到下游的TLP转发,那从下游到上游又怎么走呢?比如上图中的EP2发起了一个访问存储器的请求,TLP2是如何走到RC的?TLP2首先到达P3桥,P3桥的base和limit肯定不包含TLP2中的目的地址,P3桥将TLP2发送到PCI BUS1。

        这里需要注意的是,“TLP从上游端口向下游端口传递”和“TLP从下游端口向上游端口传递”的桥片处理机制有所不同。从上游向下游传时,如果桥片的配置寄存器base和limit包含TLP的目的地址时,桥片将接收TLP,否则不接收;而从下游到上游传时,如果桥片的配置寄存器base和limit不包含TLP的目的地址时,桥片将接收TLP,并将其推送到桥片上游PCI总线。

        TLP2到达总线PCI BUS1时,P2桥片会检查TLP2是不是自己的(相对P2桥来说,此时的TLP2方向是上游到下游),P1桥片也会检查TLP2是不是自己的(相对P3桥来说,此时的TLP2方向是下游到上游),P1桥片发现配置寄存器base和limit不包含TLP2的目的地址,则将其转发到上游PCI BUS0总线,也就到了RC。

        另外上图中的EP2访问EP1的TLP3就不多说了,机制和上面描述的一样。

 ID路由

        在一个PCIe拓扑结构中,由ID=Bus Number+Device Number+Function Number(BDF)能唯一找到某个设备的某个功能。这种按设备ID号来寻址的方式叫作ID路由。配置读写、Vender_defined Messages、CPl、CPlD 这几种TLP按ID路由寻址。

        使用ID路由的TLP如下图,其TLP Header中含有BDF信息:

        还是把这张图贴在这里:

 

        若RC要访问到EP1的配置空间,配置空间的请求都是使用ID路由的,所以RC需要使用type1的配置请求TLP(此TLP的bus number为2,EP1挂在PCI bus2上),报文到达P-P1虚拟桥时,它会检查此TLP的bus number是否为1,若为1则表示该TLP访问的目标设备在PCI bus1总线上,此时P-P1桥将会把type1的TLP转化为type0的TLP,然后推送到PCI bus1上,并访问其下设备(注意type0的TLP是不能穿越PCI桥的,所以它只能访问到P-P2或P-P3,那这个两个桥怎么接收type0的TLP呢?这里是虚拟的PCI桥,当要访问桥的时候,可以认为桥不是桥了,这个桥就是PCI agent设备,PCI是共享总线的传输方式,PCI总线上挂了多个PCI agent设备,每个设备都有一个独立的IDSEL#信号与P-P1地址总线相连,PCI总线根据IDSEL#与地址总线的连接关系来决定相应设备的device number)。这里扯远了点,回到RC发出的TLP的bus number为2这个前提,P-P1桥则会发现此bus number(2)在其secondary bus number(1)和subordinate bus number(3)之间,P-P1桥将直接透传此type1的TLP到PCI bus 1上,然后P-P2检查到bus number为2则知道此TLP是给自己下挂的EP的,就将此type1 TLP转化为type0 TLP(bus number和device number字段就不需要了,全部填1,因为一个switch端口只连接一个EP,保留function number和register偏移地址),再转发到EP1,由EP1处理此TLP。

 隐式路由

        只有Message TLP才支持隐式路由。在PCIe总线中,有许多消息是直接发给RC或来自RC的广播报文,因此没有必要明明白白地指定地址或者ID,这种路由方式称为隐式路由。也有使用地址路由和ID路由的Message TLP,但是多数是使用隐式路由,这些消息报文包括:中断请求、错误状态处理、锁定总线事务、热插拔信号处理、vendor defined message等。

Message TLP的Header总是4DW:

Type字段,低3位,由rrr表示,指明该Message的路由方式,具体如下图所示:

        当一个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,则往上游端口转发。

        OK,TLP路由介绍暂时到这,更详细的内容有面有机会再展开。

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

介绍一款idea神级插件【Bito-ChatGPT】而且免费!

什么是Bito? Bito是一款在IntelliJ IDEA编辑器中的插件,Bito插件是由ChatGPT团队开发的,它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队,他们开发了一款基于GPT的自然语言处理…

云原生CAx软件: HTTP基础知识汇总

随着云原生(Cloud Native)的兴起,面向服务架构(Service-Oriented Architecture,SOA)、微服务(Microservice)、容器(Container)等相关概念与技术正在逐渐影响CAx(CAD/CAE/CAM)软件的架构设计与开发。 在云原生CAx软件中,首先需要把系统按照功…

vue3表单输入绑定

初识表单输入绑定 vue3可以帮助我们将vue定义的变量绑定到html表单元素上&#xff0c;并且监听到html表单元素修改值时&#xff0c;会将对应的vue定义的变量修改。 <!-- 将vue3定义的text绑定给inut元素, 当input元素发生input输入事件时, 将修改vue3定义的text --> <…

Linux常用操作命令

目录 一. Linux命令格式 二. 文件目录操作命令 文件目录操作命令 ls 文件目录操作命令 cd 文件目录操作命令 cat 文件目录操作命令 more 文件目录操作命令 tail 文件目录操作命令 mkdir 文件目录操作命令 rmdir 文件目录操作命令 rm 三. 拷贝移动命令 拷贝移动命令 …

STM32 学习笔记_6 定时器中断(上)

TIM 定时器是功能最强大&#xff0c;内容最复杂的32结构。 之前51用过的功能&#xff0c;定时产生中断。输出比较&#xff0c;常用于产生 PWM 波形&#xff0c;驱动电机等。输入捕获&#xff0c;测量方波频率。编码器&#xff0c;读取正交编码器的波形。 最大定时时间&#…

关于repeater录制的流量子调用的identity中带有~S的情况

前段时间同事问我&#xff0c;我们录制的流量中&#xff0c;尤其是dubbo的子调用显示经常他的末尾会带上一个小尾巴这个是什么意思呢&#xff0c;其实之前我没有太在意这个事情&#xff0c;只是同事这么疑问了&#xff0c;确实激起了好奇心&#xff0c;所以就差了下 到底是什么…

HTML(四) -- 多媒体设计

目录 1. 视频标签 2. 音频标签 3. 资源标签&#xff08;定义媒介资源 &#xff09; 1. 视频标签 属性值描述autoplayautoplay如果出现该属性&#xff0c;则视频在就绪后马上播放。controlscontrols表示添加标准的视频控制界面&#xff0c;包括播放、暂停、快进、音量等…

交叉熵损失函数与参数更新计算实例(节点分类为例)

交叉熵损失与参数更新 数据准备 对于下面这样一个图网络网络&#xff1a; 假如我们得到了节点i的嵌入表示 z i z_i zi​数据如下&#xff1a; i d , x 0 , x 1 , x 2 , x 3 1 , 0.5 , 0.6 , 0.7 , 0.8 2 , 0.3 , 0.8 , 0.3 , 0.4 3 , 0.7 , 0.9 , 0.6 , 0.9 4 , 0.2 , 0.1…

【计算几何】判断一条线段和一段圆弧是否相交 C++代码实现

文章目录 一、前言二、线段与圆弧的代码表示2.1 线段代码表示2.2 圆弧代码表示 三、实现思路及数学推导3.1 第一步&#xff08;粗略判断&#xff09;3.2 第二步3.3 第三步 四、完整代码五、效果展示 一、前言 最近做项目&#xff0c;需要判断一条线段是否和一段圆弧相交&#…

利用Ad Hoc传感器网络上的局部信息组织全球坐标系(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 知道通信网络中节点的地理位置通常是有用的&#xff0c;但在每个节点上添加GPS接收器或其他复杂的传感器可能会很昂贵。 本文…

系统集成项目管理工程师 笔记(第14章 项目采购管理)

文章目录 采购管理包括如下几个过程14.2 编制采购计划 4621&#xff09;采购管理计划2&#xff09;采购工作说明书3&#xff09;采购文件14.2.3 工作说明书&#xff08;SOW&#xff09; 14.3 实施采购 47414.3.2 实施采购的方法和技术 476&#xff08;1&#xff09;投标人会议&…

深入篇【C++】类与对象:构造函数+析构函数

深入篇【C】类与对象&#xff1a;构造函数析构函数 ①.构造函数Ⅰ.概念Ⅱ.特性1.函数名和类型相同。2.无返回值&#xff0c;也不用写void。3.自动调用对应的构造函数。4.构造函数可重载5.编译器的无参构造6.编译器的无参构造特性7.声明时可缺省8.构造函数的调用9.默认构造函数 …

进程控制下篇

进程控制下篇 1.进程创建 1.1认识fork / vfork 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程 #include<unistd.h> int main() {pid_t i fork;return 0; }当前进程调用fork&#xff0c;…

【VScode】的 安装--配置--使用(中文插件下载不了怎么办?)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : VScode &#x1f606;今日分享 : ”兰因絮果“是世间定律吗&#xff1f; 一段美好爱情开始时你侬我侬、缠缠绵绵&#xff0c;最后却以相看两厌结尾&#xff0c;让人唏嘘。清代词人纳兰容若于是咏出「人生若只如初见&#xff…

后端程序员的前端必备【Vue】 -01 Vue入门

Vue概述与基础入门 1 Vue简介1.1 简介1.2 MVVM 模式的实现者——双向数据绑定模式1.3 其它 MVVM 实现者1.4 为什么要使用 Vue.js1.5 Vue.js 的两大核心要素1.5.1 数据驱动![请添加图片描述](https://img-blog.csdnimg.cn/963aca7d7a4447009a23f6900fdd7ee1.png)1.5.2 组件化 2 …

系统集成项目管理工程师 笔记(第13章 项目合同管理)

文章目录 13.2.1 按信息系统 范围 划分的合同分类 4451、总承包合同2、单项工程承包合同3、分包合同 13.2.2 按项目 付款方式 划分的合同分类 4461、总价合同2、成本补偿合同&#xff08;卖方有利&#xff09;3、工料合同 13.3.1 项目合同的内容 44713.3.2 项目合同签订的注意事…

进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)

谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 目录 谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 抛出总结 开始介绍 发现问题 进程地址空间&#xff08;虚拟地址&#xff09; 页表 物理内存与进程地址空间映射 缺页中断基本…

Linux操作系统之mysql数据库简介

文章目录 数据库的介绍有关数据库的操作有关数据表的操作C语言访问mysql事务视图索引 数据库的介绍 mysql数据库模型&#xff1a; 关系型数据库与非关系型数据库&#xff1a; 关系型数据库&#xff1a;指采用了关系模型来组织数据的数据库&#xff0c;关系模型就是指二维表格模…

【PCL】—— 点云滤波

文章目录 直通滤波降采样使用统计滤波&#xff08;statisticalOutlierRemoval&#xff09;移除离群点使用条件滤波&#xff08;ConditionalRemoval&#xff09;或 半径滤波&#xff08;RadiusOutlinerRemoval&#xff09;移除离群点 在获取点云数据时&#xff0c;由于设备精度&…

Vue(组件化编程:非单文件组件、单文件组件)

一、组件化编程 1. 对比传统编写与组件化编程&#xff08;下面两个解释图对比可以直观了解&#xff09; 传统组件编写&#xff1a;不同的HTML引入不同的样式和行为文件 组件方式编写&#xff1a;组件单独&#xff0c;复用率高&#xff08;前提组件拆分十分细致&#xff09; 理…