1 /******************************************************************************
2 David.Jia 2007.10.29 share_version_union
4 TCC -fpu None -O2 -bi -g+ -apcs /interwork -D__RUN_IN_SDRAM sdram_init.c
5 SC6600R -D_BL_NF_SC6600R_
6 SC6600H -D_BL_NF_SC6600H_
7 SC6600I -D_BL_NF_SC6600I_
8 SC6800 -gtp -cpu ARM926EJ-S -D_REF_SC6800_ -D_BL_NF_SC6800_
9 ******************************************************************************/
12 #include <asm/arch/sci_types.h>
13 #include <asm/arch/arm_reg.h>
14 #include <asm/arch/sdram_cfg.h>
15 #include <asm/arch/chng_freq.h>
16 #include <asm/arch/sc_reg.h>
17 #include <asm/arch/sdram.h>
18 #include <asm/arch/chip.h>
20 #define REG32(x) (*((volatile uint32 *)(x)))
25 LPDDR2_DS_34_OHM = 0xd,
26 LPDDR2_DS_40_OHM = 0xb,
27 LPDDR2_DS_48_OHM = 0x9,
28 LPDDR2_DS_60_OHM = 0x7,
29 LPDDR2_DS_80_OHM = 0x5
34 LPDDR1_DS_33_OHM = 0xa,
35 LPDDR1_DS_31_OHM = 0xb,
36 LPDDR1_DS_48_OHM = 0xc,
37 LPDDR1_DS_43_OHM = 0xd,
38 LPDDR1_DS_39_OHM = 0xe,
39 LPDDR1_DS_55_OHM = 0x5,
40 LPDDR1_DS_64_OHM = 0x4
45 SDLL_PHS_DLY_DEF = 0x0,
46 SDLL_PHS_DLY_36 = 0x3,
47 SDLL_PHS_DLY_54 = 0x2,
48 SDLL_PHS_DLY_72 = 0x1,
49 SDLL_PHS_DLY_90 = 0x0,
50 SDLL_PHS_DLY_108 = 0x4,
51 SDLL_PHS_DLY_126 = 0x8,
52 SDLL_PHS_DLY_144 = 0x12
58 DQS_STEP_DLY_SUB3 = 0,
59 DQS_STEP_DLY_SUB2 = 1,
60 DQS_STEP_DLY_SUB1 = 2,
63 DQS_STEP_DLY_ADD1 = 4,
64 DQS_STEP_DLY_ADD2 = 5,
65 DQS_STEP_DLY_ADD3 = 6,
66 DQS_STEP_DLY_ADD4 = 7,
72 extern uint32 LPDDR1_MEM_DS; //lpddr1 driver strength,refer to multiPHY p155
73 extern uint32 LPDDR2_MEM_DS; //lpddr1 driver strength,
75 extern uint32 B0_SDLL_PHS_DLY; //byte0 sll dll phase delay
76 extern uint32 B1_SDLL_PHS_DLY; //byte1 sll dll phase delay
77 extern uint32 B2_SDLL_PHS_DLY; //byte2 sll dll phase delay
78 extern uint32 B3_SDLL_PHS_DLY; //byte3 sll dll phase delay
80 extern uint32 B0_DQS_STEP_DLY; //byte0 dqs step delay
81 extern uint32 B1_DQS_STEP_DLY; //byte1 dqs step delay
82 extern uint32 B2_DQS_STEP_DLY; //byte2 dqs step delay
83 extern uint32 B3_DQS_STEP_DLY; //byte3 dqs step delay
86 typedef enum MCU_CLK_TYPE_TAG
97 ARM1000_EMC100_AHB200,
98 ARM1000_EMC200_AHB200,
99 ARM1000_EMC400_AHB200,
100 ARM1200_EMC100_AHB200,
101 ARM1200_EMC200_AHB200,
102 ARM1200_EMC400_AHB200,
106 typedef struct ARM_EMC_AHB_CLK_TAG
112 MCU_CLK_TYPE_E clk_type;
115 static const ARM_EMC_AHB_CLK_T s_arm_emc_ahb_clk[] =
117 // mcu_clk arm_clk emc_clk ahb_clk
118 {ARM_CLK_800M, ARM_CLK_800M, ARM_CLK_100M, ARM_CLK_200M, ARM800_EMC100_AHB200},
119 {ARM_CLK_800M, ARM_CLK_800M, ARM_CLK_200M, ARM_CLK_200M, ARM800_EMC200_AHB200},
120 {ARM_CLK_800M, ARM_CLK_800M, ARM_CLK_400M, ARM_CLK_200M, ARM800_EMC400_AHB200},
121 {ARM_CLK_1000M,ARM_CLK_1000M,ARM_CLK_100M, ARM_CLK_200M, ARM1000_EMC100_AHB200},
122 {ARM_CLK_1000M,ARM_CLK_1000M,ARM_CLK_200M, ARM_CLK_200M, ARM1000_EMC200_AHB200},
123 {ARM_CLK_1000M,ARM_CLK_1000M,ARM_CLK_400M, ARM_CLK_200M, ARM1000_EMC400_AHB200},
124 {ARM_CLK_1200M,ARM_CLK_1200M,ARM_CLK_200M, ARM_CLK_200M, ARM1200_EMC200_AHB200},
125 {ARM_CLK_1200M,ARM_CLK_1200M,ARM_CLK_400M, ARM_CLK_200M, ARM1200_EMC400_AHB200},
128 static uint32 GetClockCfg(MCU_CLK_TYPE_E clk_type, uint32 *mcu_clk, uint32 *arm_clk, uint32 *emc_clk, uint32 *ahb_clk)
131 for (i=0; i<(sizeof(s_arm_emc_ahb_clk)/sizeof(s_arm_emc_ahb_clk[0])); i++)
133 if (s_arm_emc_ahb_clk[i].clk_type == clk_type)
135 *mcu_clk = s_arm_emc_ahb_clk[i].mcu_clk;
136 *arm_clk = s_arm_emc_ahb_clk[i].arm_clk;
137 *emc_clk = s_arm_emc_ahb_clk[i].emc_clk;
138 *ahb_clk = s_arm_emc_ahb_clk[i].ahb_clk;
148 for (i=0; i<0x100; i++);
151 static uint32 GET_MPLL_N()
153 return REG32(GR_MPLL_MN)&0x07FF;
156 static uint32 GET_MPLL_M()
159 switch ((REG32(GR_MPLL_MN)>>16)&0x3)
161 case 0x0: M=2; break;
162 case 0x3: M=13;break;
168 static void SET_MPLL_N(uint32 N)
171 mpll =REG32(GR_MPLL_MN);
174 REG32(GR_MPLL_MN) = mpll;
177 static int SET_MPLL_M(uint32 M)
188 mpll = REG32(GR_MPLL_MN);
191 REG32(GR_MPLL_MN) = mpll;
196 static uint32 GetMPllClk (void)
198 return GET_MPLL_M()*GET_MPLL_N()*1000000;
201 static uint32 SetMPllClk (uint32 clk)
208 REG32(GR_GEN1) |= BIT_9; // MPLL Write En
215 REG32(GR_GEN1) &= ~BIT_9; // MPLL Write Dis
219 static uint32 GET_DPLL_N()
221 return REG32(GR_DPLL_MN)&0x07FF;
224 static uint32 GET_DPLL_M()
227 switch ((REG32(GR_DPLL_MN)>>16)&0x3)
229 case 0x0: M=2; break;
230 case 0x3: M=13;break;
236 static uint32 GetDPllClk(void)
238 return GET_DPLL_M()*GET_DPLL_N()*1000000;
241 static uint32 EmcClkConfig(uint32 emc_clk)
243 uint32 src_clk, div, ahb_arm_clk;
245 ahb_arm_clk = REG32(AHB_ARM_CLK);
247 ahb_arm_clk &= ~(0x3f<<14);
248 ahb_arm_clk |= 0xf<<14;
249 REG32(AHB_ARM_CLK) = ahb_arm_clk;
252 ahb_arm_clk &= ~(0x0f<<8); //emc clock div = 0
253 src_clk = GetDPllClk();
254 div = src_clk / emc_clk;
255 ahb_arm_clk &= ~(0x0f<<8);
256 ahb_arm_clk |= ((div-1)&0x0f)<<8;
257 REG32(AHB_ARM_CLK) = ahb_arm_clk;
260 ahb_arm_clk &= ~BIT_3; //emc lcokc async
261 ahb_arm_clk &= ~(0x03<<12); //emc clock src= MPLL/2
262 ahb_arm_clk |= (1<<12); //emc clock src=DPLL
264 REG32(AHB_ARM_CLK) = ahb_arm_clk;
269 static uint32 AhbClkConfig(uint32 ahb_clk)
271 uint32 ahb_arm_clk, div, mcu_clk;
273 mcu_clk = GetMPllClk();
275 ahb_arm_clk = REG32(AHB_ARM_CLK);
276 div = mcu_clk/ahb_clk;
277 if (div*ahb_clk != mcu_clk)
279 ahb_arm_clk &= ~(0x07<<4);
280 ahb_arm_clk |= ((div-1)&0x7)<<4; //ahb clock
281 REG32(AHB_ARM_CLK) = ahb_arm_clk;
284 ahb_arm_clk &= ~(0x03<<23); //MCU clock = MPLL
285 REG32(AHB_ARM_CLK) = ahb_arm_clk;
290 static uint32 AxiClkConfig()
293 ca5_cfg = REG32(AHB_CA5_CFG);
295 if (sci_efuse_overclocking_get())
296 ca5_cfg |= (2 << 11);
299 REG32(AHB_CA5_CFG) = ca5_cfg;
304 static uint32 ArmClkPeriSet()
307 ahb_arm_clk = REG32(AHB_ARM_CLK);
308 ahb_arm_clk &= ~(7<<20);
309 if (sci_efuse_overclocking_get())
310 ahb_arm_clk |= 2 << 20;
312 ahb_arm_clk |= 1<<20;
313 REG32(AHB_ARM_CLK) = ahb_arm_clk;
317 static uint32 DbgClkConfig()
319 uint32 ahb_arm_clk, dbg_div;
320 ahb_arm_clk = REG32(AHB_ARM_CLK);
321 dbg_div = (ahb_arm_clk>>14)&0x3f;
322 if (sci_efuse_overclocking_get())
326 ahb_arm_clk |= dbg_div<<14;
327 REG32(AHB_ARM_CLK) = ahb_arm_clk;
331 static uint32 McuClkConfig(uint32 mcu_clk)
333 if (SetMPllClk(mcu_clk))
335 if (mcu_clk > ARM_CLK_800M)
343 static uint32 ClkConfig()
345 //uint32 mcu_clk, arm_clk, emc_clk, ahb_clk, ahb_arm_clk, div;
346 //if (GetClockCfg(clk_type, &mcu_clk, &arm_clk, &emc_clk, &ahb_clk))
350 if (sci_efuse_overclocking_get()) {
351 /* if used dcdc calibration in uboot, dcdc_arm,dcdc_core set in dcdc_cal.c */
353 reg_data = ADI_Analogdie_reg_read(0x420006AC);
356 ADI_Analogdie_reg_write(0x420006AC, reg_data);
358 #if 1 // default 1.1V regdata = 0;
360 reg_data = ADI_Analogdie_reg_read(0x42000640);
363 reg_data |= (0x1 << 4);
364 ADI_Analogdie_reg_write(0x42000640, reg_data);
368 McuClkConfig(1200000000);
372 McuClkConfig(1000000000);
374 AhbClkConfig(200000000);
375 //EmcClkConfig(emc_clk);
382 MCU_CLK_TYPE_E clk_type;
384 //clk_type = ARM1000_EMC50_AHB200;
385 //clk_type = ARM1000_EMC100_AHB200;
386 clk_type = ARM1000_EMC100_AHB200;
387 //clk_type = ARM1000_EMC400_AHB200;
388 //clk_type = ARM800_EMC100_AHB200;
389 //clk_type = ARM800_EMC200_AHB200;
390 //clk_type = ARM800_EMC400_AHB200;
398 #if defined USE_SPL_DATA
400 #define SPL_DATA_ADR (CONFIG_SYS_TEXT_BASE + (23*1024))
420 #define EMC_PRIV_DATA 0x10
421 #define EMC_MAGIC_DATA 0xabcd1234
423 #if defined SPL_DATA_DBG
424 #define SPL_DATA_DBG_ADR (SPL_DATA_ADR + 0x100)
427 static spl_priv_data* spl_data = NULL;
428 static emc_priv_data* emc_data = NULL;
430 static uint32 GET_SPL_Data()
434 spl_data = (spl_priv_data *)SPL_DATA_ADR;
435 if (spl_data->tag == EMC_PRIV_DATA)
437 emc_data = (emc_priv_data *)(spl_data->data);
438 if (emc_data->flag == EMC_MAGIC_DATA)
440 uint32 check_sum = 0;
441 check_sum ^= emc_data->flag;
442 check_sum ^= emc_data->mem_drv;
443 check_sum ^= emc_data->sdll_phase;
444 check_sum ^= emc_data->dqs_step;
445 if (check_sum == emc_data->check_sum)
453 void Chip_Init (void) /*lint !e765 "Chip_Init" is used by init.s entry.s*/
457 #ifdef CONFIG_NAND_SPL
460 ret = GET_SPL_Data();
464 #if defined USE_SPL_DATA
468 DMC_Init(0, 0, 0, 0);
472 #if defined SPL_DATA_DBG
473 *((volatile unsigned int *)(SPL_DATA_DBG_ADR + 0x00)) = emc_data->mem_drv;
474 *((volatile unsigned int *)(SPL_DATA_DBG_ADR + 0x04)) = emc_data->sdll_phase;
475 *((volatile unsigned int *)(SPL_DATA_DBG_ADR + 0x08)) = emc_data->dqs_step;
476 *((volatile unsigned int *)(SPL_DATA_DBG_ADR + 0x0C)) = emc_data->check_sum;
478 DMC_Init(0, emc_data->mem_drv, emc_data->sdll_phase, emc_data->dqs_step);
481 DMC_Init(0, 0, 0, 0);
485 if(CONFIG_DDR_TIMING_CUSTOM == TRUE)
487 LPDDR1_MEM_DS = CONFIG_LPDDR1_DS;
488 LPDDR2_MEM_DS = CONFIG_LPDDR2_DS;
490 B0_SDLL_PHS_DLY = CONFIG_BYTE0_PHS_DLY;
491 B1_SDLL_PHS_DLY = CONFIG_BYTE1_PHS_DLY;
492 B2_SDLL_PHS_DLY = CONFIG_BYTE2_PHS_DLY;
493 B3_SDLL_PHS_DLY = CONFIG_BYTE3_PHS_DLY;
495 B0_DQS_STEP_DLY = CONFIG_BYTE0_STEP_DLY;
496 B1_DQS_STEP_DLY = CONFIG_BYTE1_STEP_DLY;
497 B2_DQS_STEP_DLY = CONFIG_BYTE2_STEP_DLY;
498 B3_DQS_STEP_DLY = CONFIG_BYTE3_STEP_DLY;
501 #ifdef CONFIG_NAND_SPL
502 if (ret == 0) //chesum is pass
504 LPDDR1_MEM_DS = emc_data->mem_drv;
505 LPDDR2_MEM_DS = emc_data->mem_drv;
507 B0_SDLL_PHS_DLY = (emc_data->sdll_phase&0xff000000)>>24;
508 B1_SDLL_PHS_DLY = (emc_data->sdll_phase&0xff0000)>>16;
509 B2_SDLL_PHS_DLY = (emc_data->sdll_phase&0xff00)>>8;
510 B3_SDLL_PHS_DLY = emc_data->sdll_phase&0xff;
512 B0_DQS_STEP_DLY = (emc_data->dqs_step&0xff000000)>>24;
513 B1_DQS_STEP_DLY = (emc_data->dqs_step&0xff0000)>>16;
514 B2_DQS_STEP_DLY = (emc_data->dqs_step&0xff00)>>8;
515 B3_DQS_STEP_DLY = emc_data->dqs_step&0xff;
519 DMC_Dev_Init(400000000);