PCIe总线-事物层之TLP路由介绍(七)

2024-06-03 00:52

本文主要是介绍PCIe总线-事物层之TLP路由介绍(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概述

下图是一个PCIe总线系统示意图。此时RC发出一个TLP,经过Switch访问EP,TLP的路径为红色箭头所示。首先TLP从RC的下行OUT端口发出,Switch的上行IN端口接收到该TLP后,根据其路由信息,将其转发到Switch的下行OUT端口,随后TLP达到EP的IN端口,最后TLP到达EP设备。TLP从RC到EP的转发过程被称为TLP的路由过程。PCIe总线总共定义了三种路由方式,分别是基于地址(Address)路由、基于ID(BDF)路由和隐式(Implicit)路由。

TLP路由过程

TLP使用的路由方式和TLP的类型有关,具体如下表所示,PCIe桥就是根据这些信息转发TLP。

TLP TypeRouting Method Used
Memory Read [Lock], Memory Write, AtomicOpAddress Routing
IO Read and WriteAddress Routing
Configuration Read and WriteID Routing
Message, Message With DataAddress Routing, ID Routing, or Implicit routing
Completion, Completion With DataID Routing

2.地址路由(Address Routing)

存储器请求、原子操作、IO请求和某些消息请求使用地址路由。对于桥设备,地址路由和桥中设置的地址范围相关。对于EP设备,地址路由和BAR中保存的地址相关。根据传输方向,地址路由可以分为三种情况。第一种是RC Outbound,即RC访问其下游的桥或者EP设备,此时若访问地址在桥定义的地址范围内时,则桥会将该报文向下行口转发。第二种是RC Inbound,即EP(通常是使用DMA)访问RC,此时是下行口访问上行口,和第一种情况相反,只有访问地址不在桥定义的地址范围内时,桥才会将该报文向上行口转发。第三种是Peer-to-Peer,即EP之间相互访问,此时桥的处理方法综合第一种和第二种情况。

桥的地址范围

下图是一个PCIe总线,RC下面接了一个Switch,Switch两个下行口各接了一个EP。RC和Switch的每个Port都包含一个虚拟的PCI-toPCI(P2P)桥。该PCIe总线已枚举完成,分配的地址如下图所示。

建立地址路由环境

IO地址、非预取存储器地址和预取存储器地址路由规则都一样,下面以预取存储器地址路由为例,介绍TLP的传输过程。下图包含了一个RC、一个Swtich和2个EP,Swtich有一个上行口和两个下行口。RC中的P2P0桥地址范围为0x240000000 – 0x243FFFFFF,大小为64MB。Swtich上行口P2P1桥地址范围为0x240000000 – 0x243FFFFFF,大小为64MB。Swtich下行口P2P2桥地址范围为0x240000000 – 0x241FFFFFF,大小为32MB。Swtich下行口P2P3桥地址范围为0x242000000 – 0x243FFFFFF,大小为32MB。EP0的BAR0和BAR1表示的地址范围为0x240000000 – 0x241FFFFFF,大小为32MB。EP1的BAR0和BAR1表示的地址范围为0x242000000 – 0x243FFFFFF,大小为32MB。下面将分别介绍TLP0、TLP1和TLP2的路由过程。

RC Outbound:TLP0由RC发出,访问EP0。流程如下:

  1. Host Bridge生成TLP0,目的地址为0x240008000,然后通过Bus0发送到RC内部的P2P0。
  2. P2P0解析TLP0的目的地址为0x240008000,在其0x240000000 – 0x243FFFFFF地址范围内,则会接收这个TLP,然后将TLP0转发到Swtich的上行口。
  3. TLP0通过Swtich的上行口到达P2P1,P2P1解析TLP0的目的地址为0x240008000,在其0x240000000 – 0x243FFFFFF地址范围内,则会将TLP0转发到Bus2上。若TLP0的目的地址不在P2P1的地址范围内时,则TLP0会被作为不支持的请求(Unsupported Request)处理,如果需要完成报文,则Swtich会发送完成状态为UR(Unsupported Request)的完成报文给RC。
  4. P2P2和P2P3都会收到TLP0,由于TLP0的目的地址在P2P2的地址范围内,因此P2P2会接收TLP0,然后将其转发到Bus3上,P2P3不会接收TLP0。
  5. EP0发现TLP0目的地址在BAR0和BAR1表示的地址范围内,则会接收该TLP0,反之则不会接收。

RC Inbound:TLP1由EP1发出,访问RC。流程如下:

  1. EP1生成TLP1,目的地址为0x24600C000,然后通过Bus4发送给Swtich的下行口。
  2. P2P3解析TLP1的目的地址为0x24600C000,不在其0x240000000 – 0x243FFFFFF地址范围内,则P2P3会接收TLP1并将其向Bus2上转发。
  3. 当TLP1到达Bus2时,P2P2发现TLP1的目的地址不在其地址范围内,此时不会接收TLP1,随后TLP1会被P2P1转发到Bus1。
  4. P2P0发现TLP1的目的地址也不在其地址范围内,则会继续向Bus0上转发,此时Host Bridge会接收这个TLP,从而完成RC的访问。

Peer-to-Peer:TLP2由EP1发出,访问EP0。流程如下:

  1. EP1生成TLP2,目的地址为0x240004000,然后通过Bus4发送给Swtich的下行口。
  2. P2P3解析TLP1的目的地址为0x240004000,不在其0x240000000 – 0x243FFFFFF地址范围内,则P2P3会接收TLP2并将其向Bus2上转发。
  3. 当TLP2到达Bus2时,P2P2发现TLP2的目的地址在其地址范围内,则会接收TLP2,然后将TLP2转发到Bus3上。当P2P1发现TLP2已被P2P2接收了,则不会再转发TLP2。
  4. EP0发现TLP2目的地址在BAR0和BAR1表示的地址范围内,则会接收该TLP2,反之则不会接收。

地址路由

3.ID路由(ID Routing)

配置请求、完成报文和Vendor Defined消息报文使用ID路由。与地址路由不同,ID路由使用Bus Number、Device Number和Function Number组成的16位BDF进行寻址。

如下图所示,桥的配置空间中有三个和总线编号相关的寄存器。Primary Bus Number表示与桥相连的上游总线编号,Secondary Bus Number表示桥下游第一个总线编号,即桥下游最小的总线编号,Subordinate Bus Number表示桥下游最后一个总线编号,即桥下游最大的总线编号。这三个寄存器定义了桥的上游总线和下游总线编号范围,桥就是根据这些信息,进行ID路由。

总线范围

下图是一个已经枚举完成的PCIe总线。Pri表示Primary Bus Number,Sec表示Secondary Bus Number,Sub表示Subordinate Bus Number,Device x表示Device Number,Function x表示Function Number。实质上,Device Number和Function Number已经由硬件确定。比如下图中3个Port的Swtich,上行口为Device 0,下行口从左到右依次为Device 1和Device 2,对于EP,由于只有一个设备,因此Device Number固定为0。设备有几个Function,则Function Number从0开始依次递增。

如下图所示,CPU通过RC访问Bus Number=3,Device Number=0,Function Number=0的设备。TLP通过Host Bridge被转发Bus0上,此时RC的两个下行口都会收到TLP,左边的P2P发现目的设备的总线号3在其下游总线编号1-4的范围内,因此会接收,并将其向下游总线转发,右边的P2P发现目的设备的总线号3不在其下游总线编号5-9的范围内,因此不会接收该TLP。与之类似,TLP最终会穿越左边的Swtich,到达要访问的设备。

ID路由

4.隐式路由(Implicit routing)

某些消息请求使用隐式路由,如INTx中断消息、电源管理消息和错误消息等。这些消息要么直接发向RC,要么是来自RC的广播报文,要么是Local: terminate at receiver。这些报文不使用地址或ID路由,而是使用Msg或MsgD报文中的Routing(Type[2:0])字段进行路由,这种路由方式称为隐式路由。如果桥收到一条使用隐式路由的TLP时,将根据Routing(Type[2:0])字段的不同而分别处理。若是收到了一条来自RC的广播消息,则会向下游转发,若是收到了一条发向RC的消息报文,则会向上游转发,若式收到了一条Local: terminate at receiver消息报文,则会接收并终结此消息报文,不会向上游或下游转发。

消息报文隐式路由

参考资料

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

这篇关于PCIe总线-事物层之TLP路由介绍(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025579

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到