2 #include <asm/arch/regs_global.h>
3 #include <asm/arch/regs_emc.h>
4 #include <asm/arch/sdram.h>
6 #include <linux/types.h>
7 #include <asm/arch/regs_cpc.h>
8 #include <asm/arch/sdram_cfg.h>
9 #include <asm/arch/bits.h>
10 #include <asm/arch/sdram.h>
12 /********************************************
13 * SDRAM pin configuration, include direction
15 * ******************************************/
16 static void pin_driver_set(void)
20 for(i = CPC_EMA0_REG; i<= CPC_EMD15_REG; i+=4)
21 writel(0x31, i); //sdram config, direction:output, driver strength:3
23 //use SDRAM/DDR, set the bit on
24 reg_config = readl(CPC_EMBA1_REG);
26 writel(reg_config, CPC_EMBA1_REG);
30 static void on_chip_ram_en(void)
32 REG32(GEN2_ADDR)= ON_CHIP_RAM_EN;
35 //file the sdram_config_info structure
36 static void get_config(sdram_cfg_t *sdram_config_info)
38 sdram_config_info->bank_mode = CONFIG_SYS_SDRAM_BANK_CNT;
39 sdram_config_info->row_mode = CONFIG_SYS_SDRAM_ROW_CNT;
40 sdram_config_info->col_mode = CONFIG_SYS_SDRAM_COL_CNT;
41 sdram_config_info->data_width = CONFIG_SYS_SDRAM_DATA_WIDTH;
42 sdram_config_info->burst_length = CONFIG_SYS_SDRAM_BURST_LENGTH;
43 sdram_config_info->cas_latency = CONFIG_SYS_SDRAM_CAS_LATENCY;
44 sdram_config_info->ext_mode_val = CONFIG_SYS_SDRAM_EXT_MODE;
45 sdram_config_info->sdram_size = CONFIG_SYS_SDRAM_SIZE_M;
46 sdram_config_info->clk_dly = CONFIG_SYS_SDRAM_CLK_DELAY;
49 //fill the sdram_timing_param structure
50 static void get_timing_param(sdram_timing_t *sdram_timing_param)
52 sdram_timing_param->row_ref_max = CONFIG_SYS_SDRAM_ROW_REFRESH_MAX;
53 sdram_timing_param->row_pre_min = CONFIG_SYS_SDRAM_ROW_PRECHARGE_MIN;
54 sdram_timing_param->row_cyc_min = CONFIG_SYS_SDRAM_ROW_CYCLE_MIN;
55 sdram_timing_param->rcd_min = CONFIG_SYS_SDRAM_TRCD_MIN;
56 sdram_timing_param->wr_min = CONFIG_SYS_SDRAM_TWR_MIN;
57 sdram_timing_param->mrd_min = CONFIG_SYS_SDRAM_TMRD_MIN;
58 sdram_timing_param->rfc_min = CONFIG_SYS_SDRAM_TRFC_MIN;
59 sdram_timing_param->xsr_min = CONFIG_SYS_SDRAM_TXSR_MIN;
60 sdram_timing_param->ras_min = CONFIG_SYS_SDRAM_TRAS_MIN;
63 void general_ctl_cfg(sdram_cfg_t *sdram_cfg)
66 uint32_t rburst_length = sdram_cfg->burst_length;
67 uint32_t wburst_length = sdram_cfg->burst_length;
68 uint32_t data_width = sdram_cfg->data_width;
74 // //Enable ch2, no switch
75 REG32(EXT_MEM_CFG0) |= (BIT_2|BIT_12|BIT_13);
77 //Config channel0 big endian
78 REG32(EXT_MEM_CFG0) |= BIT_4;
80 //Disable all channel eburst_hit_en
81 REG32(EXT_MEM_CFG0) &= ~(BIT_20|BIT_21|BIT_22|BIT_23);
83 //DMEM enable, (CS0)-->DMEM
84 REG32(EXT_MEM_CFG1) |= (BIT_0|BIT_10); //DMEM enable
85 REG32(EXT_MEM_CFG1) &=~BIT_4; //kewang add for 128M sdram
86 REG32(EXT_MEM_CFG1) |=BIT_5;// kewang
88 REG32(EXT_MEM_CFG1) &= ~(BIT_12); //Clear smem_only_en
90 REG32(EXT_MEM_CFG1) &= ~(BIT_9); //SDRAM mode
92 if(data_width == DATA_WIDTH_16){
93 //Config read/write latency for cs0 here...
94 if(rburst_length == BURST_LEN_8) {
95 rburst_length = BURST_LEN_4;
96 }else if(rburst_length == BURST_LEN_4){
97 rburst_length = BURST_LEN_2;
99 if(wburst_length == BURST_LEN_8){
100 wburst_length = BURST_LEN_4;
101 }else if(wburst_length == BURST_LEN_4){
102 wburst_length = BURST_LEN_2;
105 reg_config = REG32(EXT_MEM_CFG2);
106 reg_config &= ~(0x3 | (0x3<<8));
107 reg_config |= (rburst_length | (wburst_length<<8));
108 REG32(EXT_MEM_CFG2) = reg_config;
109 }else if(data_width == DATA_WIDTH_32){
110 //Config read/write latency for cs0 here...
111 reg_config = REG32(EXT_MEM_CFG2);
112 reg_config &= ~(0x3 | (0x3<<8));
113 reg_config |= (rburst_length | (wburst_length<<8));
114 REG32(EXT_MEM_CFG2) = reg_config;
120 void dmem_ctl_cfg(uint32_t ahb_clk, const sdram_cfg_t *sdram_cfg_ptr, const sdram_timing_t * sdram_parameters)
124 uint32_t row_mode = sdram_cfg_ptr->row_mode;
125 uint32_t col_mode = sdram_cfg_ptr->col_mode;
126 uint32_t data_width = sdram_cfg_ptr->data_width;
127 uint32_t cas_latency = sdram_cfg_ptr->cas_latency;
128 uint32_t write_latency = 0;
130 uint32_t sdram_cycle_ns = 1000/(ahb_clk); //1000000000/(clk*1000000),this value can be set a little bigger.
131 uint32_t row_number = 0xFFFFFFFF;
133 uint32_t t_ras = sdram_parameters->ras_min/sdram_cycle_ns;//sdram_parameters[T_RAS_MIN]/sdram_cycle_ns ;
134 uint32_t t_xsr = sdram_parameters->xsr_min/sdram_cycle_ns;
135 uint32_t t_rfc = sdram_parameters->rfc_min/sdram_cycle_ns ;
136 uint32_t t_mrd = sdram_parameters->mrd_min/sdram_cycle_ns ;
137 uint32_t t_wr = sdram_parameters->wr_min/sdram_cycle_ns ;
138 uint32_t t_rcd = sdram_parameters->rcd_min/sdram_cycle_ns ;
139 uint32_t t_rp = sdram_parameters->row_pre_min/sdram_cycle_ns ;
140 uint32_t t_ref = sdram_parameters->row_ref_max/sdram_cycle_ns ;
141 uint32_t t_wtr = 0xf;
145 else if(cas_latency == 2)
150 if (row_mode == ROW_MODE_11)
154 else if (row_mode == ROW_MODE_12)
158 else if (row_mode == ROW_MODE_13)
167 if(data_width == DATA_WIDTH_16)
170 }else if(data_width == DATA_WIDTH_32)
175 REG32(EXT_MEM_DCFG0) = ( \
176 DCFG0_BKPOS_HADDR_24_23 | \
179 DCFG0_AUTO_PRE_POSITION_A10 | \
181 DCFG0_CLKDMEM_OUT_EN | \
182 DCFG0_ALTERNATIVE_EN | \
187 REG32(EXT_MEM_DCFG1) = ( \
198 REG32(EXT_MEM_DCFG2) = ( (1<<row_number)|DCFG2_REF_CNT_RST );
199 //rdm/wdm latency should be cfg relatively...
200 REG32(EXT_MEM_DCFG4) = ( cas_latency | (write_latency<<4) );
202 REG32(EXT_MEM_CFG1) &= ~BIT_14;
203 REG32(EXT_MEM_DCFG0) |= BIT_14;
206 REG32(EXT_MEM_DCFG4) = 0x00800209;
207 REG32(EXT_MEM_DCFG6) = 0x00400100;
209 else if (cas_latency == 2)
211 REG32(EXT_MEM_DCFG4) = 0x00600007;
212 REG32(EXT_MEM_DCFG6) = 0x00100100;
220 void sdram_device_init(sdram_cfg_t *sdram_cfg_ptr)
222 uint8_t mode_reg_bl = 0xFF;
223 uint8_t mode_reg_bt = MODE_REG_BT_SEQ; //sequencial mode burst.
224 uint8_t mode_reg_cl = 0xFF;
225 uint8_t mode_reg_opmode = MODE_REG_OPMODE;
226 uint8_t mode_reg_wb = MODE_REG_WB_PRORAM; //Programming burst length for write.
228 uint32_t ex_mode_reg = 0;
229 uint16_t mode_reg = 0;
230 uint8_t dsoft_cs = 0; // command for CS0
232 // since DMEM suport different r/w burst len, how to cfg sdram deviec burst len?
233 switch (sdram_cfg_ptr->burst_length)
236 mode_reg_bl = MODE_REG_BL_2;
239 mode_reg_bl = MODE_REG_BL_4;
242 mode_reg_bl = MODE_REG_BL_8;
245 mode_reg_bl = MODE_REG_BL_8;
249 switch (sdram_cfg_ptr->cas_latency)
252 mode_reg_cl = MODE_REG_CL_1;
255 mode_reg_cl = MODE_REG_CL_2;
258 mode_reg_cl = MODE_REG_CL_3;
261 mode_reg_cl = MODE_REG_CL_3;
265 mode_reg = ((mode_reg_wb<<9) | (mode_reg_opmode<<7)
266 | (mode_reg_cl<<4) | (mode_reg_bt<<3) | mode_reg_bl);
268 ex_mode_reg = sdram_cfg_ptr->ext_mode_val;
270 REG32(EXT_MEM_DCFG3) |= BIT_16 | (dsoft_cs<<28);// Precharge all banks.
271 while ((REG32(EXT_MEM_DCFG3)) & BIT_16);
273 REG32(EXT_MEM_DCFG3) |= BIT_17 | (dsoft_cs<<28);//Auto_ref
274 while ((REG32(EXT_MEM_DCFG3)) & BIT_17);
276 REG32(EXT_MEM_DCFG3) |= BIT_17 | (dsoft_cs<<28);//Auto_ref
277 while ((REG32(EXT_MEM_DCFG3)) & BIT_17);
279 //mode register load.
280 REG32(EXT_MEM_DCFG3) &= ~(0xFFFF);
281 REG32(EXT_MEM_DCFG3) |= (mode_reg | BIT_18 | (dsoft_cs<<28));
282 while ((REG32(EXT_MEM_DCFG3)) & BIT_18);
284 //extended mode register load.
285 if (ex_mode_reg != SDRAM_EXT_MODE_INVALID)
287 REG32(EXT_MEM_DCFG3) &= ~(0xFFFF);
288 REG32(EXT_MEM_DCFG3) |= (ex_mode_reg | BIT_18 | (dsoft_cs<<28));
289 while ((REG32(EXT_MEM_DCFG3)) & BIT_18);
293 void emc_init(uint32_t ahb_clk)
297 sdram_cfg_t sdram_config_info;
298 sdram_timing_t sdram_timing_param;
302 get_config(&sdram_config_info);
303 get_timing_param(&sdram_timing_param);
305 //disable sdram auto refresh
306 reg_config = readl(EXT_MEM_DCFG0);
307 reg_config &= ~(DCFG0_AUTOREF_EN);
308 writel(reg_config, EXT_MEM_DCFG0);
310 general_ctl_cfg(&sdram_config_info);
311 dmem_ctl_cfg(ahb_clk, &sdram_config_info, &sdram_timing_param);
313 sdram_device_init(&sdram_config_info);
315 reg_config = readl(EXT_MEM_DCFG2);
316 reg_config |= DCFG2_REF_CNT_RST;
317 writel(reg_config, EXT_MEM_DCFG2);
319 //enable auto refresh
320 reg_config = readl(EXT_MEM_DCFG0);
321 reg_config |= DCFG0_AUTOREF_EN;
322 writel(reg_config, EXT_MEM_DCFG0);