接着上篇的代码来。
1.上代码
PRINTSTR("PCI space open: 0x80000000 - 0x8FFFFFFF\r\n") //打印信息
//config high memory windows
GET_MC_SEL_BITS
beqz a1, 84f //不跳转
nop
/* Assume MC0_ONLY */
GET_MC0_MEMSIZE //a1 = 16
move t5, a1
GET_MC1_ONLY
beqz a1, 1f //a1不等于0,不跳转
nop
//MC1_ONLY
GET_MC1_MEMSIZE
move t5, a1 //t5 = 16
1:
//use one MC only, currently only support 512M, 1G, 2G, 3G, 4G, 6G, 8G
move a1, t5
dli t5, 0x1
beq a1, t5, 1f
nop
dli t5, 0x2
beq a1, t5, 2f
nop
dli t5, 0x4
beq a1, t5, 3f
nop
dli t5, 0x6
beq a1, t5, 4f
nop
dli t5, 0x8
beq a1, t5, 5f
nop
dli t5, 0xc
beq a1, t5, 6f
nop
dli t5, 0x10
//temp code, MEM size >= 8G, use 8G only
bgeu a1, t5, 7f //跳转到7
nop
b 89f //error condition
nop
检测内存的大小,我们是8G,跳转到7
2.继续
7: //ddr_8GB_MC0:
GET_NODE_ID_a0;
XBAR_CONFIG_NODE_a0(0x20, \
0x0000000080000000, \
0xFFFFFFFF80000000, \
0x00000000000000F0)
XBAR_CONFIG_NODE_a0(0x28, \
0x0000000100000000, \
0xFFFFFFFF00000000, \
0x00000001000000F0)
XBAR_CONFIG_NODE_a0(0x30, \
0x0000000200000000, \
0xFFFFFFFF80000000, \
0x00000000800000F0)
PRINTSTR("MC0 space open : 0x080000000 - 0x27FFFFFFF\r\n")
b 81f
nop
a0 = 0.表示node_id
2.1 展开宏,前面我们分析过。
#define XBAR_CONFIG_NODE_a0(OFFSET, BASE, MASK, MMAP) \
daddiu v0, t0, OFFSET; \
dli v1, BASE; \
or v1, v1, a0; \
sd v1, 0x00(v0); \
dli v1, MASK; \
sd v1, 0x40(v0); \
dli v1, MMAP; \
sd v1, 0x80(v0);
v0 = t0 + offset(0x20,0x28,0x30) = 0x900000003ff00020,0x900000003ff00028,0x900000003ff00030 (CPU的win4,win5,win6)
v1 = 0,或上a0(0x8000,0000/0x1,0000,0000/0x2,0000,0000) 还是(0x8000,0000/0x1,0000,0000/0x2,0000,0000)
把v1(0) 写入 0x3ff0,0020 (0x28,0x30)
v1 = MASK
把v1(0xffff,ffff,f000,000) 写入 0x3ff0,0060 (0x68,0x70)
v1 = MMAP
把v1 写入 0x3ff0,00a0 (0xa8,0xb0)
根据映射规则:
1.0x8000,0000~0xffff,ffff映射到DDR0,映射范围 0x8000,0000~0xffff,ffff (2G)
2.0x1,0000,0000~0x1,ffff,ffff 映射到 DDR0,映射范围0x1,0000,0000~0x1,ffff,ffff (4G)
3.0x2,0000,0000~0x2,7fff,ffff 映射到 DDR0,映射范围 0x2,8000,0000~0x2,ffff,ffff (2G)
3.继续
81:
GET_MC1_ONLY
beqz a1, 81f //等于0,跳转到1236行,81标号处
nop
4.继续到 1236行。
81: //从636行 直接跳到这里????????
//Config other PCI space exactly as cpu windows
L2XBAR_CONFIG_PCI_AS_CPU(0x20);
L2XBAR_CONFIG_PCI_AS_CPU(0x28);
L2XBAR_CONFIG_PCI_AS_CPU(0x30);
L2XBAR_CONFIG_PCI_AS_CPU(0x38);
PRINTSTR("Full PCI space opened as cpu.\r\n") //打印了
4.1 展开宏定义
#define L2XBAR_CONFIG_PCI_AS_CPU(OFFSET) \
daddiu v0, t0, OFFSET; \
ld v1, 0x0(v0); \
sd v1, 0x100(v0); \
ld v1, 0x40(v0); \
sd v1, 0x140(v0); \
ld v1, 0x80(v0); \
sd v1, 0x180(v0);
这里偏移地址分别为0x20,0x28,0x30,0x38
v0 = t0 + offset(0x20,0x28,0x30,0x38) = 0x900000003ff00020,0x900000003ff00028,0x900000003ff00030,0x900000003ff00038
读取寄存器的数据
写入到0x120,0x128,0x130,0x138寄存器,配置的是PCI的win4,win5,win6,win7寄存器
访问的空间与cpu一致
1.0x8000,0000~0xffff,ffff映射到DDR0,映射范围 0x8000,0000~0xffff,ffff (2G)
2.0x1,0000,0000~0x1,ffff,ffff 映射到 DDR0,映射范围0x1,0000,0000~0x1,ffff,ffff (4G)
3.0x2,0000,0000~0x2,7fff,ffff 映射到 DDR0,映射范围 0x2,8000,0000~0x2,ffff,ffff (2G)
4.win7应该是0.
5.设置mszie=32,程序结束
/*****************************
4. set msize for this NODE(if the memsize is supported)
******************************/
GET_MC0_ONLY
beqz a1, 1f //等于0,跳转
nop
//use MC0 only
GET_MC0_MEMSIZE
move t5, a1
b 2f
nop
1:
GET_MC1_ONLY
beqz a1, 1f //等于0,跳转
nop
//use MC1 only
GET_MC1_MEMSIZE
move t5, a1
b 2f
nop
1:
//use MC0&MC1
GET_MC0_MEMSIZE //a1= 16
move t5, a1
GET_MC1_MEMSIZE
daddu t5, t5, a1 //t5= 32
2:
GET_NODE_ID_a0; //a0 = 0
dsrl a0, a0, 44 //because of the macro define
dsll a0, a0, 3 //a0=a0*8
dsll t5, t5, a0
or msize, msize, t5 //msize = 32
#ifdef PRINT_MSG
PRINTSTR("\r\nmsize = 0x")
move a0, msize
bal hexserial
nop
PRINTSTR("\r\n")
#endif
b 88f
nop
88:
sync
nop
nop
nop
nop