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

相关文章

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交