tag 标签: host主桥

相关博文
  • 热度 16
    2013-4-25 11:32
    1378 次阅读|
    0 个评论
    PCI设备向“可Cache的存储器空间”进行读操作的过程相对简单。对于x86处理器或者PowerPC处理器,如果访问的数据在Cache中命中,CPU会通知FSB总线,PCI设备所访问的数据在Cache中。 首先HOST主桥发起存储器读总线事务,并在Request Phase中,提供地址。Snoop Agent在Snoop Phase进行总线监听,并通过HIT#和HITM#信号将监听结果通知给Response Agent。如果Cache行的状态为E时,Response Agent将提供数据,而CPU不必改变Cache行状态。如果Snoop Agent可以直接将数据提供给HOST主桥,无疑数据访问的延时更短,但是采用这种方法无疑会极大的提高Cache Memory系统的设计难度,因此采用这种数据传送方式的处理器 并不多。 如果Cache行的状态为M时,Response Agent在Response Phase阶段,要求Snoop Agents将Cache中数据回写到存储器,并将Cache行状态更改为E。Snoop Agents在Data Phase,将Cache中数据回写给存储器控制器,同时为HOST主桥提供数据。Snoop Agents也可以直接将数据提供给HOST主桥,不需要进行数据回写过程,也不更改Cache行状态,但是采用这种方法会提高Cache Memory系统的设计难度。 如果PCI设备访问的数据没有在Cache中命中,Snoop Agents会通知FSB总线,PCI设备所访问的数据不在Cache中,此时存储器控制器(Response Agent)将在Data Phase向HOST主桥提供数据。 PCI设备向“可Cache的”存储器区域进行写操作,无论对于PowerPC处理器还是x86处理器,都较为复杂。当HOST主桥通过FSB将数据发送给存储器控制器时,在这个系统总线上的所有CPU都需要对这个PCI写操作进行监听,并根据监听结果,合理地改动Cache行状态,并将数据写入存储器。 下文以图3‑7所示的SMP处理器系统为例,说明PCI设备对“可Cache的存储器空间”进行DMA写的实现过程。 在图3‑7所示的处理器系统中,存在4个CPU,这4个CPU通过一条FSB连接在一起,而CPU之间使用MESI协议进行Cache一致性处理,而HOST主桥和存储器控制器与FSB直接相连。HOST主桥向存储器控制器传递数据时,需要处理Cache的一致性。 在这个处理器系统中,当PCI设备,如PCI设备01,进行DMA写操作时,数据将首先到达HOST主桥,而HOST主桥将首先接管该PCI设备数据访问并将其转换为FSB总线事务,并在Request Phase中,提供本次FSB总线事务的地址。CPU将在Snoop Phase对这个地址进行监听,判断当前地址在Cache中的命中情况。 当HOST主桥访问的地址不在Cache中命中时,此时在处理器系统中,所有CPU都没有驱动HIT#和HITM#信号,HIT#和HITM#信号都为1,表示HOST主桥访问的地址没有在CPU的Cache中命中,HOST主桥可以简单地将数据写入存储器。当HOST主桥访问的存储器地址在Cache中命中时,Cache行的状态可以为S、E或者为M,此时处理器系统的处理过程相对较为复杂,下一节将专门讨论这种情况。 目前Cortex A8/A9和Intel的Nehelem处理器支持这种方式。
  • 热度 17
    2013-4-8 14:09
    2426 次阅读|
    0 个评论
    PCI桥规范定义了透明桥的实现规则,本篇在第2.3.1节中详细介绍了这种桥片。通过透明桥,处理器系统可以以HOST主桥为根节点,建立一颗PCI总线树,在这个树上的PCI设备共享同一个PCI总线域上的地址空间。 但是在某些场合下PCI透明桥并不适用。在图2‑15所示的处理器系统中存在两个处理器,此时使用PCI桥1连接处理器2并不利于整个处理器系统的配置与管理。我们假定PCI总线使用32位地址空间,而处理器1和处理器2所使用的存储器大小都为2GB,同时我们假定处理器1和处理器2使用的存储器都可以被PCI设备访问。 此时处理器1和2使用的存储器空间必须映射到PCI总线的地址空间中,而32位的PCI总线只能提供4GB地址空间,此时PCI总线x 0的地址空间将全部被处理器1和2的存储器空间占用,而没有额外的空间分配给PCI设备。 此外有些处理器不能作为PCI Agent设备,因此不能直接连接到PCI桥上,比如x86处理器就无法作为PCI Agent设备,因此使用PCI透明桥无法将两个x86处理器直接相连。如果处理器2有两个以上的PCI接口,其中一个可以与PCI桥1相连(此时处理器2将作为PCI Agent设备),而另一个作为HOST主桥y连接PCI设备。此时HOST主桥y挂接的PCI设备将无法被处理器1直接访问。 使用透明桥也不便于解决处理器1与处理器2间的地址冲突,如图2‑15所示的处理器系统,如果处理器1和2都将各自的存储器映射到PCI总线地址空间中,有可能会出现地址冲突。虽然PowerPC处理器可以使用Inbound寄存器,将存储器地址空间映射到不同的PCI总线地址空间中,但是不是所有的处理器都具有这种映射机制。许多处理器的存储器地址与PCI总线地址使用了“简单相等”这种映射方法,如果PCI总线连接了两个这样的处理器,将不可避免地出现PCI总线地址的映射冲突。 采用非透明桥将有效解决以上这些问题,非透明桥并不是PCI总线定义的标准桥片,但是这类桥片在连接两个处理器系统中得到了广泛的应用。一个使用非透明桥连接两个处理器系统的实例如图2‑16所示。 使用非透明PCI桥可以方便地连接两个处理器系统。从上图中我们可以发现非透明桥可以将PCI总线x域与PCI总线y域进行隔离。值得注意的是,非透明PCI桥的作用是对不同PCI总线域地址空间进行隔离,而不是隔离存储器域地址空间。而HOST主桥的作用才是将存储器域与PCI总线域进行隔离。 非透明PCI桥可以连接两条独立的PCI总线,一条被称为Secondary PCI总线,另一条被称为Primary PCI总线,但是这两条总线没有从属关系,两边是对等的 。从处理器x的角度上看,与非透明PCI桥右边连接的总线叫Secondary PCI总线;而从处理器y的角度上看,非透明PCI桥左边连接的总线叫Secondary PCI总线。 HOST处理器x和PCI设备可以通过非透明PCI桥,直接访问PCI总线y域的地址空间,并通过HOST主桥y与访问存储器y;HOST处理器y和PCI设备也可以通过非透明PCI桥,直接访问PCI总线x域的地址空间,并通过HOST主桥x访问存储器x。为此非透明PCI桥需要对分属不同PCI总线域的地址空间进行转换。 目前有许多厂商可以提供非透明PCI桥的芯片,在具体实现上各有差异,但是其基本原理类似,下文以Intel 21555为例说明非透明PCI桥。值得注意的是,在PCIe体系结构中,也存在非透明PCI桥的概念。 2.5.1 Intel 21555中的配置寄存器 Intel 21555非透明PCI桥源于DEC21554 ,并在此基础上做了一些改动。Intel 21555桥片与其他透明桥在系统中的位置相同。如图2‑16所示,这个桥片一边与Primary PCI总线相连,另一边与Secondary PCI总线相连。 在Intel 21555桥片中,包含两个PCI 设备配置空间,分别是Primary PCI总线配置空间和Secondary PCI总线配置空间,处理器可以使用Type 00h配置请求访问这些配置空间。在大多数情况之下,在Primary PCI总线上的HOST处理器管理Primary PCI配置空间;在Secondary PCI总线上的HOST处理器管理Secondary PCI配置空间 。 在Intel 21555桥片中,还有一组私有寄存器CSR(Control and Status Register),系统软件使用这组寄存器对非透明桥进行管理并获得桥片的一些信息,这组寄存器可以被映射成为PCI总线的存储器地址空间或者I/O地址空间。 本章仅介绍Primary PCI总线这一边的配置寄存器,Secondary PCI总线的配置寄存器虽然与Primary PCI总线的这些寄存器略有不同,但是基本对等,因此本节对此不做介绍。Primary PCI总线的主要寄存器如表2‑6所示。 表 2‑6 Primary PCI总线的配置寄存器 从表2‑6中,我们可以发现Primary PCI总线的这些配置寄存器共分为两组,一组寄存器与PCI设备的配置寄存器的BAR0~5对应,这些寄存器与标准PCI配置寄存器BAR0~5的功能相同;另一组寄存器是Translated Base寄存器,这组寄存器的主要作用是将来自Primary PCI总线的数据访问转换到Secondary PCI总线。 其中BAR0~5寄存器在系统初始化时由Primary PCI总线上的HOST处理器进行配置,配置过程与PCI总线上的普通设备完全相同。只是Intel 21555规定,BAR0只能映射为32位存储器空间。 CSR寄存器可以根据需要映射在BAR0空间中,此时BAR0空间最小为4KB。CSR寄存器也可以根据需要使用BAR1寄存器映射为I/O地址空间,同时BAR1寄存器还可以映射其他I/O空间;BAR2~3只能映射为32位存储器地址空间;而BAR4~5用来映射64位的存储器地址空间。 对于Primary PCI总线,所有BAR0~5寄存器映射的地址空间都将占用Primary PCI总线域,然而这些地址空间中所对应的数据并不在Primary PCI总线域中,而是在Secondary PCI总线域中。Translated Base寄存器实现不同PCI总线域地址空间的转换,Intel 21555将不同PCI总线域地址空间的转换过程称为“地址翻译”。 Intel 21555支持两种地址翻译方法,一个是直接地址翻译,一个是查表翻译。Primary PCI总线的BAR空间只支持直接地址翻译,而Secondary PCI总线的Memory 2 BAR空间支持查表翻译,本节仅介绍直接地址翻译方法,对查表翻译有兴趣的读者请阅读Intel 21555的数据手册 。直接地址翻译过程如图2‑17所示。 当Primary PCI总线对非透明桥21555的BAR0~5地址空间进行数据请求时,这个数据请求将被转换为对Secondary PCI总线的数据请求。Translated Base寄存器将完成这个地址翻译过程,下节将结合实例说明这个直接地址翻译过程。 2.5.2 通过非透明桥片进行数据传递 下文以图2‑16中处理器x访问处理器y存储器地址空间的实例,说明非透明桥21555如何将PCI总线x域与PCI总线y域联系在一起。 处理器x需要访问处理器y的存储器空间之前,需要做一些必要的准备工作。 (1) 首先确定由哪一个BAR寄存器空间映射处理器y的存储器地址空间。本节假定使用BAR2寄存器映射处理器y的存储器地址空间。 (2) BAR2寄存器使用Downstream Memory 2 Translated Base寄存器,将来自Primary PCI总线的访问转换为对Secondary PCI总线地址空间的访问。其中Downstream Memory 2 Translated Base寄存器可以由处理器x或者处理器y根据需要进行设置。 假定处理器x和y的HOST主桥使用“直接相等”策略,建立存储器域与PCI总线域间的映射;而处理器x使用BAR2地址空间访问处理器y存储器空间0x1000-000~0x1FFF-FFFF;处理器x的系统软件事先将BAR2寄存器设置完毕。处理器x访问处理器y的这段存储器空间的步骤如下,读者可参考图2‑18理解这一步骤。 (1) 首先处理器x访问在处理器x域中,且与非透明桥的BAR2空间相对应的存储器地址空间。 (2) HOST主桥将进行存储器域到PCI总线域的转换,并将这个请求发送到Primary PCI总线上。 (3) 非透明桥发现这个数据请求发向BAR2地址空间,则接收这个数据请求,并在桥片中暂存这个数据请求。 (4) 非透明桥根据Downstream Memory 2 Translated Base寄存器的内容,按照图2‑17所示的规则进行地址转换。假设Downstream Memory 2 Translated Base寄存器的基地址被预先设置为0x1000-0000,大小为256MB(这个物理地址属于处理器y的主存储器地址空间)。 (5) 经过非透明桥的转换后,这个数据请求将穿越非透明桥,从Primary PCI总线域进入Secondary PCI总线域,然后访问处理器y的基地址为0x1000-0000的存储器区域。 (6) 处理器y的HOST主桥接收这个存储器访问请求,并最终将数据请求发向处理器y的存储器中。 非透明桥21555除了可以支持存储器到存储器之间的数据传递,还支持PCI总线域到存储器域,以及PCI总线域之间的数据传递,此外非透明桥21555还可以通过I2O和Doorbell寄存器进行Primary PCI总线与Secondary PCI总线之间的中断信号传递。本节对这部分内容不做进一步介绍。 非透明桥有效解决了使用PCI总线连接两个处理器存在的问题,因而得到了广泛的应用。在PCIe体系结构中,也存在非透明PCI桥的概念。如在PLX的Switch芯片中,各个端口都可以设置为非透明模式, 2.6 小结 本章介绍了在PCI总线中使用的桥,包括HOST主桥和PCI桥,并较为详细介绍了如何使用这些桥访问PCI设备的配置空间。 其中HOST主桥并不在PCI总线规范的约束范围内,不同的处理器可以根据需要设计出不同的HOST主桥。本章更加侧重介绍PowerPC处理器使用的HOST主桥,在该主桥的设计中,提出了许多新的概念,并极大促进了PCI总线的发展,在这个桥片中出现的许多新的思想被PCI V3.0总线规范采纳。 在PowerPC处理器的HOST主桥中,明确了存储器域与PCI总线域的概念。而区分存储器域与PCI总线域也是本章的书写重点,本书将始终强调这两个域的不同。有些处理器系统并没有明确区分这两个域的差别,因此许多读者忽略了PCI总线域的存在,并错误地认为PCI总线域是存储器域的一部分。 在本章中,还重点介绍了PCI桥的实现机制。在许多较为简单处理器系统中,并不包含PCI桥,但是读者仍然需要深入理解PCI桥这一重要概念。深入理解PCI桥的运行机制,是理解PCI体系结构的重要基础。 有些非透明桥,如DEC21554的两边并不是完全对等的,尤其是在处理64位地址空间时,本文对此不做详细说明。 DEC21554是Digital公司的产品。 Intel 21555非透明桥片两边的HOST处理器都可以访问Primary和Secondary总线的配置寄存器。 多数半导体厂商提供两类芯片手册,分别是Datasheet和User manual。其中Datasheet偏重硬件电气特性,User Manual侧重芯片使用原理。
  • 热度 14
    2013-4-2 18:03
    2163 次阅读|
    0 个评论
    PCI总线定义了两类配置请求,一个是Type 00h配置请求,另一个是Type 01h配置请求。PCI总线使用这些配置请求访问PCI总线树上的设备配置空间,包括PCI桥和PCI Agent设备的配置空间。 其中HOST主桥或者PCI桥使用Type 00h配置请求,访问与HOST主桥或者PCI桥直接相连的PCI Agent设备或者PCI桥 ;而HOST主桥或者PCI桥使用Type 01h配置请求,需要至少穿越一个PCI桥,访问没有与其直接相连的PCI Agent设备或者PCI桥。如图2‑8所示,HOST主桥可以使用Type 00h配置请求访问PCI设备01,而使用Type 01h配置请求通过PCI桥1、2或者3转换为Type 00h配置请求之后,访问PCI总线树上的PCI设备11、21、22、31和32 。 当x86处理器对CONFIG_DATA寄存器进行读写操作时,HOST主桥将决定向PCI总线发送Type 00h配置请求还是Type 01h配置请求。在PCI总线事务的地址周期中,这两种配置请求总线事务的不同反映在PCI总线的AD 信号线上。 值得注意的是,PCIe总线还可以使用ECAM(Enhanced Configuration Access Mechanism)机制访问PCIe设备的扩展配置空间,使用这种方式可以访问PCIe设备256B~4KB之间的扩展配置空间。但是本节仅介绍如何使用CONFIG_ADDRESS和CONFIG_FATA寄存器产生Type 00h和Type 01h配置请求。有关ECAM机制的详细说明见第5.3.2节。 处理器首先将目标PCI设备的ID号保存在CONFIG_ADDRESS寄存器中,之后HOST主桥根据该寄存器的Bus Number字段,决定是产生Type 00h配置请求,还是Type 01h配置请求。当Bus Number字段为0时,将产生Type 00h配置请求,因为与HOST主桥直接相连的总线号为0;大于0时,将产生Type 01h配置请求。 2.4.1 Type 01h 和Type 00h配置请求 本节首先介绍Type 01h配置请求,并从PCI总线使用的信号线的角度上,讲述HOST主桥如何生成Type 01配置请求。在PCI总线中,只有PCI桥能够接收Type 01h配置请求。Type 01h配置请求不能直接发向最终的PCI Agent设备,而只能由PCI桥将其转换为Type 01h继续发向其他PCI桥,或者转换为Type 00h配置请求发向PCI Agent设备。PCI桥还可以将Type 01h配置请求转换为Special Cycle总线事务(HOST主桥也可以实现该功能),本节对这种情况不做介绍。 在地址周期中,HOST主桥使用配置读写总线事务,将CONFIG_ADDRESS寄存器的内容拷贝到PCI总线的AD 信号线中。CONFIG_ADDRESS寄存器与Type 01h配置请求的对应关系如图2‑11所示。 从图2‑11中可以发现,CONFIG_ADDRESS寄存器的内容基本上是原封不动的拷贝到PCI总线的AD 信号线上的 。其中CONFIG_ADDRESS的Enable位不被拷贝,而AD总线的第0位为必须为1,表示当前配置请求是Type 01h。 当PCI总线接收到Type 01配置请求时,将寻找合适的PCI桥 接收这个配置信息。如果这个配置请求是直接发向PCI桥下的PCI设备时,PCI桥将接收个Type 01配置请求,并将其转换为Type 00h配置请求;否则PCI桥将当前Type 01h配置请求原封不动的传递给下一级PCI总线。 如果HOST主桥或者PCI桥发起的是Type 00h配置请求,CONFIG_ADDRESS寄存器与AD 的转换如图2‑12所示。 此时处理器对CONFIG_DATA寄存器进行读写时,处理器将CONFIG_ADDRESS寄存器中的Function Number和Register Number字段拷贝到PCI的AD总线的第10~2位;将AD总线的第1~0位赋值为0b00。PCI总线在配置请求总线事务的地址周期根据AD 判断当前配置请求是Type 00h还是Type 01h,如果AD 等于0b00表示是Type 00h配置请求,如果AD 等于0b01表示是Type 01h配置请求。 而AD 与CONFIG_ADDRESS的Device Number字段有关,在Type 00h配置请求的地址周期中,AD 位有且只有一位为1,其中AD 的每一位选通一个PCI设备的配置空间。如第1.2.2节所述,PCI设备配置空间的片选信号是IDSEL,因此AD 将与PCI设备的IDSEL信号对应相连。 当以下两种请求之一满足时,HOST主桥或者PCI桥将生成Type 00h配置头,并将其发送到指定的PCI总线上。 (1) CONFIG_ADDRESS寄存器的Bus Number字段为0时,处理器访问CONFIG_DATA寄存器时,HOST主桥将直接向PCI总线0发出Type 00h配置请求。因为与HOST主桥直接相连的PCI总线号为0,此时表示HOST主桥需要访问与其直接相连的PCI设备。 (2) 当PCI桥收到Type 01h配置头时,将检查Type 01配置头的Bus Number字段,如果这个Bus Number与PCI桥的Secondary Bus Number相同,则将这个Type 01配置头转换为Type 00h配置头,并发送到该PCI桥的Secondary总线上。 2.4.2 PCI 总线配置请求的转换原则 当CONFIG_ADDRESS寄存器的Enable位为1,系统软件访问CONFIG_DATA寄存器时,HOST主桥可以产生两类PCI总线配置读写总线事务,分别为Type 00h和Type 01h配置读写总线事务。在配置读写总线事务的地址周期和数据周期中,CONFIG_ADDRESS和CONFIG_DATA寄存器中的数据将被放置到PCI总线的AD总线上。其中Type 00h和Type 01h配置读写总线事务映射到AD总线的数据并不相同。 其中Type 00h配置请求可以直接读取PCI Agent设备的配置空间,而Type 01h配置请求在通过PCI桥时,最终将被转换为Type 00h配置请求,并读取PCI Agent设备的配置寄存器。本节重点讲述PCI桥如何将Type 01h配置请求转换为Type 00h配置请求。 首先Type 00h配置请求不会被转换成Type 01h配置请求,因为Type 00h配置请求是发向最终PCI Agent设备,这些PCI Agent设备不会转发这些配置请求。 当CONFIG_ADDRESS寄存器的Bus Number字段为0时,处理器对CONFIG_DATA寄存器操作时,HOST主桥将直接产生Type 00h配置请求,挂接在PCI总线0上的某个设备将通过ID译码接收这个Type 00h配置请求,并对配置寄存器进行读写操作。如果PCI总线上没有设备接收这个Type 00h配置请求,将引发Master Abort,详情见PCI总线规范,本节对此不做进一步说明。 如果CONFIG_ADDRESS寄存器的Bus Number字段为n(n≠0),即访问的PCI设备不是直接挂接在PCI总线0上的,此时HOST主桥对CONFIG_DATA寄存器操作时,将产生Type 01h配置请求,PCI总线0将遍历所有在这条总线上的PCI桥,确定由哪个PCI桥接收这个Type 01h配置请求。 如果n大于等于某个PCI桥的Secondary Bus Number寄存器,而且小于等于Subordinate Bus number寄存器,那么这个PCI桥将接收在当前PCI总线上的Type 01配置请求,并采用以下规则进行递归处理。 (1) 开始。 (2) 遍历当前PCI 总线的所有PCI桥。 (3) 如果n等于某个PCI桥的Secondary Bus Number寄存器,说明这个Type 01配置请求的目标设备直接连接在该PCI桥的Secondary bus上。此时PCI桥将Type 01配置请求转换为Type 00h配置请求,并将这个配置请求发送到PCI桥的Secondary Bus上,Secondary Bus上的某个设备将响应这个Type 00h配置请求,并与HOST主桥进行配置信息的交换,转(5)。 (4) 如果n大于PCI桥的Secondary Bus Number寄存器,而且小于等于PCI桥的Subordinate Bus number寄存器,说明这个Type 01配置请求的目标设备不与该PCI桥的Secondary Bus直接相连,但是由这个PCI桥下游总线上的某个PCI桥管理。此时PCI桥将首先认领这个Type 01配置请求,并将其转发到Secondary Bus,转(2)。 (5) 结束。 下文将举例说明PCI总线配置请求的转换原则,并以图2‑8为例说明处理器如何访问PCI设备01和PCI设备31的配置空间。PCI设备01直接与HOST主桥相连,因此HOST主桥可以使用Type 00h配置请求访问该设备。 而HOST主桥需要经过多级PCI桥才能访问PCI设备31,因此HOST主桥需要首先使用Type 01h配置请求,之后通过PCI桥1、2和3将Type 01h配置请求转换为Type 00h配置请求,最终访问PCI设备31。 1 PCI设备01 这种情况较易处理,当HOST处理器访问PCI设备01的配置空间时,发现PCI设备01与HOST主桥直接相连,所以将直接使用Type 00h配置请求访问该设备的配置空间,具体步骤如下。 首先HOST处理器将CONFIG_ADDRESS寄存器的Enable位置1,Bus Number号置为0,并对该寄存器的Device、Function和Register Number字段赋值。当处理器对CONFIG_DATA寄存器访问时,HOST主桥将存放在CONFIG_ADDRESS寄存器中的数值,转换为Type 00h配置请求,并发送到PCI总线0上,PCI设备01将接收这个Type 00h配置请求,并与处理器进行配置信息交换。 2 PCI设备31 HOST处理器对PCI设备31进行配置读写时,需要通过HOST主桥、PCI桥1、2和3,最终到达PCI设备31。 当处理器访问PCI设备31时,首先将CONFIG_ADDRESS寄存器的Enable位置1,Bus Number字段置为3,并对Device、Function和Register Number字段赋值。之后当处理器对CONFIG_DATA寄存器进行读写访问时,HOST主桥、PCI桥1、2和3将按照以下步骤进行处理,最后PCI设备31将接收这个配置请求。 (1) HOST主桥发现Bus Number字段的值为3,该总线号并不是与HOST主桥直接相连的PCI总线的Bus Number,所以HOST主桥将处理器对CONFIG_DATA寄存器的读写访问直接转换为Type 01h配置请求,并将这个配置请求发送到PCI总线0上。PCI总线规定Type 01h配置请求只能由PCI桥负责处理。 (2) 在PCI总线0上,PCI桥1的Secondary Bus Number为1而Subordinate Bus Number为3。而1 Bus Number = 3,所以PCI桥1将接收来自PCI总线0的Type 01h配置请求,并将这个配置请求直接下推到PCI总线1。 (3) 在PCI总线1上,PCI桥2的Secondary Bus Number为2而Subordinate Bus Number为3。而1 Bus Number = 3,所以PCI桥2将接收来自PCI总线0的Type 01h配置请求,并将这个配置请求直接下推到PCI总线2。 (4) 在PCI总线2上,PCI桥3的Secondary Bus Number为3,因此PCI桥3将“来自PCI总线2的Type 01h配置请求”转换为Type 00h配置请求,并将其下推到PCI总线3。PCI总线规定,如果PCI桥的Secondary Bus Number与Type 01h配置请求中包含的Bus Number相同时,该PCI桥将接收的Type 01h配置请求转换为Type 00h配置请求,然后再发向其Secondary Bus。 (5) 在PCI总线3上,有两个设备PCI设备31和PCI设备32。在这两个设备中,必然有一个设备将要响应这个Type 00h配置请求,从而完成整个配置请求周期。本篇在第2.4.1节中,讨论了究竟是PCI设备31还是PCI设备32接收这个配置请求,这个问题涉及PCI总线如何分配PCI设备使用的设备号。 2.4.3 PCI 总线树Bus号的初始化 在一个处理器系统中,每一个HOST主桥都推出一颗PCI总线树。在一颗PCI总线树中有多少个PCI桥(包括HOST主桥),就含有多少条PCI总线。系统软件在遍历当前PCI总线树时,需要首先对这些PCI总线进行编号,即初始化PCI桥的Primary、Secondary和Subordinate Bus Number寄存器。 在一个处理器系统中,一般将与HOST主桥直接相连的PCI总线被命名为PCI总线0。然后系统软件使用DFS(Depth First Search)算法,依次对其他PCI总线进行编号。值得注意的是,与HOST主桥直接相连的PCI总线,其编号都为0,因此当处理器系统中存在多个HOST主桥时,将有多个编号为0的PCI总线,但是这些编号为0的PCI总线分属不同的PCI总线域,其含义并不相同。 在一个处理器系统中,PCI总线树的结构如图2‑13所示。当然在一个实际的处理器系统中,很少会出现这样复杂的PCI总线树结构,本节采用这个结构的目的是便于说明PCI总线号的分配过程。 在PCI总线中,系统软件使用深度优先DFS算法对PCI总线树进行遍历,DFS算法和广度优先BFS(Breadth First Search)算法是遍历树型结构的常用算法。与BFS算法相比,DFS算法的空间复杂度较低,因此绝大多数系统系统在遍历PCI总线树时,都使用DFS算法而不是BFS算法。 DFS是搜索算法的一种,其实现机制是沿着一颗树的深度遍历各个节点,并尽可能深地搜索树的分支,DFS的算法为线性时间复杂度,适合对拓扑结构未知的树进行遍历。在一个处理器系统的初始化阶段,PCI总线树的拓扑结构是未知的,适合使用DFS算法进行遍历。下文以图2‑13为例,说明系统软件如何使用DFS算法,分配PCI总线号,并初始化PCI桥中的Primary Bus Number、Secondary Bus Number和Subordinate Bus number寄存器。所谓DFS算法是指按照深度优先的原则遍历PCI胖树,其步骤如下。 (1) HOST主桥扫描PCI总线0上的设备。系统软件首先忽略所有这条总线上的PCI Agent设备,因为在这些设备之下不会挂接新的PCI总线。例如PCI设备01下不可能挂接新的PCI总线。 (2) HOST主桥首先发现PCI桥1,并将PCI桥1的Secondary Bus命名为PCI总线1。系统软件将初始化PCI桥1的配置空间,将PCI桥1的Primary Bus Number寄存器赋值为0,而将Secondary Bus Number寄存器赋值为1,即PCI桥1的上游PCI总线号为0,而下游PCI总线号为1。 (3) 扫描PCI总线1,发现PCI桥2,并将PCI桥2的Secondary Bus命名为PCI总线2。系统软件将初始化PCI桥2的配置空间,将PCI桥2的Primary Bus Number寄存器赋值为1,而将Secondary Bus Number寄存器赋值为2。 (4) 扫描PCI总线2,发现PCI桥3,并将PCI桥3的Secondary Bus命名为PCI总线3。系统软件将初始化PCI桥3的配置空间,将PCI桥3的Primary Bus Number寄存器赋值为2,而将Secondary Bus Number寄存器赋值为3。 (5) 扫描PCI总线3,没有发现任何PCI桥,这表示PCI总线3下不可能有新的总线,此时系统软件将PCI桥3的Subordinate Bus number寄存器赋值为3。系统软件在完成PCI总线3的扫描后,将回退到PCI总线3的上一级总线,即PCI总线2,继续进行扫描。 (6) 在重新扫描PCI总线2时,系统软件发现PCI总线2上除了PCI桥3之外没有发现新的PCI桥,而PCI桥3之下的所有设备已经完成了扫描过程,此时系统软件将PCI桥2的Subordinate Bus number寄存器赋值为3。继续回退到PCI总线1。 (7) PCI总线1上除了PCI桥2外,没有其他桥片,于是继续回退到PCI总线0,并将PCI桥1的Subordinate Bus number寄存器赋值为3。 (8) 在PCI总线0上,系统软件扫描到PCI桥4,则首先将PCI桥4的Primary Bus Number寄存器赋值为0,而将Secondary Bus Number寄存器赋值为4,即PCI桥1的上游PCI总线号为0,而下游PCI总线号为4。 (9) 系统软件发现PCI总线4上没有任何PCI桥,将结束对PCI总线4的扫描,并将PCI桥4的Subordinate Bus number寄存器赋值为4,之后回退到PCI总线4的上游总线,即PCI总线0继续进行扫描。 (10) 系统软件发现在PCI总线0上的两个桥片PCI总线0和PCI总线4都已完成扫描后,将结束对PCI总线的DFS遍历全过程。 从以上算法可以看出,PCI桥的Primary Bus和Secondary Bus号的分配在遍历PCI总线树的过程中从上向下分配,而Subordinate Bus号是从下向上分配的,因为只有确定了一个PCI桥之下究竟有多少条PCI总线后,才能初始化该PCI桥的Subordinate Bus号。 2.4.4 PCI 总线Device号的分配 一条PCI总线会挂接各种各样的PCI设备,而每一个PCI设备在PCI总线下具有唯一的设备号。系统软件通过总线号和设备号定位一个PCI设备之后,才能访问这个PCI设备的配置寄存器。值得注意的是,系统软件使用“地址寻址方式”访问PCI设备的存储器和I/O地址空间,这与访问配置空间使用的“ID寻址方式”不同。 PCI设备的IDSEL信号与PCI总线的AD 信号的连接关系决定了该设备在这条PCI总线的设备号。如上文所述,每一个PCI设备都使用独立的IDSEL信号,该信号将与PCI总线的AD 信号连接,IDSEL信号的含义见第1.2.2节。 在此我们简要回顾PCI的配置读写事务使用的时序。如图1‑3所示,PCI总线事务由一个地址周期加若干个数据周期组成。在进行配置读写请求总线事务时,C/BE#信号线的值在地址周期中为0x1010或者为0x1011,表示当前总线事务为配置读或者配置写请求。此时出现在AD 总线上的值并不是目标设备的PCI总线地址,而是目标设备的ID号,这与PCI总线进行I/O或者存储器请求时不同,因为PCI总线使用ID号而不是PCI总线地址对配置空间进行访问。 如图2‑12所示,在配置读写总线事务的地址周期中,AD 信号已经被Function Number和Register Number使用,因此PCI设备的IDSEL只能与AD 信号连接。 认真的读者一定可以发现在CONFIG_ADDRESS寄存器中Device Number字段一共有5位可以表示32个设备,而AD 只有21位,显然在这两者之间无法建立一一对应的映射关系。因此在一条PCI总线上如果有21个以上的PCI设备,那么总是有几个设备无法与AD 信号线连接,从而PCI总线无法访问这些设备。因为PCI总线在配置请求的地址周期中,只能使用第31~11这些AD信号,所以在一条总线上最多也只能挂接21个PCI设备。这21个设备可能是从0到20,也可能是从11到31排列。从而系统软件在遍历PCI总线时,还是需要从0到31遍历整条PCI总线。 在实际的应用中,一条PCI总线能够挂接21个设备已经足够了,实际上由于PCI总线的负载能力有限,即便总线频率为33MHz的情况下,在一条PCI总线中最多也只能挂接10个负载,一条PCI总线所能挂接的负载详见表1‑1。AD信号线与PCI设备IDSEL线的连接关系如图2‑14所示。 PCI总线推荐了一种Device Number字段与AD 之间的映射关系。其中PCI设备0与Device Number字段的0b00000对应;PCI设备1与Device Number字段的0b00001对应,并以此类推,PCI设备15与Device Number字段的0b01111对应。 在这种映射关系之下,一条PCI总线中,与信号线AD16相连的PCI设备其设备号为0;与信号线AD17相连的PCI设备其设备号为1;以此类推,与信号线AD31相连的PCI设备其设备号为15。在Type 00h配置请求中,设备号并没有像Function Number和Register Number那样以编码的形式出现在AD总线上,而是与AD信号一一对应,如图2‑12所示。 这里有一个原则需要读者注意,就是对PCI设备的配置寄存器进行访问时,一定要有确定的Bus Number、Device Number、Function Number和Register Number,这“四元组”缺一不可。在Type 00h配置请求中,Device Number由AD 信号线与PCI设备IDSEL信号的连接关系确定;Function Number保存在AD 字段中;而Register Number保存在AD 字段中;在Type 01h配置请求中,也有完整的四元组信息。 此时PCI桥作为一个PCI设备,接收访问其配置空间的读写请求。 最终Type 01h配置请求将会被转换为Type 00h配置请求,然后访问PCI Agent设备。 Type 01h配置头信息存在于PCI总线事务的地址周期中。 PCI桥根据Subordinate Bus Number和Secondary Bus Number寄存器,决定是否接收当前配置请求。
  • 热度 14
    2013-3-28 10:11
    1669 次阅读|
    0 个评论
    3 使用Outbound寄存器访问PCI总线地址空间 MPC8548处理器使用Outbound寄存器组访问PCI总线地址空间的步骤如下。 (1) 首先MPC8548处理器需要将程序使用的32位有效地址EA (Effective Address)转换为41位的虚拟地址VA (Virtual Address)。E500 V2内核不能关闭MMU(Memory Management Unit),因此不能直接访问物理地址。 (2) MPC8548处理器通过MMU将41位的虚拟地址转换为36位的物理地址。在E500 V2内核中,物理地址是36位(缺省是32位,需要使能)。 (3) 检查LAWBAR和LAWAR寄存器,判断当前36位的物理地址是否属于PCI总线空间。在MPC8548中定义了一组LAWBAR和LAWAR寄存器对,每一对寄存器描述当前物理空间是与PCI总线、PCIe总线、DDR还是RapidIO空间对应。该组寄存器的详细说明见MPC8548 PowerQUICC III™ Integrated Host Processor Family Reference Manual。如果CPU访问的空间为PCI总线空间,则执行第(4)步,否则处理器将不会访问PCI地址空间。 (4) 判断当前36 位物理地址是否在POWBARn寄存器1~4描述的窗口中,如果在则将36位的处理器物理地址通过寄存器POTARn和POTEARn转换为64位的PCI总线地址,然后HOST主桥将来自处理器的读写请求发送到PCI总线上;如果不在POWBARn寄存器1~4描述的窗口中,POWBAR0寄存器作为缺省窗口,接管这个存储器访问,并使用寄存器POTAR0和POTEAR0,将处理器物理地址转换为PCI总线地址,当然在正常设计中很少出现这种情况。 许多系统软件,将Outbound窗口两边的寄存器使用“直接相等”的方法进行映射,将存储器域的地址与PCI总线地址设为相同的值。但是系统软件程序员务必注意这个存储器地址与PCI总线地址是分属于存储器域与PCI总线域的,这两个值虽然相等,但是所代表的地址并不相同,一个属于存储器域,而另一个属于PCI总线域。 2.2.3 PCI 总线域地址空间到存储器域地址空间的转换 MPC8548处理器使用Inbound寄存器组将PCI总线域地址转换为存储器域的地址。PCI设备进行DMA读写时,只有访问的地址在Inbound窗口中时,HOST主桥才能接收这些读写请求,并将其转发到存储器控制器。MPC8548处理器提供了3组Inbound寄存器,即提供3个Inbound寄存器窗口,实现PCI总线地址到存储器地址的反向映射。 从PCI设备的角度上看,PCI设备访问存储器域的地址空间时,首先需要通过Inbound窗口将PCI总线地址转换为存储器域的地址;而从处理器的角度上看,处理器必须要将存储器地址通过Inbound寄存器组反向映射为PCI总线地址空间,才能被PCI设备访问。 PCI设备只能使用PCI总线地址访问PCI总线域的地址空间。HOST主桥将这段地址空间通过Inbound窗口转换为存储器域的地址之后,PCI设备才能访问存储器域地址空间。这个地址转换过程如图2‑5所示。 在介绍MPC8548处理器如何使用Inbound寄存器组进行PCI总线域地址空间到存储器域地址空间的转换之前,我们首先简要介绍Inbound寄存器组中的相应寄存器。该组寄存器的地址偏移、属性和复位值如表2‑3所示。 表 2‑3 PCI/X ATMU Inbound寄存器组 Offset 寄存器名 属性 复位值 0x0_8DA0/C0/E0 PITARn 可读写 0x0000-0000 0x0_8DA8/C8/E8 PIWBARn 可读写 0x0000-0000 0x0_8DAC/CC PIWBEARn 可读写 0x0000-0000 0x0_8DB0/D0/F0 PIWARn 可读写 0x0000-0000 值得注意的是,Inbound寄存器组除了可以进行PCI总线地址空间到存储器域地址空间的转换之外,还可以转换分属不同PCI总线域的地址空间,以支持PCI总线的Peer-to-Peer数据传送方式。 1 PITARn寄存器 PITARn寄存器保存当前Inbound窗口在存储器域中的36位地址空间的基地址,其地址窗口的大小至少为4KB,因此在该寄存器中仅存放存储器域地址的第0~23位,该寄存器的其主要字段如下所示。 TEA字段存放存储器地址空间的第0~3位。 TA字段存放存储器地址空间的第4~23位。 2 PIWBARn和PIWBEARn寄存器 PIWBARn和PIWBEARn寄存器保存当前Inbound窗口在PCI总线域中的64位地址空间的基地址的第63~12位,Inbound窗口使用的最小地址空间为4KB,因此在这两个寄存器中不含有PCI总线地址空间的第11~0位。这两个寄存器的主要字段如下所示。 PIWBARn寄存器的BEA字段存放PCI总线地址空间的第43~32位。 PIWBARn寄存器的BA字段存放PCI总线地址空间的第31~12位。 PIWBEARn寄存器的BEA字段存放PCI总线地址空间的第63~44位。 3 PIWARn寄存器 PIWARn寄存器描述当前Inbound窗口的属性,该寄存器由以下位和字段组成。 EN位,第0位。该位是Inbound窗口的使能位,为1表示当前Inbound寄存器组描述的存储器地址空间到PCI总线地址空间的映射关系有效;为0表示无效。 PF位,第2位。该位为1表示当前Inbound窗口描述的存储区域支持预读;为0表示不支持预读。 TGI字段,第8~11位。该字段为0b0010表示当前Inbound窗口描述的存储区域属于PCIe总线域地址空间;为0b1100表示当前Inbound窗口描述的存储区域属于RapidIO总线域地址空间。该字段对于OCeaN实现不同域间的报文转发非常重要,如果当前Inbound窗口的TGI字段为0b0010,此时PCI总线上的设备可以使用该Inbound窗口,通过OCeaN直接读取PCIe总线的地址空间,而不需要经过SoC平台总线。如果TGI字段为0b1111表示Inbound窗口描述的存储器区域属于主存储器地址空间,这也是最常用的方式。使用该字段可以实现HOST主桥的Peer-to-Peer数据传送方式。 RTT字段和WTT字段,分别为该寄存器的第12~15位和第16~19位。Inbound窗口的RTT/WTT字段的含义与Outbound窗口的RTT/WTT字段基本类似。只是在Inbound窗口中可以规定PCI设备访问主存储器时,是否需要进行Cache一致性操作(Cache Lock and Allocate),在进行DMA写操作时,数据是否可以直接进入到Cache中。该字段是PowerPC处理器对PCI总线规范的有效补充,由于该字段的存在,PowerPC处理器的PCI设备可以将数据直接写入Cache,也可以视情况决定DMA操作是否需要进行Cache共享一致性操作。 IWS字段,第26~31位。该字段描述当前窗口的大小,Inbound窗口的大小在4KB~16GB之间,其值为2IWS+1。 4 使用Inbound寄存器组进行DMA操作 PCI设备使用DMA操作访问主存储器空间,或者访问其他PCI总线域地址空间时,需要通过Inbound窗口,其步骤如下。 (1) PCI设备在访问主存储器空间时,将首先检查当前PCI总线地址是否在PIWBARn和PIWBEARn寄存器描述的窗口中。如果在这个窗口中,则将这个PCI总线地址通过PITARn寄存器转换为存储器域的地址或者其他PCI总线域的地址;如果不在将禁止本次访问。 (2) 如果PCI设备访问的是存储器地址空间,HOST主桥将来自PCI总线的读写请求发送到存储器空间,进行存储器读写操作,并根据Inbound寄存器组的RTT/WTT位决定是否需要进行Cache一致性操作,或者将数据直接写入到Cache中。 结合Outbound寄存器组,可以发现PCI总线地址空间与存储器地址空间是有一定联系的。如果存储器域地址空间被Inbound寄存器组反向映射到PCI空间,这个存储器地址具有两个地址,一个是在存储器域的地址,一个是在PCI总线域的地址;同理PCI总线空间的地址如果使用Outbound寄存器映射到寄存器地址空间,这个PCI总线地址也具有两个地址,一个是在PCI总线域的地址,一个是在存储器域的地址。 能够被处理器和PCI总线同时访问的地址空间,一定在PCI总线域和存储器域中都存在地址映射。再次强调,绝大多数操作系统将同一个空间的PCI总线域地址和存储器地址设为相同的值,但是这两个相同的值所代表的含义不同。 由此可以看出,如果MPC8548处理器的某段存储器区域没有在Inbound窗口中定义时,PCI设备将不能使用DMA机制访问这段存储器空间;同理如果PCI设备的空间不在Outbound窗口,HOST处理器也不能访问这段PCI地址空间。 在绝大多数PowerPC处理器系统中,PCI设备地址空间都在HOST主桥的Outbound窗口中建立了映射;而MPC8548处理器可以选择将哪些主存储器空间共享给PCI设备,从而对主存储器空间进行保护。 2.2.4 x86 处理器的HOST主桥 x86处理器使用南北桥结构连接CPU和PCI设备。其中北桥(North Bridge)连接快速设备,如显卡、和内存条,并推出PCI总线,HOST主桥包含在北桥中。而南桥(South Bridge)连接慢速设备。x86处理器使用的南北桥结构如图2‑6所示。 Intel使用南北桥概念统一PC架构。但是从体系结构的角度上看,南北桥架构并不重要,北桥中存放的主要部件不过是存储器控制器、显卡控制器和HOST主桥而已,而南桥存放的是一些慢速设备,如ISA总线和中断控制器等。 不同的处理器系统集成这些组成部件的方式并不相同,如PowerPC、MIPS和ARM处理器系统通常将CPU和主要外部设备都集成到一颗芯片中,组成一颗基于SoC架构的处理器系统。这些集成方式并不重要,每一个处理器系统都有其针对的应用领域,不同应用领域的需求对处理器系统的集成方式有较大的影响。Intel采用的南北桥架构针对x86处理器的应用领域而设计,并不能说采用这种结构一定比MPC8548处理器中即含有HOST-to-PCI主桥也含有HOST-to-PCIe主桥更为合理。 在许多嵌入式处理器系统中,即含有PCI设备也含有PCIe设备,为此MPC8548处理器同时提供了PCI总线和PCIe总线接口,在这个处理器系统中,PCI设备可以与PCI总线直接相连,而PCIe设备可以与PCIe总线直接相连,因此并不需要使用PCIe桥扩展PCI总线,从而在一定程度上简化了嵌入式系统的设计。 嵌入式系统所面对的应用千姿百态,进行芯片设计时所要考虑的因素相对较多,因而在某种程度上为设计带来了一些难度。而x86处理器系统所面对的应用领域针对个人PC**务器,向前兼容和通用性显得更加重要。在多数情况下,一个通用处理器系统的设计难过专用处理器系统的设计,Intel为此付出了极大的代价。 在一些相对较老的北桥中,如Intel 440系列芯片组中包含了HOST主桥,从系统软件的角度上看HOST-to-PCI主桥实现的功能与HOST-to-PCIe主桥实现的功能相近。本节仅简单介绍Intel的HOST-to-PCI主桥如何产生PCI的配置周期,有关Intel HOST-to-PCIe主桥 的详细信息参见第5章。 x86处理器定义了两个I/O端口寄存器,分别为CONFIG_ADDRESS和CONFIG_DATA寄存器,其地址为0xCF8和0xCFC。x86处理器使用这两个I/O端口访问PCI设备的配置空间。PCI总线规范也以这个两个寄存器为例,说明处理器如何访问PCI设备的配置空间。其中CONFIG_ADDRESS寄存器存放PCI设备的ID号,而CONFIG_DATA寄存器存放进行配置读写的数据。 CONFIG_ADDRESS寄存器与PowerPC处理器中的CFG_ADDR寄存器的使用方法类似,而CONFIG_DATA寄存器与PowerPC处理器中的CFG_DATA寄存器的使用方法类似。CONFIG_ADDRESS寄存器的结构如图2‑7所示。 CONFIG_ADDRESS寄存器的各个字段和位的说明如下所示, Enable位,第31位。该位为1时,对CONFIG_DATA寄存器进行读写时将引发PCI总线的配置周期。 Bus Number字段,第23~16位,记录PCI设备的总线号。 Device Number字段,第15~11位,记录PCI设备的设备号。 Function Number字段,第10~8位,记录PCI设备的功能号。 Register Number字段,第7~2位,记录PCI设备的寄存器号。 当x86处理器对CONFIG_DATA寄存器进行I/O读写访问,且CONFIG_ADDR寄存器的Enable位为1时,HOST主桥将这个I/O读写访问转换为PCI配置读写总线事务,然后发送到PCI总线上,PCI总线根据保存在CONFIG_ADDR寄存器中的ID号,将PCI配置读写请求发送到指定PCI设备的指定配置寄存器中。 x86处理器使用小端地址模式,因此从CONFIG_DATA寄存器中读出的数据不需要进行模式转换,这点和PowerPC处理器不同,此外x86处理器的HOST主桥也实现了存储器域到PCI总线域的地址转换,但是这个概念在x86处理器中并不明晰。 本书将在第5章以HOST-to-PCIe主桥为例,详细介绍Intel处理器的存储器地址与PCI总线地址的转换关系,而在本节不对x86处理器的HOST主桥做进一步说明。x86处理器系统的升级速度较快,目前在x86的处理器体系结构中,已很难发现HOST主桥的身影。 目前Intel对南北桥架构进行了升级,其中北桥被升级为MCH(Memory Controller Hub),而南桥被升级为ICH(I/O Controller Hub)。x86处理器系统在MCH中集成了存储器控制器、显卡芯片和HOST-to-PCIe主桥,并通过Hub Link与ICH相连;而在ICH中集成了一些相对低速总线接口,如AC’97、LPC(Low Pin Count)、IDE和USB总线,当然也包括一些低带宽的PCIe总线接口。 在Intel最新的Nehelem 处理器系统中,MCH被一份为二,存储器控制器和图形控制器已经与CPU内核集成在一个Die中,而MCH剩余的部分与ICH合并成为PCH(Peripheral Controller Hub)。但是从体系结构的角度上看,这些升级与整合并不重要。 目前Intel在Menlow 平台基础上,计划推出基于SoC架构的x86处理器,以进军手持设备市场。在基于SoC构架的x86处理器中将逐渐淡化Chipset的概念,其拓扑结构与典型的SoC处理器,如ARM和PowerPC处理器,较为类似。     WBA字段并没有保存存储器域的第24~35位地址,因为Outbound窗口大小至少为4KB。 这个HOST-to-PCIe主桥也是RC(Root Complex)的一部分。 Nehelem处理器也被称为Core i7处理器。 Menlow平台于2008年3月发布,其目标应用为MID(Mobile Internet Device)设备。Menlow平台基于低功耗处理器内核Atom。
  • 热度 14
    2013-3-28 10:11
    1759 次阅读|
    0 个评论
    本节以MPC8548处理器为例说明HOST主桥在PowerPC处理器中的实现机制,并简要介绍x86处理器系统使用的HOST主桥。 MPC8548处理器是Freescale基于E500 V2内核的一个PowerPC处理器,该处理器中集成了DDR控制器、多个eTSEC(Enhanced Three-Speed Ethernet Controller)、PCI/PCI-X和PCIe总线控制器等一系列接口。MPC8548处理器的拓扑结构如图2‑2所示。   如上图所示,MPC8548处理器的L1 Cache在E500 V2内核中,而L2 Cache与FSB 直接相连,不属于E500内核。值得注意的是有些高端PowerPC处理器的L2 Cache也在CPU中,而L3 Cache与CCB总线直接相连。 在MPC8548处理器中,所有外部设备,如以太网控制器、DDR控制器和OCeaN连接的总线控制器都与SoC平台总线 直接连接。而SoC平台总线通过Cache共享一致性模块与FSB连接。 在MPC8548处理器中,具有一个32位的PCI总线控制器、一个64位的PCI/PCI-X总线控制器,还有多个PCIe总线控制器。MPC8548处理器使用OCeaN连接这些PCI、PCI-X和PCIe总线控制器。在MPC8548处理器系统中,PCI设备进行DMA操作时,首先通过OCeaN,之后经过SoC平台总线到达DDR控制器。 OCeaN是MPC8548处理器中连接快速外设使用的交叉互连总线,OCeaN不仅可以连接PCI、PCI-X和PCIe总线控制器,而且可以连接RapidIO 总线控制器。使用OCeaN进行互连的总线控制器可以直接通信,而不需要通过SoC平台总线。 如来自HOST主桥1的数据报文可以通过OCeaN直接发向HOST主桥2,而不需要将数据通过SoC平台总线,再进行转发,从而减轻了SoC平台总线的负担。OCeaN部件的拓扑结构如图2‑3所示。 在MPC8548处理器中,有两个HOST主桥,分别是HOST主桥1和HOST主桥2,其中HOST主桥1可以支持PCI-X总线,而HOST主桥2只能支持PCI总线。此外该处理器还含有多个PCIe总线控制器。 本节仅介绍HOST主桥,即MPC8548处理器中的PCI总线控制器,而不介绍该处理器的PCIe总线控制器。因为从软件层面上看,MPC8548处理器的PCIe总线控制器与PCI/PCI-X总线控制器功能类似。 MPC8548处理器即可以作为PCI总线的HOST处理器,也可以作为PCI总线的从设备,本节仅讲述MPC8548处理器如何作为PCI总线的HOST处理器管理PCI总线树,而并不关心MPC8548处理器作为从设备的情况。 在MPC8548处理器的HOST主桥中,定义了一系列与系统软件相关的寄存器。本节将通过介绍这些寄存器,说明这个HOST主桥的功能。为节约篇幅,本节仅介绍与HOST主桥1相关的寄存器,HOST主桥2使用的寄存器与HOST主桥1使用的寄存器类似。 2 .2.1 PCI 设备配置空间的访问机制 PCI总线规定访问配置空间的总线事务,即配置读写总线事务,使用ID号进行寻址。PCI设备的ID号由总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)组成。 其中总线号在HOST主桥遍历PCI总线树时确定。PCI总线可以使用PCI桥扩展PCI总线,并形成一颗PCI总线树。在一颗PCI总线树上,有几个PCI桥(包括HOST主桥),就有几条PCI总线。在一颗PCI总线树中,总线号由系统软件决定,通常与HOST主桥直接相连的PCI总线编号为0,系统软件使用DFS(Depth-First Search)算法扫描PCI总线树上的所有PCI总线,并依次进行编号。 一条PCI总线的设备号由PCI设备的IDSEL信号与PCI总线地址线的连接关系确定,而功能号与PCI设备的具体设计相关。在一个PCI设备中最多有8个功能设备,而且每一个功能设备都有各自的PCI配置空间,而在绝大多数PCI设备中只有一个功能设备。HOST主桥使用寄存器号,访问PCI设备配置空间的某个寄存器。 在MPC8548处理器的HOST主桥中,与PCI设备配置空间相关的寄存器由CFG_ADDR、CFG_DATA和INT_ACK寄存器组成。系统软件使用CFG_ADDR和CFG_DATA寄存器访问PCI设备的配置空间,而使用INT_ACK寄存器访问挂接在PCI总线上的中断控制器的中断向量,这3个寄存器的地址偏移和属性如表2‑1所示。 表 2‑1 PCI总线配置寄存器 Offset 寄存器 属性 复位值 0x0_8000 CFG_ADDR 可读写 0x0000-0000 0x0_8004 CFG_DATA 可读写 0x0000-0000 0x0_8008 INT_ACK 只读 0x0000-0000 在MPC8548处理器中,所有内部寄存器都使用存储器映射方式进行寻址,并存放在以BASE_ADDR 变量为起始地址的“1MB连续的物理地址空间”中。PowerPC处理器可以通过BASE_ADDR+Offset的方式访问表2‑1中的寄存器。 MPC8548处理器使用CFG_ADDR寄存器和CFG_DATA寄存器访问PCI设备的配置空间,其中用CFG_ADDR寄存器保存PCI设备的ID号和寄存器号,该寄存器的各个字段的详细说明如下所示。 Enable位。当该位为1时,HOST主桥使能对PCI设备配置空间的访问,当HOST处理器对CFG_DATA寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI配置读写总线事务并发送到PCI总线上。 Bus Number字段记录PCI设备所在的总线号。 Device Number字段记录PCI设备的设备号。 Function Number字段记录PCI设备的功能号。 Register Number字段记录PCI设备的配置寄存器号。 MPC8548处理器访问PCI设备的配置空间时,首先需要在CFG_ADDR寄存器中设置这个PCI设备对应的总线号、设备号、功能号和寄存器号,然后使能Enable位。之后当MPC8548处理器对CFG_DATA寄存器进行读写访问时, HOST主桥将这个存储器读写访问转换为PCI配置读写请求,并发送到PCI总线上。如果Enable位没有使能,处理器对CFG_DATA的访问不过是一个普通的I/O访问,HOST主桥并不能将其转换为PCI配置读写请求。 HOST主桥根据CFG_ADDR寄存器中的ID号,生成PCI配置读写总线事务,并将这个读写总线事务,通过ID译码方式发送到指定的PCI设备。PCI设备将接收来自配置写总线事务的数据,或者为配置读总线事务提供数据。 值得注意的是,在PowerPC处理器中,在CFG_DATA寄存器中保存的数据采用大端方式进行编址,而PCI设备的配置寄存器采用小端编址,因此HOST主桥需要进行端模式转换。我们以源代码2‑1为例说明PowerPC处理器如何访问PCI配置空间。 源代码 2‑1 PowerPC处理器访问PCI配置空间 stw r0, 0(r1) ld r3, 0(r2) 我们首先假设寄存器r1的初始值为BASE_ADDR+0x0_8000(即CFG_ADDR寄存器的地址) ,寄存器r0的初始值为0x8000-0008,寄存器r2的初始值为BASE_ADDR+0x0_8004 (即CFG_DATA寄存器的地址),而指定PCI设备(总线号、设备号、功能号都为0)的配置寄存器的0x0B~0x08中的值为0x9988-7766。 这段源代码的执行步骤如下。 (1) 将r0寄存器赋值到r1寄存器所指向的地址空间中,即初始化CFG_ADDR寄存器为0x8000-0008。 (2) 从r2寄存器所指向的地址空间中读取数据到r3寄存器中,即从CFG_DATA寄存器中读取数据到r3寄存器。 在MPC8548处理器中,源代码2‑1执行完毕后,寄存器r3保存的值为0x6677-8899,而不是0x9988-6677。系统程序员在使用这个返回值时,一定要注意大小端模式的转换。值得注意的是,源代码2‑1可以使用lwbrx指令进行优化,该指令可以在读取数据的同时,进行大小端模式的转换。 处理器读取INT_ACK寄存器时,HOST主桥将这个读操作转换为PCI总线中断响应事务。PCI总线中断响应事务的作用是通过PCI总线读取中断控制器的中断向量号,这样做的前提是中断控制器需要连接在PCI总线上。 PowerPC处理器使用的MPIC中断控制器不是挂接在PCI总线上,而是挂接在SoC平台总线上的,因此PCI总线提供的中断应答事务在这个处理器系统中并没有太大用途。但是并不排除某些PowerPC处理器系统使用了挂接在PCI总线上的中断控制器,比如PCI南桥芯片,此时PowerPC处理器系统需要使用中断应答事务读取PCI南桥中的中断控制器,以获取中断向量号。 2.2.2 存储器域地址空间到PCI 总线域地址空间的转换 MPC8548处理器使用ATMU (Address Translation and Mapping Unit)寄存器组进行存储器域到PCI总线域,以及PCI总线域到存储器域的地址映射。ATMU寄存器组由两大组寄存器组成,分别为Outbound和Inbound寄存器组。其中Outbound寄存器组将存储器域的地址转换为PCI总线域的地址,而Inbound寄存器组将PCI总线域的地址转换为存储器域的地址。 在MPC8548处理器中,只有当CPU读写访问的地址范围在Outbound寄存器组管理的地址空间之内时,HOST主桥才能接收CPU的读写访问,并将CPU在存储器域上的读写访问转换为PCI总线域上的读写访问,然后才能对PCI设备进行读写操作。 如图2‑2所示,CPU对存储器域的地址访问,首先使用CCB总线事务,如果所访问的地址在Cache中命中时,则从Cache中直接获得数据,否则将从存储器域中获取数据。而在绝大多数情况下,外部设备使用的地址空间是不可Cache 的,所以在绝大多数情况之下,发向PCI设备的CCB总线事务并不会与Cache进行数据交换。 如果CCB总线事务使用的地址在HOST主桥的Outbound寄存器窗口中命中时,HOST主桥将接收这个CCB总线事务,并将其转换为PCI总线事务之后,再发送到PCI总线上。MPC8548处理器的每一个HOST主桥都提供了5个Outbound寄存器窗口来实现存储器域地址到PCI总线域地址的映射,其映射过程如图2‑4所示。 在介绍MPC8548处理器如何使用Outbound寄存器组进行存储器域地址空间到PCI总线域地址空间的转换之前,本节将首先介绍Outbound寄存器组中的相应寄存器。Outbound寄存器组的地址偏移、属性和复位值如表2‑2所示。 表 2‑2 PCI/X ATMU Outbound寄存器组 地址偏移 寄存器名 属性 复位值 0x0_8C00/20/40/60/80 POTARn 可读写 0x0000-0000 0x0_8C04/24/44/64/84 POTEARn 可读写 0x0000-0000 0x0_8C28/48/68/88 POWBARn 可读写 0x0000-0000 0x0_8C30/50/70/90 POWARn 可读写 0x0000-0000 1 POTARn和POTEARn寄存器 在POTARn和POTEARn寄存器中保存当前Outbound窗口在PCI总线域中的64位地址空间的基地址。这两个寄存器的主要字段如下。 POTARn寄存器的TEA字段,第0~11位,保存PCI总线地址空间的43~32位。 POTARn寄存器的TA字段,第12~31位,保存PCI总线地址空间的31~12位 。 POTEARn寄存器的TEA字段,第12~31位,保存PCI总线地址空间的63~44位。 2 POWBARn寄存器和POWARn寄存器 而POWBARn寄存器保存当前Outbound窗口在存储器域中的36位地址空间的基地址 ,其主要字段如下。 WBEA字段保存存储器域地址的第0~3位。 WBA字段保存存储器域地址的第4~23 位。 POWARn寄存器描述Outbound窗口的属性,其主要字段如下。 EN位,第0位。该位是Outbound窗口的使能位,为1表示当前Outbound寄存器组描述的存储器地址空间到PCI总线地址空间的映射关系有效;为0表示无效。 RTT字段,第12~15位,该字段描述当前窗口的读传送类型,为0b0100表示存储器读,为0b1000表示I/O读。 WTT字段,第16~19位,该字段描述当前窗口的写传送类型,为0b0100表示存储器写,为0b1000表示I/O写。在PCIe总线控制器中,RTT字段和WTT字段还可以支持对配置空间的读写操作。 OWS字段,第26~31位,该字段描述当前窗口的大小,Outbound窗口的大小在4KB~64GB之间,其值为2OWS+1。    MPC8548也将FSB称为CCB(Core Complex Bus)。 PowerPC处理器并没有公开其SoC平台总线的设计规范。ARM提出的AMBA总线是一条典型的SoC平台总线。 RapidIO总线由Mercury Computer System和Motorola Semiconductor(目前的Freescale)共同提出,用于解决背板互连的一条外部总线。 在MPC8548处理器中,BASE_ADDR存放在CCSRBAR寄存器中。 PCI设备使用的ROM空间可以是“可Cache”的地址空间。 POTARn寄存器没有保存PCI总线的11~0位,因为Outbound窗口大小至少为4KB。 MPC8548处理器的物理地址为36位。注意在PowerPC处理器中,第0位是地址的最高位。