Address Map and Accessing CSRs on the OCTEON CPU

Cn71xx这款处理器和我们之前用的powerpc系列处理器有不小的区别,刚开始可能不太适应,但熟悉了之后你会发现mips的处理器更简单。今天先来说一下地址空间和寄存器访问这个最基本的问题。

1. 寄存器如何访问

先来看一个例子,u-boot启动代码,start.s里面如何访问寄存器:
比如OCTEON_GPIO_TX_SET,很大,这是个64bit的寄存器地址:

直接赋值给a4,就可以直接访问了。

这个地址在芯片手册里是这样定义的

大家可能会注意到,芯片手册GPIO_TX_SET的地址是0x0001070000000888,而代码里用的地址却是0x8001070000000888,最高位相差1.
这个涉及到一个mips规定的“xkphys”地址空间,见下图:

“xkphys”是物理地址的一个“窗口”,通过这个窗口,就可以访问任何的物理地址。

结论:从芯片手册查到的物理地址,与上0x8000000000000000,就能得到虚拟地址,cpu就可以访问这个虚拟地址。

2. 地址空间

这款CPU是个64bit的cpu,拥有巨大的64bit地址空间。

2.1. 物理地址空间

还是以GPIO_TX_SET为例,它的物理地址是0x0001070000000888,共49bit的有效地址。与芯片手册说明一致:

Cavium把地址空间分为两类,IO空间和MEM空间。物理地址最高bit是1的都属于IO空间,为0则属于MEM空间。其他的像DID等位段,看看就行了,作用不大。

  • MEM空间特指:DDR内存
  • 剩下的都是IO空间,包括:所有寄存器,PCI的MEM/IO/CONFIG空间,bootbus空间。
  • IO空间和MEM空间最大的区别是:对MEM空间(即DDR)的访问,都经过cache;而对IO空间的访问都不经过cache。

这里,有个和powerpc的重大区别:powerpc的寄存器空间基址可配,但这款cpu的所有寄存器地址都是固定地址。见下图:

特别的,PCI的MEM空间也是固定的

2.2. 虚拟地址空间

08-Ch_3_Software_Overview_r3_June_2009第10小节

3. Linux下的内存视图

3.1. 内核态

3.2. 用户态

3.3. xkphys空间在用户态也可以访问

在内核menuconfig里面可配,默认是打开的.
也就是说,用户态可以访问全部的物理内存和全部的SOC寄存器。
这是个很强大的功能,用户态网口收包,不经过kernel就靠的是它。

cd Cavium_Networks/OCTEON-SDK/linux/kernel_2.6/linux
make menuconfig

results matching ""

    No results matching ""