本文以freescale p2040系列硬件(cpu core e500mc)来说明硬件的寻址过程。
首先附上CCSR域配置划分图:
当处理器核e500mc(36-bit physical addr)要访问CPU线性(虚拟)地址virtual_addr时,首先进入的是MMU单元。假如三级页表操作没有错误,这个时候,CPU核已经将要访问的虚拟地址virtual_addr转换成了物理地址physical_addr,这个物理地址对e500mc核来看,就是个local_addr。然后CPU core根据CCSRBAR寄存器中指示的LAW窗口基地址(偏移0xC00开始),查找这个local_addr命中哪个LAWn(n为0~31)。假设能够命中,这个时候,我们就知道这个地址对应的是什么接口控制器了。
下面先列出这个LAW结构(图中只列出3个LAW,系统共有32个LAW):
每个LAW窗口有三部分组成LAWn_HIGH,LAWn_LOW和LAWn_ATTRIBUTE.
LAWn_HIGH:BaseAddrHigh,如果系统开启了PAE(物理地址扩展),则这4个bit为地址的
bit0~bit3;
LAWn_LOW:BaseAddrLow,表示地址的地址的bit4~bit23;
LAWn_ATTRIBUTE: EN表示使能这个LAW,TARGET_ID表示命中这个LAW的地址对应的外设
接口表示.
比如TARGET_ID为0x00表示PCIe1 constroller,
0x01表示PCIe2 constroller,
0x10表示memory constroller
其他的TARGET_ID见下图:
每个LAW所表示的地址范围为
(BaseAddrHigh + BaseAddrLow) ~ (BaseAddrHigh + BaseAddrLow) +2^(size+1)
当local_addr落在这个区间时,表示命中这个LAW。
经过LAW机制后,我们知道了要访问的地址是什么外设接口,然后系统将地址送到相应的接口:
假如LAW之后,我们命中的LAW指示本次要访问的target为memory constroller,local_addr就被送到memory constroller。这个时候我只知道了是哪个接口,还不知道具体的外设地址(比如系统中有2块DDR RAM),所以接下午需要的是将这个local_addr地址转换成外设地址,而这个是由OutBound的ATMU窗口来完成的。
对于这个ATMU窗口,我没有找到其具体结构的资料:
我们根据LAW送过来的目的地址local_addr,查找这个ATMU窗口,看其是否命中BAR + WAR中描述的地址范围。如果命中,则从TAR中取出目标地址local_addr的map地址。
按照之前的假设,我们的目的地址是个Memory,则这里命中的是DDR memory controller memory map ( CCSRBAR + 0x0_8000)
DDR
memory controller memory map 域的分布一览图如下:
如果ATMU窗口中的TAR给出的片选地址是0x8000,那么表示我们要访问的是CS0片选的内存
然后就是根据DDR_CS0_BANDS的起止地址和TAR给出的偏移地址信息来取得目标地址local_addr对应的外设memory上的地址,最终实现外设地址空间的访问。
DDR_CS0_BANDS的结构如下:
转载的朋友,最后这行信息不要遗漏了^_^
本文描述的信息是基于作者自身的理解,如有错误,或者表述不清楚的,欢迎指正:shaohui973@163.com