TLP的路由是指TLP通过Switch或者PCIe桥片时采用哪条路径,最终到达EP或者RC的方法。PCIe总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于ID的路由和隐式路由(Implicit)方式。
存储器和I/O读写请求TLP使用基于地址的路由方式,这种方式使用TLP中的Address字段进行路由选径,最终到达目的地。
而配置读写报文、“Vendor_Defined Messages”报文、Cpl和CplD报文使用基于ID的路由方式,这种方式使用PCI总线号[1](Bus Number)进行路由选径。在Switch或者多端口RC的虚拟PCI-PCI桥配置空间中,包含如何使用PCI总线号进行路由选径的信息。
而隐式路由方式主要用于Message报文的传递。在PCIe总线中定义了一系列消息报文,包括“INTx Interrupt Signaling”,“Power Management Messages”和“Error Signal Messages”等报文。在这些报文中,除了“Vendor_Defined Messages”报文,其他所有消息报文都使用隐式路由方式,隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式,或者用于RC向EP发出广播报文。
5.2.1 基于地址的路由
在PCIe总线中,存储器读写和I/O读写TLP使用基于地址的路由方式。PCIe设备使用的地址路由方式与PCI设备使用的地址路由方式类似。只是PCIe设备使用TLP进行数据传送,而PCI设备使用总线周期进行数据传送。使用地址路由方式进行数据传递的TLP格式如第5.3.1节的图5?8所示,在这类TLP中包含目的设备的地址。
当一个TLP进行数据传递时,可能会经过多级Switch,最终到达目的地。Switch将根据存储器读写和I/O读写请求TLP的目的地址将报文传递到合适的Egress端口上。如图4?10所示,在一个Switch中包含了多个虚拟PCI-to-PCI桥。在Switch中有几个端口,就包含几个虚拟PCI-to-PCI桥。
在虚拟PCI-to-PCI桥的配置寄存器空间中,包含一个桥片能够接收的物理地址范围。PCIe总线通过这个物理地址范围实现基于地址的路由。这段配置寄存器如图5?4所示。当系统软件初始化PCI总线时,将合理地设置这些寄存器,之后当TLP通过这些Switch时将根据这些寄存器选择合适的路径。
上图中的配置寄存器描述了该虚拟PCI-to-PCI桥下游PCI子树使用的三组空间范围,分别为I/O、存储器和可预取的存储器空间,分别用Base和Limit两类寄存器描述,其中Base寄存器表示可访问空间的基地址,Limit寄存器表示可访问空间的大小。TLP使用基于地址的路由时,一定要通过查询这组寄存器之后,再决定传送路径。这组寄存器的使用方法与PCI总线中的PCI桥兼容。
其中TLP从“上游端口发送到下游端口”与“下游端口发送到上游端口”的路由过程略有不同,如图5?5所示。下文以TLP1~3的发送过程对地址路由过程进行说明。TLP1~3的描述如下。
- TLP1是一个存储器或者I/O请求TLP,由RC发出,并通过一个Switch发向EP1。存储器和I/O读写请求TLP使用这种地址路由方式。TLP1将从Switch的上游端口传送到下游端口。
- TLP2是一个存储器或者I/O请求TLP,由EP2发出,并通过一个Switch发向RC。当PCIe设备进行DMA读写操作时,将使用这种地址路由方式。TLP2将从Switch的下游端口传送到上游端口。
- TLP3是一个存储器或者I/O请求TLP,由一个EP2发出,并通过一个Switch后发送到另外一个EP。在x86处理器系统中,这种用法并不常见。但是在某些大规模处理器系统中,具有这种应用方式。此时TLP3将从Switch的下游端口传送到另外一个下游端口。
1 TLP1的传送过程
当TLP1从RC发向EP1时,这个TLP1为I/O或者存储器报文,其中TLP1目的地址在EP1的BAR空间中。当处理器访问EP的BAR空间时,需要使用该类TLP。值得注意的是这个数据报文在通过RC时需要进行地址转换。
TLP1首先通过PCI Bus0发向Switch,并通过Switch的Upstream端口到达P-P1桥片,P-P1桥片首先根据配置寄存器中的Limit和Base寄存器决定是否接收TLP1。如果Switch不接收TLP1,则将该TLP作为不支持的请求(Unsupported Request)处理,此时如果TLP1需要回应报文,Switch将发出完成报文,该报文的状态为UR(Unsupported Request)。
如果Switch接收TLP1,则表示TLP1所访问的地址在该Switch下游端口所连接的EP或者Switch中,此时Switch将TLP1从PCI Bus0推至PCI Bus1中,即穿越P-P1桥片。TLP1到达PCI Bus1后将同时查找P-P2和P-P3桥片配置寄存器中的Limit和Base寄存器,决定是P-P2还是P-P3桥片接收TLP1。本小节中的例子将使用P-P2桥片接收TLP1,并将TLP1推至PCI Bus2,而PCI Bus2上的EP1将接收TLP1,完成整个地址路由。
2 TLP2的传送过程
当TLP2从EP2发向RC时,一般来说该TLP将访问处理器系统的主存储器。此时TLP2首先将请求发至P-P3桥片,在P-P3桥片配置寄存器的Limit和Base寄存器中当然不会包含TLP2所访问的地址,此时P-P3桥片将TLP2推至PCI Bus1。
TLP从“下游端口向上游端口”与“TLP从上游端口向下游端口”进行传递时,桥片的处理机制有所不同,从上游端口向下游端口传递时,如果桥片配置寄存器的Limit和Base寄存器包含该TLP的访问地址时,桥片将接收此TLP,否则不接收该TLP。而从下游端口向上游端口传递时,如果桥片配置寄存器的Limit和Base寄存器不包含该TLP的访问地址时,桥片将接收该TLP,并将其推至桥片的上游PCI总线。值得注意的是,这两种地址译码方式都属于PCI总线的正向译码。
当TLP2到达PCI Bus1时,首先检查在PCI Bus1总线上的P-P2桥片是否可以接收此TLP,如果不能接收则TLP2通过P-P1桥片传递到PCI Bus0,即到达RC。
在MPC8548处理器中,到达RC的TLP首先通过Inbound寄存器进行地址转换,将TLP的PCI总线地址转换为处理器的地址,然后访问处理器中相应的存储器空间;对于x86处理器而言,MCH也会完成PCI域地址空间到存储器域地址空间的转换,然后访问处理器中相应的存储器空间。
3 TLP3的传送过程
TLP3的传递方式与TLP2的传递方式有些类似,当TLP3传递到PCI Bus1时,P-P2桥片将接收TLP3,并将TLP3传递到PCI Bus2上的EP1中。由以上叙述可以发现,PCIe总线中基于地址的路由方式与PCI总线上的基于地址的数据传递流程十分相近。TLP3在PCI总线域上进行数据传递,因此不需要进行PCI总线域到存储器域的地址转换。
5.2.2 基于ID的路由
在PCIe总线中,基于ID的路由方式主要用于配置读写请求TLP、Cpl和CplD报文,此外Vendor_Defined消息报文也可以使用这种基于ID的路由方式。而在PCI总线中,只有配置读写周期才使用ID进行数据传递。
基于ID的路由方式与基于地址的路由方式有较大的不同,基于ID路由方式的TLP头格式也与基于地址路由方式的头格式不同,其报文格式如图5?6所示。
如上图所示,使用ID路由方式的TLP头,其Byte8~11字段与基于地址路由的TLP不同。基于ID路由的TLP,使用Bus Number、Device Number和Function Number进行路由寻址。从软件的角度上看,PCIe总线与PCI总线兼容,只是在PCIe总线中,每一个PCIe设备使用唯一的PCI设备号,但是每一个设备仍然可以有多个子设备(Function)。
PCIe总线规定,在一个PCI总线域空间中,最多只能有256条PCI总线,因此在一个TLP中,Bus Number由五位组成;而在每一条总线中最多包含32个设备,因此TLP中的Device Number由5位[2]组成;而每一个设备中最多包含8个功能,因此一个TLP的Function Number由3位组成。
配置读写请求TLP是使用“基于ID路由”的一组重要报文,其主要作用是读写PCIe总线的EP、Switch及PCIe桥片的配置寄存器,以完成PCIe总线的配置。在处理器系统上电之后需要进行PCI总线系统的枚举,为PCI总线分配总线号,并设置Switch、PCIe桥片或者EP的配置寄存器,如Limit寄存器组、Base寄存器组、BAR寄存器、Subordinate Bus Number、Secondary Bus Number和Primary Bus Number等一系列配置寄存器。
在上文中我们简单介绍了Limit寄存器组和Base寄存器组的用法,下文将重点描述Subordinate Bus Number、Secondary Bus Number和Primary Bus Number寄存器。Subordinate Bus Number、Secondary Bus Number和Primary Bus Number寄存器在Type 01h配置寄存器中,用来描述PCI-to-PCI桥片的上游及下游总线号。这段寄存器在PCI配置寄存器中的位置如所图5?7示。
与PCI总线中的桥片类似,Primary Bus Number记录PCI-to-PCI桥上游的PCI总线号,Secondary Bus Number记录PCI-to-PCI桥下游的第一个PCI总线号,而Subordinate Bus Number记录PCI-to-PCI桥下游的最后一个PCI总线号。
如图5?5所示,P-P1桥片的Primary Bus Number为0,Secondary Bus Number为1,而Subordinate Bus Number为3。这些总线号,在处理器系统对PCI总线进行枚举时由系统初始化程序设置,从系统初始化程序的角度上看,PCIe总线与PCI总线基本兼容,只是PCIe总线对配置空间进行了一些扩展。
如表5?2所示,RC可以使用Type 00h和Type 01h读写请求TLP,对PCIe设备的配置寄存器进行读写访问,配置读写请求TLP只能由RC发出,配置读写请求TLP使用基于ID的路由方式。
如图5?5所示的例子,RC首先使用Type 00h配置请求TLP访问在PCI Bus0总线上的设备,PCI Bus0上的所有设备,包括桥片都要监听PCI Bus 0上的配置请求,在本例中只有Switch挂接在PCI Bus0上,实际上是Switch的上游端口与PCI Bus0直接相连。因此Switch的上游端口将接收RC发出的Type 00h配置请求TLP,之后Switch将向RC发出完成报文,结束配置请求。与PCI总线相同,PCIe总线的Type 00h类型配置请求TLP不能够穿越桥片,在图5?5中这类请求只能访问Switch上游端口的配置空间。
PCI总线是基于共享总线的数据传送方式,在一条PCI总线上可以连接多个PCI Agent设备,其中每一个PCI Agent都提供了一个IDSEL#信号,这个信号与PCI-to-PCI桥片或者HOST主桥的地址线直接相连,PCI总线根据与IDSEL#信号与地址线的连接关系决定相应设备的Device Number。
这与PCIe总线的使用方法不同,PCIe总线使用“端对端”的连接方式,在PCIe链路只能连接一个下游设备,而这个下游设备的Device Number只能为0。而只有在Switch的虚拟PCI总线上可以连接多个Device Number不同的端口。
当一个虚拟PCI总线上挂接PCI-to-PCI桥时,系统配置软件将使用Type 01h配置请求TLP访问PCI-PCI桥下游的PCI设备。如图5?5所示,RC可以通过Type 01h配置请求TLP访问P-P2桥片、P-P3桥片,EP1和EP2。
当RC使用Type 01h配置请求TLP,直接访问P-P1桥的下游设备时,首先需要检查该TLP的Bus Number是否为1,如果为1表示该TLP的访问目标在PCI Bus 1总线上,此时PCI-to-PCI桥将这个Type 01h类型的TLP转换为Type 00h类型的TLP,然后推至PCI Bus 1总线,并访问其下的设备。
如果该TLP的Bus Number在P-P1桥片的Secondary Bus Number和Subordinate Bus Number寄存器之间,则P-P1桥片将该Type 01h类型的TLP直接转发到PCI Bus 1上,并不改变该TLP的类型,之后Type 01和类型的TLP将继续检查P-P2和P-P3桥片的配置空间,决定由P-P2还是P-P3接收该TLP。如果TLP的PCI Bus Number为2时,P-P2桥片将接收该TLP,并将该Type 01h类型TLP转换为Type 00h类型的TLP,然后发送给EP1,并由EP1处理该TLP。
上文简要讲述了配置请求TLP使用ID路由方式从上游端口向下游端口的传递规则,但是Vendor_Defined消息报文和Cpl和CplD报文还可能从下游端口向上游端口进行传递。此时PCIe总线处理方法略有不同。下文仍以图5?5为例说明这种情况。
当一个TLP从EP2传送到EP1或者RC时,首先检查P-P3桥片的配置空间,P-P3桥片发现该TLP不是发向自己时,将该TLP推至上游总线,即PCI Bus 1。如果PCI Bus1上P-P1桥片没有认领该TLP,该TLP将继续向P-P2桥片传递,并由这个桥片将TLP转发给合适的EP;如果P-P1桥片认领该TLP,该TLP将继续向上游总线传递,直至RC。
由以上描述可以发现,PCIe总线使用的基于ID的路由方式与PCI总线中配置读写总线事务通过PCI桥的方法较为类似。
5.2.3 隐式路由
PCIe总线规定消息请求报文使用隐式路由方式。在PCIe总线中,有许多消息是直接发向RC或者来自RC的广播报文,这些报文不使用地址或者ID进行路由,而是使用Msg和MsgD报文的Route字段进行路由,这种路由方式被称为隐式路由。
PCIe总线定义了一些用于中断请求、错误状态处理、锁定总线事务、热插拔信号处理和“Vendor_Defined Messages”消息报文。这些消息报文需要使用隐式路由方式进行传递。消息报文的Route字段的含义如表5?4所示。
表5?4 Route[4:0]字段
Route[2:0] |
描述 |
000 |
路由到RC |
001 |
使用地址路由 |
010 |
使用ID路由 |
011 |
来自RC的广播报文 |
100 |
本地消息,在接收端结束(Legacy中断消息使用这种报文格式,传递来自PCI总线的中断报文) |
101 |
用于PCIe电源管理(PME_TO_Ack报文使用) |
110~111 |
保留 |
由上表所示,使用隐式路由方式的TLP,其Route字段为“000”,“011”,“100”或者“101”。当一个报文使用隐式路由向EP发送时,EP将对Route字段进行检查,如果这个报文是“来自RC的广播报文”,或者是“本地报文”,EP将接收此报文。
如果Switch收到一条使用隐式路由的TLP时,将根据报文Route字段的不同而分别处理。如果Switch的上游端口接收了一条来自RC的广播消息,则将该报文发向所有的下游端口;如果Switch接收了一条来自下游端口发向RC的消息报文时,Switch将此报文直接转发到上游端口,直至RC;如果Switch接收了一条使用隐式路由方式的本地消息报文,则Switch接收并终结此报文,不再上传或下推。
如果RC收到一个使用隐式路由的TLP时,将根据报文Route字段而分别处理这些TLP。如果该Route字段为0b000和0b101,RC将接收该TLP,并作相应的处理;如果为0b100,RC将接收该TLP,并结束该TLP报文的传递。