tag 标签: tlp

相关帖子
相关博文
  • 热度 17
    2013-7-24 10:46
    1523 次阅读|
    0 个评论
    在PCIe总线中,有些TLP含有Data Payload,如存储器写请求、存储器读完成TLP等。在PCIe总线中,TLP含有的Data Payload大小与Max_Payload_Size、Max_Read_Request_Size和RCB参数相关。下文将分别介绍这些参数的使用。 5.4.1 Max_Payload_Size参数 PCIe总线规定在TLP报文中,数据有效负载的最大值为4KB,但是PCIe设备并不一定能够发送这么大的数据报文。PCIe设备含有“Max_Payload_Size”和“Max_Payload_Size Supported”参数,这两个参数分别在Device Capability寄存器和Device Control寄存器中定义。 “Max_Payload_Size Supported”参数存放在一个PCIe设备中,TLP有效负载的最大值,该参数由PCIe设备的硬件逻辑确定,系统软件不能改写该参数。而Max_Payload_Size参数存放PCIe设备实际使用的,TLP有效负载的最大值。该参数由PCIe链路两端的设备协商决定,是PCIe设备进行数据传送时,实际使用的参数。 PCIe设备发送数据报文时,使用Max_Payload_Size参数决定TLP的最大有效负载。当PCIe设备的所传送的数据大小超过Max_Payload_Size参数时,这段数据将被分割为多个TLP进行发送。当PCIe设备接收TLP时,该TLP的最大有效负载也不能超过Max_Payload_Size参数,如果接收的TLP,其Length字段超过Max_Payload_Size参数,该PCIe设备将认为该TLP非法。 RC或者EP在发送存储器读完成TLP时,这个存储器读完成TLP的最大Payload也不能超过Max_Payload_Size参数,如果超过该参数,PCIe设备需要发送多个读完成报文。值得注意的是,这些读完成报文需要满足RCB参数的要求,有关RCB参数的详细说明见下文。 在实际应用中,尽管有些PCIe设备的Max_Payload_Size Supported参数可以为256B、512B、1024B或者更高,但是如果PCIe链路的对端设备可以支持的Max_Payload_Size参数为128B时,系统软件将使用对端设备的Max_Payload_Size Supported参数,初始化该设备的Max_Payload_Size参数,即选用PCIe链路两端最小的Max_Payload_Size Supported参数初始化Max_Payload_Size参数。 在多数x86处理器系统的MCH或者ICH中,Max_Payload_Size Supported参数为128B。这也意味着在x86处理器中,与MCH或者ICH直接相连的PCIe设备进行DMA读写时,数据的有效负载不能超过128B。而在PowerPC处理器系统中,该参数大多为256B。 目前在大多数EP中,Max_Payload_Size Supported参数不大于512B,因为在大多数处理器系统的RC中,Max_Payload_Size Supported参数也不大于512B。因此即便EP支持较大的Max_Payload_Size Supported参数,并不会提高数据传送效率。   而Max_Payload_Size参数的大小与PCIe链路的传送效率成正比,该参数越大,PCIe链路带宽的利用率越高,该参数越小,PCIe链路带宽的利用率越低。 PCIe总线规范规定,对于实时性要求较高的PCIe设备,Max_Payload_Size参数不应设置过大,因此这个参数有时会低于PCIe链路允许使用的最大值。 5.4.2 Max_Read_Request_Size参数 Max_Read_Request_Size参数由PCIe设备决定,该参数规定了PCIe设备一次能从目标设备读取多少数据。 Max_Read_Request_Size参数在Device Control寄存器中定义。该参数与存储器读请求TLP的Length字段相关,其中Length字段不能大于Max_Read_Request_Size参数。在存储器读请求TLP中,Length字段表示需要从目标设备读取多少数据。 值得注意的是,Max_Read_Request_Size参数与Max_Payload_Size参数间没有直接联系,Max_Payload_Size参数仅与存储器写请求和存储器读完成报文相关。 PCIe总线规定存储器读请求,其读取的数据长度不能超过Max_Read_Request_Size参数,即存储器读TLP中的Length字段不能大于这个参数。如果一次存储器读操作需要读取的数据范围大于Max_Read_Request_Size参数时,该PCIe设备需要向目标设备发送多个存储器读请求TLP。 PCIe总线规定Max_Read_Request_Size参数的最大值为4KB,但是系统软件需要根据硬件特性决定该参数的值。因为PCIe总线规定EP在进行存储器读请求时,需要具有足够大的缓冲接收来自目标设备的数据。 如果一个EP的Max_Read_Request_Size参数被设置为4KB,而且这个EP每发出一个4KB大小存储器读请求时,EP都需要准备一个4KB大小的缓冲 。这对于绝大多数EP,这都是一个相当苛刻的条件。为此在实际设计中,一个EP会对Max_Read_Request_Size参数的大小进行限制。 5.4.3 RCB参数 RCB位在Link Control寄存器中定义。RCB位决定了RCB参数的值,在PCIe总线中,RCB参数的大小为64B或者128B,如果一个PCIe设备没有设置RCB的大小 ,则RC的RCB参数缺省值为64B,而其他PCIe设备的RCB参数的缺省值为128B。PCIe总线规定RC的RCB参数的值为64B或者128B,其他PCIe设备的RCB参数为128B。 在PCIe总线中,一个存储器读请求TLP可能收到目标设备发出的多个完成报文后,才能完成一次存储器读操作。因为在PCIe总线中,一个存储器读请求最多可以请求4KB大小的数据报文,而目标设备可能会使用多个存储器读完成TLP才能将数据传递完毕。   当一个EP向RC或者其他EP读取数据时,这个EP首先向RC或者其他EP发送存储器读请求TLP;之后由RC或者其他EP发送存储器读完成TLP,将数据传递给这个EP。 如果存储器读完成报文所传递数据的地址范围没有跨越RCB参数的边界,那么数据发送端只能使用一个存储器完成报文将数据传递给请求方,否则可以使用多个存储器读完成TLP。 假定一个EP向地址范围为0xFFFF-0000~0xFFFF-0010这段区域进行DMA读操作,RC收到这个存储器读请求TLP后,将组织存储器读完成TLP,由于这段区域并没有跨越RCB边界,因此RC只能使用一个存储器读完成TLP完成数据传递。 如果存储器读完成报文所传递数据的地址范围跨越了RCB边界,那么数据发送端(目标设备)可以使用一个或者多个完成报文进行数据传递。数据发送端使用多个存储器读完成报文完成数据传递时,需要遵循以下原则。 第一个完成报文所传送的数据,其起始地址与要求的起始地址相同。其结束地址或者为要求的结束地址(使用一个完成报文传递所有数据),或者为RCB参数的整数倍(使用多个完成报文传递数据)。 最后一个完成报文的起始地址或者为要求的起始地址(使用一个完成报文传递所有数据),或者为RCB参数的整数倍(使用多个完成报文传递数据)。其结束地址必须为要求的结束地址。 中间的完成报文的起始地址和结束地址必须为RCB参数的整数倍。 当RC或者EP需要使用多个存储器读完成报文将0xFFFE-FFF0~0xFFFF-00C7之间的数据发送给数据请求方时,可以将这些完成报文按照表5‑9方式组织。  表5‑9 存储器读完成报文的拆分方法 方式1 方式2 方式3 0xFFFE-FFF0~0xFFFE-FFFF 0xFFFE-FFF0~0xFFFE-FFFF 0xFFFE-FFF0~0xFFFE-FFFF 0xFFFF-0000~0xFFFF-003F 0xFFFF-0000~0xFFFF-007F 0xFFFF-0000~0xFFFF-00C7 0xFFFF-0040~0xFFFF-007F 0xFFFF-0080~0xFFFF-00C7   0xFFFF-0080~0xFFFF-00BF     0xFFFF-00C0~0xFFFF-00C7         上表提供的方式仅供参考,目标设备还可以使用其他拆分方法发送存储器读完成TLP。PCIe总线使用多个完成报文实现一次数据读请求的主要原因是考虑Cache行长度和流量控制。在多数x86处理器系统中,存储器读完成报文的数据长度为一个Cache行,即一次传送64B。除此之外,较短的数据完成报文占用流量控制的资源较少,而且可以有效避免数据拥塞。 5.5 小结      本章重点介绍PCIe总线的事务层。在PCIe总线层次结构中,事务层最易理解,同时也与系统软件直接相关。 这是流量控制Infinite FC Unit的要求,详见第9.3.2节。 有些PCIe设备可能没有Link Control寄存器。
  • 热度 20
    2013-6-25 16:56
    1539 次阅读|
    0 个评论
    TLP的路由是指TLP通过Switch或者PCIe桥片时采用哪条路径,最终到达EP或者RC的方法。PCIe总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于ID的路由和隐式路由(Implicit)方式。 存储器和I/O读写请求TLP使用基于地址的路由方式,这种方式使用TLP中的Address字段进行路由选径,最终到达目的地。 而配置读写报文、“Vendor_Defined Messages”报文、Cpl和CplD报文使用基于ID的路由方式,这种方式使用PCI总线号 (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位 组成;而每一个设备中最多包含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 字段 Route 描述 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报文的传递。 PCIe总线实际上使用Transaction ID进行ID路由,有关Transaction ID的详细说明见第6.3.1节。 PCIe链路采用端到端的通信方式,每一个链路只能挂接一个设备,因此在多数情况下,使用3位描述Device Number是多余的,因此PCIe总线提出了ARI格式,该格式的详细描述见第6.3.1节。    
  • 热度 21
    2013-6-25 16:52
    1956 次阅读|
    0 个评论
    当处理器或者其他PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP,之后才能通过PCIe总线的各个层次发送出去。TLP的基本格式如图5‑1所示。     一个完整的TLP由1个或者多个TLP Prefix、TLP头、Data Payload(数据有效负载)和TLP Digest组成。TLP头是TLP最重要的标志,不同的TLP其头的定义并不相同。TLP头包含了当前TLP的总线事务类型、路由信息等一系列信息。在一个TLP中,Data Payload的长度可变,最小为0,最大为1024DW。 TLP Digest是一个可选项, 一个TLP是否需要TLP Digest由TLP头决定。Data Payload也是一个可选项,有些TLP并不需要Data Payload,如存储器读请求、配置和I/O写完成TLP并不需要Data Payload。 TLP Prefix由PCIe V2.1总线规范引入,分为Local TLP Prefix和EP-EP TLP Prefix两类。其中Local TLP Prefix的主要作用是在PCIe链路的两端传递消息,而EP-EP TLP Prefix的主要作用是在发送设备和接收设备之间传递消息。设置TLP Prefix的主要目的是为了扩展TLP头,并以此支持PCIe V2.1规范的一些新的功能。 TLP头由3个或者4个双字(DW)组成。其中第一个双字中保存通用TLP头,其他字段与通用TLP头的Type字段相关。一个通用TLP头由Fmt、Type、TC、Length等字段组成,如图5‑2所示。   如果存储器读写TLP支持64位地址模式时,TLP头的长度为4DW,否则为3DW。而完成报文的TLP头不含有地址信息,使用的TLP头长度为3DW。其中Byte 4~Byte 15的格式与TLP相关,下文将结合具体的TLP介绍这些字段。 5.1.1 通用TLP头的Fmt字段和Type字段 Fmt和Type字段确认当前TLP使用的总线事务,TLP头的大小是由3个双字还是4个双字组成,当前TLP是否包含有效负载。其具体含义如表5‑1所示。  表5‑1 Fmt 字段 Fmt TLP的格式 0b000 TLP大小为3个双字,不带数据。 0b001 TLP大小为4个双字,不带数据。 0b010 TLP大小为3个双字,带数据。 0b011 TLP大小为4个双字,带数据。 0b100 TLP Prefix 其他 PCIe总线保留     其中所有读请求TLP都不带数据,而写请求TLP带数据,而其他TLP可能带数据也可能不带数据,如完成报文可能含有数据,也可能仅含有完成标志而并不携带数据。在TLP的Type字段中存放TLP的类型,即PCIe总线支持的总线事务。该字段共由5位组成,其含义如表5‑2所示。 表5‑2 Type 字段 TLP类型 Fmt Type 描述 MRd 0b000 0b001 0b0 0000 存储器读请求;TLP头大小为3个或者4个双字,不带数据。 MRdLk 0b000 0b001 0b0 0001 带锁的存储器读请求;TLP头大小为3个或者4个双字,不带数据。 MWr 0b010 0b011 0b0 0000 存储器写请求;TLP头大小为3个或者4个双字,带数据。 IORd 0b000 0b0 0010 IO读请求;TLP头大小为3个双字,不带数据。 IOWr 0b010 0b0 0010 IO写请求;TLP头大小为3个双字,带数据。 CfgRd0 0b000 0b0 0100 配置0读请求;TLP头大小为3个双字,不带数据。 CfgWr0 0b010 0b0 0100 配置0写请求;TLP头大小为3个双字,带数据。 CfgRd1 0b000 0b0 0101 配置1读请求;不带数据。 CfgWr1 0b010 0b0 0101 配置1写请求;带数据。 TCfgRd 0b010 0b1 1011 本书对这两种总线事务不做介绍。 TCfgWr 0b001 0b1 1011 Msg 0b001 0b1 0r 2 r 1 r 0 消息请求;TLP头大小为4个双字,不带数据。“rrr”字段是消息请求报文的Route字段,下文将详细介绍该字段。 MsgD 0b011 0b1 0r 2 r 1 r 0 消息请求;TLP头大小为4个双字,带数据。 Cpl 0b000 0b0 1010 完成报文;TLP头大小为3个双字,不带数据。包括存储器、配置和I/O写完成。 CplD 0b010 0b0 1010 带数据的完成报文,TLP头大小为3个双字,包括存储器读、I/O读、配置读和原子操作读完成。 CplLk 0b000 0b0 1011 锁定的完成报文,TLP头大小为3个双字,不带数据。 CplDLk 0b010 0b0 1011 带数据的锁定完成报文,TLP头大小为3个双字,带数据。 FetchAdd 0b010 0b011 0b0 1100 Fetch and Add原子操作。 Swap 0b010 0b011 0b0 1101 Swap原子操作。 CAS 0b010 0b011 0b0 1110 CAS原子操作。 LPrfx 0b100 0b0 L 3 L 2 L 1 L 0 Local TLP Prefix EPrfx 0b100 0b1 E 3 E 2 E 1 E 0 End-End TLP Prefix   由上表所示,存储器读和写请求,IO读和写请求,及配置读和写请求的type字段相同,如存储器读和写请求的Type字段都为0b0 0000。此时PCIe总线规范使用Fmt字段区分读写请求,当Fmt字段是“带数据”的报文,一定是“写报文”;当Fmt字段是“不带数据”的报文,一定是“读报文”。 PCIe总线的数据报文传送方式与PCI总线数据传送有类似之处。其中存储器写TLP使用Posted方式进行传送,而其他总线事务使用Non-Posted方式。 PCIe总线规定所有Non-Posted存储器请求使用Split总线方式进行数据传递。当PCIe设备进行存储器读、I/O读写或者配置读写请求时,首先向目标设备发送数据读写请求TLP,当目标设备收到这些读写请求TLP后,将数据和完成信息通过完成报文(Cpl或者CplD)发送给源设备。 其中存储器读、I/O读和配置读需要使用CplD报文,因为目标设备需要将数据传递给源设备;而I/O写和配置写需要使用Cpl报文,因为目标设备不需要将任何数据传递给源设备,但是需要通知源设备,写操作已经完成,数据已经成功地传递给目标设备。   在PCIe总线中,进行存储器或者I/O写操作时,数据与数据包头一起传递;而进行存储器或者I/O读操作时,源设备首先向目标设备发送读请求TLP,而目标设备在准备好数据后,向源设备发出完成报文。   PCIe总线规范还定义了MRdLk报文,该报文的主要作用是与PCI总线的锁操作相兼容,但是PCIe总线规范并不建议用户使用这种功能,因为使用这种功能将极大影响PCIe总线的数据传送效率。   与PCI总线并不相同,PCIe总线规范定义了Msg报文,即消息报文。分别为Msg和MsgD,这两种报文的区别在于一个报文可以传递数据,一个不能传递数据。   PCIe V2.1总线规范还补充了一些总线事务,如FetchAdd、Swap、CAS、LPrfx和EPrfx。其中LPrfx和EPrfx总线事务分别与Local TLP Prefix和EP-EP TLP Prefix对应。在PCIe总线规范V2.0中,TLP头的大小为1DW,而使用LPrfx和EPrfx总线事务可以对TLP头进行扩展,本节不对这些TLP Prefix做进一步介绍。PCIe设备可以使用FetchAdd、Swap和CAS总线事务进行原子操作,本篇将在第5.3.5节详细介绍该类总线事务。 5.1.2 TC字段 TC字段表示当前TLP的传送类型,PCIe总线规定了8种传输类型,分别为TC0~TC7,缺省值为TC0,该字段与PCIe的QoS相关。PCIe设备使用TC区分不同类型的数据传递,而多数EP中只含有一个VC,因此这些EP在发送TLP时,也仅仅使用TC0,但是有些对实时性要求较高的EP中,含有可以设置TC字段的寄存器。   在Intel的高精度声卡控制器(High Definition Audio Controller)的扩展配置空间中含有一个TCSEL寄存器。系统软件可以设置该寄存器,使声卡控制器发出的TLP使用合适的TC。声卡控制器可以使用TC7传送一些对实时性要求较强的控制信息,而使用TC0传送一般的数据信息。在具体实现中,一个EP也可以将控制TC字段的寄存器放入到设备的BAR空间中,而不必和Intel的高精度声卡控制器相同,存放在PCI配置空间中。   目前许多处理器系统的RC仅支持一个VC通路,此时EP使用不同的TC进行传递数据的意义不大。x86处理器的MCH中一般支持两个VC通路,而多数PowerPC处理器仅支持一个VC通路。PLX公司的多数Switch也仅支持两个VC通路。   有些RC,如MPC8572处理器,也能决定其发出TLP使用的TC。在该处理器的PCIe Outbound窗口寄存器(PEXOWARn)中,含有一个TC字段,通过设置该字段可以确定RC发出的TLP使用的TC字段。不同的TC可以使用PCIe链路中的不同VC,而不同的VC的仲裁级别并不相同。EP或者RC通过调整其发出TLP的TC字段,可以调整TLP使用的VC,从而调整TLP的优先级。   5.1.3 Attr字段 Attr字段由3位组成,其中第2位表示该TLP是否支持PCIe总线的ID-based Ordering;第1位表示是否支持Relaxed Ordering;而第0位表示该TLP在经过RC到达存储器时,是否需要进行Cache共享一致性处理。Attr字段如图5‑3所示。   一个TLP可以同时支持ID-based Ordering和Relaxed Ordering两种位序。Relaxed Ordering最早在PCI-X总线规范中提出,用来提高PCI-X总线的数据传送效率;而ID-based Ordering由PCIe V2.1总线规范提出。TLP支持的序如表5‑3所示。  表5‑3 TLP支持的序 Attr Attr 类型 0 0 缺省序,即强序模型 0 1 PCI-X Relaxed Ordering模型 1 0 ID-Based Ordering(IDO)模型 1 1 同时支持Relaxed Ordering和IDO模型     当使用标准的强序模型时,在数据的整个传送路径中,PCIe设备在处理相同类型的TLP时,如PCIe设备发送两个存储器写TLP时,后面的存储器写TLP必须等待前一个存储器写TLP完成后才能被处理,即便当前报文在传送过程中被阻塞,后一个报文也必须等待。 如果使用Relaxed Ordering模型,后一个存储器写TLP可以穿越前一个存储器写TLP,提前执行,从而提高了PCIe总线的利用率。有时一个PCIe设备发出的TLP,其目的地址并不相同,可能先进入发送队列的TLP,在某种情况下无法发送,但这并不影响后续TLP的发送,因为这两个TLP的目的地址并不相同,发送条件也并不相同。 值得注意的是,在使用PCI总线强序模型时,不同种类的TLP间也可以乱序通过同一条PCIe链路,比如存储器写TLP可以超越存储器读请求TLP提前进行。而PCIe总线支持Relaxed Ordering模型之后,在TLP的传递过程中出现乱序种类更多,但是这些乱序仍然是有条件限制的。在PCIe总线规范中为了避免死锁,还规定了不同报文的传送数据规则,即Ordering Rules。   PCIe V2.1总线规范引入了一种新的“序”模型,即IDO(ID-Based Ordering)模型,IDO模型与数据传送的数据流相关,是PCIe V2.1规范引入的序模型。   Attr字段的第0位是“No Snoop Attribute”位。当该位为0时表示当前TLP所传送的数据在通过FSB时,需要与Cache保持一致,这种一致性由FSB通过总线监听自动完成而不需要软件干预;如果为1,表示FSB并不会将TLP中的数据与Cache进行一致,在这种情况下,进行数据传送时,必须使用软件保证Cache的一致性。   在PCI总线中没有与这个“No Snoop Attribute”位对应的概念,因此一个PCI设备对存储器进行DMA操作时会进行Cache一致性操作(1) ,这种“自动的”Cache一致性行为在某些特殊情况下并不能带来更高的效率。   当一个PCIe设备对存储器进行DMA读操作时,如果传送的数据非常大,比如512MB,Cache的一致性操作不但不会提高DMA写的效率,反而会降低。因为这个DMA读访问的数据在绝大多数情况下,并不会在Cache中命中,但是FSB依然需要使用Snoop Phase进行总线监听。而处理器在进行Cache一致性操作时仍然需要占用一定的时钟周期,即在Snoop Phase中占用的时钟周期,Snoop Phase是FSB总线事务的一个阶段,如图3‑6所示。   对于这类情况,一个较好的做法是,首先使用软件指令保证Cache与主存储器的一致性,并置“No Snoop Attribute”位为1(2),然后再进行DMA读操作。同理使用这种方法对一段较大的数据区域进行DMA写时,也可以提高效率。   除此之外,当PCIe设备访问的存储器,不是“可Cache空间”时,也可以通过设置“No Snoop Attribute”位,避免FSB的Cache共享一致性操作,从而提高FSB的效率。“No Snoop Attribute”位是PCIe总线针对PCI总线的不足,所作出的重要改动。 5.1.4 通用TLP头中的其他字段 除了Fmt和Type字段外,通用TLP头还含有以下字段。 1 TH位、TD位和EP位 TH位为1表示当前TLP中含有TPH(TLP Processing Hint)信息,TPH是PCIe V2.1总线规范引入的一个重要功能。TLP的发送端可以使用TPH信息,通知接收端即将访问数据的特性,以便接收端合理地预读和管理数据,TPH的详细介绍见第5.3.6节。   TD位表示TLP中的TLP Digest是否有效,为1表示有效,为0表示无效。而EP位表示当前TLP中的数据是否有效,为1表示无效,为0表示有效。 2 AT字段 AT字段与PCIe总线的地址转换相关。在一些PCIe设备中设置了ATC(Address Translation Cache)部件,这个部件的主要功能是进行地址转换。只有在支持IOMMU技术的处理器系统中,PCIe设备才能使用该字段。   AT字段可以用作存储器域与PCI总线域之间的地址转换,但是设置这个字段的主要目的是为了方便多个虚拟主机共享同一个PCIe设备。对这个字段有兴趣的读者可以参考Address Translation Sevices规范,这个规范是PCI的IO Virtualization规范的重要组成部分。对虚拟化技术有兴趣的读者可以参考清华大学出版社的《系统虚拟化——原理与实现》,以获得基本的关于虚拟化的入门知识。 3 Length字段 Length字段用来描述TLP的有效负载(Data Payload)大小(3).PCIe总线规范规定一个TLP的Data Payload的大小在1B~4096B之间。PCIe总线设置Length字段的目的是提高总线的传送效率。   当PCI设备在进行数据传送时,其目标设备并不知道实际的数据传送大小,这在一定程度上影响了PCI总线的数据传送效率。而在PCIe总线中,目标设备可以通过Length字段提前获知源设备需要发送或者请求的数据长度,从而合理地管理接收缓冲,并根据实际情况进行Cache一致性操作。   当PCI设备进行DMA写操作,将PCI设备中4KB大小的数据传送到主存储器时,这个PCI设备的DMA控制器将存放传送的目的地址和传送大小,然后启动DMA写操作,将数据写入到主存储器。由于PCI总线是一条共享总线,因此传送4KB大小的数据,可能会使用若干个PCI总线写事务才能完成(4),而每一个PCI总线写事务都不知道DMA控制器何时才能将数据传送完毕。   如果这些总线写事务还通过一系列PCI桥才能到达存储器,在这个路径上的每一个PCI桥也无法预知,何时这个DMA操作才能结束。这种“不可预知”将导致PCI总线的带宽不能被充分利用,而且极易造成PCI桥数据缓冲的浪费。   而PCIe总线通过TLP的Length字段,可以有效避免PCIe链路带宽的浪费。值得注意的是,Length字段以DW为单位,其最小单位为1个DW。如果PCIe主设备传送的单位小于1个DW或者传送的数据并不以DW对界时,需要使用字节使能字段,即“DW BE”字段。有关“DW BE”字段的详细说明见第5.3.1节。 (1)PowerPC处理器通过设置Inbound寄存器,也可以避免这个Cache一致性操作。 (2)FSB收到这类TLP后,不进行Cache一致性操作。 (3)存储器读请求TLP没有DataPayload字段,此时该TLP使用Length字段表示需要读取多少数据。 (4)当多个PCI设备共享一条PCI总线时,一个设备不会长时间占用PCI总线,这个设备在使用这条PCI总线一定的时间后,将让出PCI总线的使用权。
相关资源
  • 所需E币: 5
    时间: 2019-12-25 12:52
    大小: 865.26KB
    上传者: 2iot
    理解嵌入式多重处理技术的选择InformationQuarterly[27]Number1,Autumn2004InformationQuarterly[28]Number1,Autumn2004InformationQuarterly[29]Number1,Autumn2004InformationQuarterly[30]Number1,Autumn2004……