2 * arch/arm/mach-rk2928/ddr.c-- for ddr3&ddr2
4 * Function Driver for DDR controller
6 * Copyright (C) 2012 Fuzhou Rockchip Electronics Co.,Ltd
15 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/clk.h>
20 #include <asm/cacheflush.h>
21 #include <asm/tlbflush.h>
23 #include <mach/sram.h>
26 typedef uint32_t uint32 ;
29 #define DDR3_DDR2_DLL_DISABLE_FREQ (300) // ¿ÅÁ£dll disableµÄƵÂÊ
30 #define DDR3_DDR2_ODT_DISABLE_FREQ (333) //¿ÅÁ£odt disableµÄƵÂÊ
31 #define SR_IDLE (0x1) //unit:32*DDR clk cycle, and 0 for disable auto self-refresh
32 #define PD_IDLE (0x40) //unit:DDR clk cycle, and 0 for disable auto power-down
33 #define PHY_ODT_DISABLE_FREQ (333) //¶¨ÒåÖ÷¿Ø¶Ëodt disableµÄƵÂÊ
34 #define PHY_DLL_DISABLE_FREQ (266) //¶¨ÒåÖ÷¿Ø¶Ëdll bypassµÄƵÂÊ
36 //#define PMU_BASE_ADDR RK30_PMU_BASE //??RK 2928 PMUÔÚÄÄÀï
37 #define SDRAMC_BASE_ADDR RK2928_DDR_PCTL_BASE
38 #define DDR_PHY_BASE RK2928_DDR_PHY_BASE
39 #define CRU_BASE_ADDR RK2928_CRU_BASE
40 #define REG_FILE_BASE_ADDR RK2928_GRF_BASE
41 #define SysSrv_DdrConf (RK2928_CPU_AXI_BUS_BASE+0x08)
42 #define SysSrv_DdrTiming (RK2928_CPU_AXI_BUS_BASE+0x0c)
43 #define SysSrv_DdrMode (RK2928_CPU_AXI_BUS_BASE+0x10)
44 #define SysSrv_ReadLatency (RK2928_CPU_AXI_BUS_BASE+0x14)
46 #define ddr_print(x...) printk( "DDR DEBUG: " x )
49 /***********************************
51 ***********************************/
54 #define DDR3_BC4_8 (1)
56 #define DDR3_CL(n) (((((n)-4)&0x7)<<4)|((((n)-4)&0x8)>>1))
57 #define DDR3_WR(n) (((n)&0x7)<<9)
58 #define DDR3_DLL_RESET (1<<8)
59 #define DDR3_DLL_DeRESET (0<<8)
62 #define DDR3_DLL_ENABLE (0)
63 #define DDR3_DLL_DISABLE (1)
64 #define DDR3_MR1_AL(n) (((n)&0x7)<<3)
66 #define DDR3_DS_40 (0)
67 #define DDR3_DS_34 (1<<1)
68 #define DDR3_Rtt_Nom_DIS (0)
69 #define DDR3_Rtt_Nom_60 (1<<2)
70 #define DDR3_Rtt_Nom_120 (1<<6)
71 #define DDR3_Rtt_Nom_40 ((1<<2)|(1<<6))
74 #define DDR3_MR2_CWL(n) ((((n)-5)&0x7)<<3)
75 #define DDR3_Rtt_WR_DIS (0)
76 #define DDR3_Rtt_WR_60 (1<<9)
77 #define DDR3_Rtt_WR_120 (2<<9)
79 /***********************************
81 ***********************************/
85 #define DDR2_CL(n) (((n)&0x7)<<4)
86 #define DDR2_WR(n) ((((n)-1)&0x7)<<9)
87 #define DDR2_DLL_RESET (1<<8)
88 #define DDR2_DLL_DeRESET (0<<8)
90 //EMR; //Extended Mode Register
91 #define DDR2_DLL_ENABLE (0)
92 #define DDR2_DLL_DISABLE (1)
94 #define DDR2_STR_FULL (0)
95 #define DDR2_STR_REDUCE (1<<1)
96 #define DDR2_AL(n) (((n)&0x7)<<3)
97 #define DDR2_Rtt_Nom_DIS (0)
98 #define DDR2_Rtt_Nom_150 (0x40)
99 #define DDR2_Rtt_Nom_75 (0x4)
100 #define DDR2_Rtt_Nom_50 (0x44)
103 #define DDR_PLL_REFDIV (1)
104 #define FBDIV(n) ((0xFFF<<16) | (n&0xfff))
105 #define REFDIV(n) ((0x3F<<16) | (n&0x3f))
106 #define POSTDIV1(n) ((0x7<<(12+16)) | ((n&0x7)<<12))
107 #define POSTDIV2(n) ((0x7<<(6+16)) | ((n&0x7)<<6))
109 #define PLL_LOCK_STATUS (0x1<<10)
111 typedef volatile struct tagCRU_STRUCT
113 uint32 CRU_PLL_CON[4][4]; //cru_pll_con[][4] reserved
115 uint32 CRU_CLKSEL_CON[35];
116 uint32 CRU_CLKGATE_CON[10];
117 uint32 reserved2[(0x100-0xf8)/4];
118 uint32 CRU_GLB_SRST_FST_VALUE;
119 uint32 CRU_GLB_SRST_SND_VALUE;
120 uint32 reserved3[(0x110-0x108)/4];
121 uint32 CRU_SOFTRST_CON[9];
123 uint32 reserved4[(0x140-0x138)/4];
124 uint32 CRU_GLB_CNT_TH;
125 } CRU_REG, *pCRU_REG;
127 #define pCRU_Reg ((pCRU_REG)CRU_BASE_ADDR)
129 typedef struct tagGPIO_LH
135 typedef struct tagGPIO_IOMUX
143 //GRF_OS_REG1 ddr message
144 #define DDR_RANK_COUNT (11)
145 #define DDR_COL_COUNT (9)
146 #define DDR_BANK_COUNT (8)
147 #define DDR_ROW_COUNT (6)
148 /********************************
149 GRF ¼Ä´æÆ÷ÖÐGRF_OS_REG1 ´æddr rank£¬typeµÈÐÅÏ¢
150 GRF_SOC_CON2¼Ä´æÆ÷ÖпØÖÆc_sysreqÐźÅÏòpctl·¢ËͽøÈëlow power ÇëÇó
151 GRF_DDRC_STAT ¿É²éѯpctlÊÇ·ñ½ÓÊÜÇëÇó ½øÈëlow power
152 ********************************/
154 #if defined (CONFIG_ARCH_RK3026)
155 typedef volatile struct tagREG_FILE
157 uint32 reserved0[(0xa8-0x0)/4];
158 GPIO_IOMUX_T GRF_GPIO_IOMUX[4]; // 0x00a8
159 uint32 reserved1[(0x100-0xe8)/4];
160 uint32 GRF_GPIO_DS; //0x110
161 uint32 reserved2[(0x118-0x104)/4];
162 GPIO_LH_T GRF_GPIO_PULL[4]; // 0x118
163 uint32 reserved3[(0x140-0x138)/4];
164 uint32 GRF_SOC_CON[3]; // 0x140
165 uint32 GRF_SOC_STATUS0;
166 uint32 GRF_LVDS_CON0;
167 uint32 reserved4[(0x15c-0x154)/4];
168 uint32 GRF_DMAC1_CON[3]; //0x15c
169 uint32 reserved5[(0x17c-0x168)/4];
170 uint32 GRF_UOC0_CON0; //0x17c
171 uint32 reserved6[(0x190-0x180)/4];
172 uint32 GRF_UOC1_CON0; //0x190
173 uint32 GRF_UOC1_COM1;
175 uint32 GRF_DDRC_STAT;
178 uint32 GRF_CPU_CON[6];
179 uint32 GRF_CPU_STATUS[2];
180 uint32 GRF_OS_REG[8];
181 uint32 reserved9[(0x200-0x1e8)/4];
182 uint32 GRF_DLL_CON[4]; //0X200
183 uint32 GRF_DLL_STATUS;
184 uint32 reserved10[(0x220-0x214)/4];
185 uint32 GRF_DFI_WRNUM; //0X220
186 uint32 GRF_DFI_RDNUM;
187 uint32 GRF_DFI_ACTNUM;
188 uint32 GRF_DFI_TIMERVAL;
189 uint32 GRF_NIF_FIFO[4];
190 uint32 reserved11[(0x280-0x240)/4];
191 uint32 GRF_USBPHY0_CON[8];
192 uint32 GRF_USBPHY1_CON[8];
193 uint32 reserved12[(0x300-0x2c0)/4];
195 } REG_FILE, *pREG_FILE;
198 typedef volatile struct tagREG_FILE
200 uint32 reserved1[(0xa8-0x0)/4]; //42
201 uint32 GRF_GPIO_IOMUX[16]; //ÆäÖÐ 12£¬13reserved
202 uint32 reserved2[(0x118-0xe8)/4]; //12
203 GPIO_LH_T GRF_GPIO_PULL[4];
204 uint32 reserved3[(0x140-0x138)/4]; // 2
205 uint32 GRF_SOC_CON[3];
206 uint32 GRF_SOC_STATUS0;
207 uint32 GRF_LCDS_CON0;
208 uint32 reserved4[(0x15c-0x154)/4]; // 2
209 uint32 GRF_DMAC1_CON[3];
210 uint32 reserved5[(0x16c-0x168)/4]; // 1
211 uint32 GRF_UOC0_CON[5];
212 uint32 GRF_UOC1_CON[6];
213 uint32 reserved6[(0x19c-0x198)/4]; // 1
214 uint32 GRF_DDRC_STAT;
215 uint32 reserved7[(0x1c8-0x1a0)/4]; //10
216 uint32 GRF_OS_REG[4];
217 } REG_FILE, *pREG_FILE;
220 #define pGRF_Reg ((pREG_FILE)REG_FILE_BASE_ADDR)
223 #define INIT_STATE (0)
224 #define CFG_STATE (1)
226 #define SLEEP_STATE (3)
227 #define WAKEUP_STATE (4)
232 #define Config_req (2)
234 #define Access_req (4)
235 #define Low_power (5)
236 #define Low_power_entry_req (6)
237 #define Low_power_exit_req (7)
240 #define mddr_lpddr2_clk_stop_idle(n) ((n)<<24)
241 #define pd_idle(n) ((n)<<8)
242 #define mddr_en (2<<22)
243 #define lpddr2_en (3<<22)
244 #define ddr2_en (0<<5)
245 #define ddr3_en (1<<5)
246 #define lpddr2_s2 (0<<6)
247 #define lpddr2_s4 (1<<6)
248 #define mddr_lpddr2_bl_2 (0<<20)
249 #define mddr_lpddr2_bl_4 (1<<20)
250 #define mddr_lpddr2_bl_8 (2<<20)
251 #define mddr_lpddr2_bl_16 (3<<20)
252 #define ddr2_ddr3_bl_4 (0)
253 #define ddr2_ddr3_bl_8 (1)
254 #define tfaw_cfg(n) (((n)-4)<<18)
255 #define pd_exit_slow (0<<17)
256 #define pd_exit_fast (1<<17)
257 #define pd_type(n) ((n)<<16)
258 #define two_t_en(n) ((n)<<3)
259 #define bl8int_en(n) ((n)<<2)
260 #define cke_or_en(n) ((n)<<1)
263 #define power_up_start (1<<0)
266 #define power_up_done (1<<0)
269 #define dfi_init_complete (1<<0)
272 #define cmd_tstat (1<<0)
275 #define cmd_tstat_en (1<<1)
278 #define Deselect_cmd (0)
288 #define lpddr2_op(n) ((n)<<12)
289 #define lpddr2_ma(n) ((n)<<4)
291 #define bank_addr(n) ((n)<<17)
292 #define cmd_addr(n) ((n)<<4)
294 #define start_cmd (1u<<31)
296 typedef union STAT_Tag
301 unsigned ctl_stat : 3;
302 unsigned reserved3 : 1;
303 unsigned lp_trig : 3;
304 unsigned reserved7_31 : 25;
308 typedef union SCFG_Tag
313 unsigned hw_low_power_en : 1;
314 unsigned reserved1_5 : 5;
315 unsigned nfifo_nif1_dis : 1;
316 unsigned reserved7 : 1;
317 unsigned bbflags_timing : 4;
318 unsigned reserved12_31 : 20;
322 /* DDR Controller register struct */
323 typedef volatile struct DDR_REG_Tag
325 //Operational State, Control, and Status Registers
326 SCFG_T SCFG; //State Configuration Register
327 volatile uint32 SCTL; //State Control Register
328 STAT_T STAT; //State Status Register
329 volatile uint32 INTRSTAT; //Interrupt Status Register
330 uint32 reserved0[(0x40-0x10)/4];
331 //Initailization Control and Status Registers
332 volatile uint32 MCMD; //Memory Command Register
333 volatile uint32 POWCTL; //Power Up Control Registers
334 volatile uint32 POWSTAT; //Power Up Status Register
335 volatile uint32 CMDTSTAT; //Command Timing Status Register
336 volatile uint32 CMDTSTATEN; //Command Timing Status Enable Register
337 uint32 reserved1[(0x60-0x54)/4];
338 volatile uint32 MRRCFG0; //MRR Configuration 0 Register
339 volatile uint32 MRRSTAT0; //MRR Status 0 Register
340 volatile uint32 MRRSTAT1; //MRR Status 1 Register
341 uint32 reserved2[(0x7c-0x6c)/4];
342 //Memory Control and Status Registers
343 volatile uint32 MCFG1; //Memory Configuration 1 Register
344 volatile uint32 MCFG; //Memory Configuration Register
345 volatile uint32 PPCFG; //Partially Populated Memories Configuration Register
346 volatile uint32 MSTAT; //Memory Status Register
347 volatile uint32 LPDDR2ZQCFG; //LPDDR2 ZQ Configuration Register
349 //DTU Control and Status Registers
350 volatile uint32 DTUPDES; //DTU Status Register
351 volatile uint32 DTUNA; //DTU Number of Random Addresses Created Register
352 volatile uint32 DTUNE; //DTU Number of Errors Register
353 volatile uint32 DTUPRD0; //DTU Parallel Read 0
354 volatile uint32 DTUPRD1; //DTU Parallel Read 1
355 volatile uint32 DTUPRD2; //DTU Parallel Read 2
356 volatile uint32 DTUPRD3; //DTU Parallel Read 3
357 volatile uint32 DTUAWDT; //DTU Address Width
358 uint32 reserved4[(0xc0-0xb4)/4];
359 //Memory Timing Registers
360 volatile uint32 TOGCNT1U; //Toggle Counter 1U Register
361 volatile uint32 TINIT; //t_init Timing Register
362 volatile uint32 TRSTH; //Reset High Time Register
363 volatile uint32 TOGCNT100N; //Toggle Counter 100N Register
364 volatile uint32 TREFI; //t_refi Timing Register
365 volatile uint32 TMRD; //t_mrd Timing Register
366 volatile uint32 TRFC; //t_rfc Timing Register
367 volatile uint32 TRP; //t_rp Timing Register
368 volatile uint32 TRTW; //t_rtw Timing Register
369 volatile uint32 TAL; //AL Latency Register
370 volatile uint32 TCL; //CL Timing Register
371 volatile uint32 TCWL; //CWL Register
372 volatile uint32 TRAS; //t_ras Timing Register
373 volatile uint32 TRC; //t_rc Timing Register
374 volatile uint32 TRCD; //t_rcd Timing Register
375 volatile uint32 TRRD; //t_rrd Timing Register
376 volatile uint32 TRTP; //t_rtp Timing Register
377 volatile uint32 TWR; //t_wr Timing Register
378 volatile uint32 TWTR; //t_wtr Timing Register
379 volatile uint32 TEXSR; //t_exsr Timing Register
380 volatile uint32 TXP; //t_xp Timing Register
381 volatile uint32 TXPDLL; //t_xpdll Timing Register
382 volatile uint32 TZQCS; //t_zqcs Timing Register
383 volatile uint32 TZQCSI; //t_zqcsi Timing Register
384 volatile uint32 TDQS; //t_dqs Timing Register
385 volatile uint32 TCKSRE; //t_cksre Timing Register
386 volatile uint32 TCKSRX; //t_cksrx Timing Register
387 volatile uint32 TCKE; //t_cke Timing Register
388 volatile uint32 TMOD; //t_mod Timing Register
389 volatile uint32 TRSTL; //Reset Low Timing Register
390 volatile uint32 TZQCL; //t_zqcl Timing Register
391 volatile uint32 TMRR; //t_mrr Timing Register
392 volatile uint32 TCKESR; //t_ckesr Timing Register
393 volatile uint32 TDPD; //t_dpd Timing Register
394 uint32 reserved5[(0x180-0x148)/4];
395 //ECC Configuration, Control, and Status Registers
396 volatile uint32 ECCCFG; //ECC Configuration Register
397 volatile uint32 ECCTST; //ECC Test Register
398 volatile uint32 ECCCLR; //ECC Clear Register
399 volatile uint32 ECCLOG; //ECC Log Register
400 uint32 reserved6[(0x200-0x190)/4];
401 //DTU Control and Status Registers
402 volatile uint32 DTUWACTL; //DTU Write Address Control Register
403 volatile uint32 DTURACTL; //DTU Read Address Control Register
404 volatile uint32 DTUCFG; //DTU Configuration Control Register
405 volatile uint32 DTUECTL; //DTU Execute Control Register
406 volatile uint32 DTUWD0; //DTU Write Data 0
407 volatile uint32 DTUWD1; //DTU Write Data 1
408 volatile uint32 DTUWD2; //DTU Write Data 2
409 volatile uint32 DTUWD3; //DTU Write Data 3
410 volatile uint32 DTUWDM; //DTU Write Data Mask
411 volatile uint32 DTURD0; //DTU Read Data 0
412 volatile uint32 DTURD1; //DTU Read Data 1
413 volatile uint32 DTURD2; //DTU Read Data 2
414 volatile uint32 DTURD3; //DTU Read Data 3
415 volatile uint32 DTULFSRWD; //DTU LFSR Seed for Write Data Generation
416 volatile uint32 DTULFSRRD; //DTU LFSR Seed for Read Data Generation
417 volatile uint32 DTUEAF; //DTU Error Address FIFO
418 //DFI Control Registers
419 volatile uint32 DFITCTRLDELAY; //DFI tctrl_delay Register
420 volatile uint32 DFIODTCFG; //DFI ODT Configuration Register
421 volatile uint32 DFIODTCFG1; //DFI ODT Configuration 1 Register
422 volatile uint32 DFIODTRANKMAP; //DFI ODT Rank Mapping Register
423 //DFI Write Data Registers
424 volatile uint32 DFITPHYWRDATA; //DFI tphy_wrdata Register
425 volatile uint32 DFITPHYWRLAT; //DFI tphy_wrlat Register
426 uint32 reserved7[(0x260-0x258)/4];
427 volatile uint32 DFITRDDATAEN; //DFI trddata_en Register
428 volatile uint32 DFITPHYRDLAT; //DFI tphy_rddata Register
429 uint32 reserved8[(0x270-0x268)/4];
430 //DFI Update Registers
431 volatile uint32 DFITPHYUPDTYPE0; //DFI tphyupd_type0 Register
432 volatile uint32 DFITPHYUPDTYPE1; //DFI tphyupd_type1 Register
433 volatile uint32 DFITPHYUPDTYPE2; //DFI tphyupd_type2 Register
434 volatile uint32 DFITPHYUPDTYPE3; //DFI tphyupd_type3 Register
435 volatile uint32 DFITCTRLUPDMIN; //DFI tctrlupd_min Register
436 volatile uint32 DFITCTRLUPDMAX; //DFI tctrlupd_max Register
437 volatile uint32 DFITCTRLUPDDLY; //DFI tctrlupd_dly Register
439 volatile uint32 DFIUPDCFG; //DFI Update Configuration Register
440 volatile uint32 DFITREFMSKI; //DFI Masked Refresh Interval Register
441 volatile uint32 DFITCTRLUPDI; //DFI tctrlupd_interval Register
442 uint32 reserved10[(0x2ac-0x29c)/4];
443 volatile uint32 DFITRCFG0; //DFI Training Configuration 0 Register
444 volatile uint32 DFITRSTAT0; //DFI Training Status 0 Register
445 volatile uint32 DFITRWRLVLEN; //DFI Training dfi_wrlvl_en Register
446 volatile uint32 DFITRRDLVLEN; //DFI Training dfi_rdlvl_en Register
447 volatile uint32 DFITRRDLVLGATEEN; //DFI Training dfi_rdlvl_gate_en Register
448 //DFI Status Registers
449 volatile uint32 DFISTSTAT0; //DFI Status Status 0 Register
450 volatile uint32 DFISTCFG0; //DFI Status Configuration 0 Register
451 volatile uint32 DFISTCFG1; //DFI Status configuration 1 Register
453 volatile uint32 DFITDRAMCLKEN; //DFI tdram_clk_enalbe Register
454 volatile uint32 DFITDRAMCLKDIS; //DFI tdram_clk_disalbe Register
455 volatile uint32 DFISTCFG2; //DFI Status configuration 2 Register
456 volatile uint32 DFISTPARCLR; //DFI Status Parity Clear Register
457 volatile uint32 DFISTPARLOG; //DFI Status Parity Log Register
458 uint32 reserved12[(0x2f0-0x2e4)/4];
459 //DFI Low Power Registers
460 volatile uint32 DFILPCFG0; //DFI Low Power Configuration 0 Register
461 uint32 reserved13[(0x300-0x2f4)/4];
462 //DFI Training 2 Registers
463 volatile uint32 DFITRWRLVLRESP0; //DFI Training dif_wrlvl_resp Status 0 Register
464 volatile uint32 DFITRWRLVLRESP1; //DFI Training dif_wrlvl_resp Status 1 Register
465 volatile uint32 DFITRWRLVLRESP2; //DFI Training dif_wrlvl_resp Status 2 Register
466 volatile uint32 DFITRRDLVLRESP0; //DFI Training dif_rdlvl_resp Status 0 Register
467 volatile uint32 DFITRRDLVLRESP1; //DFI Training dif_rdlvl_resp Status 1 Register
468 volatile uint32 DFITRRDLVLRESP2; //DFI Training dif_rdlvl_resp Status 2 Register
469 volatile uint32 DFITRWRLVLDELAY0; //DFI Training dif_wrlvl_delay Configuration 0 Register
470 volatile uint32 DFITRWRLVLDELAY1; //DFI Training dif_wrlvl_delay Configuration 1 Register
471 volatile uint32 DFITRWRLVLDELAY2; //DFI Training dif_wrlvl_delay Configuration 2 Register
472 volatile uint32 DFITRRDLVLDELAY0; //DFI Training dif_rdlvl_delay Configuration 0 Register
473 volatile uint32 DFITRRDLVLDELAY1; //DFI Training dif_rdlvl_delay Configuration 1 Register
474 volatile uint32 DFITRRDLVLDELAY2; //DFI Training dif_rdlvl_delay Configuration 2 Register
475 volatile uint32 DFITRRDLVLGATEDELAY0; //DFI Training dif_rdlvl_gate_delay Configuration 0 Register
476 volatile uint32 DFITRRDLVLGATEDELAY1; //DFI Training dif_rdlvl_gate_delay Configuration 1 Register
477 volatile uint32 DFITRRDLVLGATEDELAY2; //DFI Training dif_rdlvl_gate_delay Configuration 2 Register
478 volatile uint32 DFITRCMD; //DFI Training Command Register
479 uint32 reserved14[(0x3f8-0x340)/4];
480 //IP Status Registers
481 volatile uint32 IPVR; //IP Version Register
482 volatile uint32 IPTR; //IP Type Register
483 }DDR_REG_T, *pDDR_REG_T;
485 #define pDDR_Reg ((pDDR_REG_T)SDRAMC_BASE_ADDR)
488 #define PHY_AUTO_CALIBRATION (1<<0)
489 #define PHY_SW_CALIBRATION (1<<1)
490 #define PHY_MEM_TYPE (6)
492 //PHY_REG22,25,26,27,28
493 #if defined (CONFIG_ARCH_RK3026) //RK3028A /rk3026
494 #define PHY_RON_DISABLE (0)
495 #define PHY_RON_309ohm (1)
496 #define PHY_RON_155ohm (2)
497 #define PHY_RON_103ohm (3)
498 #define PHY_RON_77ohm (4)
499 #define PHY_RON_63ohm (5)
500 #define PHY_RON_52ohm (6)
501 #define PHY_RON_45ohm (7)
502 //#define PHY_RON_77ohm (8)
503 #define PHY_RON_62ohm (9)
504 //#define PHY_RON_52ohm (10)
505 #define PHY_RON_44ohm (11)
506 #define PHY_RON_39ohm (12)
507 #define PHY_RON_34ohm (13)
508 #define PHY_RON_31ohm (14)
509 #define PHY_RON_28ohm (15)
511 #define PHY_RTT_DISABLE (0)
512 #define PHY_RTT_816ohm (1)
513 #define PHY_RTT_431ohm (2)
514 #define PHY_RTT_287ohm (3)
515 #define PHY_RTT_216ohm (4)
516 #define PHY_RTT_172ohm (5)
517 #define PHY_RTT_145ohm (6)
518 #define PHY_RTT_124ohm (7)
519 #define PHY_RTT_215ohm (8)
520 //#define PHY_RTT_172ohm (9)
521 #define PHY_RTT_144ohm (10)
522 #define PHY_RTT_123ohm (11)
523 #define PHY_RTT_108ohm (12)
524 #define PHY_RTT_96ohm (13)
525 #define PHY_RTT_86ohm (14)
526 #define PHY_RTT_78ohm (15)
529 #define PHY_RON_DISABLE (0)
530 #define PHY_RON_138O (1)
531 //#define PHY_RON_69O (2)
532 //#define PHY_RON_46O (3)
533 #define PHY_RON_69O (4)
534 #define PHY_RON_46O (5)
535 #define PHY_RON_34O (6)
536 #define PHY_RON_28O (7)
538 #define PHY_RTT_DISABLE (0)
539 #define PHY_RTT_212O (1)
540 #define PHY_RTT_106O (4)
541 #define PHY_RTT_71O (5)
542 #define PHY_RTT_53O (6)
543 #define PHY_RTT_42O (7)
546 /* DDR PHY register struct */
547 typedef volatile struct DDRPHY_REG_Tag
549 volatile uint32 PHY_REG1; //PHY soft reset Register
550 volatile uint32 PHY_REG3; //Burst type select Register
551 volatile uint32 PHY_REG2; //PHY DQS squelch calibration Register
552 uint32 reserved1[(0x38-0x0a)/4];
553 volatile uint32 PHY_REG4a; //CL,AL set register
554 volatile uint32 PHY_REG4b; //dqs gata delay select bypass mode register
555 uint32 reserved2[(0x54-0x40)/4];
556 volatile uint32 PHY_REG16; //
557 uint32 reserved3[(0x5c-0x58)/4];
558 volatile uint32 PHY_REG18; //0x5c
559 volatile uint32 PHY_REG19;
560 uint32 reserved4[(0x68-0x64)/4];
561 volatile uint32 PHY_REG21; //0x68
562 uint32 reserved5[(0x70-0x6c)/4];
563 volatile uint32 PHY_REG22; //0x70
564 uint32 reserved6[(0x80-0x74)/4];
565 volatile uint32 PHY_REG25; //0x80
566 volatile uint32 PHY_REG26;
567 volatile uint32 PHY_REG27;
568 volatile uint32 PHY_REG28;
569 uint32 reserved7[(0xd4-0x90)/4];
570 volatile uint32 PHY_REG6; //0xd4
571 volatile uint32 PHY_REG7;
572 uint32 reserved8[(0xe0-0xdc)/4];
573 volatile uint32 PHY_REG8; //0xe0
574 volatile uint32 PHY_REG0e4; //use for DQS ODT off
575 uint32 reserved9[(0x114-0xe8)/4];
576 volatile uint32 PHY_REG9; //0x114
577 volatile uint32 PHY_REG10;
578 uint32 reserved10[(0x120-0x11c)/4];
579 volatile uint32 PHY_REG11; //0x120
580 volatile uint32 PHY_REG124; //use for DQS ODT off
581 uint32 reserved11[(0x1c0-0x128)/4];
582 volatile uint32 PHY_REG29; //0x1c0
583 uint32 reserved12[(0x264-0x1c4)/4];
584 volatile uint32 PHY_REG264; //use for phy soft reset
585 uint32 reserved13[(0x2b0-0x268)/4];
586 volatile uint32 PHY_REG2a; //0x2b0
587 uint32 reserved14[(0x2c4-0x2b4)/4];
588 // volatile uint32 PHY_TX_DeSkew[24]; //0x2c4-0x320
589 volatile uint32 PHY_REG30;
590 volatile uint32 PHY_REG31;
591 volatile uint32 PHY_REG32;
592 volatile uint32 PHY_REG33;
593 volatile uint32 PHY_REG34;
594 volatile uint32 PHY_REG35;
595 volatile uint32 PHY_REG36;
596 volatile uint32 PHY_REG37;
597 volatile uint32 PHY_REG38;
598 volatile uint32 PHY_REG39;
599 volatile uint32 PHY_REG40;
600 volatile uint32 PHY_REG41;
601 volatile uint32 PHY_REG42;
602 volatile uint32 PHY_REG43;
603 volatile uint32 PHY_REG44;
604 volatile uint32 PHY_REG45;
605 volatile uint32 PHY_REG46;
606 volatile uint32 PHY_REG47;
607 volatile uint32 PHY_REG48;
608 volatile uint32 PHY_REG49;
609 volatile uint32 PHY_REG50;
610 volatile uint32 PHY_REG51;
611 volatile uint32 PHY_REG52;
612 volatile uint32 PHY_REG53;
613 uint32 reserved15[(0x328-0x324)/4];
614 // volatile uint32 PHY_RX_DeSkew[11]; //0x328-0x350
615 volatile uint32 PHY_REG54;
616 volatile uint32 PHY_REG55;
617 volatile uint32 PHY_REG56;
618 volatile uint32 PHY_REG57;
619 volatile uint32 PHY_REG58;
620 volatile uint32 PHY_REG59;
621 volatile uint32 PHY_REG5a;
622 volatile uint32 PHY_REG5b;
623 volatile uint32 PHY_REG5c;
624 volatile uint32 PHY_REG5d;
625 volatile uint32 PHY_REG5e;
626 uint32 reserved16[(0x3c4-0x354)/4];
627 volatile uint32 PHY_REG5f; //0x3c4
628 uint32 reserved17[(0x3e0-0x3c8)/4];
629 volatile uint32 PHY_REG60;
630 volatile uint32 PHY_REG61;
631 volatile uint32 PHY_REG62;
632 }DDRPHY_REG_T, *pDDRPHY_REG_T;
634 #define pPHY_Reg ((pDDRPHY_REG_T)DDR_PHY_BASE)
636 typedef enum DRAM_TYPE_Tag
649 typedef struct PCTRL_TIMING_Tag
652 //Memory Timing Registers
653 uint32 togcnt1u; //Toggle Counter 1U Register
654 uint32 tinit; //t_init Timing Register
655 uint32 trsth; //Reset High Time Register
656 uint32 togcnt100n; //Toggle Counter 100N Register
657 uint32 trefi; //t_refi Timing Register
658 uint32 tmrd; //t_mrd Timing Register
659 uint32 trfc; //t_rfc Timing Register
660 uint32 trp; //t_rp Timing Register
661 uint32 trtw; //t_rtw Timing Register
662 uint32 tal; //AL Latency Register
663 uint32 tcl; //CL Timing Register
664 uint32 tcwl; //CWL Register
665 uint32 tras; //t_ras Timing Register
666 uint32 trc; //t_rc Timing Register
667 uint32 trcd; //t_rcd Timing Register
668 uint32 trrd; //t_rrd Timing Register
669 uint32 trtp; //t_rtp Timing Register
670 uint32 twr; //t_wr Timing Register
671 uint32 twtr; //t_wtr Timing Register
672 uint32 texsr; //t_exsr Timing Register
673 uint32 txp; //t_xp Timing Register
674 uint32 txpdll; //t_xpdll Timing Register
675 uint32 tzqcs; //t_zqcs Timing Register
676 uint32 tzqcsi; //t_zqcsi Timing Register
677 uint32 tdqs; //t_dqs Timing Register
678 uint32 tcksre; //t_cksre Timing Register
679 uint32 tcksrx; //t_cksrx Timing Register
680 uint32 tcke; //t_cke Timing Register
681 uint32 tmod; //t_mod Timing Register
682 uint32 trstl; //Reset Low Timing Register
683 uint32 tzqcl; //t_zqcl Timing Register
684 uint32 tmrr; //t_mrr Timing Register
685 uint32 tckesr; //t_ckesr Timing Register
686 uint32 tdpd; //t_dpd Timing Register
690 typedef union NOC_TIMING_Tag
695 unsigned ActToAct : 6;
696 unsigned RdToMiss : 6;
697 unsigned WrToMiss : 6;
698 unsigned BurstLen : 3;
701 unsigned BwRatio : 1;
705 typedef struct PCTL_REG_Tag
711 PCTL_TIMING_T pctl_timing;
712 //DFI Control Registers
713 uint32 DFITCTRLDELAY;
716 uint32 DFIODTRANKMAP;
717 //DFI Write Data Registers
718 uint32 DFITPHYWRDATA;
720 //DFI Read Data Registers
723 //DFI Update Registers
724 uint32 DFITPHYUPDTYPE0;
725 uint32 DFITPHYUPDTYPE1;
726 uint32 DFITPHYUPDTYPE2;
727 uint32 DFITPHYUPDTYPE3;
728 uint32 DFITCTRLUPDMIN;
729 uint32 DFITCTRLUPDMAX;
730 uint32 DFITCTRLUPDDLY;
734 //DFI Status Registers
737 uint32 DFITDRAMCLKEN;
738 uint32 DFITDRAMCLKDIS;
740 //DFI Low Power Register
744 typedef struct BACKUP_REG_Tag
748 NOC_TIMING_T noc_timing;
754 __sramdata BACKUP_REG_T ddr_reg;
757 uint32_t __sramdata ddr3_cl_cwl[22][4]={
758 /* 0~330 330~400 400~533 speed
759 * tCK >3 2.5~3 1.875~2.5 1.875~1.5
760 * cl<<16, cwl cl<<16, cwl cl<<16, cwl */
761 {((5<<16)|5), ((5<<16)|5), 0 , 0}, //DDR3_800D
762 {((5<<16)|5), ((6<<16)|5), 0 , 0}, //DDR3_800E
764 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), 0}, //DDR3_1066E
765 {((5<<16)|5), ((6<<16)|5), ((7<<16)|6), 0}, //DDR3_1066F
766 {((5<<16)|5), ((6<<16)|5), ((8<<16)|6), 0}, //DDR3_1066G
768 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), ((7<<16)|7)}, //DDR3_1333F
769 {((5<<16)|5), ((5<<16)|5), ((7<<16)|6), ((8<<16)|7)}, //DDR3_1333G
770 {((5<<16)|5), ((6<<16)|5), ((7<<16)|6), ((9<<16)|7)}, //DDR3_1333H
771 {((5<<16)|5), ((6<<16)|5), ((8<<16)|6), ((10<<16)|7)}, //DDR3_1333J
773 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), ((7<<16)|7)}, //DDR3_1600G
774 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), ((8<<16)|7)}, //DDR3_1600H
775 {((5<<16)|5), ((5<<16)|5), ((7<<16)|6), ((9<<16)|7)}, //DDR3_1600J
776 {((5<<16)|5), ((6<<16)|5), ((7<<16)|6), ((10<<16)|7)}, //DDR3_1600K
778 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), ((8<<16)|7)}, //DDR3_1866J
779 {((5<<16)|5), ((5<<16)|5), ((7<<16)|6), ((8<<16)|7)}, //DDR3_1866K
780 {((6<<16)|5), ((6<<16)|5), ((7<<16)|6), ((9<<16)|7)}, //DDR3_1866L
781 {((6<<16)|5), ((6<<16)|5), ((8<<16)|6), ((10<<16)|7)}, //DDR3_1866M
783 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), ((7<<16)|7)}, //DDR3_2133K
784 {((5<<16)|5), ((5<<16)|5), ((6<<16)|6), ((8<<16)|7)}, //DDR3_2133L
785 {((5<<16)|5), ((5<<16)|5), ((7<<16)|6), ((9<<16)|7)}, //DDR3_2133M
786 {((6<<16)|5), ((6<<16)|5), ((7<<16)|6), ((9<<16)|7)}, //DDR3_2133N
788 {((6<<16)|5), ((6<<16)|5), ((8<<16)|6), ((10<<16)|7)} //DDR3_DEFAULT
791 uint32_t __sramdata ddr3_tRC_tFAW[22]={
793 ((50<<16)|50), //DDR3_800D
794 ((53<<16)|50), //DDR3_800E
796 ((49<<16)|50), //DDR3_1066E
797 ((51<<16)|50), //DDR3_1066F
798 ((53<<16)|50), //DDR3_1066G
800 ((47<<16)|45), //DDR3_1333F
801 ((48<<16)|45), //DDR3_1333G
802 ((50<<16)|45), //DDR3_1333H
803 ((51<<16)|45), //DDR3_1333J
805 ((45<<16)|40), //DDR3_1600G
806 ((47<<16)|40), //DDR3_1600H
807 ((48<<16)|40), //DDR3_1600J
808 ((49<<16)|40), //DDR3_1600K
810 ((45<<16)|35), //DDR3_1866J
811 ((46<<16)|35), //DDR3_1866K
812 ((47<<16)|35), //DDR3_1866L
813 ((48<<16)|35), //DDR3_1866M
815 ((44<<16)|35), //DDR3_2133K
816 ((45<<16)|35), //DDR3_2133L
817 ((46<<16)|35), //DDR3_2133M
818 ((47<<16)|35), //DDR3_2133N
820 ((53<<16)|50) //DDR3_DEFAULT
823 __sramdata uint32_t mem_type; //0:DDR3 1:DDR2 ;ÓëInno PHY µÄPHY_REG2 ÀïÉèÖõÄÖµÏàÒ»ÖÂ
824 static __sramdata uint32_t ddr_speed_bin; // used for ddr3 only
825 static __sramdata uint32_t ddr_capability_per_die; // one chip cs capability
826 static __sramdata uint32_t ddr_freq;
827 static __sramdata uint32_t ddr_sr_idle;
828 static __sramdata uint32_t ddr_dll_status; // ¼Ç¼ddr dllµÄ״̬£¬ÔÚselfrefresh exitʱѡÔñÊÇ·ñ½øÐÐdll reset
830 /****************************************************************************
831 Internal sram us delay function
832 Cpu highest frequency is 1.6 GHz
834 1 us = 1000 ns = 1000 * 1.6 cycles = 1600 cycles
835 *****************************************************************************/
836 static __sramdata uint32_t loops_per_us;
838 #define LPJ_100MHZ 999456UL
840 /*----------------------------------------------------------------------
841 Name : void __sramlocalfunc ddr_delayus(uint32_t us)
843 Params : uint32_t us --ÑÓʱʱ¼ä
845 Notes : loops_per_us Ϊȫ¾Ö±äÁ¿ ÐèÒª¸ù¾Ýarm freq¶ø¶¨
846 ----------------------------------------------------------------------*/
848 /*static*/ void __sramlocalfunc ddr_delayus(uint32_t us)
852 count = loops_per_us*us;
853 while(count--) // 3 cycles
857 /*----------------------------------------------------------------------
858 Name : __sramfunc void ddr_copy(uint32 *pDest, uint32 *pSrc, uint32 words)
859 Desc : ddr ¿½±´¼Ä´æÆ÷º¯Êý
860 Params : pDest ->Ä¿±ê¼Ä´æÆ÷Ê×µØÖ·
861 pSrc ->Ô´±ê¼Ä´æÆ÷Ê×µØÖ·
865 ----------------------------------------------------------------------*/
867 __sramfunc void ddr_copy(uint32 *pDest, uint32 *pSrc, uint32 words)
871 for(i=0; i<words; i++)
877 /*----------------------------------------------------------------------
878 Name : uint32 ddr_get_row(void)
879 Desc : »ñÈ¡ddr row ÐÅÏ¢
883 ----------------------------------------------------------------------*/
884 uint32 ddr_get_row(void)
886 return (13+((pGRF_Reg->GRF_OS_REG[1] >> DDR_ROW_COUNT) & 0x3));
889 /*----------------------------------------------------------------------
890 Name : uint32 ddr_get_bank(void)
891 Desc : »ñÈ¡ddr bank ÐÅÏ¢
895 ----------------------------------------------------------------------*/
896 uint32 ddr_get_bank(void)
898 return (((pGRF_Reg->GRF_OS_REG[1] >> DDR_BANK_COUNT) & 0x1)? 2:3);
901 /*----------------------------------------------------------------------
902 Name : uint32 ddr_get_col(void)
903 Desc : »ñÈ¡ddr col ÐÅÏ¢
907 ----------------------------------------------------------------------*/
908 uint32 ddr_get_col(void)
910 return (9 + ((pGRF_Reg->GRF_OS_REG[1]>>DDR_COL_COUNT)&0x3));
913 /*----------------------------------------------------------------------
914 Name : __sramfunc void ddr_move_to_Lowpower_state(void)
915 Desc : pctl ½øÈë lowpower state
919 ----------------------------------------------------------------------*/
920 __sramfunc void ddr_move_to_Lowpower_state(void)
922 volatile uint32 value;
926 value = pDDR_Reg->STAT.b.ctl_stat;
927 if(value == Low_power)
934 pDDR_Reg->SCTL = CFG_STATE;
936 while((pDDR_Reg->STAT.b.ctl_stat) != Config);
938 pDDR_Reg->SCTL = GO_STATE;
940 while((pDDR_Reg->STAT.b.ctl_stat) != Access);
942 pDDR_Reg->SCTL = SLEEP_STATE;
944 while((pDDR_Reg->STAT.b.ctl_stat) != Low_power);
946 default: //Transitional state
952 /*----------------------------------------------------------------------
953 Name : __sramfunc void ddr_move_to_Access_state(void)
954 Desc : pctl ½øÈë Access state
958 ----------------------------------------------------------------------*/
959 __sramfunc void ddr_move_to_Access_state(void)
961 volatile uint32 value;
963 //set auto self-refresh idle
964 pDDR_Reg->MCFG1=(pDDR_Reg->MCFG1&0xffffff00)|ddr_sr_idle | (1<<31);
968 value = pDDR_Reg->STAT.b.ctl_stat;
970 || ((pDDR_Reg->STAT.b.lp_trig == 1) && ((pDDR_Reg->STAT.b.ctl_stat) == Low_power)))
977 pDDR_Reg->SCTL = WAKEUP_STATE;
979 while((pDDR_Reg->STAT.b.ctl_stat) != Access);
982 pDDR_Reg->SCTL = CFG_STATE;
984 while((pDDR_Reg->STAT.b.ctl_stat) != Config);
986 pDDR_Reg->SCTL = GO_STATE;
988 while(!(((pDDR_Reg->STAT.b.ctl_stat) == Access)
989 || ((pDDR_Reg->STAT.b.lp_trig == 1) && ((pDDR_Reg->STAT.b.ctl_stat) == Low_power))));
991 default: //Transitional state
995 pGRF_Reg->GRF_SOC_CON[2] = (1<<16 | 0);//de_hw_wakeup :enable auto sr if sr_idle != 0
998 /*----------------------------------------------------------------------
999 Name : __sramfunc void ddr_move_to_Config_state(void)
1000 Desc : pctl ½øÈë config state
1004 ----------------------------------------------------------------------*/
1005 __sramfunc void ddr_move_to_Config_state(void)
1007 volatile uint32 value;
1008 pGRF_Reg->GRF_SOC_CON[2] = (1<<16 | 1); //hw_wakeup :disable auto sr
1011 value = pDDR_Reg->STAT.b.ctl_stat;
1019 pDDR_Reg->SCTL = WAKEUP_STATE;
1023 pDDR_Reg->SCTL = CFG_STATE;
1026 default: //Transitional state
1032 /*----------------------------------------------------------------------
1033 Name : void __sramlocalfunc ddr_send_command(uint32 rank, uint32 cmd, uint32 arg)
1034 Desc : ͨ¹ýд pctl MCMD¼Ä´æÆ÷Ïòddr·¢ËÍÃüÁî
1035 Params : rank ->ddr rank Êý
1039 Notes : arg°üÀ¨bank_addrºÍcmd_addr
1040 ----------------------------------------------------------------------*/
1041 void __sramlocalfunc ddr_send_command(uint32 rank, uint32 cmd, uint32 arg)
1043 pDDR_Reg->MCMD = (start_cmd | (rank<<20) | arg | cmd);
1045 while(pDDR_Reg->MCMD & start_cmd);
1048 __sramdata uint32 copy_data[8]={0xffffffff,0x00000000,0x55555555,0xAAAAAAAA,
1049 0xEEEEEEEE,0x11111111,0x22222222,0xDDDDDDDD};/**/
1051 /*----------------------------------------------------------------------
1052 Name : uint32_t __sramlocalfunc ddr_data_training(void)
1053 Desc : ¶Ôddr×ödata training
1056 Notes : ûÓÐ×ödata trainingУÑé
1057 ----------------------------------------------------------------------*/
1058 uint32_t __sramlocalfunc ddr_data_training(void)
1061 value = pDDR_Reg->TREFI;
1062 pDDR_Reg->TREFI = 0;
1063 cs = (pGRF_Reg->GRF_OS_REG[1] >> DDR_RANK_COUNT) & 0x1;
1064 cs = cs + (1 << cs); //case 0:1rank cs=1; case 1:2rank cs =3;
1066 pPHY_Reg->PHY_REG2 = ((pPHY_Reg->PHY_REG2 & (~0x1)) | PHY_AUTO_CALIBRATION);
1067 // wait echo byte DTDONE
1070 while((pPHY_Reg->PHY_REG62 & 0x3)!=0x3);
1071 pPHY_Reg->PHY_REG2 = (pPHY_Reg->PHY_REG2 & (~0x1));
1072 // send some auto refresh to complement the lost while DTT
1073 ddr_send_command(cs, REF_cmd, 0);
1074 ddr_send_command(cs, REF_cmd, 0);
1075 ddr_send_command(cs, REF_cmd, 0);
1076 ddr_send_command(cs, REF_cmd, 0);
1078 // resume auto refresh
1079 pDDR_Reg->TREFI = value;
1084 /*----------------------------------------------------------------------
1085 Name : void __sramlocalfunc ddr_set_dll_bypass(uint32 freq)
1086 Desc : ÉèÖÃPHY dll ¹¤×÷ģʽ
1087 Params : freq -> ddr¹¤×÷ƵÂÊ
1090 ----------------------------------------------------------------------*/
1091 void __sramlocalfunc ddr_set_dll_bypass(uint32 freq)
1093 if(freq <= PHY_DLL_DISABLE_FREQ)
1095 pPHY_Reg->PHY_REG2a = 0x1F; //set cmd,left right dll bypass
1096 pPHY_Reg->PHY_REG19 = 0x08; //cmd slave dll
1097 pPHY_Reg->PHY_REG6 = 0x18; //left TX DQ DLL
1098 pPHY_Reg->PHY_REG7 = 0x00; //left TX DQS DLL
1099 pPHY_Reg->PHY_REG9 = 0x18; //right TX DQ DLL
1100 pPHY_Reg->PHY_REG10 = 0x00; //right TX DQS DLL
1105 pPHY_Reg->PHY_REG2a = 0x03; //set cmd,left right dll bypass
1106 pPHY_Reg->PHY_REG19 = 0x08; //cmd slave dll
1107 pPHY_Reg->PHY_REG6 = 0x0c; //left TX DQ DLL
1108 pPHY_Reg->PHY_REG7 = 0x00; //left TX DQS DLL
1109 pPHY_Reg->PHY_REG9 = 0x0c; //right TX DQ DLL
1110 pPHY_Reg->PHY_REG10 = 0x00; //right TX DQS DLL
1113 //ÆäËûÓëdllÏà¹ØµÄ¼Ä´æÆ÷ÓÐ:REG8(RX DQS),REG11(RX DQS),REG18(CMD),REG21(CK) ±£³ÖĬÈÏÖµ
1117 static __sramdata uint32_t clkFbDiv;
1118 static __sramdata uint32_t clkPostDiv1;
1119 static __sramdata uint32_t clkPostDiv2;
1121 /*****************************************
1122 REFDIV FBDIV POSTDIV1/POSTDIV2 FOUTPOSTDIV freq Step FOUTPOSRDIV finally use
1123 ==================================================================================================================
1124 1 17 - 66 4 100MHz - 400MHz 6MHz 200MHz <= 300MHz <= 150MHz
1125 1 17 - 66 3 133MHz - 533MHz 8MHz
1126 1 17 - 66 2 200MHz - 800MHz 12MHz 300MHz <= 600MHz 150MHz <= 300MHz
1127 1 17 - 66 1 400MHz - 1600MHz 24MHz 600MHz <= 1200MHz 300MHz <= 600MHz
1128 ******************************************/
1129 //for minimum jitter operation, the highest VCO and FREF frequencies should be used.
1130 /*----------------------------------------------------------------------
1131 Name : uint32_t __sramlocalfunc ddr_set_pll(uint32_t nMHz, uint32_t set)
1133 Params : nMHZ -> ddr¹¤×÷ƵÂÊ
1134 set ->0»ñÈ¡ÉèÖõÄƵÂÊÐÅÏ¢
1136 Return : ÉèÖõÄƵÂÊÖµ
1137 Notes : ÔÚ±äƵʱÐèÒªÏÈset=0µ÷ÓÃÒ»´Îddr_set_pll£¬ÔÙset=1 µ÷ÓÃddr_set_pll
1138 ----------------------------------------------------------------------*/
1139 uint32_t __sramlocalfunc ddr_set_pll(uint32_t nMHz, uint32_t set)
1143 uint32_t pll_id=1; //DPLL
1150 #if defined (CONFIG_ARCH_RK3026) //RK3028A RK3026
1153 if(nMHz <= 150) //ʵ¼ÊÊä³öƵÂÊ<300
1161 else if(nMHz <= 300)
1174 clkFbDiv = (nMHz * 2 * DDR_PLL_REFDIV * clkPostDiv1 * clkPostDiv2)/24;//×îºóËÍÈëddrµÄÊÇÔÙ¾¹ý2·ÖƵ
1175 ret = (24 * clkFbDiv)/(2 * DDR_PLL_REFDIV * clkPostDiv1 * clkPostDiv2);
1184 else if(nMHz <= 300)
1193 clkFbDiv = (nMHz * 2 * DDR_PLL_REFDIV * clkPostDiv1 * clkPostDiv2)/24;//×îºóËÍÈëddrµÄÊÇÔÙ¾¹ý2·ÖƵ
1194 ret = (24 * clkFbDiv)/(2 * DDR_PLL_REFDIV * clkPostDiv1 * clkPostDiv2);
1199 pCRU_Reg->CRU_MODE_CON = (0x1<<((pll_id*4) + 16)) | (0x0<<(pll_id*4)); //PLL slow-mode
1201 pCRU_Reg->CRU_PLL_CON[pll_id][0] = FBDIV(clkFbDiv) | POSTDIV1(clkPostDiv1);
1202 pCRU_Reg->CRU_PLL_CON[pll_id][1] = REFDIV(DDR_PLL_REFDIV) | POSTDIV2(clkPostDiv2) | (0x10001<<12);//interger mode
1209 if (pCRU_Reg->CRU_PLL_CON[pll_id][1] & (PLL_LOCK_STATUS)) // wait for pll locked
1214 pCRU_Reg->CRU_CLKSEL_CON[26] = ((0x3<<16) | 0x0); //clk_ddr_src:clk_ddrphy = 1:1
1215 pCRU_Reg->CRU_MODE_CON = (0x1<<((pll_id*4) + 16)) | (0x1<<(pll_id*4)); //PLL normal
1221 /*----------------------------------------------------------------------
1222 Name : uint32_t ddr_get_parameter(uint32_t nMHz)
1224 Params : nMHZ -> ddr¹¤×÷ƵÂÊ
1227 -4 ƵÂÊÖµ³¬¹ý¿ÅÁ£×î´óƵÂÊ
1229 ----------------------------------------------------------------------*/
1230 uint32_t ddr_get_parameter(uint32_t nMHz)
1238 PCTL_TIMING_T *p_pctl_timing=&(ddr_reg.pctl.pctl_timing);
1239 NOC_TIMING_T *p_noc_timing=&(ddr_reg.noc_timing);
1241 p_pctl_timing->togcnt1u = nMHz;
1242 p_pctl_timing->togcnt100n = nMHz/10;
1243 p_pctl_timing->tinit = 200;
1244 p_pctl_timing->trsth = 500;
1246 if(mem_type == DDR3)
1248 if(ddr_speed_bin > DDR3_DEFAULT)
1254 #define DDR3_tREFI_7_8_us (78)
1255 #define DDR3_tMRD (4)
1256 #define DDR3_tRFC_512Mb (90)
1257 #define DDR3_tRFC_1Gb (110)
1258 #define DDR3_tRFC_2Gb (160)
1259 #define DDR3_tRFC_4Gb (300)
1260 #define DDR3_tRFC_8Gb (350)
1261 #define DDR3_tRTW (2) //register min valid value
1262 #define DDR3_tRAS (37)
1263 #define DDR3_tRRD (10)
1264 #define DDR3_tRTP (7)
1265 #define DDR3_tWR (15)
1266 #define DDR3_tWTR (7)
1267 #define DDR3_tXP (7)
1268 #define DDR3_tXPDLL (24)
1269 #define DDR3_tZQCS (80)
1270 #define DDR3_tZQCSI (10000)
1271 #define DDR3_tDQS (1)
1272 #define DDR3_tCKSRE (10)
1273 #define DDR3_tCKE_400MHz (7)
1274 #define DDR3_tCKE_533MHz (6)
1275 #define DDR3_tMOD (15)
1276 #define DDR3_tRSTL (100)
1277 #define DDR3_tZQCL (320)
1278 #define DDR3_tDLLK (512)
1298 if(nMHz < DDR3_DDR2_DLL_DISABLE_FREQ) //when dll bypss cl = cwl = 6;
1305 cl = ddr3_cl_cwl[ddr_speed_bin][tmp] >> 16;
1306 cwl = ddr3_cl_cwl[ddr_speed_bin][tmp] & 0x0ff;
1310 ret = -4; //³¬¹ý¿ÅÁ£µÄ×î´óƵÂÊ
1312 if(nMHz <= DDR3_DDR2_ODT_DISABLE_FREQ)
1314 ddr_reg.ddrMR[1] = DDR3_DS_40 | DDR3_Rtt_Nom_DIS;
1318 ddr_reg.ddrMR[1] = DDR3_DS_40 | DDR3_Rtt_Nom_120;
1320 ddr_reg.ddrMR[2] = DDR3_MR2_CWL(cwl) /* | DDR3_Rtt_WR_60 */;
1321 ddr_reg.ddrMR[3] = 0;
1322 /**************************************************
1324 **************************************************/
1326 * tREFI, average periodic refresh interval, 7.8us
1328 p_pctl_timing->trefi = DDR3_tREFI_7_8_us;
1332 p_pctl_timing->tmrd = DDR3_tMRD & 0x7;
1334 * tRFC, 90ns(512Mb),110ns(1Gb),160ns(2Gb),300ns(4Gb),350ns(8Gb)
1336 if(ddr_capability_per_die <= 0x4000000) // 512Mb 90ns
1338 tmp = DDR3_tRFC_512Mb;
1340 else if(ddr_capability_per_die <= 0x8000000) // 1Gb 110ns
1342 tmp = DDR3_tRFC_1Gb;
1344 else if(ddr_capability_per_die <= 0x10000000) // 2Gb 160ns
1346 tmp = DDR3_tRFC_2Gb;
1348 else if(ddr_capability_per_die <= 0x20000000) // 4Gb 300ns
1350 tmp = DDR3_tRFC_4Gb;
1354 tmp = DDR3_tRFC_8Gb;
1356 p_pctl_timing->trfc = (tmp*nMHz+999)/1000;
1358 * tXSR, =tDLLK=512 tCK
1360 p_pctl_timing->texsr = DDR3_tDLLK;
1364 p_pctl_timing->trp = cl;
1366 * WrToMiss=WL*tCK + tWR + tRP + tRCD
1368 p_noc_timing->b.WrToMiss = ((cwl+((DDR3_tWR*nMHz+999)/1000)+cl+cl)&0x3F);
1372 p_pctl_timing->trc = ((((ddr3_tRC_tFAW[ddr_speed_bin]>>16)*nMHz+999)/1000)&0x3F);
1373 p_noc_timing->b.ActToAct = ((((ddr3_tRC_tFAW[ddr_speed_bin]>>16)*nMHz+999)/1000)&0x3F);
1375 p_pctl_timing->trtw = (cl+2-cwl);//DDR3_tRTW;
1376 p_noc_timing->b.RdToWr = ((cl+2-cwl)&0x1F);
1377 p_pctl_timing->tal = al;
1378 p_pctl_timing->tcl = cl;
1379 p_pctl_timing->tcwl = cwl;
1381 * tRAS, 37.5ns(400MHz) 37.5ns(533MHz)
1383 p_pctl_timing->tras = (((DDR3_tRAS*nMHz+(nMHz>>1)+999)/1000)&0x3F);
1387 p_pctl_timing->trcd = cl;
1389 * tRRD = max(4nCK, 7.5ns), DDR3-1066(1K), DDR3-1333(2K), DDR3-1600(2K)
1390 * max(4nCK, 10ns), DDR3-800(1K,2K), DDR3-1066(2K)
1391 * max(4nCK, 6ns), DDR3-1333(1K), DDR3-1600(1K)
1394 tmp = ((DDR3_tRRD*nMHz+999)/1000);
1399 p_pctl_timing->trrd = (tmp&0xF);
1401 * tRTP, max(4 tCK,7.5ns)
1403 tmp = ((DDR3_tRTP*nMHz+(nMHz>>1)+999)/1000);
1408 p_pctl_timing->trtp = tmp&0xF;
1410 * RdToMiss=tRTP+tRP + tRCD - (BL/2 * tCK)
1412 p_noc_timing->b.RdToMiss = ((tmp+cl+cl-(bl>>1))&0x3F);
1416 tmp = ((DDR3_tWR*nMHz+999)/1000);
1417 p_pctl_timing->twr = tmp&0x1F;
1422 ddr_reg.ddrMR[0] = DDR3_BL8 | DDR3_CL(cl) | DDR3_WR(tmp);
1425 * tWTR, max(4 tCK,7.5ns)
1427 tmp = ((DDR3_tWTR*nMHz+(nMHz>>1)+999)/1000);
1432 p_pctl_timing->twtr = tmp&0xF;
1433 p_noc_timing->b.WrToRd = ((tmp+cwl)&0x1F);
1435 * tXP, max(3 tCK, 7.5ns)(<933MHz)
1437 tmp = ((DDR3_tXP*nMHz+(nMHz>>1)+999)/1000);
1442 p_pctl_timing->txp = tmp&0x7;
1444 * tXPDLL, max(10 tCK,24ns)
1446 tmp = ((DDR3_tXPDLL*nMHz+999)/1000);
1451 p_pctl_timing->txpdll = tmp & 0x3F;
1453 * tZQCS, max(64 tCK, 80ns)
1455 tmp = ((DDR3_tZQCS*nMHz+999)/1000);
1460 p_pctl_timing->tzqcs = tmp&0x7F;
1464 p_pctl_timing->tzqcsi = DDR3_tZQCSI;
1468 p_pctl_timing->tdqs = DDR3_tDQS;
1470 * tCKSRE, max(5 tCK, 10ns)
1472 tmp = ((DDR3_tCKSRE*nMHz+999)/1000);
1477 p_pctl_timing->tcksre = tmp & 0x1F;
1479 * tCKSRX, max(5 tCK, 10ns)
1481 p_pctl_timing->tcksrx = tmp & 0x1F;
1483 * tCKE, max(3 tCK,7.5ns)(400MHz) max(3 tCK,5.625ns)(533MHz)
1487 tmp = ((DDR3_tCKE_533MHz*nMHz+999)/1000);
1491 tmp = ((DDR3_tCKE_400MHz*nMHz+(nMHz>>1)+999)/1000);
1497 p_pctl_timing->tcke = tmp & 0x7;
1499 * tCKESR, =tCKE + 1tCK
1501 p_pctl_timing->tckesr = (tmp+1)&0xF;
1503 * tMOD, max(12 tCK,15ns)
1505 tmp = ((DDR3_tMOD*nMHz+999)/1000);
1510 p_pctl_timing->tmod = tmp&0x1F;
1514 p_pctl_timing->trstl = ((DDR3_tRSTL*nMHz+999)/1000)&0x7F;
1516 * tZQCL, max(256 tCK, 320ns)
1518 tmp = ((DDR3_tZQCL*nMHz+999)/1000);
1523 p_pctl_timing->tzqcl = tmp&0x3FF;
1527 p_pctl_timing->tmrr = 0;
1531 p_pctl_timing->tdpd = 0;
1533 /**************************************************
1535 **************************************************/
1536 p_noc_timing->b.BurstLen = ((bl>>1)&0x7);
1538 else if(mem_type == DDR2)
1540 #define DDR2_tREFI_7_8_us (78)
1541 #define DDR2_tMRD (2)
1542 #define DDR2_tRFC_256Mb (75)
1543 #define DDR2_tRFC_512Mb (105)
1544 #define DDR2_tRFC_1Gb (128)
1545 #define DDR2_tRFC_2Gb (195)
1546 #define DDR2_tRFC_4Gb (328)
1547 #define DDR2_tRAS (45)
1548 #define DDR2_tRTW (2) //register min valid value
1549 #define DDR2_tRRD (10)
1550 #define DDR2_tRTP (7)
1551 #define DDR2_tWR (15)
1552 #define DDR2_tWTR_LITTLE_200MHz (10)
1553 #define DDR2_tWTR_GREAT_200MHz (7)
1554 #define DDR2_tDQS (1)
1555 #define DDR2_tCKSRE (1)
1556 #define DDR2_tCKSRX (1)
1557 #define DDR2_tCKE (3)
1558 #define DDR2_tCKESR DDR2_tCKE
1559 #define DDR2_tMOD (12)
1560 #define DDR2_tFAW_333MHz (50)
1561 #define DDR2_tFAW_400MHz (45)
1562 #define DDR2_tDLLK (200)
1570 else if((nMHz > 266) && (nMHz <= 333))
1574 else if((nMHz > 333) && (nMHz <= 400))
1583 if(nMHz <= DDR3_DDR2_ODT_DISABLE_FREQ)
1585 ddr_reg.ddrMR[1] = DDR2_STR_REDUCE | DDR2_Rtt_Nom_DIS;
1589 ddr_reg.ddrMR[1] = DDR2_STR_REDUCE | DDR2_Rtt_Nom_75;
1591 ddr_reg.ddrMR[2] = 0;
1592 ddr_reg.ddrMR[3] = 0;
1593 /**************************************************
1595 **************************************************/
1597 * tREFI, average periodic refresh interval, 7.8us
1599 p_pctl_timing->trefi = DDR2_tREFI_7_8_us;
1603 p_pctl_timing->tmrd = DDR2_tMRD & 0x7;
1605 * tRFC, 75ns(256Mb) 105ns(512Mb) 127.5ns(1Gb) 195ns(2Gb) 327.5ns(4Gb)
1607 if(ddr_capability_per_die <= 0x2000000) // 256Mb
1609 tmp = DDR2_tRFC_256Mb;
1611 else if(ddr_capability_per_die <= 0x4000000) // 512Mb
1613 tmp = DDR2_tRFC_512Mb;
1615 else if(ddr_capability_per_die <= 0x8000000) // 1Gb
1617 tmp = DDR2_tRFC_1Gb;
1619 else if(ddr_capability_per_die <= 0x10000000) // 2Gb
1621 tmp = DDR2_tRFC_2Gb;
1625 tmp = DDR2_tRFC_4Gb;
1627 p_pctl_timing->trfc = (tmp*nMHz+999)/1000;
1629 * tXSR, max(tRFC+10,200 tCK)
1631 tmp = (((tmp+10)*nMHz+999)/1000);
1636 p_pctl_timing->texsr = tmp&0x3FF;
1638 * tRP=CL DDR2 8bank need to add 1 additional cycles for PREA
1640 if(ddr_get_bank() == 8)
1642 p_pctl_timing->trp = (1<<16) | cl;
1646 p_pctl_timing->trp = cl;
1649 * WrToMiss=WL*tCK + tWR + tRP + tRCD
1651 p_noc_timing->b.WrToMiss = ((cwl+((DDR2_tWR*nMHz+999)/1000)+cl+cl)&0x3F);
1655 tmp=((DDR2_tRAS*nMHz+999)/1000);
1656 p_pctl_timing->tras = (tmp&0x3F);
1660 p_pctl_timing->trc = ((tmp+cl)&0x3F);
1661 p_noc_timing->b.ActToAct = ((tmp+cl)&0x3F);
1663 p_pctl_timing->trtw = (cl+2-cwl);//DDR2_tRTW;
1664 p_noc_timing->b.RdToWr = ((cl+2-cwl)&0x1F);
1665 p_pctl_timing->tal = al;
1666 p_pctl_timing->tcl = cl;
1667 p_pctl_timing->tcwl = cwl;
1671 p_pctl_timing->trcd = cl;
1673 * tRRD = 10ns(2KB page)
1676 p_pctl_timing->trrd = (((DDR2_tRRD*nMHz+999)/1000)&0xF);
1680 tmp = ((DDR2_tRTP*nMHz+(nMHz>>1)+999)/1000);
1681 p_pctl_timing->trtp = tmp&0xF;
1683 * RdToMiss=tRTP+tRP + tRCD - (BL/2 * tCK)
1685 p_noc_timing->b.RdToMiss = ((tmp+cl+cl-(bl>>1))&0x3F);
1689 tmp = ((DDR2_tWR*nMHz+999)/1000);
1690 p_pctl_timing->twr = tmp&0x1F;
1692 * tWTR, 10ns(200MHz) 7.5ns(>200MHz)
1696 tmp = ((DDR2_tWTR_LITTLE_200MHz*nMHz+999)/1000);
1700 tmp = ((DDR2_tWTR_GREAT_200MHz*nMHz+(nMHz>>1)+999)/1000);
1702 p_pctl_timing->twtr = tmp&0xF;
1703 p_noc_timing->b.WrToRd = ((tmp+cwl)&0x1F);
1705 * tXP, 6-AL(200MHz) 6-AL(266MHz) 7-AL(333MHz) 8-AL(400MHz) 10-AL(533MHz)
1723 p_pctl_timing->txp = tmp&0x7;
1727 p_pctl_timing->txpdll = tmp & 0x3F;
1731 p_pctl_timing->tzqcs = 0;
1735 p_pctl_timing->tzqcsi = 0;
1739 p_pctl_timing->tdqs = DDR2_tDQS;
1743 p_pctl_timing->tcksre = DDR2_tCKSRE & 0x1F;
1745 * tCKSRX, no such timing
1747 p_pctl_timing->tcksrx = DDR2_tCKSRX & 0x1F;
1751 p_pctl_timing->tcke = DDR2_tCKE & 0x7;
1755 p_pctl_timing->tckesr = DDR2_tCKESR&0xF;
1759 p_pctl_timing->tmod = ((DDR2_tMOD*nMHz+999)/1000)&0x1F;
1763 p_pctl_timing->trstl = 0;
1767 p_pctl_timing->tzqcl = 0;
1771 p_pctl_timing->tmrr = 0;
1775 p_pctl_timing->tdpd = 0;
1777 /**************************************************
1779 **************************************************/
1780 p_noc_timing->b.BurstLen = ((bl>>1)&0x7);
1787 /*----------------------------------------------------------------------
1788 Name : uint32_t __sramlocalfunc ddr_update_timing(void)
1789 Desc : ¸üÐÂpctl phy Ïà¹Øtiming¼Ä´æÆ÷
1793 ----------------------------------------------------------------------*/
1794 uint32_t __sramlocalfunc ddr_update_timing(void)
1796 PCTL_TIMING_T *p_pctl_timing = &(ddr_reg.pctl.pctl_timing);
1797 NOC_TIMING_T *p_noc_timing = &(ddr_reg.noc_timing);
1799 ddr_copy((uint32_t *)&(pDDR_Reg->TOGCNT1U), (uint32_t*)&(p_pctl_timing->togcnt1u), 34);
1800 pPHY_Reg->PHY_REG3 = (0x12 << 1) | (ddr2_ddr3_bl_8); //0x12Ϊ±£ÁôλµÄĬÈÏÖµ£¬ÒÔĬÈÏÖµ»Øд
1801 pPHY_Reg->PHY_REG4a = ((p_pctl_timing->tcl << 4) | (p_pctl_timing->tal));
1802 *(volatile uint32_t *)SysSrv_DdrTiming = p_noc_timing->d32;
1804 if(mem_type == DDR3)
1806 pDDR_Reg->MCFG = (pDDR_Reg->MCFG & (~(0x1|(0x3<<18)|(0x1<<17)|(0x1<<16)))) | ddr2_ddr3_bl_8 | tfaw_cfg(5)|pd_exit_slow|pd_type(1);
1807 pDDR_Reg->DFITRDDATAEN = (pDDR_Reg->TAL + pDDR_Reg->TCL)-3; //trdata_en = rl-3
1808 pDDR_Reg->DFITPHYWRLAT = pDDR_Reg->TCWL-1;
1810 else if(mem_type == DDR2)
1812 pDDR_Reg->MCFG = (pDDR_Reg->MCFG & (~(0x1|(0x3<<18)|(0x1<<17)|(0x1<<16)))) | ddr2_ddr3_bl_8 | tfaw_cfg(5)|pd_exit_fast|pd_type(1);
1817 /*----------------------------------------------------------------------
1818 Name : uint32_t __sramlocalfunc ddr_update_mr(void)
1819 Desc : ¸üпÅÁ£MR¼Ä´æÆ÷
1823 ----------------------------------------------------------------------*/
1824 uint32_t __sramlocalfunc ddr_update_mr(void)
1828 cs = (pGRF_Reg->GRF_OS_REG[1] >> DDR_RANK_COUNT) & 0x1;
1829 cs = cs + (1 << cs); //case 0:1rank cs=1; case 1:2rank cs =3;
1830 if(ddr_freq > DDR3_DDR2_DLL_DISABLE_FREQ)
1832 if(ddr_dll_status == DDR3_DLL_DISABLE) // off -> on
1834 ddr_send_command(cs, MRS_cmd, bank_addr(0x1) | cmd_addr((ddr_reg.ddrMR[1]))); //DLL enable
1835 ddr_send_command(cs, MRS_cmd, bank_addr(0x0) | cmd_addr(((ddr_reg.ddrMR[0]))| DDR3_DLL_RESET)); //DLL reset
1836 ddr_delayus(2); //at least 200 DDR cycle
1837 ddr_send_command(cs, MRS_cmd, bank_addr(0x0) | cmd_addr((ddr_reg.ddrMR[0])));
1838 ddr_dll_status = DDR3_DLL_ENABLE;
1842 ddr_send_command(cs, MRS_cmd, bank_addr(0x1) | cmd_addr((ddr_reg.ddrMR[1])));
1843 ddr_send_command(cs, MRS_cmd, bank_addr(0x0) | cmd_addr((ddr_reg.ddrMR[0])));
1848 ddr_send_command(cs, MRS_cmd, bank_addr(0x1) | cmd_addr(((ddr_reg.ddrMR[1])) | DDR3_DLL_DISABLE)); //DLL disable
1849 ddr_send_command(cs, MRS_cmd, bank_addr(0x0) | cmd_addr((ddr_reg.ddrMR[0])));
1850 ddr_dll_status = DDR3_DLL_DISABLE;
1852 ddr_send_command(cs, MRS_cmd, bank_addr(0x2) | cmd_addr((ddr_reg.ddrMR[2])));
1857 /*----------------------------------------------------------------------
1858 Name : void __sramlocalfunc ddr_update_odt(void)
1859 Desc : update PHY odt & PHY driver impedance
1863 ----------------------------------------------------------------------*/
1864 void __sramlocalfunc ddr_update_odt(void)
1868 //adjust DRV and ODT
1869 if(ddr_freq <= PHY_ODT_DISABLE_FREQ)
1871 pPHY_Reg->PHY_REG27 = PHY_RTT_DISABLE; //dynamic RTT disable, Left 8bit ODT
1872 pPHY_Reg->PHY_REG28 = PHY_RTT_DISABLE; //Right 8bit ODT
1873 pPHY_Reg->PHY_REG0e4 = (0x0E & 0xc)|0x1;//off DQS ODT bit[1:0]=2'b01
1874 pPHY_Reg->PHY_REG124 = (0x0E & 0xc)|0x1;//off DQS ODT bit[1:0]=2'b01
1876 #if defined (CONFIG_ARCH_RK3026) //RK3028A RK3026
1879 pPHY_Reg->PHY_REG27 = ((PHY_RTT_215ohm<<4) | PHY_RTT_215ohm);
1880 pPHY_Reg->PHY_REG28 = ((PHY_RTT_215ohm<<4) | PHY_RTT_215ohm);
1881 pPHY_Reg->PHY_REG0e4 = 0x0E; //on DQS ODT default:0x0E
1882 pPHY_Reg->PHY_REG124 = 0x0E; //on DQS ODT default:0x0E
1884 tmp = ((PHY_RON_45ohm<<4) | PHY_RON_45ohm);
1885 #else //RK2928 R2926
1888 pPHY_Reg->PHY_REG27 = ((PHY_RTT_212O<<3) | PHY_RTT_212O);
1889 pPHY_Reg->PHY_REG28 = ((PHY_RTT_212O<<3) | PHY_RTT_212O);
1890 pPHY_Reg->PHY_REG0e4 = 0x0E; //on DQS ODT default:0x0E
1891 pPHY_Reg->PHY_REG124 = 0x0E; //on DQS ODT default:0x0E
1893 tmp = ((PHY_RON_46O<<3) | PHY_RON_46O);
1896 pPHY_Reg->PHY_REG16 = tmp; //CMD driver strength
1897 pPHY_Reg->PHY_REG22 = tmp; //CK driver strength
1898 pPHY_Reg->PHY_REG25 = tmp; //Left 8bit DQ driver strength
1899 pPHY_Reg->PHY_REG26 = tmp; //Right 8bit DQ driver strength
1903 /*----------------------------------------------------------------------
1904 Name : __sramfunc void ddr_adjust_config(uint32_t dram_type)
1906 Params : dram_type ->¿ÅÁ£ÀàÐÍ
1909 ----------------------------------------------------------------------*/
1910 __sramfunc void ddr_adjust_config(uint32_t dram_type)
1913 unsigned long save_sp;
1916 volatile unsigned int * temp=(volatile unsigned int *)SRAM_CODE_OFFSET;
1918 //get data training address before idle port
1919 // value = ddr_get_datatraing_addr(); //Inno PHY ²»ÐèÒªtraining address
1921 /** 1. Make sure there is no host access */
1925 DDR_SAVE_SP(save_sp);
1927 for(i=0;i<2;i++) //8KB SRAM
1932 n= pDDR_Reg->SCFG.d32;
1933 n= pPHY_Reg->PHY_REG1;
1934 n= pCRU_Reg->CRU_PLL_CON[0][0];
1935 n= *(volatile uint32_t *)SysSrv_DdrConf;
1938 //enter config state
1939 ddr_move_to_Config_state();
1940 // pDDR_Reg->DFIODTCFG = ((1<<3) | (1<<11)); //loaderÖЩÁ˳õʼ»¯
1941 //set auto power down idle
1942 pDDR_Reg->MCFG=(pDDR_Reg->MCFG&0xffff00ff)|(PD_IDLE<<8);
1944 //enable the hardware low-power interface
1945 pDDR_Reg->SCFG.b.hw_low_power_en = 1;
1949 //enter access state
1950 ddr_move_to_Access_state();
1952 DDR_RESTORE_SP(save_sp);
1955 /*----------------------------------------------------------------------
1956 Name : void __sramlocalfunc ddr_selfrefresh_enter(uint32 nMHz)
1958 Params : nMHz ->ddrƵÂÊ
1961 ----------------------------------------------------------------------*/
1962 void __sramlocalfunc ddr_selfrefresh_enter(uint32 nMHz)
1964 ddr_move_to_Config_state();
1965 ddr_move_to_Lowpower_state();
1966 pPHY_Reg->PHY_REG264 &= ~(1<<1);
1967 pPHY_Reg->PHY_REG1 = (pPHY_Reg->PHY_REG1 & (~(0x3<<2))); //phy soft reset
1969 pCRU_Reg->CRU_CLKGATE_CON[0] = ((0x1<<2)<<16) | (1<<2); //disable DDR PHY clock
1973 uint32 dtt_buffer[8];
1975 /*----------------------------------------------------------------------
1976 Name : void ddr_dtt_check(void)
1977 Desc : data training check
1981 ----------------------------------------------------------------------*/
1982 void ddr_dtt_check(void)
1987 dtt_buffer[i] = copy_data[i];
1994 if(dtt_buffer[i] != copy_data[i])
1996 sram_printascii("DTT failed!\n");
2004 /*----------------------------------------------------------------------
2005 Name : void __sramlocalfunc ddr_selfrefresh_exit(void)
2010 ----------------------------------------------------------------------*/
2011 void __sramlocalfunc ddr_selfrefresh_exit(void)
2013 pCRU_Reg->CRU_CLKGATE_CON[0] = ((0x1<<2)<<16) | (0<<2); //enable DDR PHY clock
2016 pPHY_Reg->PHY_REG1 = (pPHY_Reg->PHY_REG1 | (0x3 << 2)); //phy soft de-reset
2017 pPHY_Reg->PHY_REG264 |= (1<<1);
2019 ddr_move_to_Config_state();
2020 ddr_data_training();
2021 ddr_move_to_Access_state();
2025 /*----------------------------------------------------------------------
2026 Name : void __sramlocalfunc ddr_change_freq_in(uint32 freq_slew)
2027 Desc : ÉèÖÃddr pllÇ°µÄtiming¼°mr²ÎÊýµ÷Õû
2028 Params : freq_slew :±äƵбÂÊ 1Éýƽ 0½µÆµ
2031 ----------------------------------------------------------------------*/
2032 void __sramlocalfunc ddr_change_freq_in(uint32 freq_slew)
2034 uint32 value_100n, value_1u;
2038 value_100n = ddr_reg.pctl.pctl_timing.togcnt100n;
2039 value_1u = ddr_reg.pctl.pctl_timing.togcnt1u;
2040 ddr_reg.pctl.pctl_timing.togcnt1u = pDDR_Reg->TOGCNT1U;
2041 ddr_reg.pctl.pctl_timing.togcnt100n = pDDR_Reg->TOGCNT100N;
2042 ddr_update_timing();
2044 ddr_reg.pctl.pctl_timing.togcnt100n = value_100n;
2045 ddr_reg.pctl.pctl_timing.togcnt1u = value_1u;
2049 pDDR_Reg->TOGCNT100N = ddr_reg.pctl.pctl_timing.togcnt100n;
2050 pDDR_Reg->TOGCNT1U = ddr_reg.pctl.pctl_timing.togcnt1u;
2053 pDDR_Reg->TZQCSI = 0;
2057 /*----------------------------------------------------------------------
2058 Name : void __sramlocalfunc ddr_change_freq_out(uint32 freq_slew)
2059 Desc : ÉèÖÃddr pllºóµÄtiming¼°mr²ÎÊýµ÷Õû
2060 Params : freq_slew :±äƵбÂÊ 1Éýƽ 0½µÆµ
2063 ----------------------------------------------------------------------*/
2064 void __sramlocalfunc ddr_change_freq_out(uint32 freq_slew)
2068 pDDR_Reg->TOGCNT100N = ddr_reg.pctl.pctl_timing.togcnt100n;
2069 pDDR_Reg->TOGCNT1U = ddr_reg.pctl.pctl_timing.togcnt1u;
2070 pDDR_Reg->TZQCSI = ddr_reg.pctl.pctl_timing.tzqcsi;
2074 ddr_update_timing();
2077 ddr_data_training();
2080 static uint32 save_sp;
2081 /*----------------------------------------------------------------------
2082 Name : uint32_t __sramfunc ddr_change_freq(uint32_t nMHz)
2084 Params : nMHz -> ±äƵµÄƵÂÊÖµ
2087 ----------------------------------------------------------------------*/
2088 uint32_t __sramfunc ddr_change_freq(uint32_t nMHz)
2093 unsigned long flags;
2094 volatile unsigned int * temp=(volatile unsigned int *)SRAM_CODE_OFFSET;
2095 uint32_t regvalue0 = pCRU_Reg->CRU_PLL_CON[0][0];
2096 uint32_t regvalue1 = pCRU_Reg->CRU_PLL_CON[0][1];
2100 // freq = (fin*fbdiv/(refdiv * postdiv1 * postdiv2))
2101 if((pCRU_Reg->CRU_MODE_CON & 1) == 1) // CPLL Normal mode
2103 freq = 24*(regvalue0&0xfff)
2104 /((regvalue1&0x3f)*((regvalue0>>12)&0x7)*((regvalue1>>6)&0x7));
2110 loops_per_us = LPJ_100MHZ*freq / 1000000;
2112 ret=ddr_set_pll(nMHz,0);
2119 freq_slew = (ret>ddr_freq)? 1 : -1;
2121 ddr_get_parameter(ret);
2122 /** 1. Make sure there is no host access */
2123 local_irq_save(flags);
2124 local_fiq_disable();
2128 DDR_SAVE_SP(save_sp);
2129 for(i=0;i<2;i++) //8KB SRAM
2134 n= pDDR_Reg->SCFG.d32;
2135 n= pPHY_Reg->PHY_REG1;
2136 n= pCRU_Reg->CRU_PLL_CON[0][0];
2137 n= *(volatile uint32_t *)SysSrv_DdrConf;
2138 n= pGRF_Reg->GRF_SOC_STATUS0;
2140 ddr_move_to_Config_state();
2142 ddr_change_freq_in(freq_slew);
2143 ddr_move_to_Lowpower_state();
2144 pPHY_Reg->PHY_REG264 &= ~(1<<1);
2145 pPHY_Reg->PHY_REG1 = (pPHY_Reg->PHY_REG1 & (~(0x3<<2))); //phy soft reset
2147 /** 3. change frequence */
2149 ddr_set_dll_bypass(ddr_freq); //set phy dll mode;
2150 pPHY_Reg->PHY_REG1 = (pPHY_Reg->PHY_REG1 | (0x3 << 2)); //phy soft de-reset
2151 pPHY_Reg->PHY_REG264 |= (1<<1);
2154 ddr_move_to_Config_state();
2155 ddr_change_freq_out(freq_slew);
2156 ddr_move_to_Access_state();
2158 /** 5. Issues a Mode Exit command */
2159 DDR_RESTORE_SP(save_sp);
2161 local_irq_restore(flags);
2162 // clk_set_rate(clk_get(NULL, "ddr_pll"), 0);
2168 EXPORT_SYMBOL(ddr_change_freq);
2170 /*----------------------------------------------------------------------
2171 Name : void ddr_set_auto_self_refresh(bool en)
2172 Desc : ÉèÖýøÈë selfrefesh µÄÖÜÆÚÊý
2173 Params : en -> ʹÄÜauto selfrefresh
2175 Notes : ÖÜÆÚÊýΪ1*32 cycle
2176 ----------------------------------------------------------------------*/
2177 void ddr_set_auto_self_refresh(bool en)
2179 //set auto self-refresh idle
2180 ddr_sr_idle = en ? SR_IDLE : 0;
2183 EXPORT_SYMBOL(ddr_set_auto_self_refresh);
2185 /*----------------------------------------------------------------------
2186 Name : void __sramfunc ddr_suspend(void)
2187 Desc : ½øÈëddr suspend
2191 ----------------------------------------------------------------------*/
2192 void __sramfunc ddr_suspend(void)
2196 volatile unsigned int * temp=(volatile unsigned int *)SRAM_CODE_OFFSET;
2197 /** 1. Make sure there is no host access */
2202 for(i=0;i<2;i++) //sram size = 8KB
2207 n= pDDR_Reg->SCFG.d32;
2208 n= pPHY_Reg->PHY_REG1;
2209 n= pCRU_Reg->CRU_PLL_CON[0][0];
2210 n= *(volatile uint32_t *)SysSrv_DdrConf;
2211 n= pGRF_Reg->GRF_SOC_STATUS0;
2213 ddr_selfrefresh_enter(0);
2214 pCRU_Reg->CRU_MODE_CON = (0x1<<((1*4) + 16)) | (0x0<<(1*4)); //PLL slow-mode
2217 pCRU_Reg->CRU_PLL_CON[1][1] = ((0x1<<13)<<16) | (0x1<<13); //PLL power-down
2222 EXPORT_SYMBOL(ddr_suspend);
2224 /*----------------------------------------------------------------------
2225 Name : void __sramfunc ddr_resume(void)
2230 ----------------------------------------------------------------------*/
2231 void __sramfunc ddr_resume(void)
2235 pCRU_Reg->CRU_PLL_CON[1][1] = ((0x1<<13)<<16) | (0x0<<13); //PLL no power-down
2240 if (pCRU_Reg->CRU_PLL_CON[1][1] & (0x1<<10))
2245 pCRU_Reg->CRU_MODE_CON = (0x1<<((1*4) + 16)) | (0x1<<(1*4)); //PLL normal
2248 ddr_selfrefresh_exit();
2250 EXPORT_SYMBOL(ddr_resume);
2252 /*----------------------------------------------------------------------
2253 Name : uint32 ddr_get_cap(void)
2254 Desc : »ñÈ¡ÈÝÁ¿£¬·µ»Ø×Ö½ÚÊý
2258 ----------------------------------------------------------------------*/
2259 uint32 ddr_get_cap(void)
2262 uint32 cs, bank, row, col;
2263 value = pGRF_Reg->GRF_OS_REG[1];
2264 bank = (((value >> DDR_BANK_COUNT) & 0x1)? 2:3);
2265 row = (13+((value >> DDR_ROW_COUNT) & 0x3));
2266 col = (9 + ((value >> DDR_COL_COUNT)&0x3));
2267 cs = (1 + ((value >> DDR_RANK_COUNT)&0x1));
2268 return ((1 << (row + col + bank + 1))*cs);
2270 EXPORT_SYMBOL(ddr_get_cap);
2272 /*----------------------------------------------------------------------
2273 Name : void ddr_reg_save(void)
2274 Desc : ±£´æ¿ØÖÆÆ÷¼Ä´æÆ÷Öµ
2278 ----------------------------------------------------------------------*/
2279 void ddr_reg_save(void)
2282 ddr_reg.pctl.SCFG = pDDR_Reg->SCFG.d32;
2283 ddr_reg.pctl.CMDTSTATEN = pDDR_Reg->CMDTSTATEN;
2284 ddr_reg.pctl.MCFG1 = pDDR_Reg->MCFG1;
2285 ddr_reg.pctl.MCFG = pDDR_Reg->MCFG;
2286 ddr_reg.pctl.pctl_timing.ddrFreq = ddr_freq;
2287 ddr_reg.pctl.DFITCTRLDELAY = pDDR_Reg->DFITCTRLDELAY;
2288 ddr_reg.pctl.DFIODTCFG = pDDR_Reg->DFIODTCFG;
2289 ddr_reg.pctl.DFIODTCFG1 = pDDR_Reg->DFIODTCFG1;
2290 ddr_reg.pctl.DFIODTRANKMAP = pDDR_Reg->DFIODTRANKMAP;
2291 ddr_reg.pctl.DFITPHYWRDATA = pDDR_Reg->DFITPHYWRDATA;
2292 ddr_reg.pctl.DFITPHYWRLAT = pDDR_Reg->DFITPHYWRLAT;
2293 ddr_reg.pctl.DFITRDDATAEN = pDDR_Reg->DFITRDDATAEN;
2294 ddr_reg.pctl.DFITPHYRDLAT = pDDR_Reg->DFITPHYRDLAT;
2295 ddr_reg.pctl.DFITPHYUPDTYPE0 = pDDR_Reg->DFITPHYUPDTYPE0;
2296 ddr_reg.pctl.DFITPHYUPDTYPE1 = pDDR_Reg->DFITPHYUPDTYPE1;
2297 ddr_reg.pctl.DFITPHYUPDTYPE2 = pDDR_Reg->DFITPHYUPDTYPE2;
2298 ddr_reg.pctl.DFITPHYUPDTYPE3 = pDDR_Reg->DFITPHYUPDTYPE3;
2299 ddr_reg.pctl.DFITCTRLUPDMIN = pDDR_Reg->DFITCTRLUPDMIN;
2300 ddr_reg.pctl.DFITCTRLUPDMAX = pDDR_Reg->DFITCTRLUPDMAX;
2301 ddr_reg.pctl.DFITCTRLUPDDLY = pDDR_Reg->DFITCTRLUPDDLY;
2303 ddr_reg.pctl.DFIUPDCFG = pDDR_Reg->DFIUPDCFG;
2304 ddr_reg.pctl.DFITREFMSKI = pDDR_Reg->DFITREFMSKI;
2305 ddr_reg.pctl.DFITCTRLUPDI = pDDR_Reg->DFITCTRLUPDI;
2306 ddr_reg.pctl.DFISTCFG0 = pDDR_Reg->DFISTCFG0;
2307 ddr_reg.pctl.DFISTCFG1 = pDDR_Reg->DFISTCFG1;
2308 ddr_reg.pctl.DFITDRAMCLKEN = pDDR_Reg->DFITDRAMCLKEN;
2309 ddr_reg.pctl.DFITDRAMCLKDIS = pDDR_Reg->DFITDRAMCLKDIS;
2310 ddr_reg.pctl.DFISTCFG2 = pDDR_Reg->DFISTCFG2;
2311 ddr_reg.pctl.DFILPCFG0 = pDDR_Reg->DFILPCFG0;
2314 ddr_reg.DdrConf = *(volatile uint32_t *)SysSrv_DdrConf;
2315 ddr_reg.DdrMode = *(volatile uint32_t *)SysSrv_DdrMode;
2316 ddr_reg.ReadLatency = *(volatile uint32_t *)SysSrv_ReadLatency;
2318 EXPORT_SYMBOL(ddr_reg_save);
2320 __attribute__((aligned(4))) __sramdata uint32 ddr_reg_resume[] =
2322 #include "ddr_reg_resume.inc"
2326 /*----------------------------------------------------------------------
2327 Name : int ddr_init(uint32_t dram_speed_bin, uint32_t freq)
2328 Desc : ddr ³õʼ»¯º¯Êý
2329 Params : dram_speed_bin ->ddr¿ÅÁ£ÀàÐÍ
2333 ----------------------------------------------------------------------*/
2334 int ddr_init(uint32_t dram_speed_bin, uint32_t freq)
2336 volatile uint32_t value = 0;
2338 uint32_t calStatusLeft, calStatusRight;
2340 ddr_print("version 1.00 20130731 \n");
2341 cs = (1 << (((pGRF_Reg->GRF_OS_REG[1]) >> DDR_RANK_COUNT)&0x1)); //case 0:1rank ; case 1:2rank ;
2342 mem_type = ((pGRF_Reg->GRF_OS_REG[1] >> 13) &0x7);
2343 ddr_speed_bin = dram_speed_bin;
2346 ddr_dll_status = DDR3_DLL_DISABLE;
2357 ddr_print("ddr type error type=%d\n",mem_type);
2362 //get capability per chip, not total size, used for calculate tRFC
2363 ddr_capability_per_die = ddr_get_cap()/(cs * die);
2364 ddr_print("%d CS, ROW=%d, Bank=%d, COL=%d, Total Capability=%dMB\n",
2367 (0x1<<(ddr_get_bank())), \
2369 (ddr_get_cap()>>20));
2370 ddr_adjust_config(mem_type);
2372 value=ddr_change_freq(freq);
2374 value=ddr_change_freq(clk_get_rate(clk_get(NULL, "ddr"))/1000000);
2376 clk_set_rate(clk_get(NULL, "ddr"), 0);
2377 ddr_print("init success!!! freq=%dMHz\n", clk_get_rate(clk_get(NULL, "ddr"))/1000000);
2379 calStatusLeft = pPHY_Reg->PHY_REG60;
2380 calStatusRight = pPHY_Reg->PHY_REG61;
2383 ddr_print("left channel:Dllsel=%x, Ophsel=%x, Cycsel=%x\n",\
2384 (calStatusRight >> 5) & 0x07,\
2385 (calStatusRight >> 3) & 0x03,\
2386 calStatusRight & 0x07);
2387 ddr_print("right channel:Dllsel=%x, Ophsel=%x, Cycsel=%x\n",\
2388 (calStatusLeft >> 5) & 0x07,\
2389 (calStatusLeft >> 3) & 0x03,\
2390 calStatusLeft & 0x07);
2392 ddr_print("DRV Pull-Up=0x%x, DRV Pull-Dwn=0x%x\n", (pPHY_Reg->PHY_REG25>>3)&0x7, pPHY_Reg->PHY_REG25&0x7);
2393 ddr_print("ODT Pull-Up=0x%x, ODT Pull-Dwn=0x%x\n", (pPHY_Reg->PHY_REG27>>3)&0x7, pPHY_Reg->PHY_REG27&0x7);
2397 EXPORT_SYMBOL(ddr_init);