Home PCIe TLP包路由
Post
Cancel

PCIe TLP包路由

PCIe_TLP路由

当包(Packet)到达Switch的输入端口(Ingress Port)时,端口首先会检查包是否有错误, 然后根据包的路由(Routing)信息(路由信息在TLP包的Head中),来做出以下三种处理方式之一:

  1. 接受这个包,并自己(Switch)使用它(Internal Use);
  2. 将其通过响应的输出端口(Egress Port)转发到下一级Endpoint(或者下一级Switch);
  3. 拒绝接受这个包。

在前面的文章中多次介绍过,PCIe总线中一共有三种类型的包:

  1. Ordered Sets(命令集包,只在相邻的设备的物理层之间进行传递,不会被转发到其他的设备中)
  2. DLLPs(数据链路层包,只在相邻的设备的数据链路层之间进行传递,不会被转发到其他设备中)
  3. TLPs(事务层包,可以根据包中的路由信息被转发到其他的设备中)。

注:实际上不论是TLPs还是DLLPs都会经过物理层,这里说的TLP和DLLP指的是包的最初来源分别是事务层和数据链路层, 即DLLP和上一层的事务层没有什么关系,其内容和作用完全是由数据链路层自己决定的。

注:Endpoint不仅可以发送TLP给其上层的设备(如Root),也可以发送TLP给其他的Endpoint, 当然这需要借助Switch来实现。这种传输方式叫做Peer-to-Peer。

TLP一共有三种路由方式,分别是ID路由(ID Routing,即BDF Routing)、地址路由(Address Routing,包括Memory和IO)以及模糊路由(Implicitly Routing)。 本文将简单介绍一些关于TLP路由的基础知识,具体的路由方式将会在接下来的三篇文章中依次进行介绍。

具体采用哪一种路由方式是由TLP的类型所决定的,如下表所示:

PCIe_TLP路由方式确定

注:一般情况下,Message都是使用模糊路由(Implicitly Routing)的,但是也有PCIe设备厂商自定义的Message会使用地址路由或者ID路由。

可能有的人要有疑惑了,既然Message可以使用地址路由或者ID路由,为什么还要单独搞出来一个模糊路由呢? 原因很简单,使用模糊路由可以广播Message到每一个设备,采用其他的路由方式必须明确指定是哪一个设备。

那么PCIe中是如何来判断TLP的类型的呢?又是如何判断其为Request还是Completion的呢?实际上是通过TLP Header的Format和Type部分来确定的,如下图所示:

PCIe_TLP包类型判断1

PCIe_TLP包类型判断2

ID Routing(BDF 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:

PCIe_ID_Routing_Header1

PCIe_ID_Routing_Header2

对于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格式。

对于Switch来说,则需要根据TLP Header中的BDF来判断,这个TLP是给自己的还是给自己下属的其他设备的。如下图所示:

PCIe_ID_Routing_Header3

Address Routing

地址路由(Address Routing)的地址包括IO和Memory对于Memory请求来说,32bit的地址使用3DW的Header,64bit的地址使用4DW的Header。 而IO请求则只能使用32bit的地址,即只能使用3DW的Header。

IO请求是为了兼容早期的PCI设备的,在新的PCIe设备中禁止使用。

3DW和4DW的TLP Header分别如以下两张图所示:

PCIe_Address_Routing_Header1

PCIe_Address_Routing_Header2

当Endpoint接收到采用地址路由的TLP时,其会根据该TLP Header中的地址信息和自己的配置空间中的BAR寄存器来判断这个TLP是不是自己的。如下图所示:

PCIe_Address_Routing_EP

Switch的地址路由机制如下图所示:

PCIe_Address_Routing_switch

Implicit Routing

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

PCIe定义的Message主要有以下几种类型:

  • Power Management
  • INTx legacy interrupt signaling
  • Error signaling
  • Locked Transaction support
  • Hot Plug signaling
  • Vendor‐specific signaling
  • Slot Power Limit settings

所有采用模糊路由的TLP的Header都是4DW的,具体如下图所示:

PCIe_Implicit_Routing_Header1

其中Type决定了模糊路由的类型,具体如下图所示:

PCIe_Implicit_Routing_Header2

This post is licensed under CC BY 4.0 by the author.

PCIe Base & Limit寄存器详解

PCIe 错误机制