2.2 HOST主桥 分类: 浅谈PCI 2013-07-22 16:27 349人阅读 评论(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处理器中,所有外部设备,如以太网控制器、DDR控制器和OCeaN连接的总线控制器都与SoC平台总线[2]直接连接。而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[3]总线控制器。使用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_DA
表2?1 PCI总线配置寄存器
Offset | 寄存器 | 属性 | 复位值 |
0x0_8000 | CFG_ADDR | 可读写 | 0x0000-0000 |
0x0_8004 | CFG_DA | 可读写 | 0x0000-0000 |
0x0_8008 | INT_ACK | 只读 | 0x0000-0000 |
在MPC8548处理器中,所有内部寄存器都使用存储器映射方式进行寻址,并存放在以BASE_ADDR[4]变量为起始地址的“1MB连续的物理地址空间”中。PowerPC处理器可以通过BASE_ADDR+Offset的方式访问表2?1中的寄存器。
MPC8548处理器使用CFG_ADDR寄存器和CFG_DA
-
Enable位。当该位为1时,HOST主桥使能对PCI设备配置空间的访问,当HOST处理器对CFG_DA TA 寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI配置读写总线事务并发送到PCI总线上。 -
Bus Number字段记录PCI设备所在的总线号。 -
Device Number字段记录PCI设备的设备号。 -
Function Number字段记录PCI设备的功能号。 - Register Number字段记录PCI设备的配置寄存器号。
MPC8548处理器访问PCI设备的配置空间时,首先需要在CFG_ADDR寄存器中设置这个PCI设备对应的总线号、设备号、功能号和寄存器号,然后使能Enable位。之后当MPC8548处理器对CFG_DA
HOST主桥根据CFG_ADDR寄存器中的ID号,生成PCI配置读写总线事务,并将这个读写总线事务,通过ID译码方式发送到指定的PCI设备。PCI设备将接收来自配置写总线事务的数据,或者为配置读总线事务提供数据。
值得注意的是,在PowerPC处理器中,在CFG_DA
stw r0, 0(r1) ld |
我们首先假设寄存器r1的初始值为BASE_ADDR+0x0_8000(即CFG_ADDR寄存器的地址) ,寄存器r0的初始值为0x8000-0008,寄存器r2的初始值为BASE_ADDR+0x0_8004 (即CFG_DA
这段源代码的执行步骤如下。
(1)
(2)
在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[5]的,所以在绝大多数情况之下,发向PCI设备的CCB总线事务并不会与Cache进行数据交换。
如果CCB总线事务使用的地址在HOST主桥的Outbound寄存器窗口中命中时,HOST主桥将接收这个CCB总线事务,并将其转换为PCI总线事务之后,再发送到PCI总线上。MPC8548处理器的每一个HOST主桥都提供了5个Outbound寄存器窗口来实现存储器域地址到PCI总线域地址的映射,其映射过程如图2?4所示。
地址偏移 | 寄存器名 | 属性 | 复位值 |
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位[6]。
-
POTEARn寄存器的TEA字段,第12~31位,保存PCI总线地址空间的63~44位。
2 POWBARn寄存器和POWARn寄存器
而POWBARn寄存器保存当前Outbound窗口在存储器域中的36位地址空间的基地址[7],其主要字段如下。
-
WBEA字段保存存储器域地址的第0~3位。 -
WBA字段保存存储器域地址的第4~23[8]位。 - 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。
3 使用Outbound寄存器访问PCI总线地址空间
MPC8548处理器使用Outbound寄存器组访问PCI总线地址空间的步骤如下。
(1)
(2)
(3)
(4)
许多系统软件,将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所示。
表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)
(2)
结合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主桥[9]的详细信息参见第5章。
x86处理器定义了两个I/O端口寄存器,分别为CONFIG_ADDRESS和CONFIG_DA
CONFIG_ADDRESS寄存器与PowerPC处理器中的CFG_ADDR寄存器的使用方法类似,而CONFIG_DA
CONFIG_ADDRESS寄存器的各个字段和位的说明如下所示,
-
Enable位,第31位。该位为1时,对CONFIG_DA TA 寄存器进行读写时将引发PCI总线的配置周期。 -
Bus Number字段,第23~16位,记录PCI设备的总线号。 -
Device Number字段,第15~11位,记录PCI设备的设备号。 -
Function Number字段,第10~8位,记录PCI设备的功能号。 - Register Number字段,第7~2位,记录PCI设备的寄存器号。
当x86处理器对CONFIG_DA
x86处理器使用小端地址模式,因此从CONFIG_DA
本书将在第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[10]处理器系统中,MCH被一份为二,存储器控制器和图形控制器已经与CPU内核集成在一个Die中,而MCH剩余的部分与ICH合并成为PCH(Peripheral Controller Hub)。但是从体系结构的角度上看,这些升级与整合并不重要。
目前Intel在Menlow[11]平台基础上,计划推出基于SoC架构的x86处理器,以进军手持设备市场。在基于SoC构架的x86处理器中将逐渐淡化Chipset的概念,其拓扑结构与典型的SoC处理器,如ARM和PowerPC处理器,较为类似。[1] MPC8548也将FSB称为CCB(Core Complex Bus)。
[2] PowerPC处理器并没有公开其SoC平台总线的设计规范。ARM提出的AMBA总线是一条典型的SoC平台总线。
[3] RapidIO总线由Mercury Computer System和Motorola Semiconductor(目前的Freescale)共同提出,用于解决背板互连的一条外部总线。
[4] 在MPC8548处理器中,BASE_ADDR存放在CCSRBAR寄存器中。
[5] PCI设备使用的ROM空间可以是“可Cache”的地址空间。
[6] POTARn寄存器没有保存PCI总线的11~0位,因为Outbound窗口大小至少为4KB。
[7] MPC8548处理器的物理地址为36位。注意在PowerPC处理器中,第0位是地址的最高位。
[8] WBA字段并没有保存存储器域的第24~35位地址,因为Outbound窗口大小至少为4KB。
[9]这个HOST-to-PCIe主桥也是RC(Root Complex)的一部分。
[10] Nehelem处理器也被称为Core i7处理器。
[11] Menlow平台于2008年3月发布,其目标应用为MID(Mobile Internet Device)设备。Menlow平台基于低功耗处理器内核Atom。
版权声明:本文为博主原创文章,未经博主允许不得转载。