接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(7)
MPC8548处理器的拓扑结构如图2-2所示:
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(Core Complex Bus)总线事务。如果所访问的地址在Cache中,则从Cache中直接获得数据,否则将从存储器域中获取数据。而在绝大多数情况下,外部设备使用的地址空间是不可Cache的(PCI设备使用的ROM空间可以是“可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 | 可读写 | 0x00000000 |
0x0_8C04/24/44/64/84 | POTEARn | 可读写 | 0x00000000 |
0x0_8C28/48/68/88 | POWBARn | 可读写 | 0x00000000 |
0x0_8C30/50/70/90 | POWARn | 可读写 | 0x00000000 |
(1)POTARn和POTEARn寄存器
在PORTARn和PORTEARn寄存器中保存当前Outbound窗口在PCI总线域的64位地址空间的基地址。这两个寄存器的主要字段如下:
(2)POWBARn和POWARn寄存器
POWBARn寄存器保存当前Outbound窗口在存储器域中的36位地址空间的基地址。其主要字段如下:
POWARn寄存器描述Outbound窗口的属性,其主要字段如下:
(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总线上;如果不在,则将POWBAR0寄存器作为缺省窗口,接管这个存储器访问,并使用寄存器POTAR0和POTEAR0,将处理器物理地址转换为PCI总线地址,当然在正常设计中很少出现这种情况。
许多系统软件,将Outbound窗口两边的寄存器使用“直接相等”的方法进行映射,将存储器域的地址与PCI总线地址设为相同的值。但是系统软件程序员务必注意这个存储器地址与PCI总线地址是分属于存储器域和PCI总线域的,这两个值虽然相等,但是所代表的地址并不相同,一个属于存储器域、而另一个属于PCI总线域。
更多内容请看下回。