第5章 PCIe总线的事务层Word格式文档下载.docx
- 文档编号:16636529
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:30
- 大小:146.49KB
第5章 PCIe总线的事务层Word格式文档下载.docx
《第5章 PCIe总线的事务层Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第5章 PCIe总线的事务层Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
21:
32)
当处理器或者其他PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP,之后才能通过PCIe总线的各个层次发送出去。
TLP的基本格式如图51所示。
一个完整的TLP由1个或者多个TLPPrefix、TLP头、DataPayload(数据有效负载)和TLPDigest组成。
TLP头是TLP最重要的标志,不同的TLP其头的定义并不相同。
TLP头包含了当前TLP的总线事务类型、路由信息等一系列信息。
在一个TLP中,DataPayload的长度可变,最小为0,最大为1024DW。
TLPDigest是一个可选项,
一个TLP是否需要TLPDigest由TLP头决定。
DataPayload也是一个可选项,有些TLP并不需要DataPayload,如存储器读请求、配置和I/O写完成TLP并不需要DataPayload。
TLPPrefix由PCIeV2.1总线规范引入,分为LocalTLPPrefix和EP-EPTLPPrefix两类。
其中LocalTLPPrefix的主要作用是在PCIe链路的两端传递消息,而EP-EPTLPPrefix的主要作用是在发送设备和接收设备之间传递消息。
设置TLPPrefix的主要目的是为了扩展TLP头,并以此支持PCIeV2.1规范的一些新的功能。
TLP头由3个或者4个双字(DW)组成。
其中第一个双字中保存通用TLP头,其他字段与通用TLP头的Type字段相关。
一个通用TLP头由Fmt、Type、TC、Length等字段组成,如图52所示。
如果存储器读写TLP支持64位地址模式时,TLP头的长度为4DW,否则为3DW。
而完成报文的TLP头不含有地址信息,使用的TLP头长度为3DW。
其中Byte4~Byte15的格式与TLP相关,下文将结合具体的TLP介绍这些字段。
5.1.1
通用TLP头的Fmt字段和Type字段
Fmt和Type字段确认当前TLP使用的总线事务,TLP头的大小是由3个双字还是4个双字组成,当前TLP是否包含有效负载。
其具体含义如表51所示。
表51
Fmt[1:
0]字段
Fmt[2:
0]
0b000
TLP大小为3个双字,不带数据。
0b001
TLP大小为4个双字,不带数据。
0b010
TLP大小为3个双字,带数据。
0b011
TLP大小为4个双字,带数据。
0b100
TLPPrefix
其他
PCIe总线保留
其中所有读请求TLP都不带数据,而写请求TLP带数据,而其他TLP可能带数据也可能不带数据,如完成报文可能含有数据,也可能仅含有完成标志而并不携带数据。
在TLP的Type字段中存放TLP的类型,即PCIe总线支持的总线事务。
该字段共由5位组成,其含义如表52所示。
表52
Type[4:
TLP类型
描述
MRd
0b00000
存储器读请求;
TLP头大小为3个或者4个双字,不带数据。
MRdLk
0b00001
带锁的存储器读请求;
MWr
存储器写请求;
TLP头大小为3个或者4个双字,带数据。
IORd
0b00010
IO读请求;
TLP头大小为3个双字,不带数据。
IOWr
IO写请求;
TLP头大小为3个双字,带数据。
CfgRd0
0b00100
配置0读请求;
CfgWr0
配置0写请求;
CfgRd1
0b00101
配置1读请求;
不带数据。
CfgWr1
配置1写请求;
带数据。
TCfgRd
0b11011
本书对这两种总线事务不做介绍。
TCfgWr
Msg
0b10r2r1r0
消息请求;
TLP头大小为4个双字,不带数据。
“rrr”字段是消息请求报文的Route字段,下文将详细介绍该字段。
MsgD
TLP头大小为4个双字,带数据。
Cpl
0b01010
完成报文;
包括存储器、配置和I/O写完成。
CplD
带数据的完成报文,TLP头大小为3个双字,包括存储器读、I/O读、配置读和原子操作读完成。
CplLk
0b01011
锁定的完成报文,TLP头大小为3个双字,不带数据。
CplDLk
带数据的锁定完成报文,TLP头大小为3个双字,带数据。
FetchAdd
0b01100
FetchandAdd原子操作。
Swap
0b01101
Swap原子操作。
CAS
0b01110
CAS原子操作。
LPrfx
0b0L3L2L1L0
LocalTLPPrefix
EPrfx
0b1E3E2E1E0
End-EndTLPPrefix
由上表所示,存储器读和写请求,IO读和写请求,及配置读和写请求的type字段相同,如存储器读和写请求的Type字段都为0b00000。
此时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,这两种报文的区别在于一个报文可以传递数据,一个不能传递数据。
PCIeV2.1总线规范还补充了一些总线事务,如FetchAdd、Swap、CAS、LPrfx和EPrfx。
其中LPrfx和EPrfx总线事务分别与LocalTLPPrefix和EP-EPTLPPrefix对应。
在PCIe总线规范V2.0中,TLP头的大小为1DW,而使用LPrfx和EPrfx总线事务可以对TLP头进行扩展,本节不对这些TLPPrefix做进一步介绍。
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的高精度声卡控制器(HighDefinitionAudioController)的扩展配置空间中含有一个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。
在该处理器的PCIeOutbound窗口寄存器(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-basedOrdering;
第1位表示是否支持RelaxedOrdering;
而第0位表示该TLP在经过RC到达存储器时,是否需要进行Cache共享一致性处理。
Attr字段如图53所示。
一个TLP可以同时支持ID-basedOrdering和RelaxedOrdering两种位序。
RelaxedOrdering最早在PCI-X总线规范中提出,用来提高PCI-X总线的数据传送效率;
而ID-basedOrdering由PCIeV2.1总线规范提出。
TLP支持的序如表53所示。
表53
TLP支持的序
Attr[2]
Attr[1]
类型
缺省序,即强序模型
1
PCI-XRelaxedOrdering模型
ID-BasedOrdering(IDO)模型
同时支持RelaxedOrdering和IDO模型
当使用标准的强序模型时,在数据的整个传送路径中,PCIe设备在处理相同类型的TLP时,如PCIe设备发送两个存储器写TLP时,后面的存储器写TLP必须等待前一个存储器写TLP完成后才能被处理,即便当前报文在传送过程中被阻塞,后一个报文也必须等待。
如果使用RelaxedOrdering模型,后一个存储器写TLP可以穿越前一个存储器写TLP,提前执行,从而提高了PCIe总线的利用率。
有时一个PCIe设备发出的TLP,其目的地址并不相同,可能先进入发送队列的TLP,在某种情况下无法发送,但这并不影响后续TLP的发送,因为这两个TLP的目的地址并不相同,发送条件也并不相同。
值得注意的是,在使用PCI总线强序模型时,不同种类的TLP间也可以乱序通过同一条PCIe链路,比如存储器写TLP可以超越存储器读请求TLP提前进行。
而PCIe总线支持RelaxedOrdering模型之后,在TLP的传递过程中出现乱序种类更多,但是这些乱序仍然是有条件限制的。
在PCIe总线规范中为了避免死锁,还规定了不同报文的传送数据规则,即OrderingRules。
PCIeV2.1总线规范引入了一种新的“序”模型,即IDO(ID-BasedOrdering)模型,IDO模型与数据传送的数据流相关,是PCIeV2.1规范引入的序模型。
Attr字段的第0位是“NoSnoopAttribute”位。
当该位为0时表示当前TLP所传送的数据在通过FSB时,需要与Cache保持一致,这种一致性由FSB通过总线监听自动完成而不需要软件干预;
如果为1,表示FSB并不会将TLP中的数据与Cache进行一致,在这种情况下,进行数据传送时,必须使用软件保证Cache的一致性。
在PCI总线中没有与这个“NoSnoopAttribute”位对应的概念,因此一个PCI设备对存储器进行DMA操作时会进行Cache一致性操作[1]。
这种“自动的”Cache一致性行为在某些特殊情况下并不能带来更高的效率。
当一个PCIe设备对存储器进行DMA读操作时,如果传送的数据非常大,比如512MB,Cache的一致性操作不但不会提高DMA写的效率,反而会降低。
因为这个DMA读访问的数据在绝大多数情况下,并不会在Cache中命中,但是FSB依然需要使用SnoopPhase进行总线监听。
而处理器在进行Cache一致性操作时仍然需要占用一定的时钟周期,即在SnoopPhase中占用的时钟周期,SnoopPhase是FSB总线事务的一个阶段,如图36所示。
对于这类情况,一个较好的做法是,首先使用软件指令保证Cache与主存储器的一致性,并置“NoSnoopAttribute”位为1[2],然后再进行DMA读操作。
同理使用这种方法对一段较大的数据区域进行DMA写时,也可以提高效率。
除此之外,当PCIe设备访问的存储器,不是“可Cache空间”时,也可以通过设置“NoSnoopAttribute”位,避免FSB的Cache共享一致性操作,从而提高FSB的效率。
“NoSnoopAttribute”位是PCIe总线针对PCI总线的不足,所作出的重要改动。
5.1.4
通用TLP头中的其他字段
除了Fmt和Type字段外,通用TLP头还含有以下字段。
1
TH位、TD位和EP位
TH位为1表示当前TLP中含有TPH(TLPProcessingHint)信息,TPH是PCIeV2.1总线规范引入的一个重要功能。
TLP的发送端可以使用TPH信息,通知接收端即将访问数据的特性,以便接收端合理地预读和管理数据,TPH的详细介绍见第5.3.6节。
TD位表示TLP中的TLPDigest是否有效,为1表示有效,为0表示无效。
而EP位表示当前TLP中的数据是否有效,为1表示无效,为0表示有效。
2
AT字段
AT字段与PCIe总线的地址转换相关。
在一些PCIe设备中设置了ATC(AddressTranslationCache)部件,这个部件的主要功能是进行地址转换。
只有在支持IOMMU技术的处理器系统中,PCIe设备才能使用该字段。
AT字段可以用作存储器域与PCI总线域之间的地址转换,但是设置这个字段的主要目的是为了方便多个虚拟主机共享同一个PCIe设备。
对这个字段有兴趣的读者可以参考AddressTranslationSevices规范,这个规范是PCI的IOVirtualization规范的重要组成部分。
对虚拟化技术有兴趣的读者可以参考清华大学出版社的《系统虚拟化——原理与实现》,以获得基本的关于虚拟化的入门知识。
3
Length字段
Length字段用来描述TLP的有效负载(DataPayload)大小[3]。
PCIe总线规范规定一个TLP的DataPayload的大小在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对界时,需要使用字节使能字段,即“DWBE”字段。
有关“DWBE”字段的详细说明见第5.3.1节。
[1]
PowerPC处理器通过设置Inbound寄存器,也可以避免这个Cache一致性操作。
[2]
FSB收到这类TLP后,不进行Cache一致性操作。
[3]
存储器读请求TLP没有DataPayload字段,此时该TLP使用Length字段表示需要读取多少数据。
[4]
当多个PCI设备共享一条PCI总线时,一个设备不会长时间占用PCI总线,这个设备在使用这条PCI总线一定的时间后,将让出PCI总线的使用权。
5.2
TLP的路由
26:
37)
TLP的路由是指TLP通过Switch或者PCIe桥片时采用哪条路径,最终到达EP或者RC的方法。
PCIe总线一共定义了三种路由方法,分别是基于地址(Address)的路由,基于ID的路由和隐式路由(Implicit)方式。
存储器和I/O读写请求TLP使用基于地址的路由方式,这种方式使用TLP中的Address字段进行路由选径,最终到达目的地。
而配置读写报文、“Vendor_DefinedMessages”报文、Cpl和CplD报文使用基于ID的路由方式,这种方式使用PCI总线号[1](BusNumber)进行路由选径。
在Switch或者多端口RC的虚拟PCI-PCI桥配置空间中,包含如何使用PCI总线号进行路由选径的信息。
而隐式路由方式主要用于Message报文的传递。
在PCIe总线中定义了一系列消息报文,包括“INTxInterruptSignaling”,“PowerManagementMessages”和“ErrorSignalMessages”等报文。
在这些报文中,除了“Vendor_DefinedMessages”报文,其他所有消息报文都使用隐式路由方式,隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式,或者用于RC向EP发出广播报文。
5.2.1
基于地址的路由
在PCIe总线中,存储器读写和I/O读写TLP使用基于地址的路由方式。
PCIe设备使用的地址路由方式与PCI设备使用的地址路由方式类似。
只是PCIe设备使用TLP进行数据传送,而PCI设备使用总线周期进行数据传送。
使用地址路由方式进行数据传递的TLP格式如第5.3.1节的图58所示,在这类TLP中包含目的设备的地址。
当一个TLP进行数据传递时,可能会经过多级Switch,最终到达目的地。
Switch将根据存储器读写和I/O读写请求TLP的目的地址将报文传递到合适的Egress端口上。
如图410所示,在一个Switch中包含了多个虚拟PCI-to-PCI桥。
在Switch中有几个端口,就包含几个虚拟PCI-to-PCI桥。
在虚拟PCI-to-PCI桥的配置寄存器空间中,包含一个桥片能够接收的物理地址范围。
PCIe总线通过这个物理地址范围实现基于地址的路由。
这段配置寄存器如图54所示。
当系统软件初始化PCI总线时,将合理地设置这些寄存器,之后当TLP通过这些Switch时将根据这些寄存器选择合适的路径。
上图中的配置寄存器描述了该虚拟PCI-to-PCI桥下游PCI子树使用的三组空间范围,分别为I/O、存储器和可预取的存储器空间,分别用Base和Limit两类寄存器描述,其中Base寄存器表示可访问空间的基地址,Limit寄存器表示可访问空间的大小。
TLP使用基于地址的路由时,一定要通过查询这组寄存器之后,再决定传送路径。
这组寄存器的使用方法与PCI总线中的PCI桥兼容。
其中TLP从“上游端口发送到下游端口”与“下游端口发送到上游端口”的路由过程略有不同,如图55所示。
下文以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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 PCIe总线的事务层 PCIe 总线 事务