系列文章目录
PCIe扫盲(一)
PCIe扫盲(二)
PCIe扫盲(三)
PCIe扫盲(四)
文章目录
TLP路由(Routing)基础
首先来分析一个例子,如下图所示:
当包(Packet)到达 Switch 的输入端口(Ingress Port)时,端口首先会检查包是否有错误,然后根据包的路由(Routing)信息,来做出以下三种处理方式之一:
接受这个包,并自己(Switch)使用它(Internal Use);
将其通过响应的输出端口(Egress Port)转发到下一级 Endpoint(或者下一级 Switch);
拒绝接受这个包。
在前面的文章中多次介绍过,PCIe 总线中一共有三种类型的包:Ordered Sets(命令集包,只在相邻的设备的物理层之间进行传递,不会被转发到其他的设备中)、DLLPs(数据链路层包,只在相邻的设备的数据链路层之间进行传递,不会被转发到其他设备中)和 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 的类型所决定的,如下表所示:
注:AtomicOp 是 PCIe Spec V2.1 新增的内容,有兴趣的可以自行阅读 V2.1 的相关内容。
注:一般情况下,Message 都是使用模糊路由(Implicitly Routing)的,但是也有 PCIe 设备厂商自定义的 Message 会使用地址路由或者 ID 路由。
可能有的人要有疑惑了,既然 Message 可以使用地址路由或者 ID 路由,为什么还要单独搞出来一个模糊路由呢?原因很简单,使用模糊路由可以广播 Message 到每一个设备,采用其他的路由方式必须明确指定是哪一个设备。
那么 PCIe 中是如何来判断 TLP 的类型的呢?又是如何判断其为 Request 还是 Completion 的呢?实际上是通过 TLP Header 的 Format 和 Type 部分来确定的,如下图所示:
TLP路由之 ID 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:
对于 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 格式,这里暂时不详细介绍了,有兴趣的可以自行阅读 PCIe Spec 的相关内容。
对于 Switch 来说,则需要根据 TLP Header 中的 BDF 来判断,这个 TLP 是给自己的还是给自己下属的其他设备的。如下图所示:
TLP 路由之 Address Routing
地址路由(Address Routing)的地址包括 IO 和 Memory 。对于 Memory 请求来说,32bit 的地址使用 3DW 的 Header,64bit 的地址使用 4DW 的 Header 。而 IO 请求则只能使用 32bit 的地址,即只能使用 3DW 的 Header。
注:再次强调,IO 请求是为了兼容早期的 PCI 设备的,在新的 PCIe 设备中禁止使用。
3DW 和 4DW 的 TLP Header 分别如以下两张图所示:
当 Endpoint 接收到采用地址路由的 TLP 时,其会根据该 TLP Header 中的地址信息和自己的配置空间中的 BAR 寄存器来判断这个 TLP 是不是自己的。如下图所示:
Switch 的地址路由机制如下图所示:
TLP 路由之 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 的,具体如下图所示:
其中 Type 决定了模糊路由的类型,具体如下图所示:
转载链接
☆