3.10 详述PCIE的三种路由机制


这是剖析PCIE协议的第20篇文章

内容简介

2024-02-04

全文共1686字,阅读大约需要6分钟。本文是第三章的最后一篇,可以说前8篇的铺垫大部分就是为了说PCIE的路由机制,本文会详细的介绍下PCIE三种路由方式的应用场景和使用方法。

    这里所说的路由就是指TLP包在PCIE的整个拓扑结构里面传输的方法。PCIE支持三种路由方案,分别是基于地址路由、基于ID路由和隐式路由。不同事务类型支持的路由方法如下:



01

ID路由的实现方法


    ID路由的TLP包帧头如下图所示,支持3DW和4DW,其中3DW帧头用于支持两种配置数据包和完成数据包,4DW用于Vendor_Defined功能的消息数据包。配置数据包只能是RC发起,完成数据包和消息数据包可以由EP发起。ID路由即采用Bus Number、Device Number和Function Number来确定目标设备的位置一种路由方法,也就是下图红色位置。 



1.1 EP的操作

    对于EP来说,收到数据包会检查BDF是否与自己一致,如果一致就解析、使用和动作,如果不一致就忽略掉。如果要发送数据包,按格式填充即可。


1.2 Switch的操作

     对于Switch不仅要检查数据包是否给自己的,还需要判断是否需要路由。判断依据就是根据配置空间里的如下字段



Primary Bus Number :当前的上游总线号

Secondary Bus Number :当前桥的总线号

Subordinate Bus Number:存放当前PCIE子树中,编号最大的PCIE总线号,也就是一个分支里面最深最靠下的总线号,但不一定是整个树里面最大的。


1.3 关于Type0和Type1

  ID路由的配置数据有Type0和type1两种数据包,如下图所示。



    在《PCIE体系导读》里面给出了 关于这四种两类数据包的解释,他的解释依据下图。



RC:

    配置读写请求只能是RC发出,有Type00和Type01两种TLP包


Bus0总线:

    PCIE总线的Type00类型配置请求TLP不能够穿越桥片。在RC发出Type00配置请求访问PCI Bus0总线上设备时,所有在PCI Bus0上的设备都要监听,但因为只有Switch,所以只有switch的上游端口会消耗个TLP包并返回完成信号(此时switch作为一个PCI设备,所以可以接收访问其配置空间的请求)。


跨switch:

    RC可以通过Type 01配置请求包访问P-P2桥片、P-P3桥片、EP1和EP2,这里分为两种情况,一种是访问P-P2或P-P3,另一种是访问EP1和EP2


    1)访问P-P2桥片、P-P3桥片的情况

    如果这个TLP包的类型为Type 01,Bus Number为1,那他访问的就是PCI BUS1总线上的设备,P-P1会将这个Type01类型数据包转换为Type00数据包给到P-P2、P-P3让它们各自判断属于谁的,此时这俩桥也是作为一个PCI设备。


    2)访问EP1、EP2

    如果如果这个TLP包的类型为Type 01,Bus Number为位于P-P1桥的Secondary Bus Number和Suboridinate Bus Number之间,P-P1桥将该TLP包之间透传到PCI BUS1虚拟桥上,此时P-P2、P-P3都检查这个数据包是谁的,然后将其转换为Type 00给到对应的EP。例如TLP包的Bus Number是2,就给到EP1。


1.4 如果是下游设备给上游设备的TLP

    ID路由数据包可以是RC发起给下游设备的,但对于消息则可以是下游给上游的。直连上游设备也会检查是不是给自己的,如果发现地址不在自己包含范围内,那么就继续往上推,直至给到RC。



02

地址路由的实现方法


    采用地址路由的有内存事务、IO事务和部分消息事务。TLP包分为3DW和4DW两种。



    对于EP来讲,就是检查这个地址是否与其某个BAR所指示的地址范围相匹配。匹配接收,不匹配忽略。


    地址路由对于switch来说,也会检查这个TLP包是不是给自己的,如果不是给自己的,就根据配置空间里面的Limit和Base来判断是不是给我下游的,如果是就往下传,如果不是就忽略。其中IO Limit IO Base是针对IO数据包,Memory Limit 和Memory Base是针对内存路由。



    具体还是参考《PCIE体系结构导读》所述来将讲,分为两个部分,一是由RC发起到EP1的TLP1数据包,二是由EP2发起上传到RC,我们看看这两条路径如何实现的



1、RC发起给到EP1,TLP1通过BUS0总线给到Switch的上游端口P-P1,判断是否属于自己或下游的,根据配置空间Limit和base的检查,发现是属于自己下游的,则继续向下传递,经由下游端口P-P2、P-P3检查是否属于自己的,属于P-P2且不是给自己的,就往下穿,EP1判断给自己的,就消化了。


2、EP2发起上传给到RC,目标地址是RC,肯定不包括在P-P3里面,按照上述逻辑就该丢弃了,但PCIE对于向上传递的数据规定不属于自己空间范围的就往上传。


03

隐式路由


    消息事务里面的大部分事务都是采用隐式路由,这种路由方式提高消息的传递效率降低延迟,还可以提升可扩展性。



    根据Type类型区分不同的消息事务,如下图,Type的bit2:0是001采用地址路由,是010采用ID路由,其它的都是隐式路由。所以消息事务的帧类型可能是000b、011b、100b、101b这四种之一。


    对EP来说,如果事务类型是011b广播类型、100本地报文,EP会接收,其他的不理会


    如果switch收到一条隐式路由的TLP,将根据报文的Route字段的不同而分布处理,如果是01b,来自RC的广播则往下游路径传递,如果是来自下游的011则往上游传递直至RC,如果是本地报文100b,则接收并终结欸传递。


    如果RC收到一条隐式路由的TLP,如果是000b或101b,RC接收并处理,如果是100,RC接收但不动作。



欢迎关注公众号点击【资料下载】领取相关资料








快来扫描下方二维码关注公众号,领取站内所有相关资料,所有哦~

有建议、有需求、有疑问、联系我

<