单龙芯3A3000-7A1000PMON研究学习-(29)撸起袖子干-再来一杯代码10-内存初始化2

接着上篇的代码来。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大智兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值