龙芯3号处理器是面向个人计算机、服务器等信息化领域的通用处理器。有些方案通过综合考虑(控制成本、特定性能需求、空间限制、特殊环境适应性)会选择将内存颗粒直接设计到板卡上。龙芯固件默认是内存条方案,如果是板贴颗粒方案需要手动修改。
固件下通过mm_ctrl->table.auto_ddr_config = 0;
变量进行内存使用模式选择:
- 0 代表,板贴内存颗粒方案
- 1 代表,内存槽插条方案 (默认配置)
本文主要讲解板贴内存颗粒,固件下如何配置内存参数。
一、内存相关代码位置
1.1 PMON 固件
相关代码位置:
- Targets/ls3a5000_7a/include/mem_ctrl.h
- Targets/ls3a5000_7a/cache_stage/cache_stage.c
1.2 UEFI 固件
相关代码位置:
- LsRefCodePkg/Include/MrcTypes.h
- LsRefCodePkg/SampleCode/Desktop/Ls3aPlatformTable/Pei/mem_feature_init.c
二、内存配置讲解
2.1 通道选择
以龙芯LS3A6000为例,默认有两个内存通道分别是:MC0、MC1,程序里定义为:
-
#define MC0_ENABLE 1
-
#define MC1_ENABLE 1
-
0 代表,关闭
-
1 代表,使能(默认配置)
2.2 代码里内存信息
- 参数含义
#define DDR2 0x8
#define DDR3 0xb
#define DDR4 0xc
/*------------------------------------------------------------
| CID_NUM | 2'h0 | no cid |
| | 2'h1 | 2dies |
| | 2'h2 | 4dies |
| | 2'h3 | 8dies |
| SDRAM_BG_SIZE | 2'h0 | no bank group |
| | 2'h1 | 2 bank group |
| | 2'h2 | 4 bank group |
| SDRAM_BA_SIZE | 1'h0 | 4 bank |
| | 1'h1 | 8 bank |
| SDRAM_ROW_SIZE | 3'hx | 18-x |
| SDRAM_COL_SIZE | 2'hx | 12-x |
| ADDR_MIRROR | 1'b1 | ADDR MIRROR |
| | 1'b0 | STANDARD |
| DIMM_MEMSIZE |12'bx | x*1MB |
| DIMM_WIDTH | 2'h0 | 8bit//not support |
| | 2'h1 | 16bit |
| | 2'h2 | 32bit |
| | 2'h3 | 64bit |
| DIMM_ECC | 1'b1 | With ECC |
| | 1'b0 | No ECC |
| DIMM_TYPE | 2'h0 | Unbuffered DIMM |
| | 2'h1 | Registered DIMM |
| | 2'h2 | SO-DIMM |
| | 2'h3 | Load Reduced DIMM |
| SDRAM_WIDTH | 2'h0 | x4 |
| | 2'h1 | x8 |
| | 2'h2 | x16 |
| SDRAM_TYPE | 3'h0 | NO_DIMM |
| | 3'hb | DDR3 |
| | 3'hc | DDR4 |
| MC_CSMAP | 8'b0 | CS7-CS0 |
------------------------------------------------------------*/
- 通道MC0默认参数
#define MC0_MEMSIZE 8192
#define MC0_DRAM_TYPE DDR4
#define MC0_DIMM_TYPE 0
#define MC0_MODULE_TYPE 2
#define MC0_CID_NUM 0
#define MC0_BA_NUM 0
#define MC0_BG_NUM 2
#define MC0_CSMAP 1
#define MC0_DRAM_WIDTH 1
#define MC0_MODULE_WIDTH 3
#define MC0_ECC 0
#define MC0_SDRAM_CAPACITY 0
#define MC0_COL_NUM 2
#define MC0_ROW_NUM 2
#define MC0_ADDR_MIRROR 0
#define MC0_BG_MIRROR 0
2.3 参数信息详解
例子,仅使用了通道MC0,内存颗粒DDR4 SDRAM MT40A512M16进行讲解。
2.3.1 内存颗粒
2.3.2 MC0通道参数配置
-
MC0_MEMSIZE
通道MC0 总容量大小,单位是MB,数值为:8192
-
MC0_DRAM_TYPE
内存颗粒类型,龙芯3号处理使用的是ddr4控制器,数值为:c
0 代表: NO_DIMM
b 代表:DDR3
c 代表:DDR4 (默认值) -
MC0_DIMM_TYPE
不用关心,使用默认值
-
MC0_MODULE_TYPE
不用关心,使用默认值
-
MC0_CID_NUM
不用关心,使用默认值
-
MC0_BA_NUM
Bank group address 2个,数值为:1
0代表,no bank group
1代表,2 bank group
2代表,4 bank group -
MC0_BG_NUM
Bank address in bank group 4个,数值为:0
0代表,4 bank
1代表,8 bank -
MC0_CSMAP
片选使用个数,和硬件工程师确认,使用的是cs0和cs1 ,数值为:3
物理CS7-CS0指芯片引脚,1代表有cs连接,0代表没有链接
列举3个例子 | CSMAP | cs7 | cs6 | cs5 | cs4 | cs3 | cs2 | cs1 | cs0 |
---|---|---|---|---|---|---|---|---|---|
例子1:使用cs0 | 0x1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
例子2:使用cs4 | 0x10 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
例子3:使用cs0、cs1 | 0x3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
-
MC0_DRAM_WIDTH
X几模式,使用的是X16,数值为:2
0代表,X4
1代表,X8
2代表,X16 -
MC0_MODULE_WIDTH
数据位数,使用的是64位,数值为:3
0代表,8bit 不支持
1代表,16bit
2代表,32bit
3代表,64bit (默认值) -
MC0_ECC
和硬件工程师确认,没有使用ecc,数值为:0
0代表,没有ecc
1代表,有ecc -
MC0_SDRAM_CAPACITY
不用关心,使用默认值
-
MC0_COL_NUM
列位数, 12-10(A[9:0]),数值为:2
公式为:12-x -
MC0_ROW_NUM
行位数, 18-16(A[15:0]),数值为:2
公式为:18-x -
MC0_ADDR_MIRROR
是否有地址镜像,和硬件工程师确认,有使用了,数值为:1
0代表,未使用
1代表,有使用 -
MC0_BG_MIRROR
是否有BG地址镜像,和硬件工程师确认,未使用,数值为:0
0代表,未使用
1代表,有使用
最终修改结果
通道 | 容量 | BA数 | BG数 | 片选 | 位宽 | ECC | 行数 | 列数 | 地址镜像 |
---|---|---|---|---|---|---|---|---|---|
通道选择 | MB | 4 bank | 2 bank group | cs0、cs1 | X16 | 无ecc | 16 | 10 | 有 |
MC0 | 8192 | 0 | 1 | 3 | 2 | 0 | 2 | 2 | 1 |
#define MC0_ENABLE 1
#define MC1_ENABLE 0
#define MC0_MEMSIZE 8192
#define MC0_DRAM_TYPE DDR4
#define MC0_DIMM_TYPE 0
#define MC0_MODULE_TYPE 2
#define MC0_CID_NUM 0
#define MC0_BA_NUM 0
#define MC0_BG_NUM 1
#define MC0_CSMAP 3
#define MC0_DRAM_WIDTH 2
#define MC0_MODULE_WIDTH 3
#define MC0_ECC 0
#define MC0_SDRAM_CAPACITY 0
#define MC0_COL_NUM 2
#define MC0_ROW_NUM 2
#define MC0_ADDR_MIRROR 1
#define MC0_BG_MIRROR 0