第2章 PCI总线的桥与配置.docx
- 文档编号:11173804
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:47
- 大小:219.53KB
第2章 PCI总线的桥与配置.docx
《第2章 PCI总线的桥与配置.docx》由会员分享,可在线阅读,更多相关《第2章 PCI总线的桥与配置.docx(47页珍藏版)》请在冰豆网上搜索。
第2章PCI总线的桥与配置
第2章 PCI总线的桥与配置
(2011-04-2611:
46:
29)
转载▼
标签:
杂谈
分类:
浅谈PCIe体系结构
在PCI体系结构中,含有两类桥片,一个是HOST主桥,另一个是PCI桥。
在每一个PCI设备中(包括PCI桥)都含有一个配置空间。
这个配置空间由HOST主桥管理,而PCI桥可以转发来自HOST主桥的配置访问。
在PCI总线中,PCIAgent设备使用的配置空间与PCI桥使用的配置空间有些差别,但这些配置空间都是由处理器通过HOST主桥管理。
2.1 存储器域与PCI总线域
(2011-04-2611:
47:
25)
转载▼
标签:
杂谈
分类:
浅谈PCIe体系结构
HOST主桥的实现因处理器系统而异。
PowerPC处理器和x86处理器的HOST主桥除了集成方式不同之外,其实现机制也有较大差异。
但是这些HOST主桥所完成的最基本功能依然是分离存储器域与PCI总线域,完成PCI总线域到存储器域,存储器域到PCI总线域之间的数据传递,并管理PCI设备的配置空间。
上文曾经多次提到在一个处理器系统中,存在PCI总线域与存储器域,深入理解这两个域的区别是理解HOST主桥的关键所在。
在一个处理器系统中,存储器域、PCI总线域与HOST主桥的关系如图21所示。
上图所示的处理器系统由一个CPU,一个DRAM控制器和两个HOST主桥组成。
在这个处理器系统中,包含CPU域、DRAM域、存储器域和PCI总线域地址空间。
其中HOST主桥x和HOST主桥y分别管理PCI总线x域与PCI总线y域。
PCI设备访问存储器域时,也需要通过HOST主桥,并由HOST主桥进行PCI总线域到存储器域的地址转换;CPU访问PCI设备时,同样需要通过HOST主桥进行存储器域到PCI总线域的地址转换。
如果HOST主桥支持Peer-to-Peer传送机制,PCI总线x域上的设备可以与PCI总线y域上的设备直接通信,如PCI设备x11可以直接与PCI设备y11通信。
为简化模型,在本书中,PCI总线仅使用32位地址空间。
2.1.1 CPU域、DRAM域与存储器域
CPU域地址空间指CPU所能直接访问的地址空间集合。
在本书中,CPU、处理器与处理器系统的概念不同。
如MPC8548处理器的内核是E500V2[1],本书将这个处理器内核称为CPU;处理器由一个或者多个CPU、外部Cache、中断控制器和DRAM控制器组成;而处理器系统由一个或者多个处理器和外部设备组成。
在CPU域中有一个重要概念,即CPU域边界,所谓CPU域边界,即CPU所能控制的数据完整性边界。
CPU域的边界由MemoryFence指令[2]的作用范围确定,CPU域边界的划分对数据完整性(DataConsistency)非常重要。
与CPU域相关的数据完整性知识较为复杂,可以独立出书,因此本篇对数据完整性不做进一步介绍。
笔者有计划再更新完PCIe总线部分的资料后,书体系结构的两方面内容,一个是Cache层次结构,一个是以WeaklyOrderedMemoryModle为基础书写数据完整性。
严格的讲CPU域仅在CPU内核中有效,CPU访问主存储器时,首先将读写命令放入读写指令缓冲中,然后将这个命令发送到DRAM控制器或者HOST主桥。
DRAM控制器或者HOST主桥将CPU地址转换为DRAM或者PCI总线地址,分别进入DRAM域或者PCI总线域后,再访问相应的地址空间。
DRAM域地址空间指DRAM控制器所能访问的地址空间集合。
目前处理器系统的DRAM一般由DDR-SDRAM组成,有的书籍也将这部分内存称为主存储器。
在有些处理器系统中,DRAM控制器能够访问的地址空间,并不能被处理器访问,因此在这类处理器系统中,CPU域与DRAM域地址空间并不等同。
比如有些CPU可以支持36位的物理地址,而有些DRAM控制器仅支持32位的物理地址,此时CPU域包含的地址空间大于DRAM域地址空间。
但是这并不意味着DRAM域一定包含在CPU域中,在某些处理器系统中,CPU并不能访问在DRAM域中的某些数据区域。
而CPU域中除了包含DRAM域外,还包含外部设备空间。
在多数处理器系统中,DRAM域空间是CPU域空间的一部分,但是也有例外。
比如显卡控制器可能会借用一部分主存储器空间,这些被借用的空间不能被CPU访问,而只能被DRAM控制器,更为准确地说是显卡通过DRAM控制器访问,因此这段空间不属于CPU域,严格地讲,这段空间属于外部设备域。
本书使用存储器域统称CPU域与DRAM域。
存储器域包括CPU内部的通用寄存器,存储器映像寻址的寄存器,主存储器空间和外部设备空间。
在Intel的x86处理器系统中,外部设备空间与PCI总线域地址空间等效,因为在x86处理器系统中,使用PCI总线统一管理全部外部设备。
为简化起见,本书使用PCI总线域替代外部设备域。
值得注意的是,存储器域的外部设备空间,在PCI总线域中还有一个地址映射。
当处理器访问PCI设备时,首先访问的是这个设备在存储器域上的PCI设备空间,之后HOST主桥将这个存储器域的PCI总线地址转换为PCI总线域的物理地址[3],然后再通过PCI总线事务访问PCI总线域的地址空间。
2.1.2 PCI总线域
在x86处理器系统中,PCI总线域是外部设备域的重要组成部分。
实际上在Intel的x86处理器系统中,所有的外部设备都使用PCI总线管理。
而AMD的x86处理器系统中还存在一条HT(HyperTransport)总线,在AMD的x86处理器系统中还存在HT总线域。
本书对HT总线不做进一步介绍。
PCI总线域(PCISegment)由PCI设备所能直接访问的地址空间组成。
在一个处理器系统中,可能存在多个HOST主桥,因此也存在多个PCI总线域。
如在图21所示的处理器系统中,具有两个HOST主桥,因而在这个处理器系统中存在PCI总线x和y域。
在多数处理器系统中,分属于两个PCI总线域的PCI设备并不能直接进行数据交换,而需要通过FSB进行数据交换。
值得注意的是,如果某些处理器的HOST主桥支持Peer-to-Peer数据传送,那么这个HOST主桥可以支持不同PCI总线域间的数据传送。
PowerPC处理器使用了OCeaN技术连接两个HOST主桥,OCeaN可以将属于x域的PCI数据请求转发到y域,OCeaN支持PCI总线的Peer-to-Peer数据传送。
有关OCeaN技术的详细说明见第2.2节。
2.1.3 处理器域
处理器域是指一个处理器系统能够访问的地址空间集合。
处理器系统能够访问的地址空间由存储器域和外部设备域组成。
其中存储器域地址空间较为简单,而在不同的处理器系统中,外部设备域的组成结构并不相同。
如在x86处理器系统中,外部设备域主要由PCI总线域组成,因为大多数外部设备都是挂接在PCI总线[4]上的,而在PowerPC处理器和其他处理器系统中,有相当多的设备与FSB直接相连,而不与PCI总线相连。
本书仅介绍PCI总线域而不对其他外部设备域进行说明。
其中存储器域与PCI总线域之间由HOST主桥联系在一起。
深入理解这些域的关系是深入理解PCI体系结构的关键所在,实际上这也是理解处理器体系结构的基础。
通过HOST主桥,处理器系统可以将处理器域划分为存储器域与PCI总线域。
其中存储器域与PCI总线域,彼此独立,并通过HOST主桥进行数据交换。
HOST主桥是联系存储器域与PCI总线域的桥梁,是PCI总线域实际的管理者。
有些书籍认为HOST处理器是PCI总线域的管理者,这种说法并不精确。
假设在一个SMP(symmetricmultiprocessing)处理器系统中,存在4个CPU而只有一个HOST主桥,这4个CPU将无法判断究竟谁是HOST处理器。
不过究竟是哪个处理器作为HOST处理器并不重要,因为在一个处理器系统中,是HOST主桥管理PCI总线域,而不是HOST处理器。
当一个处理器系统中含有多个CPU时,如果这些CPU都可以访问HOST主桥,那么这些CPU都可以作为这个HOST主桥所管理PCI总线树的HOST处理器。
在一个处理器系统中,CPU所能访问的PCI总线地址一定在存储器域中具有地址映射;而PCI设备能访问的存储器域的地址也一定在PCI总线域中具有地址映射。
当CPU访问PCI域地址空间时,首先访问存储器域的地址空间,然后经过HOST主桥转换为PCI总线域的地址,再通过PCI总线事务进行数据访问。
而当PCI设备访问主存储器时,首先通过PCI总线事务访问PCI总线域的地址空间,然后经过HOST主桥转换为存储器域的地址后,再对这些空间进行数据访问。
由此可见,存储器域与PCI总线域的转换关系由HOST主桥统一进行管理。
有些处理器提供了一些寄存器进行这种地址映射,如PowerPC处理器使用Inbound和Outbound寄存器组保存存储器域与PCI总线域的地址映射关系;而有些处理器并没有提供这些寄存器,但是存储器域到PCI总线域的转换关系依然存在。
HOST主桥进行不同地址域间的数据交换时,需要遵循以下规则。
为区别存储器域到PCI总线域的地址映射,下文将PCI总线域到存储器域的地址映射称为反向映射。
(1) 处理器访问PCI总线域地址空间时,首先需要访问存储器域的地址空间,之后通过HOST主桥将存储器地址转换为PCI总线地址,之后才能进入PCI总线域进行数据交换。
PCI设备使用的地址空间保存在各自的PCI配置寄存器中,即BAR寄存器中。
这些PCI总线地址空间需要在初始化时映射成为存储器域的存储器地址空间,之后处理器才能访问这些地址空间。
在有些处理器的HOST主桥中,具有独立的寄存器保存这个地址映射规则,如PowerPC处理器的Outbound寄存器组;而有些处理器,如在x86处理器中,虽然没有这样的寄存器组,但是在HOST主桥的硬件逻辑中仍然存在这个地址转换的概念。
(2) PCI设备访问存储器域时,首先需要访问PCI总线域的地址空间,之后通过HOST主桥将PCI总线地址转换为存储器地址,之后才能穿越HOST主桥进行数据交换。
为此处理器需要通过HOST主桥将这个PCI总线地址反向映射为存储器地址。
PCI设备不能访问在PCI总线域中没有进行这种反向映射的存储器域地址空间。
PowerPC处理器使用Inbound寄存器组存放PCI设备所能访问的存储器空间,而在x86处理器中并没有这样的寄存器组,但是依然存在这个地址转换的概念。
(3) 如果HOST主桥不支持Peer-to-Peer传送方式,那么分属不同PCI总线域的PCI设备间不能直接进行数据交换。
在32位的PCI总线中,每一个PCI总线域的地址范围都是0x0000-0000~0xFFFF-FFFF,但是这些地址没有直接联系。
PCI总线x域上的PCI总线地址0x0000-0000与PCI总线y域上的PCI总线地址0x0000-0000并不相同,而且这两个PCI总线地址经过HOST主桥反向映射后,得到的存储器地址也不相同。
本篇在第2.2节中,主要以PowerPC处理器为例说明HOST主桥的实现机制,并在第2.2.4节简要说明了x86处理器中的南北桥构架。
尽管部分读者对PowerPC处理器并不感兴趣,笔者仍然强烈建议读者仔细阅读第2.2节的全部内容。
在PowerPC处理器中,HOST主桥的实现比较完整,尤其是PCI总线域与存储器域的映射关系比较明晰,便于读者准确掌握这个重要的概念。
而x86处理器由于考虑向前兼容,设计中包含了太多的不得已,x86处理器有时不得不保留原设计中的不完美,向前兼容是Intel的重要成就,也是一个沉重的十字架。
[1] MPC8548处理器基于E500V2内核。
目前E500内核包括V1,V2和mc(MultiCore)三个版本。
[2] x86处理器的MemoryFence指令为MFENCE,LFENCE和SFENCE,而PowerPC处理器的MemoryFence指令为msync和mbar。
[3] PCI总线域只含有物理地址,因此下文将直接使用PCI总线地址,而不使用PCI总线物理地址。
[4] AMD的x86处理器中的某些外部设备,可能是基于HT总线,而不使用PCI总线。
2.2 HOST主桥
(2011-05-0313:
15:
42)
转载▼
标签:
杂谈
分类:
浅谈PCIe体系结构
本节以MPC8548处理器为例说明HOST主桥在PowerPC处理器中的实现机制,并简要介绍x86处理器系统使用的HOST主桥。
MPC8548处理器是Freescale基于E500V2内核的一个PowerPC处理器,该处理器中集成了DDR控制器、多个eTSEC(EnhancedThree-SpeedEthernetController)、PCI/PCI-X和PCIe总线控制器等一系列接口。
MPC8548处理器的拓扑结构如图22所示。
如上图所示,MPC8548处理器的L1Cache在E500V2内核中,而L2Cache与FSB[1]直接相连,不属于E500内核。
值得注意的是有些高端PowerPC处理器的L2Cache也在CPU中,而L3Cache与CCB总线直接相连。
在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部件的拓扑结构如图23所示。
在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号由总线号(BusNumber)、设备号(DeviceNumber)和功能号(FunctionNumber)组成。
其中总线号在HOST主桥遍历PCI总线树时确定。
PCI总线可以使用PCI桥扩展PCI总线,并形成一颗PCI总线树。
在一颗PCI总线树上,有几个PCI桥(包括HOST主桥),就有几条PCI总线。
在一颗PCI总线树中,总线号由系统软件决定,通常与HOST主桥直接相连的PCI总线编号为0,系统软件使用DFS(Depth-FirstSearch)算法扫描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个寄存器的地址偏移和属性如表21所示。
表21 PCI总线配置寄存器
Offset
寄存器
属性
复位值
0x0_8000
CFG_ADDR
可读写
0x0000-0000
0x0_8004
CFG_DATA
可读写
0x0000-0000
0x0_8008
INT_ACK
只读
0x0000-0000
在MPC8548处理器中,所有内部寄存器都使用存储器映射方式进行寻址,并存放在以BASE_ADDR[4]变量为起始地址的“1MB连续的物理地址空间”中。
PowerPC处理器可以通过BASE_ADDR+Offset的方式访问表21中的寄存器。
MPC8548处理器使用CFG_ADDR寄存器和CFG_DATA寄存器访问PCI设备的配置空间,其中用CFG_ADDR寄存器保存PCI设备的ID号和寄存器号,该寄存器的各个字段的详细说明如下所示。
∙ Enable位。
当该位为1时,HOST主桥使能对PCI设备配置空间的访问,当HOST处理器对CFG_DATA寄存器进行访问时,HOST主桥将对这个寄存器的访问转换为PCI配置读写总线事务并发送到PCI总线上。
∙ BusNumber字段记录PCI设备所在的总线号。
∙ DeviceNumber字段记录PCI设备的设备号。
∙ FunctionNumber字段记录PCI设备的功能号。
∙RegisterNumber字段记录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主桥需要进行端模式转换。
我们以源代码21为例说明PowerPC处理器如何访问PCI配置空间。
源代码21 PowerPC处理器访问PCI配置空间
stwr0,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处理器中,源代码21执行完毕后,寄存器r3保存的值为0x6677-8899,而不是0x9988-6677。
系统程序员在使用这个返回值时,一定要注意大小端模式的转换。
值得注意的是,源代码21可以使用lwbrx指令进行优化,该指令可以在读取数据的同时,进行大小端模式的转换。
处理器读取INT_ACK寄存器时,HOST主桥将这个读操作转换为PCI总线中断响应事务。
PCI总线中断响应事务的作用是通过PCI总线读取中断控制器的中断向量号,这样做的前提是中断控制器需要连接在PCI总线上。
PowerPC处理器使用的MPIC中断控制器不是挂接在PCI总线上,而是挂接在SoC平台总线上的,因此PCI总线提供的中断应答事务在这个处理器系统中并没有太大用途。
但是并不排除某些PowerPC处理器系统使用了挂接在PCI总线上的中断控制器,比如PCI南桥芯片,此时PowerPC处理器系统需要使用中断应答事务读取PCI南桥中的中断控制器,以获取中断向量号。
2.2.2 存储器域地址空间到PCI总线域地址空间的转换
MPC8548处理器使用ATMU(AddressTranslationandMappingUnit)寄存器组进行存储器域到PCI总线域,以及PCI总线域到存储器域的地址映射。
ATMU寄存器组由两大组寄存器组成,分别为Outbound和Inbound寄存器组。
其中Outbound寄存器组将存储器域的地址转换为PCI总线域的地址,而Inbound寄存器组将PCI总线域的地址转换为存储器域的地址。
在MPC8548处理器中,只有当CPU读写访问的地址范围在Outbound寄存器组管理的地址空间之内时,HOST主桥才能接收CPU的读写访问,并将CPU在存储器域上的读写访问转换为PCI总线域上的读写访问,然后才能对PCI设备进行读写操作。
如图22所示,CPU对存储器域的地址访问,首先使用CCB总线事务,如果所访问的地址在Cache中命中时,则从Cache中直接获得数据,否则将从存储器域中获取数据。
而在绝大多数情况下,外部设备使用的地址空间是不可Cache[5]的,所以在绝大多数情况之下,发向PCI设备的CCB总线事务并不会与Cache进行数据交换。
如果CCB总线事务使用的地址在HOST主桥的Outbound寄存器窗口中命中时,HOST主桥将接收这个CCB总线事务,并将其转换为PCI总线事务之后,再发送到PCI总线上。
MPC8548处理器的每一个HOST主桥都提供了5个Outbound寄存器窗口来实现存储器域地址到PCI总线域地址的映射,其映射过程如图24所示。
在介绍MPC8548处理器如何使用Outbound寄存器组进行存储器域地址空间到PCI总线域地址空间的转换之前,本节将首先介绍Outbound寄存器组中的相应寄存器。
Outbound寄存器组的地址偏移、属性和复位值如表22所示。
表22 PCI/XATMUOutbound寄存器组
地址偏移
寄存器名
属性
复位值
0x0_8C00/20/40/60/80
POTARn
可读写
0x0000-0000
0x0_8C04/2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第2章 PCI总线的桥与配置 PCI 总线 配置