2 * Function Driver for DDR controller
4 * Copyright (C) 2011-2014 Fuzhou Rockchip Electronics Co.,Ltd
12 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/clk.h>
17 #include <asm/cacheflush.h>
18 #include <asm/tlbflush.h>
19 #include <linux/cpu.h>
20 #include <dt-bindings/clock/ddr.h>
21 #include <linux/rockchip/cpu_axi.h>
22 #include <linux/rockchip/cru.h>
23 #include <linux/rk_fb.h>
25 typedef uint32_t uint32;
27 #ifdef CONFIG_FB_ROCKCHIP
28 #define DDR_CHANGE_FREQ_IN_LCDC_VSYNC
30 /***********************************
31 * Global Control Macro
32 ***********************************/
33 //#define ENABLE_DDR_CLCOK_GPLL_PATH //for RK3188
35 #define DDR3_DDR2_ODT_DISABLE_FREQ (333)
36 #define DDR3_DDR2_DLL_DISABLE_FREQ (333)
37 #define SR_IDLE (0x3) //unit:32*DDR clk cycle, and 0 for disable auto self-refresh
38 #define PD_IDLE (0X40) //unit:DDR clk cycle, and 0 for disable auto power-down
40 //#if (DDR3_DDR2_ODT_DISABLE_FREQ > DDR3_DDR2_DLL_DISABLE_FREQ)
44 #define ddr_print(x...) printk( "DDR DEBUG: " x )
46 /***********************************
47 * ARCH Relative Macro and Struction
48 ***********************************/
49 #define SRAM_CODE_OFFSET rockchip_sram_virt
50 #define SRAM_SIZE rockchip_sram_size
56 #define pd_scu_pwr_st (1<<11)
57 #define pd_hevc_pwr_st (1<<10)
58 #define pd_gpu_pwr_st (1<<9)
59 #define pd_video_pwr_st (1<<8)
60 #define pd_vio_pwr_st (1<<7)
61 #define pd_peri_pwr_st (1<<6)
62 #define pd_bus_pwr_st (1<<5)
64 #define idle_req_hevc_cfg (1<<9)
65 #define idle_req_cpup_cfg (1<<8)
66 #define idle_req_dma_cfg (1<<7)
67 #define idle_req_alive_cfg (1<<6)
68 #define idle_req_core_cfg (1<<5)
69 #define idle_req_vio_cfg (1<<4)
70 #define idle_req_video_cfg (1<<3)
71 #define idle_req_gpu_cfg (1<<2)
72 #define idle_req_peri_cfg (1<<1)
73 #define idle_req_bus_cfg (1<<0)
76 #define idle_ack_hevc (1<<25)
77 #define idle_ack_cpup (1<<24)
78 #define idle_ack_dma (1<<23)
79 #define idle_ack_alive (1<<22)
80 #define idle_ack_core (1<<21)
81 #define idle_ack_vio (1<<20)
82 #define idle_ack_video (1<<19)
83 #define idle_ack_gpu (1<<18)
84 #define idle_ack_peir (1<<17)
85 #define idle_ack_bus (1<<16)
87 #define idle_hevc (1<<9)
88 #define idle_cpup (1<<8)
89 #define idle_dma (1<<7)
90 #define idle_alive (1<<6)
91 #define idle_core (1<<5)
92 #define idle_vio (1<<4)
93 #define idle_video (1<<3)
94 #define idle_gpu (1<<2)
95 #define idle_peri (1<<1)
96 #define idle_bus (1<<0)
102 #define ddrio_ret_de_req(ch) (1<<(21+(ch)))
103 #define ddrc_gating_en(ch) (1<<(19+(ch)))
104 #define ddrio_ret_en(ch) (1<<(17+(ch)))
105 #define sref_enter_en(ch) (1<<(15+(ch)))
108 #define SREF_EXIT (1<<26)
109 #define DDR_IO_PWRUP (1<<25)
112 typedef volatile struct tagPMU_FILE
114 uint32 PMU_WAKEUP_CFG[2];
115 uint32 PMU_PWRDN_CON;
119 uint32 PMU_PWRMODE_CON;
120 uint32 PMU_PWR_STATE;
123 uint32 PMU_STABL_CNT;
124 uint32 PMU_DDR0IO_PWRON_CNT;
125 uint32 PMU_DDR1IO_PWRON_CNT;
126 uint32 PMU_CORE_PWRDN_CNT;
127 uint32 PMU_CORE_PWRUP_CNT;
128 uint32 PMU_GPU_PWRDWN_CNT;
129 uint32 PMU_GPU_PWRUP_CNT;
130 uint32 PMU_WAKEUP_RST_CLR_CNT;
132 uint32 PMU_DDR_SREF_ST;
135 uint32 PMU_BOOT_ADDR_SEL;
138 uint32 PMU_GPIO0_A_PULL;
139 uint32 PMU_GPIO0_B_PULL;
140 uint32 PMU_GPIO0_C_PULL;
141 uint32 PMU_GPIO0_A_DRV;
142 uint32 PMU_GPIO0_B_DRV;
143 uint32 PMU_GPIO0_C_DRV;
145 uint32 PMU_GPIO0_SEL18;
146 uint32 PMU_GPIO0_A_IOMUX;
147 uint32 PMU_GPIO0_B_IOMUX;
148 uint32 PMU_GPIO0_C_IOMUX;
149 uint32 PMU_GPIO0_D_IOMUX;
150 uint32 PMU_PMU_SYS_REG[4];
151 }PMU_FILE, *pPMU_FILE;
156 typedef enum PLL_ID_Tag
165 #define PLL_RESET (((0x1<<5)<<16) | (0x1<<5))
166 #define PLL_DE_RESET (((0x1<<5)<<16) | (0x0<<5))
167 #define NR(n) ((0x3F<<(8+16)) | (((n)-1)<<8))
168 #define NO(n) ((0xF<<16) | ((n)-1))
169 #define NF(n) ((0x1FFF<<16) | ((n)-1))
170 #define NB(n) ((0xFFF<<16) | ((n)-1))
173 typedef volatile struct tagCRU_STRUCT
175 uint32 CRU_PLL_CON[5][4];
177 uint32 reserved1[(0x60-0x54)/4];
178 uint32 CRU_CLKSEL_CON[43];
179 uint32 reserved2[(0x160-0x10c)/4];
180 uint32 CRU_CLKGATE_CON[19];
181 uint32 reserved3[(0x1b0-0x1ac)/4];
182 uint32 CRU_GLB_SRST_FST_VALUE;
183 uint32 CRU_GLB_SRST_SND_VALUE;
184 uint32 CRU_SOFTRST_CON[12];
186 uint32 CRU_GLB_CNT_TH;
187 uint32 CRU_TSADC_RST_CON;
188 uint32 reserved4[(0x200-0x1f4)/4];
189 uint32 CRU_SDMMC_CON[2];
190 uint32 CRU_SDIO0_CON[2];
191 uint32 CRU_SDIO1_CON[2];
192 uint32 CRU_EMMC_CON[2];
193 // other regigster unused in boot
194 } CRU_REG, *pCRU_REG;
200 typedef volatile struct tagREG_FILE
202 uint32 GRF_GPIO1A_IOMUX;
203 uint32 GRF_GPIO1B_IOMUX;
204 uint32 GRF_GPIO1C_IOMUX;
205 uint32 GRF_GPIO1D_IOMUX;
206 uint32 GRF_GPIO2A_IOMUX;
207 uint32 GRF_GPIO2B_IOMUX;
208 uint32 GRF_GPIO2C_IOMUX;
209 uint32 GRF_GPIO2D_IOMUX;
210 uint32 GRF_GPIO3A_IOMUX;
211 uint32 GRF_GPIO3B_IOMUX;
212 uint32 GRF_GPIO3C_IOMUX;
213 uint32 GRF_GPIO3DL_IOMUX;
214 uint32 GRF_GPIO3DH_IOMUX;
215 uint32 GRF_GPIO4AL_IOMUX;
216 uint32 GRF_GPIO4AH_IOMUX;
217 uint32 GRF_GPIO4BL_IOMUX;
218 uint32 GRF_GPIO4BH_IOMUX;
219 uint32 GRF_GPIO4C_IOMUX;
220 uint32 GRF_GPIO4D_IOMUX;
221 uint32 GRF_GPIO5A_IOMUX;
222 uint32 GRF_GPIO5B_IOMUX;
223 uint32 GRF_GPIO5C_IOMUX;
224 uint32 GRF_GPIO5D_IOMUX;
225 uint32 GRF_GPIO6A_IOMUX;
226 uint32 GRF_GPIO6B_IOMUX;
227 uint32 GRF_GPIO6C_IOMUX;
228 uint32 GRF_GPIO6D_IOMUX;
229 uint32 GRF_GPIO7A_IOMUX;
230 uint32 GRF_GPIO7B_IOMUX;
231 uint32 GRF_GPIO7CL_IOMUX;
232 uint32 GRF_GPIO7CH_IOMUX;
233 uint32 GRF_GPIO7D_IOMUX;
234 uint32 GRF_GPIO8A_IOMUX;
235 uint32 GRF_GPIO8B_IOMUX;
236 uint32 GRF_GPIO8C_IOMUX;
237 uint32 GRF_GPIO8D_IOMUX;
238 uint32 reserved1[(0x100-0x90)/4];
239 uint32 GRF_GPIO1L_SR;
240 uint32 GRF_GPIO1H_SR;
241 uint32 GRF_GPIO2L_SR;
242 uint32 GRF_GPIO2H_SR;
243 uint32 GRF_GPIO3L_SR;
244 uint32 GRF_GPIO3H_SR;
245 uint32 GRF_GPIO4L_SR;
246 uint32 GRF_GPIO4H_SR;
247 uint32 GRF_GPIO5L_SR;
248 uint32 GRF_GPIO5H_SR;
249 uint32 GRF_GPIO6L_SR;
250 uint32 GRF_GPIO6H_SR;
251 uint32 GRF_GPIO7L_SR;
252 uint32 GRF_GPIO7H_SR;
253 uint32 GRF_GPIO8L_SR;
254 uint32 GRF_GPIO8H_SR;
320 uint32 GRF_SOC_CON[15];
321 uint32 GRF_SOC_STATUS[23];
322 uint32 reserved2[(0x2e0-0x2dc)/4];
323 uint32 GRF_DMAC2_CON[4];
324 uint32 GRF_DDRC0_CON0;
325 uint32 GRF_DDRC1_CON0;
326 uint32 GRF_CPU_CON[5];
327 uint32 reserved3[(0x318-0x30c)/4];
328 uint32 GRF_CPU_STATUS0;
329 uint32 reserved4[(0x320-0x31c)/4];
330 uint32 GRF_UOC0_CON[5];
331 uint32 GRF_UOC1_CON[5];
332 uint32 GRF_UOC2_CON[4];
333 uint32 GRF_UOC3_CON[2];
334 uint32 GRF_UOC4_CON[2];
335 uint32 GRF_DLL_CON[3];
336 uint32 GRF_DLL_STATUS[3];
338 uint32 GRF_SARADC_TESTBIT;
339 uint32 GRF_TSADC_TESTBIT_L;
340 uint32 GRF_TSADC_TESTBIT_H;
341 uint32 GRF_OS_REG[4];
342 uint32 GRF_FAST_BOOT_ADDR;
343 uint32 GRF_SOC_CON15;
344 uint32 GRF_SOC_CON16;
345 } REG_FILE, *pREG_FILE;
351 #define INIT_STATE (0)
352 #define CFG_STATE (1)
354 #define SLEEP_STATE (3)
355 #define WAKEUP_STATE (4)
360 #define Config_req (2)
362 #define Access_req (4)
363 #define Low_power (5)
364 #define Low_power_entry_req (6)
365 #define Low_power_exit_req (7)
368 #define mddr_lpddr2_clk_stop_idle(n) ((n)<<24)
369 #define pd_idle(n) ((n)<<8)
370 #define mddr_en (2<<22)
371 #define lpddr2_en (3<<22)
372 #define ddr2_en (0<<5)
373 #define ddr3_en (1<<5)
374 #define lpddr2_s2 (0<<6)
375 #define lpddr2_s4 (1<<6)
376 #define mddr_lpddr2_bl_2 (0<<20)
377 #define mddr_lpddr2_bl_4 (1<<20)
378 #define mddr_lpddr2_bl_8 (2<<20)
379 #define mddr_lpddr2_bl_16 (3<<20)
380 #define ddr2_ddr3_bl_4 (0)
381 #define ddr2_ddr3_bl_8 (1)
382 #define tfaw_cfg(n) (((n)-4)<<18)
383 #define pd_exit_slow (0<<17)
384 #define pd_exit_fast (1<<17)
385 #define pd_type(n) ((n)<<16)
386 #define two_t_en(n) ((n)<<3)
387 #define bl8int_en(n) ((n)<<2)
388 #define cke_or_en(n) ((n)<<1)
391 #define power_up_start (1<<0)
394 #define power_up_done (1<<0)
397 #define dfi_init_complete (1<<0)
400 #define cmd_tstat (1<<0)
403 #define cmd_tstat_en (1<<1)
406 #define Deselect_cmd (0)
416 #define lpddr2_op(n) ((n)<<12)
417 #define lpddr2_ma(n) ((n)<<4)
419 #define bank_addr(n) ((n)<<17)
420 #define cmd_addr(n) ((n)<<4)
422 #define start_cmd (1u<<31)
424 typedef union STAT_Tag
429 unsigned ctl_stat : 3;
430 unsigned reserved3 : 1;
431 unsigned lp_trig : 3;
432 unsigned reserved7_31 : 25;
436 typedef union SCFG_Tag
441 unsigned hw_low_power_en : 1;
442 unsigned reserved1_5 : 5;
443 unsigned nfifo_nif1_dis : 1;
444 unsigned reserved7 : 1;
445 unsigned bbflags_timing : 4;
446 unsigned reserved12_31 : 20;
450 /* DDR Controller register struct */
451 typedef volatile struct DDR_REG_Tag
453 //Operational State, Control, and Status Registers
454 SCFG_T SCFG; //State Configuration Register
455 volatile uint32 SCTL; //State Control Register
456 STAT_T STAT; //State Status Register
457 volatile uint32 INTRSTAT; //Interrupt Status Register
458 uint32 reserved0[(0x40-0x10)/4];
459 //Initailization Control and Status Registers
460 volatile uint32 MCMD; //Memory Command Register
461 volatile uint32 POWCTL; //Power Up Control Registers
462 volatile uint32 POWSTAT; //Power Up Status Register
463 volatile uint32 CMDTSTAT; //Command Timing Status Register
464 volatile uint32 CMDTSTATEN; //Command Timing Status Enable Register
465 uint32 reserved1[(0x60-0x54)/4];
466 volatile uint32 MRRCFG0; //MRR Configuration 0 Register
467 volatile uint32 MRRSTAT0; //MRR Status 0 Register
468 volatile uint32 MRRSTAT1; //MRR Status 1 Register
469 uint32 reserved2[(0x7c-0x6c)/4];
470 //Memory Control and Status Registers
471 volatile uint32 MCFG1; //Memory Configuration 1 Register
472 volatile uint32 MCFG; //Memory Configuration Register
473 volatile uint32 PPCFG; //Partially Populated Memories Configuration Register
474 volatile uint32 MSTAT; //Memory Status Register
475 volatile uint32 LPDDR2ZQCFG; //LPDDR2 ZQ Configuration Register
477 //DTU Control and Status Registers
478 volatile uint32 DTUPDES; //DTU Status Register
479 volatile uint32 DTUNA; //DTU Number of Random Addresses Created Register
480 volatile uint32 DTUNE; //DTU Number of Errors Register
481 volatile uint32 DTUPRD0; //DTU Parallel Read 0
482 volatile uint32 DTUPRD1; //DTU Parallel Read 1
483 volatile uint32 DTUPRD2; //DTU Parallel Read 2
484 volatile uint32 DTUPRD3; //DTU Parallel Read 3
485 volatile uint32 DTUAWDT; //DTU Address Width
486 uint32 reserved4[(0xc0-0xb4)/4];
487 //Memory Timing Registers
488 volatile uint32 TOGCNT1U; //Toggle Counter 1U Register
489 volatile uint32 TINIT; //t_init Timing Register
490 volatile uint32 TRSTH; //Reset High Time Register
491 volatile uint32 TOGCNT100N; //Toggle Counter 100N Register
492 volatile uint32 TREFI; //t_refi Timing Register
493 volatile uint32 TMRD; //t_mrd Timing Register
494 volatile uint32 TRFC; //t_rfc Timing Register
495 volatile uint32 TRP; //t_rp Timing Register
496 volatile uint32 TRTW; //t_rtw Timing Register
497 volatile uint32 TAL; //AL Latency Register
498 volatile uint32 TCL; //CL Timing Register
499 volatile uint32 TCWL; //CWL Register
500 volatile uint32 TRAS; //t_ras Timing Register
501 volatile uint32 TRC; //t_rc Timing Register
502 volatile uint32 TRCD; //t_rcd Timing Register
503 volatile uint32 TRRD; //t_rrd Timing Register
504 volatile uint32 TRTP; //t_rtp Timing Register
505 volatile uint32 TWR; //t_wr Timing Register
506 volatile uint32 TWTR; //t_wtr Timing Register
507 volatile uint32 TEXSR; //t_exsr Timing Register
508 volatile uint32 TXP; //t_xp Timing Register
509 volatile uint32 TXPDLL; //t_xpdll Timing Register
510 volatile uint32 TZQCS; //t_zqcs Timing Register
511 volatile uint32 TZQCSI; //t_zqcsi Timing Register
512 volatile uint32 TDQS; //t_dqs Timing Register
513 volatile uint32 TCKSRE; //t_cksre Timing Register
514 volatile uint32 TCKSRX; //t_cksrx Timing Register
515 volatile uint32 TCKE; //t_cke Timing Register
516 volatile uint32 TMOD; //t_mod Timing Register
517 volatile uint32 TRSTL; //Reset Low Timing Register
518 volatile uint32 TZQCL; //t_zqcl Timing Register
519 volatile uint32 TMRR; //t_mrr Timing Register
520 volatile uint32 TCKESR; //t_ckesr Timing Register
521 volatile uint32 TDPD; //t_dpd Timing Register
522 uint32 reserved5[(0x180-0x148)/4];
523 //ECC Configuration, Control, and Status Registers
524 volatile uint32 ECCCFG; //ECC Configuration Register
525 volatile uint32 ECCTST; //ECC Test Register
526 volatile uint32 ECCCLR; //ECC Clear Register
527 volatile uint32 ECCLOG; //ECC Log Register
528 uint32 reserved6[(0x200-0x190)/4];
529 //DTU Control and Status Registers
530 volatile uint32 DTUWACTL; //DTU Write Address Control Register
531 volatile uint32 DTURACTL; //DTU Read Address Control Register
532 volatile uint32 DTUCFG; //DTU Configuration Control Register
533 volatile uint32 DTUECTL; //DTU Execute Control Register
534 volatile uint32 DTUWD0; //DTU Write Data 0
535 volatile uint32 DTUWD1; //DTU Write Data 1
536 volatile uint32 DTUWD2; //DTU Write Data 2
537 volatile uint32 DTUWD3; //DTU Write Data 3
538 volatile uint32 DTUWDM; //DTU Write Data Mask
539 volatile uint32 DTURD0; //DTU Read Data 0
540 volatile uint32 DTURD1; //DTU Read Data 1
541 volatile uint32 DTURD2; //DTU Read Data 2
542 volatile uint32 DTURD3; //DTU Read Data 3
543 volatile uint32 DTULFSRWD; //DTU LFSR Seed for Write Data Generation
544 volatile uint32 DTULFSRRD; //DTU LFSR Seed for Read Data Generation
545 volatile uint32 DTUEAF; //DTU Error Address FIFO
546 //DFI Control Registers
547 volatile uint32 DFITCTRLDELAY; //DFI tctrl_delay Register
548 volatile uint32 DFIODTCFG; //DFI ODT Configuration Register
549 volatile uint32 DFIODTCFG1; //DFI ODT Configuration 1 Register
550 volatile uint32 DFIODTRANKMAP; //DFI ODT Rank Mapping Register
551 //DFI Write Data Registers
552 volatile uint32 DFITPHYWRDATA; //DFI tphy_wrdata Register
553 volatile uint32 DFITPHYWRLAT; //DFI tphy_wrlat Register
554 uint32 reserved7[(0x260-0x258)/4];
555 volatile uint32 DFITRDDATAEN; //DFI trddata_en Register
556 volatile uint32 DFITPHYRDLAT; //DFI tphy_rddata Register
557 uint32 reserved8[(0x270-0x268)/4];
558 //DFI Update Registers
559 volatile uint32 DFITPHYUPDTYPE0; //DFI tphyupd_type0 Register
560 volatile uint32 DFITPHYUPDTYPE1; //DFI tphyupd_type1 Register
561 volatile uint32 DFITPHYUPDTYPE2; //DFI tphyupd_type2 Register
562 volatile uint32 DFITPHYUPDTYPE3; //DFI tphyupd_type3 Register
563 volatile uint32 DFITCTRLUPDMIN; //DFI tctrlupd_min Register
564 volatile uint32 DFITCTRLUPDMAX; //DFI tctrlupd_max Register
565 volatile uint32 DFITCTRLUPDDLY; //DFI tctrlupd_dly Register
567 volatile uint32 DFIUPDCFG; //DFI Update Configuration Register
568 volatile uint32 DFITREFMSKI; //DFI Masked Refresh Interval Register
569 volatile uint32 DFITCTRLUPDI; //DFI tctrlupd_interval Register
570 uint32 reserved10[(0x2ac-0x29c)/4];
571 volatile uint32 DFITRCFG0; //DFI Training Configuration 0 Register
572 volatile uint32 DFITRSTAT0; //DFI Training Status 0 Register
573 volatile uint32 DFITRWRLVLEN; //DFI Training dfi_wrlvl_en Register
574 volatile uint32 DFITRRDLVLEN; //DFI Training dfi_rdlvl_en Register
575 volatile uint32 DFITRRDLVLGATEEN; //DFI Training dfi_rdlvl_gate_en Register
576 //DFI Status Registers
577 volatile uint32 DFISTSTAT0; //DFI Status Status 0 Register
578 volatile uint32 DFISTCFG0; //DFI Status Configuration 0 Register
579 volatile uint32 DFISTCFG1; //DFI Status configuration 1 Register
581 volatile uint32 DFITDRAMCLKEN; //DFI tdram_clk_enalbe Register
582 volatile uint32 DFITDRAMCLKDIS; //DFI tdram_clk_disalbe Register
583 volatile uint32 DFISTCFG2; //DFI Status configuration 2 Register
584 volatile uint32 DFISTPARCLR; //DFI Status Parity Clear Register
585 volatile uint32 DFISTPARLOG; //DFI Status Parity Log Register
586 uint32 reserved12[(0x2f0-0x2e4)/4];
587 //DFI Low Power Registers
588 volatile uint32 DFILPCFG0; //DFI Low Power Configuration 0 Register
589 uint32 reserved13[(0x300-0x2f4)/4];
590 //DFI Training 2 Registers
591 volatile uint32 DFITRWRLVLRESP0; //DFI Training dif_wrlvl_resp Status 0 Register
592 volatile uint32 DFITRWRLVLRESP1; //DFI Training dif_wrlvl_resp Status 1 Register
593 volatile uint32 DFITRWRLVLRESP2; //DFI Training dif_wrlvl_resp Status 2 Register
594 volatile uint32 DFITRRDLVLRESP0; //DFI Training dif_rdlvl_resp Status 0 Register
595 volatile uint32 DFITRRDLVLRESP1; //DFI Training dif_rdlvl_resp Status 1 Register
596 volatile uint32 DFITRRDLVLRESP2; //DFI Training dif_rdlvl_resp Status 2 Register
597 volatile uint32 DFITRWRLVLDELAY0; //DFI Training dif_wrlvl_delay Configuration 0 Register
598 volatile uint32 DFITRWRLVLDELAY1; //DFI Training dif_wrlvl_delay Configuration 1 Register
599 volatile uint32 DFITRWRLVLDELAY2; //DFI Training dif_wrlvl_delay Configuration 2 Register
600 volatile uint32 DFITRRDLVLDELAY0; //DFI Training dif_rdlvl_delay Configuration 0 Register
601 volatile uint32 DFITRRDLVLDELAY1; //DFI Training dif_rdlvl_delay Configuration 1 Register
602 volatile uint32 DFITRRDLVLDELAY2; //DFI Training dif_rdlvl_delay Configuration 2 Register
603 volatile uint32 DFITRRDLVLGATEDELAY0; //DFI Training dif_rdlvl_gate_delay Configuration 0 Register
604 volatile uint32 DFITRRDLVLGATEDELAY1; //DFI Training dif_rdlvl_gate_delay Configuration 1 Register
605 volatile uint32 DFITRRDLVLGATEDELAY2; //DFI Training dif_rdlvl_gate_delay Configuration 2 Register
606 volatile uint32 DFITRCMD; //DFI Training Command Register
607 uint32 reserved14[(0x3f8-0x340)/4];
608 //IP Status Registers
609 volatile uint32 IPVR; //IP Version Register
610 volatile uint32 IPTR; //IP Type Register
611 }DDR_REG_T, *pDDR_REG_T;
618 #define DLLSRST (1<<1)
619 #define DLLLOCK (1<<2)
621 #define ITMSRST (1<<4)
622 #define DRAMRST (1<<5)
623 #define DRAMINIT (1<<6)
625 #define EYETRN (1<<8)
627 #define DLLBYP (1<<17)
628 #define CTLDINIT (1<<18)
629 #define CLRSR (1<<28)
630 #define LOCKBYP (1<<29)
631 #define ZCALBYP (1<<30)
632 #define INITBYP (1u<<31)
635 #define DFTLMT(n) ((n)<<3)
636 #define DFTCMP(n) ((n)<<2)
637 #define DQSCFG(n) ((n)<<1)
638 #define ITMDMD(n) ((n)<<0)
639 #define RANKEN(n) ((n)<<18)
643 #define DLDONE (1<<1)
644 #define ZCDONE (1<<2)
645 #define DIDONE (1<<3)
646 #define DTDONE (1<<4)
648 #define DTIERR (1<<6)
649 #define DFTERR (1<<7)
653 #define tITMSRST(n) ((n)<<18)
654 #define tDLLLOCK(n) ((n)<<6)
655 #define tDLLSRST(n) ((n)<<0)
658 #define tDINIT1(n) ((n)<<19)
659 #define tDINIT0(n) ((n)<<0)
662 #define tDINIT3(n) ((n)<<17)
663 #define tDINIT2(n) ((n)<<0)
666 #define DQSGE(n) ((n)<<8)
667 #define DQSGX(n) ((n)<<5)
669 typedef union DCR_Tag
675 unsigned DDR8BNK : 1;
678 unsigned DDRTYPE : 2;
679 unsigned reserved10_26 : 17;
688 typedef volatile struct DATX8_REG_Tag
690 volatile uint32 DXGCR; //DATX8 General Configuration Register
691 volatile uint32 DXGSR[2]; //DATX8 General Status Register
692 volatile uint32 DXDLLCR; //DATX8 DLL Control Register
693 volatile uint32 DXDQTR; //DATX8 DQ Timing Register
694 volatile uint32 DXDQSTR; //DATX8 DQS Timing Register
695 uint32 reserved[0x80-0x76];
698 /* DDR PHY register struct */
699 typedef volatile struct DDRPHY_REG_Tag
701 volatile uint32 RIDR; //Revision Identification Register
702 volatile uint32 PIR; //PHY Initialization Register
703 volatile uint32 PGCR; //PHY General Configuration Register
704 volatile uint32 PGSR; //PHY General Status Register
705 volatile uint32 DLLGCR; //DLL General Control Register
706 volatile uint32 ACDLLCR; //AC DLL Control Register
707 volatile uint32 PTR[3]; //PHY Timing Registers 0-2
708 volatile uint32 ACIOCR; //AC I/O Configuration Register
709 volatile uint32 DXCCR; //DATX8 Common Configuration Register
710 volatile uint32 DSGCR; //DDR System General Configuration Register
711 DCR_T DCR; //DRAM Configuration Register
712 volatile uint32 DTPR[3]; //DRAM Timing Parameters Register 0-2
713 volatile uint32 MR[4]; //Mode Register 0-3
714 volatile uint32 ODTCR; //ODT Configuration Register
715 volatile uint32 DTAR; //Data Training Address Register
716 volatile uint32 DTDR[2]; //Data Training Data Register 0-1
718 uint32 reserved1[0x30-0x18];
719 uint32 DCU[0x38-0x30];
720 uint32 reserved2[0x40-0x38];
721 uint32 BIST[0x51-0x40];
722 uint32 reserved3[0x60-0x51];
724 volatile uint32 ZQ0CR[2]; //ZQ 0 Impedance Control Register 0-1
725 volatile uint32 ZQ0SR[2]; //ZQ 0 Impedance Status Register 0-1
726 volatile uint32 ZQ1CR[2]; //ZQ 1 Impedance Control Register 0-1
727 volatile uint32 ZQ1SR[2]; //ZQ 1 Impedance Status Register 0-1
728 volatile uint32 ZQ2CR[2]; //ZQ 2 Impedance Control Register 0-1
729 volatile uint32 ZQ2SR[2]; //ZQ 2 Impedance Status Register 0-1
730 volatile uint32 ZQ3CR[2]; //ZQ 3 Impedance Control Register 0-1
731 volatile uint32 ZQ3SR[2]; //ZQ 3 Impedance Status Register 0-1
733 DATX8_REG_T DATX8[9]; //DATX8 Register
734 }DDRPHY_REG_T, *pDDRPHY_REG_T;
736 typedef union NOC_TIMING_Tag
741 unsigned ActToAct : 6;
742 unsigned RdToMiss : 6;
743 unsigned WrToMiss : 6;
744 unsigned BurstLen : 3;
747 unsigned BwRatio : 1;
751 typedef union NOC_ACTIVATE_Tag
756 unsigned Rrd : 4; //bit[0:3]
757 unsigned Faw : 6; //bit[4:9]
758 unsigned Fawbank : 1; //bit 10
759 unsigned reserved : 21;
763 typedef volatile struct MSCH_REG_Tag
765 volatile uint32 coreid;
766 volatile uint32 revisionid;
767 volatile uint32 ddrconf;
768 volatile NOC_TIMING_T ddrtiming;
769 volatile uint32 ddrmode;
770 volatile uint32 readlatency;
771 uint32 reserved1[(0x38-0x18)/4];
772 volatile NOC_ACTIVATE_T activate;
773 volatile uint32 devtodev;
774 }MSCH_REG, *pMSCH_REG;
777 #define DRAM_PHYS (0) //DRAM Channel a physical address start
778 #define pPMU_Reg ((pPMU_FILE)RK_PMU_VIRT)
779 #define pCRU_Reg ((pCRU_REG)RK_CRU_VIRT)
780 #define pGRF_Reg ((pREG_FILE)RK_GRF_VIRT)
781 #define pDDR_REG(ch) ((ch) ? ((pDDR_REG_T)(RK_DDR_VIRT + RK3288_DDR_PCTL_SIZE + RK3288_DDR_PUBL_SIZE)):((pDDR_REG_T)RK_DDR_VIRT))
782 #define pPHY_REG(ch) ((ch) ? ((pDDRPHY_REG_T)(RK_DDR_VIRT + 2 * RK3288_DDR_PCTL_SIZE + RK3288_DDR_PUBL_SIZE)) : ((pDDRPHY_REG_T)(RK_DDR_VIRT + RK3288_DDR_PCTL_SIZE)))
783 #define pMSCH_REG(ch) ((ch)? ((pMSCH_REG)(RK3288_SERVICE_BUS_VIRT+0x80)):((pMSCH_REG)(RK3288_SERVICE_BUS_VIRT)))
784 #define GET_DDR3_DS_ODT() ((0x1<<28) | (0x2<<15) | (0x2<<10) | (0x19<<5) | 0x19)
785 #define GET_LPDDR2_DS_ODT() ((0x1<<28) | (0x2<<15) | (0x2<<10) | (0x19<<5) | 0x19)
786 #define GET_LPDDR3_DS_ODT() ((0x1<<28) | (0x2<<15) | (0x2<<10) | (0x19<<5) | 0x19)
787 #define DDR_GET_RANK_2_ROW15() (0)
788 #define DDR_GET_BANK_2_RANK() (0)
789 #define DDR_HW_WAKEUP(ch,en) do{pGRF_Reg->GRF_SOC_CON[0] = (1<<(16+5+ch)) | (en<<(5+ch));}while(0)
790 #define READ_GRF_REG() (pGRF_Reg->GRF_SOC_CON[0])
791 #define GET_DPLL_LOCK_STATUS() (pGRF_Reg->GRF_SOC_STATUS[1] & (1<<5))
792 #define SET_DDR_PLL_SRC(src, div) do{pCRU_Reg->CRU_CLKSEL_CON[26] = ((0x3|(0x1<<2))<<16)|(src<<2)| div;}while(0)
793 #define GET_DDR_PLL_SRC() ((pCRU_Reg->CRU_CLKSEL_CON[26]&(1<<2)) ? GPLL : DPLL)
794 #define DDR_GPLL_CLK_GATE(en) do{pCRU_Reg->CRU_CLKGATE_CON[0] = 0x02000000 | (en<<9);}while(0)
795 #define SET_DDRPHY_CLKGATE(ch,dis) do{pCRU_Reg->CRU_CLKGATE_CON[4] = ((0x1<<(12+ch))<<16) | (dis<<(12+ch));}while(0)
796 #define READ_DDR_STRIDE() (readl_relaxed(RK_SGRF_VIRT+0x8) &0x1F)
798 #define READ_CH_CNT() (1+((pPMU_Reg->PMU_PMU_SYS_REG[2]>>12)&0x1))
799 #define READ_CH_INFO() ((pPMU_Reg->PMU_PMU_SYS_REG[2]>>28)&0x3)
800 #define READ_CH_ROW_INFO(ch) ((pPMU_Reg->PMU_PMU_SYS_REG[2]>>(30+(ch)))&0x1) //row_3_4:0=normal, 1=6Gb or 12Gb
802 #define SET_PLL_MODE(pll, mode) do{pCRU_Reg->CRU_MODE_CON = ((mode<<((pll)*4))|(0x3<<(16+(pll)*4)));}while(0)
803 #define SET_PLL_PD(pll, pd) do{pCRU_Reg->CRU_PLL_CON[pll][3] = ((0x1<<1)<<16) | (pd<<1);}while(0)
805 #define READ_DRAMTYPE_INFO() ((pPMU_Reg->PMU_PMU_SYS_REG[2]>>13)&0x7)
806 #define READ_CS_INFO(ch) ((((pPMU_Reg->PMU_PMU_SYS_REG[2])>>(11+(ch)*16))&0x1)+1)
807 #define READ_BW_INFO(ch) (2>>(((pPMU_Reg->PMU_PMU_SYS_REG[2])>>(2+(ch)*16))&0x3))
808 #define READ_COL_INFO(ch) (9+(((pPMU_Reg->PMU_PMU_SYS_REG[2])>>(9+(ch)*16))&0x3))
809 #define READ_BK_INFO(ch) (3-(((pPMU_Reg->PMU_PMU_SYS_REG[2])>>(8+(ch)*16))&0x1))
810 #define READ_ROW_INFO(ch,cs) (13+(((pPMU_Reg->PMU_PMU_SYS_REG[2])>>(6-(2*cs)+(ch)*16))&0x3))
811 #define READ_DIE_BW_INFO(ch) (2>>((pPMU_Reg->PMU_PMU_SYS_REG[2]>>((ch)*16))&0x3))
813 static const uint16_t ddr_cfg_2_rbc[] =
815 /****************************/
816 // [8:7] bank(n:n bit bank)
818 // [3:2] bank(n:n bit bank)
820 /****************************/
821 //all config have (13col,3bank,16row,1cs)
822 //bank, row, bank, col col bank row(32bit)
823 ((3<<7)|(3<<4)|(0<<2)|2), // 0 11 8 15
824 ((0<<7)|(1<<4)|(3<<2)|1), // 1 10 8 13
825 ((0<<7)|(2<<4)|(3<<2)|1), // 2 10 8 14
826 ((0<<7)|(3<<4)|(3<<2)|1), // 3 10 8 15
827 ((0<<7)|(4<<4)|(3<<2)|1), // 4 10 8 16
828 ((0<<7)|(1<<4)|(3<<2)|2), // 5 11 8 13 // 32bit not use
829 ((0<<7)|(2<<4)|(3<<2)|2), // 6 11 8 14
830 ((0<<7)|(3<<4)|(3<<2)|2), // 7 11 8 15
831 ((0<<7)|(1<<4)|(3<<2)|0), // 8 9 8 13
832 ((0<<7)|(2<<4)|(3<<2)|0), // 9 9 8 14
833 ((0<<7)|(3<<4)|(3<<2)|0), // 10 9 8 15
834 ((0<<7)|(2<<4)|(2<<2)|0), // 11 9 4 14
835 ((0<<7)|(1<<4)|(2<<2)|1), // 12 10 4 13
836 ((0<<7)|(0<<4)|(2<<2)|2), // 13 11 4 12
837 ((3<<7)|(4<<4)|(0<<2)|1), // 14 10 8 16 / 10, 4,15 / 10, 8, 15
838 ((0<<7)|(4<<4)|(3<<2)|2), // 15 11 8 16
841 /***********************************
843 ***********************************/
844 //MR0 (Device Information)
845 #define LPDDR2_DAI (0x1) // 0:DAI complete, 1:DAI still in progress
846 #define LPDDR2_DI (0x1<<1) // 0:S2 or S4 SDRAM, 1:NVM
847 #define LPDDR2_DNVI (0x1<<2) // 0:DNV not supported, 1:DNV supported
848 #define LPDDR2_RZQI (0x3<<3) // 00:RZQ self test not supported, 01:ZQ-pin may connect to VDDCA or float
849 // 10:ZQ-pin may short to GND. 11:ZQ-pin self test completed, no error condition detected.
851 //MR1 (Device Feature)
852 #define LPDDR2_BL4 (0x2)
853 #define LPDDR2_BL8 (0x3)
854 #define LPDDR2_BL16 (0x4)
855 #define LPDDR2_nWR(n) (((n)-2)<<5)
857 //MR2 (Device Feature 2)
858 #define LPDDR2_RL3_WL1 (0x1)
859 #define LPDDR2_RL4_WL2 (0x2)
860 #define LPDDR2_RL5_WL2 (0x3)
861 #define LPDDR2_RL6_WL3 (0x4)
862 #define LPDDR2_RL7_WL4 (0x5)
863 #define LPDDR2_RL8_WL4 (0x6)
865 //MR3 (IO Configuration 1)
866 #define LPDDR2_DS_34 (0x1)
867 #define LPDDR2_DS_40 (0x2)
868 #define LPDDR2_DS_48 (0x3)
869 #define LPDDR2_DS_60 (0x4)
870 #define LPDDR2_DS_80 (0x6)
871 #define LPDDR2_DS_120 (0x7) //optional
873 //MR4 (Device Temperature)
874 #define LPDDR2_tREF_MASK (0x7)
875 #define LPDDR2_4_tREF (0x1)
876 #define LPDDR2_2_tREF (0x2)
877 #define LPDDR2_1_tREF (0x3)
878 #define LPDDR2_025_tREF (0x5)
879 #define LPDDR2_025_tREF_DERATE (0x6)
881 #define LPDDR2_TUF (0x1<<7)
883 //MR8 (Basic configuration 4)
884 #define LPDDR2_S4 (0x0)
885 #define LPDDR2_S2 (0x1)
886 #define LPDDR2_N (0x2)
887 #define LPDDR2_Density(mr8) (8<<(((mr8)>>2)&0xf)) // Unit:MB
888 #define LPDDR2_IO_Width(mr8) (32>>(((mr8)>>6)&0x3))
891 #define LPDDR2_ZQINIT (0xFF)
892 #define LPDDR2_ZQCL (0xAB)
893 #define LPDDR2_ZQCS (0x56)
894 #define LPDDR2_ZQRESET (0xC3)
896 //MR16 (PASR Bank Mask)
898 #define LPDDR2_PASR_Full (0x0)
899 #define LPDDR2_PASR_1_2 (0x1)
900 #define LPDDR2_PASR_1_4 (0x2)
901 #define LPDDR2_PASR_1_8 (0x3)
903 //MR17 (PASR Segment Mask) 1Gb-8Gb S4 SDRAM only
905 //MR32 (DQ Calibration Pattern A)
907 //MR40 (DQ Calibration Pattern B)
909 /***********************************
911 ***********************************/
912 //MR0 (Device Information)
913 #define LPDDR3_DAI (0x1) // 0:DAI complete, 1:DAI still in progress
914 #define LPDDR3_RZQI (0x3<<3) // 00:RZQ self test not supported, 01:ZQ-pin may connect to VDDCA or float
915 // 10:ZQ-pin may short to GND. 11:ZQ-pin self test completed, no error condition detected.
916 #define LPDDR3_WL_SUPOT (1<<6) // 0:DRAM does not support WL(Set B), 1:DRAM support WL(Set B)
917 #define LPDDR3_RL3_SUPOT (1<<7) // 0:DRAM does not support RL=3,nWR=3,WL=1; 1:DRAM supports RL=3,nWR=3,WL=1 for frequencies <=166
919 //MR1 (Device Feature)
920 #define LPDDR3_BL8 (0x3)
921 #define LPDDR3_nWR(n) ((n)<<5)
923 //MR2 (Device Feature 2)
925 #define LPDDR3_RL3_WL1 (0x1) // <=166MHz,optional
926 #define LPDDR3_RL6_WL3 (0x4) // <=400MHz
927 #define LPDDR3_RL8_WL4 (0x6) // <=533MHz
928 #define LPDDR3_RL9_WL5 (0x7) // <=600MHz
929 #define LPDDR3_RL10_WL6 (0x8) // <=667MHz,default
930 #define LPDDR3_RL11_WL6 (0x9) // <=733MHz
931 #define LPDDR3_RL12_WL6 (0xa) // <=800MHz
932 #define LPDDR3_RL14_WL8 (0xc) // <=933MHz
933 #define LPDDR3_RL16_WL8 (0xe) // <=1066MHz
935 //#define LPDDR3_RL3_WL1 (0x1) // <=166MHz,optional
936 //#define LPDDR3_RL6_WL3 (0x4) // <=400MHz
937 //#define LPDDR3_RL8_WL4 (0x6) // <=533MHz
938 //#define LPDDR3_RL9_WL5 (0x7) // <=600MHz
939 #define LPDDR3_RL10_WL8 (0x8) // <=667MHz,default
940 #define LPDDR3_RL11_WL9 (0x9) // <=733MHz
941 #define LPDDR3_RL12_WL9 (0xa) // <=800MHz
942 #define LPDDR3_RL14_WL11 (0xc) // <=933MHz
943 #define LPDDR3_RL16_WL13 (0xe) // <=1066MHz
945 #define LPDDR3_nWRE (1<<4) // 1:enable nWR programming > 9(defualt)
946 #define LPDDR3_WL_S (1<<6) // 1:Select WL Set B
947 #define LPDDR3_WR_LEVEL (1<<7) // 1:enable
949 //MR3 (IO Configuration 1)
950 #define LPDDR3_DS_34 (0x1)
951 #define LPDDR3_DS_40 (0x2)
952 #define LPDDR3_DS_48 (0x3)
953 #define LPDDR3_DS_60 (0x4) //reserved
954 #define LPDDR3_DS_80 (0x6) //reserved
955 #define LPDDR3_DS_34D_40U (0x9)
956 #define LPDDR3_DS_40D_48U (0xa)
957 #define LPDDR3_DS_34D_48U (0xb)
959 //MR4 (Device Temperature)
960 #define LPDDR3_tREF_MASK (0x7)
961 #define LPDDR3_LT_EXED (0x0) // SDRAM Low temperature operating limit exceeded
962 #define LPDDR3_4_tREF (0x1)
963 #define LPDDR3_2_tREF (0x2)
964 #define LPDDR3_1_tREF (0x3)
965 #define LPDDR3_05_tREF (0x4)
966 #define LPDDR3_025_tREF (0x5)
967 #define LPDDR3_025_tREF_DERATE (0x6)
968 #define LPDDR3_HT_EXED (0x7) // SDRAM High temperature operating limit exceeded
970 #define LPDDR3_TUF (0x1<<7) // 1:value has changed since last read of MR4
972 //MR8 (Basic configuration 4)
973 #define LPDDR3_S8 (0x3)
974 #define LPDDR3_Density(mr8) (8<<((mr8>>2)&0xf)) // Unit:MB
975 #define LPDDR3_IO_Width(mr8) (32>>((mr8>>6)&0x3))
978 #define LPDDR3_ZQINIT (0xFF)
979 #define LPDDR3_ZQCL (0xAB)
980 #define LPDDR3_ZQCS (0x56)
981 #define LPDDR3_ZQRESET (0xC3)
984 #define LPDDR3_ODT_60 (1) //optional for 1333 and 1600
985 #define LPDDR3_ODT_120 (2)
986 #define LPDDR3_ODT_240 (3)
987 #define LPDDR3_ODT_DIS (0)
989 //MR16 (PASR Bank Mask)
991 //MR17 (PASR Segment Mask) 1Gb-8Gb S4 SDRAM only
993 //MR32 (DQ Calibration Pattern A)
995 //MR40 (DQ Calibration Pattern B)
997 /***********************************
999 ***********************************/
1001 #define DDR3_BL8 (0)
1002 #define DDR3_BC4_8 (1)
1003 #define DDR3_BC4 (2)
1004 #define DDR3_CL(n) (((((n)-4)&0x7)<<4)|((((n)-4)&0x8)>>1))
1005 #define DDR3_WR(n) (((n)&0x7)<<9)
1006 #define DDR3_DLL_RESET (1<<8)
1007 #define DDR3_DLL_DeRESET (0<<8)
1010 #define DDR3_DLL_ENABLE (0)
1011 #define DDR3_DLL_DISABLE (1)
1012 #define DDR3_MR1_AL(n) (((n)&0x3)<<3)
1014 #define DDR3_DS_40 (0)
1015 #define DDR3_DS_34 (1<<1)
1016 #define DDR3_Rtt_Nom_DIS (0)
1017 #define DDR3_Rtt_Nom_60 (1<<2)
1018 #define DDR3_Rtt_Nom_120 (1<<6)
1019 #define DDR3_Rtt_Nom_40 ((1<<2)|(1<<6))
1022 #define DDR3_MR2_CWL(n) ((((n)-5)&0x7)<<3)
1023 #define DDR3_Rtt_WR_DIS (0)
1024 #define DDR3_Rtt_WR_60 (1<<9)
1025 #define DDR3_Rtt_WR_120 (2<<9)
1027 /***********************************
1029 ***********************************/
1030 //MR; //Mode Register
1031 #define DDR2_BL4 (2)
1032 #define DDR2_BL8 (3)
1033 #define DDR2_CL(n) (((n)&0x7)<<4)
1034 #define DDR2_WR(n) ((((n)-1)&0x7)<<9)
1035 #define DDR2_DLL_RESET (1<<8)
1036 #define DDR2_DLL_DeRESET (0<<8)
1038 //EMR; //Extended Mode Register
1039 #define DDR2_DLL_ENABLE (0)
1040 #define DDR2_DLL_DISABLE (1)
1042 #define DDR2_STR_FULL (0)
1043 #define DDR2_STR_REDUCE (1<<1)
1044 #define DDR2_AL(n) (((n)&0x7)<<3)
1045 #define DDR2_Rtt_Nom_DIS (0)
1046 #define DDR2_Rtt_Nom_150 (0x40)
1047 #define DDR2_Rtt_Nom_75 (0x4)
1048 #define DDR2_Rtt_Nom_50 (0x44)
1050 /***********************************
1052 ***********************************/
1053 #define mDDR_BL2 (1)
1054 #define mDDR_BL4 (2)
1055 #define mDDR_BL8 (3)
1056 #define mDDR_CL(n) (((n)&0x7)<<4)
1058 #define mDDR_DS_Full (0)
1059 #define mDDR_DS_1_2 (1<<5)
1060 #define mDDR_DS_1_4 (2<<5)
1061 #define mDDR_DS_1_8 (3<<5)
1062 #define mDDR_DS_3_4 (4<<5)
1064 static const uint8_t ddr3_cl_cwl[22][7]={
1065 /*speed 0~330 331~400 401~533 534~666 667~800 801~933 934~1066
1066 * tCK >3 2.5~3 1.875~2.5 1.5~1.875 1.25~1.5 1.07~1.25 0.938~1.07
1067 * cl<<4, cwl cl<<4, cwl cl<<4, cwl */
1068 {((5<<4)|5), ((5<<4)|5), 0 , 0, 0, 0, 0}, //DDR3_800D (5-5-5)
1069 {((5<<4)|5), ((6<<4)|5), 0 , 0, 0, 0, 0}, //DDR3_800E (6-6-6)
1071 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), 0, 0, 0, 0}, //DDR3_1066E (6-6-6)
1072 {((5<<4)|5), ((6<<4)|5), ((7<<4)|6), 0, 0, 0, 0}, //DDR3_1066F (7-7-7)
1073 {((5<<4)|5), ((6<<4)|5), ((8<<4)|6), 0, 0, 0, 0}, //DDR3_1066G (8-8-8)
1075 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), ((7<<4)|7), 0, 0, 0}, //DDR3_1333F (7-7-7)
1076 {((5<<4)|5), ((5<<4)|5), ((7<<4)|6), ((8<<4)|7), 0, 0, 0}, //DDR3_1333G (8-8-8)
1077 {((5<<4)|5), ((6<<4)|5), ((8<<4)|6), ((9<<4)|7), 0, 0, 0}, //DDR3_1333H (9-9-9)
1078 {((5<<4)|5), ((6<<4)|5), ((8<<4)|6), ((10<<4)|7), 0, 0, 0}, //DDR3_1333J (10-10-10)
1080 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), ((7<<4)|7), ((8<<4)|8), 0, 0}, //DDR3_1600G (8-8-8)
1081 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), ((8<<4)|7), ((9<<4)|8), 0, 0}, //DDR3_1600H (9-9-9)
1082 {((5<<4)|5), ((5<<4)|5), ((7<<4)|6), ((9<<4)|7), ((10<<4)|8), 0, 0}, //DDR3_1600J (10-10-10)
1083 {((5<<4)|5), ((6<<4)|5), ((8<<4)|6), ((10<<4)|7), ((11<<4)|8), 0, 0}, //DDR3_1600K (11-11-11)
1085 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), ((8<<4)|7), ((9<<4)|8), ((11<<4)|9), 0}, //DDR3_1866J (10-10-10)
1086 {((5<<4)|5), ((5<<4)|5), ((7<<4)|6), ((8<<4)|7), ((10<<4)|8), ((11<<4)|9), 0}, //DDR3_1866K (11-11-11)
1087 {((6<<4)|5), ((6<<4)|5), ((7<<4)|6), ((9<<4)|7), ((11<<4)|8), ((12<<4)|9), 0}, //DDR3_1866L (12-12-12)
1088 {((6<<4)|5), ((6<<4)|5), ((8<<4)|6), ((10<<4)|7), ((11<<4)|8), ((13<<4)|9), 0}, //DDR3_1866M (13-13-13)
1090 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), ((7<<4)|7), ((9<<4)|8), ((10<<4)|9), ((11<<4)|10)}, //DDR3_2133K (11-11-11)
1091 {((5<<4)|5), ((5<<4)|5), ((6<<4)|6), ((8<<4)|7), ((9<<4)|8), ((11<<4)|9), ((12<<4)|10)}, //DDR3_2133L (12-12-12)
1092 {((5<<4)|5), ((5<<4)|5), ((7<<4)|6), ((9<<4)|7), ((10<<4)|8), ((12<<4)|9), ((13<<4)|10)}, //DDR3_2133M (13-13-13)
1093 {((6<<4)|5), ((6<<4)|5), ((7<<4)|6), ((9<<4)|7), ((11<<4)|8), ((13<<4)|9), ((14<<4)|10)}, //DDR3_2133N (14-14-14)
1095 {((6<<4)|5), ((6<<4)|5), ((8<<4)|6), ((10<<4)|7), ((11<<4)|8), ((13<<4)|9), ((14<<4)|10)} //DDR3_DEFAULT
1098 static const uint16_t ddr3_tRC_tFAW[22]={
1100 ((50<<8)|50), //DDR3_800D (5-5-5)
1101 ((53<<8)|50), //DDR3_800E (6-6-6)
1103 ((49<<8)|50), //DDR3_1066E (6-6-6)
1104 ((51<<8)|50), //DDR3_1066F (7-7-7)
1105 ((53<<8)|50), //DDR3_1066G (8-8-8)
1107 ((47<<8)|45), //DDR3_1333F (7-7-7)
1108 ((48<<8)|45), //DDR3_1333G (8-8-8)
1109 ((50<<8)|45), //DDR3_1333H (9-9-9)
1110 ((51<<8)|45), //DDR3_1333J (10-10-10)
1112 ((45<<8)|40), //DDR3_1600G (8-8-8)
1113 ((47<<8)|40), //DDR3_1600H (9-9-9)
1114 ((48<<8)|40), //DDR3_1600J (10-10-10)
1115 ((49<<8)|40), //DDR3_1600K (11-11-11)
1117 ((45<<8)|35), //DDR3_1866J (10-10-10)
1118 ((46<<8)|35), //DDR3_1866K (11-11-11)
1119 ((47<<8)|35), //DDR3_1866L (12-12-12)
1120 ((48<<8)|35), //DDR3_1866M (13-13-13)
1122 ((44<<8)|35), //DDR3_2133K (11-11-11)
1123 ((45<<8)|35), //DDR3_2133L (12-12-12)
1124 ((46<<8)|35), //DDR3_2133M (13-13-13)
1125 ((47<<8)|35), //DDR3_2133N (14-14-14)
1127 ((53<<8)|50) //DDR3_DEFAULT
1130 typedef enum DRAM_TYPE_Tag
1142 typedef struct PCTRL_TIMING_Tag
1145 //Memory Timing Registers
1146 uint32 togcnt1u; //Toggle Counter 1U Register
1147 uint32 tinit; //t_init Timing Register
1148 uint32 trsth; //Reset High Time Register
1149 uint32 togcnt100n; //Toggle Counter 100N Register
1150 uint32 trefi; //t_refi Timing Register
1151 uint32 tmrd; //t_mrd Timing Register
1152 uint32 trfc; //t_rfc Timing Register
1153 uint32 trp; //t_rp Timing Register
1154 uint32 trtw; //t_rtw Timing Register
1155 uint32 tal; //AL Latency Register
1156 uint32 tcl; //CL Timing Register
1157 uint32 tcwl; //CWL Register
1158 uint32 tras; //t_ras Timing Register
1159 uint32 trc; //t_rc Timing Register
1160 uint32 trcd; //t_rcd Timing Register
1161 uint32 trrd; //t_rrd Timing Register
1162 uint32 trtp; //t_rtp Timing Register
1163 uint32 twr; //t_wr Timing Register
1164 uint32 twtr; //t_wtr Timing Register
1165 uint32 texsr; //t_exsr Timing Register
1166 uint32 txp; //t_xp Timing Register
1167 uint32 txpdll; //t_xpdll Timing Register
1168 uint32 tzqcs; //t_zqcs Timing Register
1169 uint32 tzqcsi; //t_zqcsi Timing Register
1170 uint32 tdqs; //t_dqs Timing Register
1171 uint32 tcksre; //t_cksre Timing Register
1172 uint32 tcksrx; //t_cksrx Timing Register
1173 uint32 tcke; //t_cke Timing Register
1174 uint32 tmod; //t_mod Timing Register
1175 uint32 trstl; //Reset Low Timing Register
1176 uint32 tzqcl; //t_zqcl Timing Register
1177 uint32 tmrr; //t_mrr Timing Register
1178 uint32 tckesr; //t_ckesr Timing Register
1179 uint32 tdpd; //t_dpd Timing Register
1182 typedef union DTPR_0_Tag
1199 typedef union DTPR_1_Tag
1208 unsigned tRTODT : 1;
1209 unsigned reserved12_15 : 4;
1211 unsigned tDQSCK : 3;
1212 unsigned tDQSCKmax : 3;
1213 unsigned reserved30_31 : 2;
1217 typedef union DTPR_2_Tag
1225 unsigned tDLLK : 10;
1226 unsigned reserved29_31 : 3;
1230 typedef struct PHY_TIMING_Tag
1235 uint32 mr[4]; //LPDDR2 no MR0, mr[2] is mDDR MR1
1236 uint32 mr11; //for LPDDR3 only
1239 typedef struct PCTL_REG_Tag
1245 PCTL_TIMING_T pctl_timing;
1246 //DFI Control Registers
1247 uint32 DFITCTRLDELAY;
1250 uint32 DFIODTRANKMAP;
1251 //DFI Write Data Registers
1252 uint32 DFITPHYWRDATA;
1253 uint32 DFITPHYWRLAT;
1254 //DFI Read Data Registers
1255 uint32 DFITRDDATAEN;
1256 uint32 DFITPHYRDLAT;
1257 //DFI Update Registers
1258 uint32 DFITPHYUPDTYPE0;
1259 uint32 DFITPHYUPDTYPE1;
1260 uint32 DFITPHYUPDTYPE2;
1261 uint32 DFITPHYUPDTYPE3;
1262 uint32 DFITCTRLUPDMIN;
1263 uint32 DFITCTRLUPDMAX;
1264 uint32 DFITCTRLUPDDLY;
1267 uint32 DFITCTRLUPDI;
1268 //DFI Status Registers
1271 uint32 DFITDRAMCLKEN;
1272 uint32 DFITDRAMCLKDIS;
1274 //DFI Low Power Register
1278 typedef struct PUBL_DQS_REG_Tag
1301 typedef struct PUBL_REG_Tag
1312 PHY_TIMING_T phy_timing;
1319 typedef struct SET_REG_Tag
1325 typedef struct BACKUP_REG_Tag
1328 /* any addr = 0xFFFFFFFF, indicate invalid */
1329 uint32 pctlAddr[CH_MAX];
1331 uint32 publAddr[CH_MAX];
1333 PUBL_DQS_REG dqs[CH_MAX];
1334 uint32 nocAddr[CH_MAX];
1335 MSCH_REG noc[CH_MAX];
1341 uint32 dpllmodeAddr;
1342 uint32 dpllSlowMode;
1343 uint32 dpllNormalMode;
1344 uint32 dpllResetAddr;
1349 uint32 dpllLockAddr;
1350 uint32 dpllLockMask;
1353 uint32 ddrPllSrcDivAddr;
1354 uint32 ddrPllSrcDiv;
1356 uint32 retenDisAddr;
1362 /* ddr relative grf register */
1363 uint32 grfRegCnt; //if no grf, set 0
1364 SET_REG_T grf[3]; //SET_REG_T grf[grfRegCnt];
1366 /* other ddr relative register */
1367 //uint32 otherRegCnt; // if = 0xFFFFFFFF, indicate invalid
1368 //SET_REG_T other[grfRegCnt];
1369 uint32 endTag; //must = 0xFFFFFFFF
1372 typedef struct CHANNEL_INFO_Tag
1375 uint32 chNum; //channel number,0:channel a; 1:channel b;
1376 pDDR_REG_T pDDR_Reg;
1377 pDDRPHY_REG_T pPHY_Reg;
1378 pMSCH_REG pMSCH_Reg;
1380 DRAM_TYPE mem_type; // =DRAM_MAX, channel invalid
1381 uint32 ddr_speed_bin; // used for ddr3 only
1382 uint32 ddr_capability_per_die; // one chip cs capability
1383 uint32 dtt_cs; //data training cs
1387 unsigned long screen_ft_us;
1388 unsigned long long t0;
1389 unsigned long long t1;
1393 typedef struct STRIDE_INFO_Tag
1399 static const STRIDE_INFO gStrideInfo[]={
1400 {0x10000000,0x10000000}, // 256
1401 {0x20000000,0x20000000}, // 512
1402 {0x40000000,0x40000000}, // 1G
1403 {0x80000000,0x80000000}, // 2G
1428 {0,0x80000000}, // 4GB
1437 CH_INFO DEFINE_PIE_DATA(ddr_ch[2]);
1438 static pCH_INFO p_ddr_ch[2]; //only used in kern, not pie
1439 BACKUP_REG_T DEFINE_PIE_DATA(ddr_reg);
1440 static BACKUP_REG_T *p_ddr_reg;
1441 static __attribute__((aligned(4096))) uint32 ddr_data_training_buf[32+8192/4]; //data in two channel even use max stride
1442 uint32 DEFINE_PIE_DATA(ddr_freq);
1443 uint32 DEFINE_PIE_DATA(ddr_sr_idle);
1445 /***********************************
1446 * ARCH Relative Data and Function
1447 ***********************************/
1448 static __sramdata uint32 clkr;
1449 static __sramdata uint32 clkf;
1450 static __sramdata uint32 clkod;
1451 uint32 DEFINE_PIE_DATA(ddr_select_gpll_div); // 0-Disable, 1-1:1, 2-2:1, 4-4:1
1452 #if defined(ENABLE_DDR_CLCOK_GPLL_PATH)
1453 static uint32 *p_ddr_select_gpll_div;
1456 static void __sramfunc ddr_delayus(uint32 us);
1458 static noinline uint32 ddr_get_pll_freq(PLL_ID pll_id) //APLL-1;CPLL-2;DPLL-3;GPLL-4
1462 // freq = (Fin/NR)*NF/OD
1463 if(((pCRU_Reg->CRU_MODE_CON>>(pll_id*4))&3) == 1) // DPLL Normal mode
1464 ret= 24 *((pCRU_Reg->CRU_PLL_CON[pll_id][1]&0x1fff)+1) // NF = 2*(CLKF+1)
1465 /((((pCRU_Reg->CRU_PLL_CON[pll_id][0]>>8)&0x3f)+1) // NR = CLKR+1
1466 *((pCRU_Reg->CRU_PLL_CON[pll_id][0]&0xF)+1)); // OD = 2^CLKOD
1473 /*****************************************
1474 NR NO NF Fout freq Step finally use
1475 1 8 12.5 - 62.5 37.5MHz - 187.5MHz 3MHz 50MHz <= 150MHz
1476 1 6 12.5 - 62.5 50MHz - 250MHz 4MHz 150MHz <= 200MHz
1477 1 4 12.5 - 62.5 75MHz - 375MHz 6MHz 200MHz <= 300MHz
1478 1 2 12.5 - 62.5 150MHz - 750MHz 12MHz 300MHz <= 600MHz
1479 1 1 12.5 - 62.5 300MHz - 1500MHz 24MHz 600MHz <= 1200MHz
1480 ******************************************/
1481 static uint32 __sramfunc ddr_set_pll_rk3188_plus(uint32 nMHz, uint32 set)
1498 else if(nMHz <= 200)
1502 else if(nMHz <= 300)
1506 else if(nMHz <= 600)
1515 clkf=(nMHz*clkr*clkod)/24;
1516 ret = (24*clkf)/(clkr*clkod);
1520 SET_DDR_PLL_SRC(1, (DATA(ddr_select_gpll_div)-1)); //clk_ddr_src = GPLL
1522 SET_PLL_MODE(DPLL,0); //PLL slow-mode
1525 pCRU_Reg->CRU_PLL_CON[DPLL][3] = PLL_RESET;
1527 pCRU_Reg->CRU_PLL_CON[DPLL][0] = NR(clkr) | NO(clkod);
1528 pCRU_Reg->CRU_PLL_CON[DPLL][1] = NF(clkf);
1529 pCRU_Reg->CRU_PLL_CON[DPLL][2] = NB(clkf>>1);
1531 pCRU_Reg->CRU_PLL_CON[DPLL][3] = PLL_DE_RESET;
1539 if (GET_DPLL_LOCK_STATUS())
1545 SET_DDR_PLL_SRC(0, 0); //clk_ddr_src = DDR PLL,clk_ddr_src:clk_ddrphy = 1:1
1546 SET_PLL_MODE(DPLL,1); //PLL normal
1554 uint32 PIE_FUNC(ddr_set_pll)(uint32 nMHz, uint32 set)
1556 return ddr_set_pll_rk3188_plus(nMHz,set);
1558 EXPORT_PIE_SYMBOL(FUNC(ddr_set_pll));
1559 static uint32 (*p_ddr_set_pll)(uint32 nMHz, uint32 set);
1561 static void __sramfunc idle_port(void)
1564 uint32 clk_gate[19];
1566 pPMU_Reg->PMU_IDLE_REQ |= idle_req_core_cfg;
1568 while( (pPMU_Reg->PMU_IDLE_ST & idle_core) == 0 );
1570 //save clock gate status
1572 clk_gate[i]=pCRU_Reg->CRU_CLKGATE_CON[i];
1574 //enable all clock gate for request idle
1576 pCRU_Reg->CRU_CLKGATE_CON[i]=0xffff0000;
1578 i = pPMU_Reg->PMU_PWRDN_ST;
1579 j = idle_req_dma_cfg;
1581 if ( (i & pd_peri_pwr_st) == 0 )
1583 j |= idle_req_peri_cfg;
1586 if ( (i & pd_video_pwr_st) == 0 )
1588 j |= idle_req_video_cfg;
1591 if ( (i & pd_gpu_pwr_st) == 0 )
1593 j |= idle_req_gpu_cfg;
1596 if ( (i & pd_hevc_pwr_st) == 0 )
1598 j |= idle_req_hevc_cfg;
1601 if ( (i & pd_vio_pwr_st) == 0 )
1603 j |= idle_req_vio_cfg;
1606 pPMU_Reg->PMU_IDLE_REQ |= j;
1608 while( (pPMU_Reg->PMU_IDLE_ST & j) != j );
1610 //resume clock gate status
1612 pCRU_Reg->CRU_CLKGATE_CON[i]= (clk_gate[i] | 0xffff0000);
1615 static void inline deidle_port(void)
1618 uint32 clk_gate[19];
1620 //save clock gate status
1622 clk_gate[i]=pCRU_Reg->CRU_CLKGATE_CON[i];
1624 //enable all clock gate for request idle
1626 pCRU_Reg->CRU_CLKGATE_CON[i]=0xffff0000;
1628 i = pPMU_Reg->PMU_PWRDN_ST;
1629 j = idle_req_dma_cfg;
1631 if ( (i & pd_peri_pwr_st) == 0 )
1633 j |= idle_req_peri_cfg;
1636 if ( (i & pd_video_pwr_st) == 0 )
1638 j |= idle_req_video_cfg;
1641 if ( (i & pd_gpu_pwr_st) == 0 )
1643 j |= idle_req_gpu_cfg;
1646 if ( (i & pd_hevc_pwr_st) == 0 )
1648 j |= idle_req_hevc_cfg;
1651 if ( (i & pd_vio_pwr_st) == 0 )
1653 j |= idle_req_vio_cfg;
1656 pPMU_Reg->PMU_IDLE_REQ &= ~j;
1658 while( (pPMU_Reg->PMU_IDLE_ST & j) != 0 );
1660 pPMU_Reg->PMU_IDLE_REQ &= ~idle_req_core_cfg;
1662 while( (pPMU_Reg->PMU_IDLE_ST & idle_core) != 0 );
1664 //resume clock gate status
1666 pCRU_Reg->CRU_CLKGATE_CON[i]= (clk_gate[i] | 0xffff0000);
1670 /***********************************
1671 * Only DDR Relative Function
1672 ***********************************/
1674 /****************************************************************************
1675 Internal sram us delay function
1676 Cpu highest frequency is 1.6 GHz
1678 1 us = 1000 ns = 1000 * 1.6 cycles = 1600 cycles
1679 *****************************************************************************/
1680 __sramdata volatile uint32 loops_per_us;
1682 #define LPJ_100MHZ 999456UL
1684 static void __sramfunc ddr_delayus(uint32 us)
1688 volatile unsigned int i = (loops_per_us*us);
1691 asm volatile(".align 4; 1: subs %0, %0, #1; bne 1b;" : "+r" (i));
1695 void PIE_FUNC(ddr_copy)(uint64_t *pDest, uint64_t *pSrc, uint32 wword)
1699 for(i=0; i<wword; i++)
1704 EXPORT_PIE_SYMBOL(FUNC(ddr_copy));
1706 static void ddr_get_datatraing_addr(uint32 *pdtar)
1722 for(ch=0,chCnt=0;ch<CH_MAX;ch++)
1724 if(p_ddr_ch[ch]->mem_type != DRAM_MAX)
1728 p_ddr_ch[ch]->dtt_cs = 0;
1731 // caculate aglined physical address
1732 addr = __pa((unsigned long)ddr_data_training_buf);
1733 ddr_print("addr=0x%x\n",addr);
1736 addr += (64-(addr&0x3F)); // 64byte align
1742 stride = READ_DDR_STRIDE();
1743 strideSize = gStrideInfo[stride].size;
1744 halfCap = gStrideInfo[stride].halfCap;
1745 ddr_print("stride=%d, size=%d, halfcap=%x\n", stride,strideSize,halfCap);
1747 if(addr & strideSize) // odd stride size
1749 socAddr[0] = addr + strideSize;
1755 socAddr[1] = addr + strideSize;
1757 ddr_print("socAddr[0]=0x%x, socAddr[1]=0x%x\n", socAddr[0], socAddr[1]);
1760 cap1 = (1 << (READ_ROW_INFO(1,0)+READ_COL_INFO(1)+READ_BK_INFO(1)+READ_BW_INFO(1)));
1761 if(READ_CS_INFO(1) > 1)
1763 cap1 += cap1 >> (READ_ROW_INFO(1,0)-READ_ROW_INFO(1,1));
1765 if(READ_CH_ROW_INFO(1))
1770 chAddr[1] = cap1 - PAGE_SIZE;
1771 if(READ_CS_INFO(1) > 1)
1772 p_ddr_ch[1]->dtt_cs = 1;
1774 else if((stride >= 0x10) && (stride <= 0x13)) // 3GB stride
1777 if(addr < 0x40000000)
1779 chAddr[0] = socAddr[0];
1780 chAddr[1] = socAddr[1] - strideSize;
1782 else if(addr < 0x80000000)
1784 chAddr[0] = socAddr[0] - 0x40000000 + strideSize;
1785 chAddr[1] = socAddr[1] - 0x40000000;
1787 else if(addr < 0xA0000000)
1789 chAddr[0] = socAddr[0] - 0x40000000;
1790 chAddr[1] = socAddr[1] - 0x40000000 - strideSize;
1794 chAddr[0] = socAddr[0] - 0x60000000 + strideSize;
1795 chAddr[1] = socAddr[1] - 0x60000000;
1803 chAddr[0] = socAddr[0];
1804 chAddr[1] = socAddr[1] - strideSize;
1808 chAddr[0] = socAddr[0] - halfCap + strideSize;
1809 chAddr[1] = socAddr[1] - halfCap;
1818 ddr_print("chAddr[0]=0x%x, chAddr[1]=0x%x\n", chAddr[0], chAddr[1]);
1820 for(ch=0,chCnt=0;ch<CH_MAX;ch++)
1822 if(p_ddr_ch[ch]->mem_type != DRAM_MAX)
1824 // find out col£¬row£¬bank,config
1825 row = READ_ROW_INFO(ch,0);
1826 bank = READ_BK_INFO(ch);
1827 col = READ_COL_INFO(ch);
1828 bw = READ_BW_INFO(ch);
1829 conf = p_ddr_ch[ch]->pMSCH_Reg->ddrconf;
1830 // according different address mapping, caculate DTAR register value
1832 pdtar[ch] |= ((chAddr[ch])>>bw) & ((0x1<<col)-1); // col
1833 pdtar[ch] |= (((chAddr[ch])>>(bw+col+((ddr_cfg_2_rbc[conf]>>2)&0x3))) & ((0x1<<row)-1)) << 12; // row
1834 if(((ddr_cfg_2_rbc[conf]>>7)&0x3)==3)
1836 pdtar[ch] |= ((((chAddr[ch])>>(bw+col+row)) & ((0x1<<bank)-1)) << 28); // bank
1840 pdtar[ch] |= ((((chAddr[ch])>>(bw+col)) & 0x7) << 28); // bank
1844 ddr_print("dtar[0]=0x%x, dtar[1]=0x%x\n", pdtar[0], pdtar[1]);
1847 static __sramfunc void ddr_reset_dll(uint32 ch)
1849 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
1850 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
1852 pPHY_Reg->ACDLLCR &= ~0x40000000;
1853 pPHY_Reg->DATX8[0].DXDLLCR &= ~0x40000000;
1854 pPHY_Reg->DATX8[1].DXDLLCR &= ~0x40000000;
1855 if(!(pDDR_Reg->PPCFG & 1))
1857 pPHY_Reg->DATX8[2].DXDLLCR &= ~0x40000000;
1858 pPHY_Reg->DATX8[3].DXDLLCR &= ~0x40000000;
1861 pPHY_Reg->ACDLLCR |= 0x40000000;
1862 pPHY_Reg->DATX8[0].DXDLLCR |= 0x40000000;
1863 pPHY_Reg->DATX8[1].DXDLLCR |= 0x40000000;
1864 if(!(pDDR_Reg->PPCFG & 1))
1866 pPHY_Reg->DATX8[2].DXDLLCR |= 0x40000000;
1867 pPHY_Reg->DATX8[3].DXDLLCR |= 0x40000000;
1872 static __sramfunc void ddr_move_to_Lowpower_state(uint32 ch)
1874 register uint32 value;
1875 register pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
1879 value = pDDR_Reg->STAT.b.ctl_stat;
1880 if(value == Low_power)
1887 pDDR_Reg->SCTL = CFG_STATE;
1889 while((pDDR_Reg->STAT.b.ctl_stat) != Config);
1891 pDDR_Reg->SCTL = GO_STATE;
1893 while((pDDR_Reg->STAT.b.ctl_stat) != Access);
1895 pDDR_Reg->SCTL = SLEEP_STATE;
1897 while((pDDR_Reg->STAT.b.ctl_stat) != Low_power);
1899 default: //Transitional state
1905 static __sramfunc void ddr_move_to_Access_state(uint32 ch)
1907 register uint32 value;
1908 register pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
1909 register pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
1911 //set auto self-refresh idle
1912 pDDR_Reg->MCFG1=(pDDR_Reg->MCFG1&0xffffff00) | DATA(ddr_sr_idle) | (1<<31);
1917 value = pDDR_Reg->STAT.b.ctl_stat;
1918 if((value == Access)
1919 || ((pDDR_Reg->STAT.b.lp_trig == 1) && ((pDDR_Reg->STAT.b.ctl_stat) == Low_power)))
1926 pDDR_Reg->SCTL = WAKEUP_STATE;
1928 while((pDDR_Reg->STAT.b.ctl_stat) != Access);
1929 while((pPHY_Reg->PGSR & DLDONE) != DLDONE); //wait DLL lock
1932 pDDR_Reg->SCTL = CFG_STATE;
1934 while((pDDR_Reg->STAT.b.ctl_stat) != Config);
1936 pDDR_Reg->SCTL = GO_STATE;
1938 while(!(((pDDR_Reg->STAT.b.ctl_stat) == Access)
1939 || ((pDDR_Reg->STAT.b.lp_trig == 1) && ((pDDR_Reg->STAT.b.ctl_stat) == Low_power))));
1941 default: //Transitional state
1945 /* de_hw_wakeup :enable auto sr if sr_idle != 0 */
1946 DDR_HW_WAKEUP(ch,0);
1949 static __sramfunc void ddr_move_to_Config_state(uint32 ch)
1951 register uint32 value;
1952 register pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
1953 register pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
1955 /* hw_wakeup :disable auto sr */
1956 DDR_HW_WAKEUP(ch,1);
1961 value = pDDR_Reg->STAT.b.ctl_stat;
1969 pDDR_Reg->SCTL = WAKEUP_STATE;
1971 while((pDDR_Reg->STAT.b.ctl_stat) != Access);
1972 while((pPHY_Reg->PGSR & DLDONE) != DLDONE); //wait DLL lock
1975 pDDR_Reg->SCTL = CFG_STATE;
1977 while((pDDR_Reg->STAT.b.ctl_stat) != Config);
1979 default: //Transitional state
1985 //arg°üÀ¨bank_addrºÍcmd_addr
1986 static void __sramfunc ddr_send_command(uint32 ch, uint32 rank, uint32 cmd, uint32 arg)
1988 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
1990 pDDR_Reg->MCMD = (start_cmd | (rank<<20) | arg | cmd);
1992 while(pDDR_Reg->MCMD & start_cmd);
1995 //¶ÔtypeÀàÐ͵ÄDDRµÄ¼¸¸öcs½øÐÐDTT
1998 static uint32 __sramfunc ddr_data_training_trigger(uint32 ch)
2001 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
2002 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
2004 // disable auto refresh
2005 pDDR_Reg->TREFI = 0;
2007 if((DATA(ddr_ch[ch]).mem_type != LPDDR2)
2008 && (DATA(ddr_ch[ch]).mem_type != LPDDR3))
2011 pPHY_Reg->PGCR |= (1<<1);
2013 // clear DTDONE status
2014 pPHY_Reg->PIR |= CLRSR;
2015 cs = ((pPHY_Reg->PGCR>>18) & 0xF);
2016 if(DATA(ddr_ch[ch]).dtt_cs == 0)
2017 pPHY_Reg->PGCR = (pPHY_Reg->PGCR & (~(0xF<<18))) | (1<<18); //use cs0 dtt
2019 pPHY_Reg->PGCR = (pPHY_Reg->PGCR & (~(0xF<<18))) | (2<<18); //use cs1 dtt
2021 pPHY_Reg->PIR |= INIT | QSTRN | LOCKBYP | ZCALBYP | CLRSR | ICPC;
2024 //¶ÔtypeÀàÐ͵ÄDDRµÄ¼¸¸öcs½øÐÐDTT
2027 static uint32 __sramfunc ddr_data_training(uint32 ch, uint32 cs)
2029 uint32 i,byte=2,cs_msk;
2030 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
2031 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
2033 if(DATA(ddr_ch[ch]).dtt_cs == 0){
2038 // wait echo byte DTDONE
2039 while((pPHY_Reg->DATX8[0].DXGSR[0] & cs_msk) != cs_msk);
2040 while((pPHY_Reg->DATX8[1].DXGSR[0] & cs_msk) != cs_msk);
2041 if(!(pDDR_Reg->PPCFG & 1))
2043 while((pPHY_Reg->DATX8[2].DXGSR[0] & cs_msk) != cs_msk);
2044 while((pPHY_Reg->DATX8[3].DXGSR[0] & cs_msk) != cs_msk);
2047 pPHY_Reg->PGCR = (pPHY_Reg->PGCR & (~(0xF<<18))) | (cs<<18); //restore cs
2048 if(DATA(ddr_ch[ch]).dtt_cs == 0){
2051 pPHY_Reg->DATX8[i].DXDQSTR = (pPHY_Reg->DATX8[i].DXDQSTR & (~((0x7<<3)|(0x3<<14))))\
2052 | ((pPHY_Reg->DATX8[i].DXDQSTR & 0x7)<<3)\
2053 | (((pPHY_Reg->DATX8[i].DXDQSTR>>12) & 0x3)<<14);
2058 pPHY_Reg->DATX8[i].DXDQSTR = (pPHY_Reg->DATX8[i].DXDQSTR & (~((0x7<<0)|(0x3<<12))))\
2059 | ((pPHY_Reg->DATX8[i].DXDQSTR>>3) & 0x7)\
2060 | (((pPHY_Reg->DATX8[i].DXDQSTR>>14) & 0x3)<<12);
2063 // send some auto refresh to complement the lost while DTT£¬//²âµ½1¸öCSµÄDTT×ʱ¼äÊÇ10.7us¡£×î¶à²¹2´ÎË¢ÐÂ
2066 ddr_send_command(ch,cs, REF_cmd, 0);
2067 ddr_send_command(ch,cs, REF_cmd, 0);
2068 ddr_send_command(ch,cs, REF_cmd, 0);
2069 ddr_send_command(ch,cs, REF_cmd, 0);
2073 ddr_send_command(ch,cs, REF_cmd, 0);
2074 ddr_send_command(ch,cs, REF_cmd, 0);
2076 if((DATA(ddr_ch[ch]).mem_type != LPDDR2)
2077 && (DATA(ddr_ch[ch]).mem_type != LPDDR3))
2080 pPHY_Reg->PGCR &= ~(1<<1);
2082 // resume auto refresh
2083 pDDR_Reg->TREFI = DATA(ddr_reg).pctl.pctl_timing.trefi;
2085 if(pPHY_Reg->PGSR & DTERR)
2096 static void __sramfunc ddr_set_dll_bypass(uint32 ch, uint32 freq)
2098 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
2099 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
2103 pPHY_Reg->DLLGCR &= ~(1<<23);
2104 pPHY_Reg->ACDLLCR |= 0x80000000;
2105 pPHY_Reg->DATX8[0].DXDLLCR |= 0x80000000;
2106 pPHY_Reg->DATX8[1].DXDLLCR |= 0x80000000;
2107 pPHY_Reg->DATX8[2].DXDLLCR |= 0x80000000;
2108 pPHY_Reg->DATX8[3].DXDLLCR |= 0x80000000;
2109 pPHY_Reg->PIR |= DLLBYP;
2113 pPHY_Reg->DLLGCR |= (1<<23);
2114 pPHY_Reg->ACDLLCR |= 0x80000000;
2115 pPHY_Reg->DATX8[0].DXDLLCR |= 0x80000000;
2116 pPHY_Reg->DATX8[1].DXDLLCR |= 0x80000000;
2117 pPHY_Reg->DATX8[2].DXDLLCR |= 0x80000000;
2118 pPHY_Reg->DATX8[3].DXDLLCR |= 0x80000000;
2119 pPHY_Reg->PIR |= DLLBYP;
2123 pPHY_Reg->DLLGCR &= ~(1<<23);
2124 pPHY_Reg->ACDLLCR &= ~0x80000000;
2125 pPHY_Reg->DATX8[0].DXDLLCR &= ~0x80000000;
2126 pPHY_Reg->DATX8[1].DXDLLCR &= ~0x80000000;
2127 if(!(pDDR_Reg->PPCFG & 1))
2129 pPHY_Reg->DATX8[2].DXDLLCR &= ~0x80000000;
2130 pPHY_Reg->DATX8[3].DXDLLCR &= ~0x80000000;
2132 pPHY_Reg->PIR &= ~DLLBYP;
2136 static noinline uint32 ddr_get_parameter(uint32 nMHz)
2144 PCTL_TIMING_T *p_pctl_timing=&(p_ddr_reg->pctl.pctl_timing);
2145 PHY_TIMING_T *p_publ_timing=&(p_ddr_reg->publ.phy_timing);
2146 volatile NOC_TIMING_T *p_noc_timing=&(p_ddr_reg->noc[0].ddrtiming);
2147 volatile NOC_ACTIVATE_T *p_noc_activate=&(p_ddr_reg->noc[0].activate);
2150 uint32 ddr_speed_bin=DDR3_DEFAULT;
2151 uint32 ddr_capability_per_die=0;
2153 for(ch=0;ch<CH_MAX;ch++)
2155 if(p_ddr_ch[ch]->mem_type != DRAM_MAX)
2157 mem_type = p_ddr_ch[ch]->mem_type;
2158 if(ddr_speed_bin == DDR3_DEFAULT)
2160 ddr_speed_bin = p_ddr_ch[ch]->ddr_speed_bin;
2164 ddr_speed_bin = (ddr_speed_bin > p_ddr_ch[ch]->ddr_speed_bin) ? ddr_speed_bin : p_ddr_ch[ch]->ddr_speed_bin;
2166 if(ddr_capability_per_die == 0)
2168 ddr_capability_per_die = p_ddr_ch[ch]->ddr_capability_per_die;
2172 ddr_capability_per_die = (ddr_capability_per_die > p_ddr_ch[ch]->ddr_capability_per_die) ? ddr_capability_per_die : p_ddr_ch[ch]->ddr_capability_per_die;
2178 p_pctl_timing->togcnt1u = nMHz;
2179 p_pctl_timing->togcnt100n = nMHz/10;
2180 p_pctl_timing->tinit = 200;
2181 p_pctl_timing->trsth = 500;
2183 if(mem_type == DDR3)
2185 if(ddr_speed_bin > DDR3_DEFAULT){
2190 #define DDR3_tREFI_7_8_us (78) //unit 100ns
2191 #define DDR3_tMRD (4) //tCK
2192 #define DDR3_tRFC_512Mb (90) //ns
2193 #define DDR3_tRFC_1Gb (110) //ns
2194 #define DDR3_tRFC_2Gb (160) //ns
2195 #define DDR3_tRFC_4Gb (300) //ns
2196 #define DDR3_tRFC_8Gb (350) //ns
2197 #define DDR3_tRTW (2) //register min valid value
2198 #define DDR3_tRAS (37) //ns
2199 #define DDR3_tRRD (10) //ns
2200 #define DDR3_tRTP (7) //ns
2201 #define DDR3_tWR (15) //ns
2202 #define DDR3_tWTR (7) //ns
2203 #define DDR3_tXP (7) //ns
2204 #define DDR3_tXPDLL (24) //ns
2205 #define DDR3_tZQCS (80) //ns
2206 #define DDR3_tZQCSI (0) //ns
2207 #define DDR3_tDQS (1) //tCK
2208 #define DDR3_tCKSRE (10) //ns
2209 #define DDR3_tCKE_400MHz (7) //ns
2210 #define DDR3_tCKE_533MHz (6) //ns
2211 #define DDR3_tMOD (15) //ns
2212 #define DDR3_tRSTL (100) //ns
2213 #define DDR3_tZQCL (320) //ns
2214 #define DDR3_tDLLK (512) //tCK
2247 if(nMHz < 300) //when dll bypss cl = cwl = 6;
2254 cl = (ddr3_cl_cwl[ddr_speed_bin][tmp] >> 4)&0xf;
2255 cwl = ddr3_cl_cwl[ddr_speed_bin][tmp] & 0xf;
2259 if(nMHz <= DDR3_DDR2_ODT_DISABLE_FREQ)
2261 p_publ_timing->mr[1] = DDR3_DS_40 | DDR3_Rtt_Nom_DIS;
2265 p_publ_timing->mr[1] = DDR3_DS_40 | DDR3_Rtt_Nom_120;
2267 p_publ_timing->mr[2] = DDR3_MR2_CWL(cwl) /* | DDR3_Rtt_WR_60 */;
2268 p_publ_timing->mr[3] = 0;
2269 /**************************************************
2271 **************************************************/
2273 * tREFI, average periodic refresh interval, 7.8us
2275 p_pctl_timing->trefi = DDR3_tREFI_7_8_us;
2279 p_pctl_timing->tmrd = DDR3_tMRD & 0x7;
2280 p_publ_timing->dtpr0.b.tMRD = DDR3_tMRD-4;
2282 * tRFC, 90ns(512Mb),110ns(1Gb),160ns(2Gb),300ns(4Gb),350ns(8Gb)
2284 if(ddr_capability_per_die <= 0x4000000) // 512Mb 90ns
2286 tmp = DDR3_tRFC_512Mb;
2288 else if(ddr_capability_per_die <= 0x8000000) // 1Gb 110ns
2290 tmp = DDR3_tRFC_1Gb;
2292 else if(ddr_capability_per_die <= 0x10000000) // 2Gb 160ns
2294 tmp = DDR3_tRFC_2Gb;
2296 else if(ddr_capability_per_die <= 0x20000000) // 4Gb 300ns
2298 tmp = DDR3_tRFC_4Gb;
2302 tmp = DDR3_tRFC_8Gb;
2304 p_pctl_timing->trfc = (tmp*nMHz+999)/1000;
2305 p_publ_timing->dtpr1.b.tRFC = ((tmp*nMHz+999)/1000);
2307 * tXSR, =tDLLK=512 tCK
2309 p_pctl_timing->texsr = DDR3_tDLLK;
2310 p_publ_timing->dtpr2.b.tXS = DDR3_tDLLK;
2314 p_pctl_timing->trp = cl;
2315 p_publ_timing->dtpr0.b.tRP = cl;
2317 * WrToMiss=WL*tCK + tWR + tRP + tRCD
2319 p_noc_timing->b.WrToMiss = (cwl+((DDR3_tWR*nMHz+999)/1000)+cl+cl);
2323 p_pctl_timing->trc = ((((ddr3_tRC_tFAW[ddr_speed_bin]>>8)*nMHz+999)/1000)&0x3F);
2324 p_noc_timing->b.ActToAct = (((ddr3_tRC_tFAW[ddr_speed_bin]>>8)*nMHz+999)/1000);
2325 p_publ_timing->dtpr0.b.tRC = (((ddr3_tRC_tFAW[ddr_speed_bin]>>8)*nMHz+999)/1000);
2327 p_pctl_timing->trtw = (cl+2-cwl);//DDR3_tRTW;
2328 p_publ_timing->dtpr1.b.tRTW = 0;
2329 p_noc_timing->b.RdToWr = (cl+2-cwl);
2330 p_pctl_timing->tal = al;
2331 p_pctl_timing->tcl = cl;
2332 p_pctl_timing->tcwl = cwl;
2334 * tRAS, 37.5ns(400MHz) 37.5ns(533MHz)
2336 p_pctl_timing->tras = (((DDR3_tRAS*nMHz+(nMHz>>1)+999)/1000)&0x3F);
2337 p_publ_timing->dtpr0.b.tRAS = ((DDR3_tRAS*nMHz+(nMHz>>1)+999)/1000);
2341 p_pctl_timing->trcd = cl;
2342 p_publ_timing->dtpr0.b.tRCD = cl;
2344 * tRRD = max(4nCK, 7.5ns), DDR3-1066(1K), DDR3-1333(2K), DDR3-1600(2K)
2345 * max(4nCK, 10ns), DDR3-800(1K,2K), DDR3-1066(2K)
2346 * max(4nCK, 6ns), DDR3-1333(1K), DDR3-1600(1K)
2349 tmp = ((DDR3_tRRD*nMHz+999)/1000);
2354 p_pctl_timing->trrd = (tmp&0xF);
2355 p_publ_timing->dtpr0.b.tRRD = tmp;
2356 p_noc_activate->b.Rrd = tmp;
2358 * tRTP, max(4 tCK,7.5ns)
2360 tmp = ((DDR3_tRTP*nMHz+(nMHz>>1)+999)/1000);
2365 p_pctl_timing->trtp = tmp&0xF;
2366 p_publ_timing->dtpr0.b.tRTP = tmp;
2368 * RdToMiss=tRTP+tRP + tRCD - (BL/2 * tCK)
2370 p_noc_timing->b.RdToMiss = (tmp+cl+cl-(bl>>1));
2374 tmp = ((DDR3_tWR*nMHz+999)/1000);
2375 p_pctl_timing->twr = tmp&0x1F;
2382 tmp += (tmp&0x1) ? 1:0;
2385 bl_tmp = (bl == 8) ? DDR3_BL8 : DDR3_BC4;
2386 p_publ_timing->mr[0] = bl_tmp | DDR3_CL(cl) | DDR3_WR(tmp);
2389 * tWTR, max(4 tCK,7.5ns)
2391 tmp = ((DDR3_tWTR*nMHz+(nMHz>>1)+999)/1000);
2396 p_pctl_timing->twtr = tmp&0xF;
2397 p_publ_timing->dtpr0.b.tWTR = tmp;
2401 p_noc_timing->b.WrToRd = (tmp+cwl);
2403 * tXP, max(3 tCK, 7.5ns)(<933MHz)
2405 tmp = ((DDR3_tXP*nMHz+(nMHz>>1)+999)/1000);
2410 p_pctl_timing->txp = tmp&0x7;
2412 * tXPDLL, max(10 tCK,24ns)
2414 tmp = ((DDR3_tXPDLL*nMHz+999)/1000);
2419 p_pctl_timing->txpdll = tmp & 0x3F;
2420 p_publ_timing->dtpr2.b.tXP = tmp;
2422 * tZQCS, max(64 tCK, 80ns)
2424 tmp = ((DDR3_tZQCS*nMHz+999)/1000);
2429 p_pctl_timing->tzqcs = tmp&0x7F;
2433 p_pctl_timing->tzqcsi = DDR3_tZQCSI;
2437 p_pctl_timing->tdqs = DDR3_tDQS;
2439 * tCKSRE, max(5 tCK, 10ns)
2441 tmp = ((DDR3_tCKSRE*nMHz+999)/1000);
2446 p_pctl_timing->tcksre = tmp & 0x1F;
2448 * tCKSRX, max(5 tCK, 10ns)
2450 p_pctl_timing->tcksrx = tmp & 0x1F;
2452 * tCKE, max(3 tCK,7.5ns)(400MHz) max(3 tCK,5.625ns)(533MHz)
2456 tmp = ((DDR3_tCKE_533MHz*nMHz+999)/1000);
2460 tmp = ((DDR3_tCKE_400MHz*nMHz+(nMHz>>1)+999)/1000);
2466 p_pctl_timing->tcke = tmp & 0x7;
2468 * tCKESR, =tCKE + 1tCK
2470 p_pctl_timing->tckesr = (tmp+1)&0xF;
2471 p_publ_timing->dtpr2.b.tCKE = tmp+1;
2473 * tMOD, max(12 tCK,15ns)
2475 tmp = ((DDR3_tMOD*nMHz+999)/1000);
2480 p_pctl_timing->tmod = tmp&0x1F;
2481 p_publ_timing->dtpr1.b.tMOD = (tmp-12);
2485 p_pctl_timing->trstl = ((DDR3_tRSTL*nMHz+999)/1000)&0x7F;
2487 * tZQCL, max(256 tCK, 320ns)
2489 tmp = ((DDR3_tZQCL*nMHz+999)/1000);
2494 p_pctl_timing->tzqcl = tmp&0x3FF;
2498 p_pctl_timing->tmrr = 0;
2502 p_pctl_timing->tdpd = 0;
2504 /**************************************************
2506 **************************************************/
2508 * tCCD, BL/2 for DDR2 and 4 for DDR3
2510 p_publ_timing->dtpr0.b.tCCD = 0;
2514 p_publ_timing->dtpr1.b.tDQSCKmax = 0;
2516 * tRTODT, 0:ODT may be turned on immediately after read post-amble
2517 * 1:ODT may not be turned on until one clock after the read post-amble
2519 p_publ_timing->dtpr1.b.tRTODT = 1;
2521 * tFAW,40ns(400MHz 1KB page) 37.5ns(533MHz 1KB page) 50ns(400MHz 2KB page) 50ns(533MHz 2KB page)
2523 tmp = (((ddr3_tRC_tFAW[ddr_speed_bin]&0x0ff)*nMHz+999)/1000);
2524 p_publ_timing->dtpr1.b.tFAW = tmp;
2525 p_noc_activate->b.Fawbank = 1;
2526 p_noc_activate->b.Faw = tmp;
2530 p_publ_timing->dtpr1.b.tAOND = 0;
2534 p_publ_timing->dtpr2.b.tDLLK = DDR3_tDLLK;
2535 /**************************************************
2537 **************************************************/
2538 p_noc_timing->b.BurstLen = (bl>>1);
2540 else if(mem_type == LPDDR2)
2542 #define LPDDR2_tREFI_3_9_us (39) //unit 100ns
2543 #define LPDDR2_tREFI_7_8_us (78) //unit 100ns
2544 #define LPDDR2_tMRD (5) //tCK
2545 #define LPDDR2_tRFC_8Gb (210) //ns
2546 #define LPDDR2_tRFC_4Gb (130) //ns
2547 #define LPDDR2_tRPpb_4_BANK (24) //ns
2548 #define LPDDR2_tRPab_SUB_tRPpb_4_BANK (0) //ns
2549 #define LPDDR2_tRPpb_8_BANK (24) //ns
2550 #define LPDDR2_tRPab_SUB_tRPpb_8_BANK (3) //ns
2551 #define LPDDR2_tRTW (1) //tCK register min valid value
2552 #define LPDDR2_tRAS (42) //ns
2553 #define LPDDR2_tRCD (24) //ns
2554 #define LPDDR2_tRRD (10) //ns
2555 #define LPDDR2_tRTP (7) //ns
2556 #define LPDDR2_tWR (15) //ns
2557 #define LPDDR2_tWTR_GREAT_200MHz (7) //ns
2558 #define LPDDR2_tWTR_LITTLE_200MHz (10) //ns
2559 #define LPDDR2_tXP (7) //ns
2560 #define LPDDR2_tXPDLL (0)
2561 #define LPDDR2_tZQCS (90) //ns
2562 #define LPDDR2_tZQCSI (0)
2563 #define LPDDR2_tDQS (1)
2564 #define LPDDR2_tCKSRE (1) //tCK
2565 #define LPDDR2_tCKSRX (2) //tCK
2566 #define LPDDR2_tCKE (3) //tCK
2567 #define LPDDR2_tMOD (0)
2568 #define LPDDR2_tRSTL (0)
2569 #define LPDDR2_tZQCL (360) //ns
2570 #define LPDDR2_tMRR (2) //tCK
2571 #define LPDDR2_tCKESR (15) //ns
2572 #define LPDDR2_tDPD_US (500) //us
2573 #define LPDDR2_tFAW_GREAT_200MHz (50) //ns
2574 #define LPDDR2_tFAW_LITTLE_200MHz (60) //ns
2575 #define LPDDR2_tDLLK (2) //tCK
2576 #define LPDDR2_tDQSCK_MAX (3) //tCK
2577 #define LPDDR2_tDQSCK_MIN (0) //tCK
2578 #define LPDDR2_tDQSS (1) //tCK
2588 /* 1066 933 800 667 533 400 333
2596 p_publ_timing->mr[2] = LPDDR2_RL3_WL1;
2602 p_publ_timing->mr[2] = LPDDR2_RL4_WL2;
2608 p_publ_timing->mr[2] = LPDDR2_RL5_WL2;
2614 p_publ_timing->mr[2] = LPDDR2_RL6_WL3;
2620 p_publ_timing->mr[2] = LPDDR2_RL7_WL4;
2626 p_publ_timing->mr[2] = LPDDR2_RL8_WL4;
2628 p_publ_timing->mr[3] = LPDDR2_DS_34;
2629 p_publ_timing->mr[0] = 0;
2630 /**************************************************
2632 **************************************************/
2634 * tREFI, average periodic refresh interval, 15.6us(<256Mb) 7.8us(256Mb-1Gb) 3.9us(2Gb-8Gb)
2636 if(ddr_capability_per_die >= 0x10000000) // 2Gb
2638 p_pctl_timing->trefi = LPDDR2_tREFI_3_9_us;
2642 p_pctl_timing->trefi = LPDDR2_tREFI_7_8_us;
2646 * tMRD, (=tMRW), 5 tCK
2648 p_pctl_timing->tmrd = LPDDR2_tMRD & 0x7;
2649 p_publ_timing->dtpr0.b.tMRD = 3;
2651 * tRFC, 90ns(<=512Mb) 130ns(1Gb-4Gb) 210ns(8Gb)
2653 if(ddr_capability_per_die >= 0x40000000) // 8Gb
2655 p_pctl_timing->trfc = (LPDDR2_tRFC_8Gb*nMHz+999)/1000;
2656 p_publ_timing->dtpr1.b.tRFC = ((LPDDR2_tRFC_8Gb*nMHz+999)/1000);
2658 * tXSR, max(2tCK,tRFC+10ns)
2660 tmp=(((LPDDR2_tRFC_8Gb+10)*nMHz+999)/1000);
2664 p_pctl_timing->trfc = (LPDDR2_tRFC_4Gb*nMHz+999)/1000;
2665 p_publ_timing->dtpr1.b.tRFC = ((LPDDR2_tRFC_4Gb*nMHz+999)/1000);
2666 tmp=(((LPDDR2_tRFC_4Gb+10)*nMHz+999)/1000);
2672 p_pctl_timing->texsr = tmp&0x3FF;
2673 p_publ_timing->dtpr2.b.tXS = tmp;
2676 * tRP, max(3tCK, 4-bank:15ns(Fast) 18ns(Typ) 24ns(Slow), 8-bank:18ns(Fast) 21ns(Typ) 27ns(Slow))
2678 //if(pPHY_Reg->DCR.b.DDR8BNK)
2681 trp_tmp = ((LPDDR2_tRPpb_8_BANK*nMHz+999)/1000);
2686 p_pctl_timing->trp = ((((LPDDR2_tRPab_SUB_tRPpb_8_BANK*nMHz+999)/1000) & 0x3)<<16) | (trp_tmp&0xF);
2690 trp_tmp = ((LPDDR2_tRPpb_4_BANK*nMHz+999)/1000);
2695 p_pctl_timing->trp = (LPDDR2_tRPab_SUB_tRPpb_4_BANK<<16) | (trp_tmp&0xF);
2697 p_publ_timing->dtpr0.b.tRP = trp_tmp;
2699 * tRAS, max(3tCK,42ns)
2701 tras_tmp=((LPDDR2_tRAS*nMHz+999)/1000);
2706 p_pctl_timing->tras = (tras_tmp&0x3F);
2707 p_publ_timing->dtpr0.b.tRAS = tras_tmp;
2710 * tRCD, max(3tCK, 15ns(Fast) 18ns(Typ) 24ns(Slow))
2712 trcd_tmp = ((LPDDR2_tRCD*nMHz+999)/1000);
2717 p_pctl_timing->trcd = (trcd_tmp&0xF);
2718 p_publ_timing->dtpr0.b.tRCD = trcd_tmp;
2721 * tRTP, max(2tCK, 7.5ns)
2723 trtp_tmp = ((LPDDR2_tRTP*nMHz+(nMHz>>1)+999)/1000);
2728 p_pctl_timing->trtp = trtp_tmp&0xF;
2729 p_publ_timing->dtpr0.b.tRTP = trtp_tmp;
2732 * tWR, max(3tCK,15ns)
2734 twr_tmp=((LPDDR2_tWR*nMHz+999)/1000);
2739 p_pctl_timing->twr = twr_tmp&0x1F;
2740 bl_tmp = (bl == 16) ? LPDDR2_BL16 : ((bl == 8) ? LPDDR2_BL8 : LPDDR2_BL4);
2741 p_publ_timing->mr[1] = bl_tmp | LPDDR2_nWR(twr_tmp);
2744 * WrToMiss=WL*tCK + tWR + tRP + tRCD
2746 p_noc_timing->b.WrToMiss = (cwl+twr_tmp+trp_tmp+trcd_tmp);
2748 * RdToMiss=tRTP + tRP + tRCD - (BL/2 * tCK)
2750 p_noc_timing->b.RdToMiss = (trtp_tmp+trp_tmp+trcd_tmp-(bl>>1));
2754 p_pctl_timing->trc = ((tras_tmp+trp_tmp)&0x3F);
2755 p_noc_timing->b.ActToAct = (tras_tmp+trp_tmp);
2756 p_publ_timing->dtpr0.b.tRC = (tras_tmp+trp_tmp);
2761 p_pctl_timing->trtw = (cl+2-cwl);//LPDDR2_tRTW;
2762 p_publ_timing->dtpr1.b.tRTW = 0;
2763 p_noc_timing->b.RdToWr = (cl+2-cwl);
2764 p_pctl_timing->tal = al;
2765 p_pctl_timing->tcl = cl;
2766 p_pctl_timing->tcwl = cwl;
2768 * tRRD, max(2tCK,10ns)
2770 tmp=((LPDDR2_tRRD*nMHz+999)/1000);
2775 p_pctl_timing->trrd = (tmp&0xF);
2776 p_publ_timing->dtpr0.b.tRRD = tmp;
2777 p_noc_activate->b.Rrd = tmp;
2779 * tWTR, max(2tCK, 7.5ns(533-266MHz) 10ns(200-166MHz))
2783 tmp=((LPDDR2_tWTR_GREAT_200MHz*nMHz+(nMHz>>1)+999)/1000);
2787 tmp=((LPDDR2_tWTR_LITTLE_200MHz*nMHz+999)/1000);
2793 p_pctl_timing->twtr = tmp&0xF;
2794 p_publ_timing->dtpr0.b.tWTR = tmp;
2798 p_noc_timing->b.WrToRd = (cwl+tmp);
2800 * tXP, max(2tCK,7.5ns)
2802 tmp=((LPDDR2_tXP*nMHz+(nMHz>>1)+999)/1000);
2807 p_pctl_timing->txp = tmp&0x7;
2808 p_publ_timing->dtpr2.b.tXP = tmp;
2812 p_pctl_timing->txpdll = LPDDR2_tXPDLL;
2816 p_pctl_timing->tzqcs = ((LPDDR2_tZQCS*nMHz+999)/1000)&0x7F;
2820 //if(pDDR_Reg->MCFG &= lpddr2_s4)
2823 p_pctl_timing->tzqcsi = LPDDR2_tZQCSI;
2827 p_pctl_timing->tzqcsi = 0;
2832 p_pctl_timing->tdqs = LPDDR2_tDQS;
2836 p_pctl_timing->tcksre = LPDDR2_tCKSRE;
2840 p_pctl_timing->tcksrx = LPDDR2_tCKSRX;
2844 p_pctl_timing->tcke = LPDDR2_tCKE;
2845 p_publ_timing->dtpr2.b.tCKE = LPDDR2_tCKE;
2849 p_pctl_timing->tmod = LPDDR2_tMOD;
2850 p_publ_timing->dtpr1.b.tMOD = LPDDR2_tMOD;
2854 p_pctl_timing->trstl = LPDDR2_tRSTL;
2858 p_pctl_timing->tzqcl = ((LPDDR2_tZQCL*nMHz+999)/1000)&0x3FF;
2862 p_pctl_timing->tmrr = LPDDR2_tMRR;
2864 * tCKESR, max(3tCK,15ns)
2866 tmp = ((LPDDR2_tCKESR*nMHz+999)/1000);
2871 p_pctl_timing->tckesr = tmp&0xF;
2875 p_pctl_timing->tdpd = LPDDR2_tDPD_US;
2877 /**************************************************
2879 **************************************************/
2881 * tCCD, BL/2 for DDR2 and 4 for DDR3
2883 p_publ_timing->dtpr0.b.tCCD = 0;
2887 p_publ_timing->dtpr1.b.tDQSCKmax = LPDDR2_tDQSCK_MAX;
2891 p_publ_timing->dtpr1.b.tDQSCK = LPDDR2_tDQSCK_MIN;
2893 * tRTODT, 0:ODT may be turned on immediately after read post-amble
2894 * 1:ODT may not be turned on until one clock after the read post-amble
2896 p_publ_timing->dtpr1.b.tRTODT = 1;
2898 * tFAW,max(8tCK, 50ns(200-533MHz) 60ns(166MHz))
2902 tmp=((LPDDR2_tFAW_GREAT_200MHz*nMHz+999)/1000);
2906 tmp=((LPDDR2_tFAW_LITTLE_200MHz*nMHz+999)/1000);
2912 p_publ_timing->dtpr1.b.tFAW = tmp;
2913 p_noc_activate->b.Fawbank = 1;
2914 p_noc_activate->b.Faw = tmp;
2918 p_publ_timing->dtpr1.b.tAOND = 0;
2922 p_publ_timing->dtpr2.b.tDLLK = LPDDR2_tDLLK;
2923 /**************************************************
2925 **************************************************/
2926 p_noc_timing->b.BurstLen = (bl>>1);
2928 else if(mem_type == LPDDR3)
2930 #define LPDDR3_tREFI_3_9_us (39) //unit 100ns
2931 #define LPDDR3_tMRD (10) //tCK
2932 #define LPDDR3_tRFC_8Gb (210) //ns
2933 #define LPDDR3_tRFC_4Gb (130) //ns
2934 #define LPDDR3_tRPpb_8_BANK (24) //ns
2935 #define LPDDR3_tRPab_SUB_tRPpb_8_BANK (3) //ns
2936 #define LPDDR3_tRTW (1) //tCK register min valid value
2937 #define LPDDR3_tRAS (42) //ns
2938 #define LPDDR3_tRCD (24) //ns
2939 #define LPDDR3_tRRD (10) //ns
2940 #define LPDDR3_tRTP (7) //ns
2941 #define LPDDR3_tWR (15) //ns
2942 #define LPDDR3_tWTR (7) //ns
2943 #define LPDDR3_tXP (7) //ns
2944 #define LPDDR3_tXPDLL (0)
2945 #define LPDDR3_tZQCS (90) //ns
2946 #define LPDDR3_tZQCSI (0)
2947 #define LPDDR3_tDQS (1)
2948 #define LPDDR3_tCKSRE (2) //tCK
2949 #define LPDDR3_tCKSRX (2) //tCK
2950 #define LPDDR3_tCKE (3) //tCK
2951 #define LPDDR3_tMOD (0)
2952 #define LPDDR3_tRSTL (0)
2953 #define LPDDR3_tZQCL (360) //ns
2954 #define LPDDR3_tMRR (4) //tCK
2955 #define LPDDR3_tCKESR (15) //ns
2956 #define LPDDR3_tDPD_US (500) //us
2957 #define LPDDR3_tFAW (50) //ns
2958 #define LPDDR3_tDLLK (2) //tCK
2959 #define LPDDR3_tDQSCK_MAX (3) //tCK
2960 #define LPDDR3_tDQSCK_MIN (0) //tCK
2961 #define LPDDR3_tDQSS (1) //tCK
2971 /* Only support Write Latency Set A here
2972 * 1066 933 800 733 667 600 533 400 166
2973 * RL, 16 14 12 11 10 9 8 6 3
2974 * WL, 8 8 6 6 6 5 4 3 1
2980 p_publ_timing->mr[2] = LPDDR3_RL3_WL1;
2986 p_publ_timing->mr[2] = LPDDR3_RL6_WL3;
2992 p_publ_timing->mr[2] = LPDDR3_RL8_WL4;
2998 p_publ_timing->mr[2] = LPDDR3_RL9_WL5;
3004 p_publ_timing->mr[2] = LPDDR3_RL10_WL6;
3010 p_publ_timing->mr[2] = LPDDR3_RL11_WL6;
3016 p_publ_timing->mr[2] = LPDDR3_RL12_WL6;
3022 p_publ_timing->mr[2] = LPDDR3_RL14_WL8;
3028 p_publ_timing->mr[2] = LPDDR3_RL16_WL8;
3030 p_publ_timing->mr[3] = LPDDR3_DS_34;
3031 if(nMHz <= DDR3_DDR2_ODT_DISABLE_FREQ)
3033 p_publ_timing->mr11 = LPDDR3_ODT_DIS;
3037 p_publ_timing->mr11 = LPDDR3_ODT_240;
3039 p_publ_timing->mr[0] = 0;
3040 /**************************************************
3042 **************************************************/
3044 * tREFI, average periodic refresh interval, 3.9us(4Gb-16Gb)
3046 p_pctl_timing->trefi = LPDDR3_tREFI_3_9_us;
3049 * tMRD, (=tMRW), 10 tCK
3051 p_pctl_timing->tmrd = LPDDR3_tMRD & 0x7;
3052 p_publ_timing->dtpr0.b.tMRD = 3; //max value
3054 * tRFC, 130ns(4Gb) 210ns(>4Gb)
3056 if(ddr_capability_per_die > 0x20000000) // >4Gb
3058 p_pctl_timing->trfc = (LPDDR3_tRFC_8Gb*nMHz+999)/1000;
3059 p_publ_timing->dtpr1.b.tRFC = ((LPDDR3_tRFC_8Gb*nMHz+999)/1000);
3061 * tXSR, max(2tCK,tRFC+10ns)
3063 tmp=(((LPDDR3_tRFC_8Gb+10)*nMHz+999)/1000);
3067 p_pctl_timing->trfc = (LPDDR3_tRFC_4Gb*nMHz+999)/1000;
3068 p_publ_timing->dtpr1.b.tRFC = ((LPDDR3_tRFC_4Gb*nMHz+999)/1000);
3069 tmp=(((LPDDR3_tRFC_4Gb+10)*nMHz+999)/1000);
3075 p_pctl_timing->texsr = tmp&0x3FF;
3076 p_publ_timing->dtpr2.b.tXS = tmp;
3079 * tRP, max(3tCK, 18ns(Fast) 21ns(Typ) 27ns(Slow))
3081 //if(pPHY_Reg->DCR.b.DDR8BNK)
3084 trp_tmp = ((LPDDR3_tRPpb_8_BANK*nMHz+999)/1000);
3089 p_pctl_timing->trp = ((((LPDDR3_tRPab_SUB_tRPpb_8_BANK*nMHz+999)/1000) & 0x3)<<16) | (trp_tmp&0xF);
3091 p_publ_timing->dtpr0.b.tRP = trp_tmp;
3093 * tRAS, max(3tCK,42ns)
3095 tras_tmp=((LPDDR3_tRAS*nMHz+999)/1000);
3100 p_pctl_timing->tras = (tras_tmp&0x3F);
3101 p_publ_timing->dtpr0.b.tRAS = tras_tmp;
3104 * tRCD, max(3tCK, 15ns(Fast) 18ns(Typ) 24ns(Slow))
3106 trcd_tmp = ((LPDDR3_tRCD*nMHz+999)/1000);
3111 p_pctl_timing->trcd = (trcd_tmp&0xF);
3112 p_publ_timing->dtpr0.b.tRCD = trcd_tmp;
3115 * tRTP, max(4tCK, 7.5ns)
3117 trtp_tmp = ((LPDDR3_tRTP*nMHz+(nMHz>>1)+999)/1000);
3122 p_pctl_timing->trtp = trtp_tmp&0xF;
3123 p_publ_timing->dtpr0.b.tRTP = trtp_tmp;
3126 * tWR, max(4tCK,15ns)
3128 twr_tmp=((LPDDR3_tWR*nMHz+999)/1000);
3133 p_pctl_timing->twr = twr_tmp&0x1F;
3134 bl_tmp = LPDDR3_BL8;
3135 p_publ_timing->mr[1] = bl_tmp | LPDDR2_nWR(twr_tmp);
3138 * WrToMiss=WL*tCK + tWR + tRP + tRCD
3140 p_noc_timing->b.WrToMiss = (cwl+twr_tmp+trp_tmp+trcd_tmp);
3142 * RdToMiss=tRTP + tRP + tRCD - (BL/2 * tCK)
3144 p_noc_timing->b.RdToMiss = (trtp_tmp+trp_tmp+trcd_tmp-(bl>>1));
3148 p_pctl_timing->trc = ((tras_tmp+trp_tmp)&0x3F);
3149 p_noc_timing->b.ActToAct = (tras_tmp+trp_tmp);
3150 p_publ_timing->dtpr0.b.tRC = (tras_tmp+trp_tmp);
3155 p_pctl_timing->trtw = (cl+2-cwl);//LPDDR2_tRTW;
3156 p_publ_timing->dtpr1.b.tRTW = 0;
3157 p_noc_timing->b.RdToWr = (cl+2-cwl);
3158 p_pctl_timing->tal = al;
3159 p_pctl_timing->tcl = cl;
3160 p_pctl_timing->tcwl = cwl;
3162 * tRRD, max(2tCK,10ns)
3164 tmp=((LPDDR3_tRRD*nMHz+999)/1000);
3169 p_pctl_timing->trrd = (tmp&0xF);
3170 p_publ_timing->dtpr0.b.tRRD = tmp;
3171 p_noc_activate->b.Rrd = tmp;
3173 * tWTR, max(4tCK, 7.5ns)
3175 tmp=((LPDDR3_tWTR*nMHz+(nMHz>>1)+999)/1000);
3180 p_pctl_timing->twtr = tmp&0xF;
3181 p_publ_timing->dtpr0.b.tWTR = tmp;
3185 p_noc_timing->b.WrToRd = (cwl+tmp);
3187 * tXP, max(3tCK,7.5ns)
3189 tmp=((LPDDR3_tXP*nMHz+(nMHz>>1)+999)/1000);
3194 p_pctl_timing->txp = tmp&0x7;
3195 p_publ_timing->dtpr2.b.tXP = tmp;
3199 p_pctl_timing->txpdll = LPDDR3_tXPDLL;
3203 p_pctl_timing->tzqcs = ((LPDDR3_tZQCS*nMHz+999)/1000)&0x7F;
3207 p_pctl_timing->tzqcsi = LPDDR3_tZQCSI;
3211 p_pctl_timing->tdqs = LPDDR3_tDQS;
3213 * tCKSRE=tCPDED, 2 tCK
3215 p_pctl_timing->tcksre = LPDDR3_tCKSRE;
3219 p_pctl_timing->tcksrx = LPDDR3_tCKSRX;
3221 * tCKE, (max 7.5ns,3 tCK)
3223 tmp=((7*nMHz+(nMHz>>1)+999)/1000);
3228 p_pctl_timing->tcke = tmp;
3229 p_publ_timing->dtpr2.b.tCKE = tmp;
3233 p_pctl_timing->tmod = LPDDR3_tMOD;
3234 p_publ_timing->dtpr1.b.tMOD = LPDDR3_tMOD;
3238 p_pctl_timing->trstl = LPDDR3_tRSTL;
3242 p_pctl_timing->tzqcl = ((LPDDR3_tZQCL*nMHz+999)/1000)&0x3FF;
3246 p_pctl_timing->tmrr = LPDDR3_tMRR;
3248 * tCKESR, max(3tCK,15ns)
3250 tmp = ((LPDDR3_tCKESR*nMHz+999)/1000);
3255 p_pctl_timing->tckesr = tmp&0xF;
3259 p_pctl_timing->tdpd = LPDDR3_tDPD_US;
3261 /**************************************************
3263 **************************************************/
3265 * tCCD, BL/2 for DDR2 and 4 for DDR3
3267 p_publ_timing->dtpr0.b.tCCD = 0;
3271 p_publ_timing->dtpr1.b.tDQSCKmax = LPDDR3_tDQSCK_MAX;
3275 p_publ_timing->dtpr1.b.tDQSCK = LPDDR3_tDQSCK_MIN;
3277 * tRTODT, 0:ODT may be turned on immediately after read post-amble
3278 * 1:ODT may not be turned on until one clock after the read post-amble
3280 p_publ_timing->dtpr1.b.tRTODT = 1;
3282 * tFAW,max(8tCK, 50ns)
3284 tmp=((LPDDR3_tFAW*nMHz+999)/1000);
3289 p_publ_timing->dtpr1.b.tFAW = tmp;
3290 p_noc_activate->b.Fawbank = 1;
3291 p_noc_activate->b.Faw = tmp;
3295 p_publ_timing->dtpr1.b.tAOND = 0;
3299 p_publ_timing->dtpr2.b.tDLLK = LPDDR3_tDLLK;
3300 /**************************************************
3302 **************************************************/
3303 p_noc_timing->b.BurstLen = (bl>>1);
3310 static uint32 __sramfunc ddr_update_timing(uint32 ch)
3313 PCTL_TIMING_T *p_pctl_timing=&(DATA(ddr_reg).pctl.pctl_timing);
3314 PHY_TIMING_T *p_publ_timing=&(DATA(ddr_reg).publ.phy_timing);
3315 volatile NOC_TIMING_T *p_noc_timing=&(DATA(ddr_reg).noc[0].ddrtiming);
3316 volatile NOC_ACTIVATE_T *p_noc_activate=&(DATA(ddr_reg).noc[0].activate);
3317 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
3318 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
3319 pMSCH_REG pMSCH_Reg= DATA(ddr_ch[ch]).pMSCH_Reg;
3321 FUNC(ddr_copy)((uint64_t *)&(pDDR_Reg->TOGCNT1U), (uint64_t*)&(p_pctl_timing->togcnt1u), 17);
3322 pPHY_Reg->DTPR[0] = p_publ_timing->dtpr0.d32;
3323 pPHY_Reg->DTPR[1] = p_publ_timing->dtpr1.d32;
3324 pPHY_Reg->DTPR[2] = p_publ_timing->dtpr2.d32;
3325 pMSCH_Reg->ddrtiming.d32 = (pMSCH_Reg->ddrtiming.b.BwRatio) | p_noc_timing->d32;
3326 pMSCH_Reg->activate.d32 = p_noc_activate->d32;
3328 if(DATA(ddr_ch[ch]).mem_type == DDR3)
3330 bl_tmp = ((p_publ_timing->mr[0] & 0x3) == DDR3_BL8) ? ddr2_ddr3_bl_8 : ddr2_ddr3_bl_4;
3331 pDDR_Reg->MCFG = (pDDR_Reg->MCFG & (~(0x1|(0x3<<18)|(0x1<<17)|(0x1<<16)))) | bl_tmp | tfaw_cfg(5)|pd_exit_slow|pd_type(1);
3332 if(DATA(ddr_freq) <= DDR3_DDR2_DLL_DISABLE_FREQ)
3334 pDDR_Reg->DFITRDDATAEN = pDDR_Reg->TCL-3;
3338 pDDR_Reg->DFITRDDATAEN = pDDR_Reg->TCL-2;
3340 pDDR_Reg->DFITPHYWRLAT = pDDR_Reg->TCWL-1;
3342 else if((DATA(ddr_ch[ch]).mem_type == LPDDR2)||(DATA(ddr_ch[ch]).mem_type == LPDDR3))
3344 if(((p_publ_timing->mr[1]) & 0x7) == LPDDR2_BL8)
3346 bl_tmp = mddr_lpddr2_bl_8;
3348 else if(((p_publ_timing->mr[1]) & 0x7) == LPDDR2_BL4)
3350 bl_tmp = mddr_lpddr2_bl_4;
3352 else //if(((p_publ_timing->mr[1]) & 0x7) == LPDDR2_BL16)
3354 bl_tmp = mddr_lpddr2_bl_16;
3356 if((DATA(ddr_freq)>=200)||(DATA(ddr_ch[ch]).mem_type == LPDDR3))
3358 pDDR_Reg->MCFG = (pDDR_Reg->MCFG & (~((0x3<<20)|(0x3<<18)|(0x1<<17)|(0x1<<16)))) | bl_tmp | tfaw_cfg(5)|pd_exit_fast|pd_type(1);
3362 pDDR_Reg->MCFG = (pDDR_Reg->MCFG & (~((0x3<<20)|(0x3<<18)|(0x1<<17)|(0x1<<16)))) | bl_tmp | tfaw_cfg(6)|pd_exit_fast|pd_type(1);
3364 i = ((pPHY_Reg->DTPR[1] >> 27) & 0x7) - ((pPHY_Reg->DTPR[1] >> 24) & 0x7);
3365 pPHY_Reg->DSGCR = (pPHY_Reg->DSGCR & (~(0x3F<<5))) | (i<<5) | (i<<8); //tDQSCKmax-tDQSCK
3366 pDDR_Reg->DFITRDDATAEN = pDDR_Reg->TCL-1;
3367 pDDR_Reg->DFITPHYWRLAT = pDDR_Reg->TCWL;
3373 static uint32 __sramfunc ddr_update_mr(uint32 ch)
3375 PHY_TIMING_T *p_publ_timing=&(DATA(ddr_reg).publ.phy_timing);
3377 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
3379 cs = ((pPHY_Reg->PGCR>>18) & 0xF);
3380 dll_off = (pPHY_Reg->MR[1] & DDR3_DLL_DISABLE) ? 1:0;
3381 FUNC(ddr_copy)((uint64_t *)&(pPHY_Reg->MR[0]), (uint64_t*)&(p_publ_timing->mr[0]), 2);
3382 if(DATA(ddr_ch[ch]).mem_type == DDR3)
3384 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x2) | cmd_addr((p_publ_timing->mr[2])));
3385 if(DATA(ddr_freq)>DDR3_DDR2_DLL_DISABLE_FREQ)
3387 if(dll_off) // off -> on
3389 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x1) | cmd_addr((p_publ_timing->mr[1]))); //DLL enable
3390 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x0) | cmd_addr(((p_publ_timing->mr[0]))| DDR3_DLL_RESET)); //DLL reset
3391 ddr_delayus(1); //at least 200 DDR cycle
3392 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x0) | cmd_addr((p_publ_timing->mr[0])));
3396 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x1) | cmd_addr((p_publ_timing->mr[1])));
3397 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x0) | cmd_addr((p_publ_timing->mr[0])));
3402 pPHY_Reg->MR[1] = (((p_publ_timing->mr[1])) | DDR3_DLL_DISABLE);
3403 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x1) | cmd_addr(((p_publ_timing->mr[1])) | DDR3_DLL_DISABLE)); //DLL disable
3404 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x0) | cmd_addr((p_publ_timing->mr[0])));
3407 else if((DATA(ddr_ch[ch]).mem_type == LPDDR2)||(DATA(ddr_ch[ch]).mem_type == LPDDR3))
3409 ddr_send_command(ch,cs, MRS_cmd, lpddr2_ma(0x1) | lpddr2_op((p_publ_timing->mr[1])));
3410 ddr_send_command(ch,cs, MRS_cmd, lpddr2_ma(0x2) | lpddr2_op((p_publ_timing->mr[2])));
3411 ddr_send_command(ch,cs, MRS_cmd, lpddr2_ma(0x3) | lpddr2_op((p_publ_timing->mr[3])));
3412 if(DATA(ddr_ch[ch]).mem_type == LPDDR3)
3414 ddr_send_command(ch,cs, MRS_cmd, lpddr2_ma(11) | lpddr2_op((p_publ_timing->mr11)));
3419 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x0) | cmd_addr((p_publ_timing->mr[0])));
3420 ddr_send_command(ch,cs, MRS_cmd, bank_addr(0x1) | cmd_addr((p_publ_timing->mr[2]))); //mr[2] is mDDR MR1
3425 static void __sramfunc ddr_update_odt(uint32 ch)
3428 pDDR_REG_T pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
3429 pDDRPHY_REG_T pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
3431 //adjust DRV and ODT
3432 if((DATA(ddr_ch[ch]).mem_type == DDR3) || (DATA(ddr_ch[ch]).mem_type == LPDDR3))
3434 if(DATA(ddr_freq) <= DDR3_DDR2_ODT_DISABLE_FREQ)
3436 pPHY_Reg->DATX8[0].DXGCR &= ~(0x3<<9); //dynamic RTT disable
3437 pPHY_Reg->DATX8[1].DXGCR &= ~(0x3<<9);
3438 if(!(pDDR_Reg->PPCFG & 1))
3440 pPHY_Reg->DATX8[2].DXGCR &= ~(0x3<<9);
3441 pPHY_Reg->DATX8[3].DXGCR &= ~(0x3<<9);
3446 pPHY_Reg->DATX8[0].DXGCR |= (0x3<<9); //dynamic RTT enable
3447 pPHY_Reg->DATX8[1].DXGCR |= (0x3<<9);
3448 if(!(pDDR_Reg->PPCFG & 1))
3450 pPHY_Reg->DATX8[2].DXGCR |= (0x3<<9);
3451 pPHY_Reg->DATX8[3].DXGCR |= (0x3<<9);
3457 pPHY_Reg->DATX8[0].DXGCR &= ~(0x3<<9); //dynamic RTT disable
3458 pPHY_Reg->DATX8[1].DXGCR &= ~(0x3<<9);
3459 if(!(pDDR_Reg->PPCFG & 1))
3461 pPHY_Reg->DATX8[2].DXGCR &= ~(0x3<<9);
3462 pPHY_Reg->DATX8[3].DXGCR &= ~(0x3<<9);
3465 if(DATA(ddr_ch[ch]).mem_type == LPDDR2)
3467 tmp = GET_LPDDR2_DS_ODT(); //DS=34ohm,ODT=171ohm
3469 else if(DATA(ddr_ch[ch]).mem_type == LPDDR3)
3471 tmp = GET_LPDDR3_DS_ODT(); //DS=34ohm,ODT=171ohm
3475 tmp = GET_DDR3_DS_ODT(); //DS=34ohm,ODT=171ohm
3477 cs = ((pPHY_Reg->PGCR>>18) & 0xF);
3480 pPHY_Reg->ZQ1CR[0] = tmp;
3483 pPHY_Reg->ZQ0CR[0] = tmp;
3487 static void __sramfunc ddr_selfrefresh_enter(uint32 nMHz)
3490 pDDR_REG_T pDDR_Reg;
3491 pDDRPHY_REG_T pPHY_Reg;
3493 for(ch=0;ch<CH_MAX;ch++)
3495 pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
3496 pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
3498 if(DATA(ddr_ch[ch]).mem_type != DRAM_MAX)
3500 ddr_move_to_Lowpower_state(ch);
3501 pDDR_Reg->TZQCSI = 0;
3506 #if defined(CONFIG_ARCH_RK3066B)
3507 static __sramdata uint32 data8_dqstr[25][4];
3508 static __sramdata uint32 min_ddr_freq,dqstr_flag=false;
3510 int ddr_get_datatraing_value_3168(bool end_flag,uint32 dqstr_value,uint32 min_freq)
3512 if(end_flag == true)
3514 dqstr_flag = true; //complete learn data training value flag
3515 min_ddr_freq = min_freq;
3519 data8_dqstr[dqstr_value][0]=pPHY_Reg->DATX8[0].DXDQSTR;
3520 data8_dqstr[dqstr_value][1]=pPHY_Reg->DATX8[0].DXDQSTR;
3521 data8_dqstr[dqstr_value][2]=pPHY_Reg->DATX8[0].DXDQSTR;
3522 data8_dqstr[dqstr_value][3]=pPHY_Reg->DATX8[0].DXDQSTR;
3524 ddr_print("training %luMhz[%d]:0x%x-0x%x-0x%x-0x%x\n",
3525 clk_get_rate(clk_get(NULL, "ddr"))/1000000,dqstr_value,data8_dqstr[dqstr_value][0],data8_dqstr[dqstr_value][1],
3526 data8_dqstr[dqstr_value][2],data8_dqstr[dqstr_value][3]);
3530 static void __sramfunc ddr_set_pll_enter_3168(uint32 freq_slew)
3532 uint32 value_1u,value_100n;
3533 ddr_move_to_Config_state();
3537 value_100n = DATA(ddr_reg).pctl.pctl_timing.togcnt100n;
3538 value_1u = DATA(ddr_reg).pctl.pctl_timing.togcnt1u;
3539 DATA(ddr_reg).pctl.pctl_timing.togcnt1u = pDDR_Reg->TOGCNT1U;
3540 DATA(ddr_reg).pctl.pctl_timing.togcnt100n = pDDR_Reg->TOGCNT100N;
3541 ddr_update_timing();
3543 DATA(ddr_reg).pctl.pctl_timing.togcnt100n = value_100n;
3544 DATA(ddr_reg).pctl.pctl_timing.togcnt1u = value_1u;
3548 pDDR_Reg->TOGCNT100N = DATA(ddr_reg).pctl.pctl_timing.togcnt100n;
3549 pDDR_Reg->TOGCNT1U = DATA(ddr_reg).pctl.pctl_timing.togcnt1u;
3552 pDDR_Reg->TZQCSI = 0;
3553 ddr_move_to_Lowpower_state();
3555 ddr_set_dll_bypass(0); //dll bypass
3556 SET_DDRPHY_CLKGATE(ch,1); //disable DDR PHY clock
3560 void __sramlocalfunc ddr_set_pll_exit_3168(uint32 freq_slew,uint32 dqstr_value)
3562 SET_DDRPHY_CLKGATE(ch,0); //enable DDR PHY clock
3564 ddr_set_dll_bypass(DATA(ddr_freq));
3567 if(dqstr_flag==true)
3569 pPHY_Reg->DATX8[0].DXDQSTR=data8_dqstr[dqstr_value][0];
3570 pPHY_Reg->DATX8[1].DXDQSTR=data8_dqstr[dqstr_value][1];
3571 pPHY_Reg->DATX8[2].DXDQSTR=data8_dqstr[dqstr_value][2];
3572 pPHY_Reg->DATX8[3].DXDQSTR=data8_dqstr[dqstr_value][3];
3576 ddr_move_to_Config_state();
3579 pDDR_Reg->TOGCNT100N = DATA(ddr_reg).pctl.pctl_timing.togcnt100n;
3580 pDDR_Reg->TOGCNT1U = DATA(ddr_reg).pctl.pctl_timing.togcnt1u;
3581 pDDR_Reg->TZQCSI = DATA(ddr_reg).pctl.pctl_timing.tzqcsi;
3585 ddr_update_timing();
3588 ddr_data_training();
3589 ddr_move_to_Access_state();
3593 static void __sramfunc ddr_chb_update_timing_odt(void)
3595 ddr_set_dll_bypass(1,0); //always use dll bypass
3596 ddr_update_timing(1);
3600 /* Make sure ddr_SRE_2_SRX paramter less than 4 */
3601 static void __sramfunc ddr_SRE_2_SRX(uint32 freq, uint32 freq_slew,uint32 dqstr_value)
3606 /** 2. ddr enter self-refresh mode or precharge power-down mode */
3608 #if defined(CONFIG_ARCH_RK3066B)
3609 ddr_set_pll_enter_3168(freq_slew);
3611 ddr_selfrefresh_enter(freq);
3614 /** 3. change frequence */
3615 FUNC(ddr_set_pll)(freq,1);
3616 DATA(ddr_freq) = freq;
3618 /** 5. Issues a Mode Exit command */
3619 #if defined(CONFIG_ARCH_RK3066B)
3620 ddr_set_pll_exit_3168(freq_slew,dqstr_value);
3622 //ddr_selfrefresh_exit();
3623 if(DATA(ddr_ch[1]).mem_type != DRAM_MAX)
3625 ddr_chb_update_timing_odt();
3627 ddr_set_dll_bypass(0,0); //always use dll bypass
3628 ddr_update_timing(0);
3630 FUNC(ddr_set_pll)(freq,2);
3631 for(ch=0;ch<CH_MAX;ch++)
3633 if(DATA(ddr_ch[ch]).mem_type != DRAM_MAX)
3635 ddr_set_dll_bypass(ch,DATA(ddr_freq));
3637 //ddr_delayus(10); //wait DLL lock
3639 ddr_move_to_Config_state(ch);
3641 cs[ch] = ddr_data_training_trigger(ch);
3644 for(ch=0;ch<CH_MAX;ch++)
3646 if(DATA(ddr_ch[ch]).mem_type != DRAM_MAX)
3648 n = ddr_data_training(ch,cs[ch]);
3649 ddr_move_to_Access_state(ch);
3652 sram_printascii("DTT failed!\n");
3661 struct ddr_change_freq_sram_param {
3668 void PIE_FUNC(ddr_change_freq_sram)(void *arg)
3670 struct ddr_change_freq_sram_param *param = arg;
3671 loops_per_us = LPJ_100MHZ * param->arm_freq / 1000000;
3672 /* Make sure ddr_SRE_2_SRX paramter less than 4 */
3673 ddr_SRE_2_SRX(param->freq, param->freq_slew, param->dqstr_value);
3675 EXPORT_PIE_SYMBOL(FUNC(ddr_change_freq_sram));
3677 typedef struct freq_tag{
3679 struct ddr_freq_t *p_ddr_freq_t;
3682 static noinline uint32 ddr_change_freq_sram(void *arg)
3686 uint32 dqstr_value=0;
3687 unsigned long flags;
3688 struct ddr_change_freq_sram_param param;
3690 volatile unsigned int * temp=(volatile unsigned int *)SRAM_CODE_OFFSET;
3693 freq_t *p_freq_t=(freq_t *)arg;
3694 uint32 nMHz=p_freq_t->nMHz;
3695 static struct rk_screen screen;
3696 static int dclk_div, down_dclk_div;
3698 #if defined (DDR_CHANGE_FREQ_IN_LCDC_VSYNC)
3699 struct ddr_freq_t *p_ddr_freq_t=p_freq_t->p_ddr_freq_t;
3702 #if defined(CONFIG_ARCH_RK3066B)
3703 if(dqstr_flag==true)
3705 dqstr_value=((nMHz-min_ddr_freq+1)/25 + 1) /2;
3706 freq_slew = (nMHz>ddr_freq)? 1 : 0;
3709 if (!screen.mode.pixclock) {
3710 rk_fb_get_prmry_screen(&screen);
3711 if (screen.lcdc_id == 0)
3712 dclk_div = (cru_readl(RK3288_CRU_CLKSELS_CON(27)) >> 8) & 0xff;
3713 else if (screen.lcdc_id == 1)
3714 dclk_div = (cru_readl(RK3288_CRU_CLKSELS_CON(29)) >> 8) & 0xff;
3715 down_dclk_div = 64*(dclk_div+1)-1;
3717 param.arm_freq = ddr_get_pll_freq(APLL);
3718 gpllvaluel = ddr_get_pll_freq(GPLL);
3719 if((200 < gpllvaluel) ||( gpllvaluel <1600)) //GPLL:200MHz~1600MHz
3721 if( gpllvaluel > 800) //800-1600MHz /4:200MHz-400MHz
3723 *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_select_gpll_div)) = 4;
3725 else if( gpllvaluel > 400) //400-800MHz /2:200MHz-400MHz
3727 *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_select_gpll_div)) = 2;
3729 else //200-400MHz /1:200MHz-400MHz
3731 *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_select_gpll_div)) = 1;
3736 ddr_print("GPLL frequency = %dMHz,Not suitable for ddr_clock \n",gpllvaluel);
3738 freq=p_ddr_set_pll(nMHz,0);
3740 ddr_get_parameter(freq);
3742 /** 1. Make sure there is no host access */
3743 local_irq_save(flags);
3744 local_fiq_disable();
3748 #if defined (DDR_CHANGE_FREQ_IN_LCDC_VSYNC)
3749 if(p_ddr_freq_t->screen_ft_us > 0)
3751 p_ddr_freq_t->t1 = cpu_clock(0);
3752 p_ddr_freq_t->t2 = (uint32)(p_ddr_freq_t->t1 - p_ddr_freq_t->t0); //ns
3754 //if test_count exceed maximum test times,ddr_freq_t.screen_ft_us == 0xfefefefe by ddr_freq.c
3755 if( (p_ddr_freq_t->t2 > p_ddr_freq_t->screen_ft_us*1000) && (p_ddr_freq_t->screen_ft_us != 0xfefefefe))
3762 rk_fb_poll_wait_frame_complete();
3766 for(i=0;i<SRAM_SIZE/4096;i++)
3772 for(i=0;i<CH_MAX;i++)
3774 if(p_ddr_ch[i]->mem_type != DRAM_MAX)
3776 n= p_ddr_ch[i]->pDDR_Reg->SCFG.d32;
3777 n= p_ddr_ch[i]->pPHY_Reg->RIDR;
3778 n= p_ddr_ch[i]->pMSCH_Reg->ddrconf;
3781 n= pCRU_Reg->CRU_PLL_CON[0][0];
3782 n= pPMU_Reg->PMU_WAKEUP_CFG[0];
3787 param.freq_slew = freq_slew;
3788 param.dqstr_value = dqstr_value;
3789 rk_fb_set_prmry_screen_status(SCREEN_PREPARE_DDR_CHANGE);
3790 if (screen.lcdc_id == 0)
3791 cru_writel(0 | CRU_W_MSK_SETBITS(down_dclk_div, 8, 0xff),
3792 RK3288_CRU_CLKSELS_CON(27));
3793 else if (screen.lcdc_id == 1)
3794 cru_writel(0 | CRU_W_MSK_SETBITS(down_dclk_div, 8, 0xff),
3795 RK3288_CRU_CLKSELS_CON(29));
3797 call_with_stack(fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_change_freq_sram)),
3799 rockchip_sram_stack-(NR_CPUS-1)*PAUSE_CPU_STACK_SIZE);
3801 if (screen.lcdc_id == 0)
3802 cru_writel(0 | CRU_W_MSK_SETBITS(dclk_div, 8, 0xff),
3803 RK3288_CRU_CLKSELS_CON(27));
3804 else if (screen.lcdc_id == 1)
3805 cru_writel(0 | CRU_W_MSK_SETBITS(dclk_div, 8, 0xff),
3806 RK3288_CRU_CLKSELS_CON(29));
3807 rk_fb_set_prmry_screen_status(SCREEN_UNPREPARE_DDR_CHANGE);
3809 #if defined (DDR_CHANGE_FREQ_IN_LCDC_VSYNC)
3813 local_irq_restore(flags);
3817 #if defined(ENABLE_DDR_CLCOK_GPLL_PATH)
3818 static uint32 ddr_change_freq_gpll_dpll(uint32 nMHz)
3820 uint32 gpll_freq,gpll_div;
3821 struct ddr_freq_t ddr_freq_t;
3822 ddr_freq_t.screen_ft_us = 0;
3824 if(true == ddr_rk3188_dpll_is_good)
3826 gpllvaluel = ddr_get_pll_freq(GPLL);
3828 if((200 < gpllvaluel) ||( gpllvaluel <1600)) //GPLL:200MHz~1600MHz
3830 gpll_div = (gpllvaluel+nMHz-1)/nMHz;
3831 if( gpllvaluel > 800) //800-1600MHz /4:200MHz-400MHz
3833 gpll_freq = gpllvaluel/4;
3836 else if( gpllvaluel > 400) //400-800MHz /2:200MHz-400MHz
3838 gpll_freq = gpllvaluel/2;
3841 else //200-400MHz /1:200MHz-400MHz
3843 gpll_freq = gpllvaluel;
3847 *p_ddr_select_gpll_div=gpll_div; //select GPLL
3848 ddr_change_freq_sram(gpll_freq,ddr_freq_t);
3849 *p_ddr_select_gpll_div=0;
3851 p_ddr_set_pll(nMHz,0); //count DPLL
3852 p_ddr_set_pll(nMHz,2); //lock DPLL only,but not select DPLL
3856 ddr_print("GPLL frequency = %dMHz,Not suitable for ddr_clock \n",gpllvaluel);
3860 return ddr_change_freq_sram(nMHz,ddr_freq_t);
3865 bool DEFINE_PIE_DATA(cpu_pause[NR_CPUS]);
3866 volatile bool *DATA(p_cpu_pause);
3867 static inline bool is_cpu0_paused(unsigned int cpu) { smp_rmb(); return DATA(cpu_pause)[0]; }
3868 static inline void set_cpuX_paused(unsigned int cpu, bool pause) { DATA(cpu_pause)[cpu] = pause; smp_wmb(); }
3869 static inline bool is_cpuX_paused(unsigned int cpu) { smp_rmb(); return DATA(p_cpu_pause)[cpu]; }
3870 static inline void set_cpu0_paused(bool pause) { DATA(p_cpu_pause)[0] = pause; smp_wmb();}
3872 /* Do not use stack, safe on SMP */
3873 void PIE_FUNC(_pause_cpu)(void *arg)
3875 unsigned int cpu = (unsigned int)arg;
3877 set_cpuX_paused(cpu, true);
3878 while (is_cpu0_paused(cpu));
3879 set_cpuX_paused(cpu, false);
3882 static void pause_cpu(void *info)
3884 unsigned int cpu = raw_smp_processor_id();
3886 call_with_stack(fn_to_pie(rockchip_pie_chunk, &FUNC(_pause_cpu)),
3888 rockchip_sram_stack-(cpu-1)*PAUSE_CPU_STACK_SIZE);
3891 static void wait_cpu(void *info)
3895 static int call_with_single_cpu(u32 (*fn)(void *arg), void *arg)
3897 s64 now_ns, timeout_ns;
3899 unsigned int this_cpu = smp_processor_id();
3902 cpu_maps_update_begin();
3905 /* It should take much less than 1s to pause the cpus. It typically
3906 * takes around 20us. */
3907 timeout_ns = ktime_to_ns(ktime_add_ns(ktime_get(), NSEC_PER_SEC));
3908 now_ns = ktime_to_ns(ktime_get());
3909 set_cpu0_paused(true);
3910 smp_call_function((smp_call_func_t)pause_cpu, NULL, 0);
3911 for_each_online_cpu(cpu) {
3912 if (cpu == this_cpu)
3914 while (!is_cpuX_paused(cpu) && (now_ns < timeout_ns))
3915 now_ns = ktime_to_ns(ktime_get());
3916 if (now_ns >= timeout_ns) {
3917 pr_err("pause cpu %d timeout\n", cpu);
3924 set_cpu0_paused(false);
3926 smp_call_function(wait_cpu, NULL, true);
3927 cpu_maps_update_done();
3932 void PIE_FUNC(ddr_adjust_config)(void *arg)
3934 uint32 value[CH_MAX];
3936 pDDR_REG_T pDDR_Reg;
3937 pDDRPHY_REG_T pPHY_Reg;
3939 for(ch=0;ch<CH_MAX;ch++)
3941 if(DATA(ddr_ch[ch]).mem_type != DRAM_MAX)
3943 value[ch] = ((uint32 *)arg)[ch];
3944 pDDR_Reg = DATA(ddr_ch[ch]).pDDR_Reg;
3945 pPHY_Reg = DATA(ddr_ch[ch]).pPHY_Reg;
3947 //enter config state
3948 ddr_move_to_Config_state(ch);
3950 //set data training address
3951 pPHY_Reg->DTAR = value[ch];
3953 //set auto power down idle
3954 pDDR_Reg->MCFG=(pDDR_Reg->MCFG&0xffff00ff)|(PD_IDLE<<8);
3957 pPHY_Reg->PGCR &= ~(0x3<<12);
3959 //enable the hardware low-power interface
3960 pDDR_Reg->SCFG.b.hw_low_power_en = 1;
3962 if(pDDR_Reg->PPCFG & 1)
3964 pPHY_Reg->DATX8[2].DXGCR &= ~(1); //disable byte
3965 pPHY_Reg->DATX8[3].DXGCR &= ~(1);
3966 pPHY_Reg->DATX8[2].DXDLLCR |= 0x80000000; //disable DLL
3967 pPHY_Reg->DATX8[3].DXDLLCR |= 0x80000000;
3972 //enter access state
3973 ddr_move_to_Access_state(ch);
3977 EXPORT_PIE_SYMBOL(FUNC(ddr_adjust_config));
3979 static uint32 _ddr_adjust_config(void *dtar)
3982 unsigned long flags;
3984 volatile unsigned int * temp=(volatile unsigned int *)SRAM_CODE_OFFSET;
3986 /** 1. Make sure there is no host access */
3987 local_irq_save(flags);
3988 local_fiq_disable();
3992 for(i=0;i<SRAM_SIZE/4096;i++)
3997 for(i=0;i<CH_MAX;i++)
3999 if(p_ddr_ch[i]->mem_type != DRAM_MAX)
4001 n= p_ddr_ch[i]->pDDR_Reg->SCFG.d32;
4002 n= p_ddr_ch[i]->pPHY_Reg->RIDR;
4003 n= p_ddr_ch[i]->pMSCH_Reg->ddrconf;
4006 n= pCRU_Reg->CRU_PLL_CON[0][0];
4007 n= pPMU_Reg->PMU_WAKEUP_CFG[0];
4011 call_with_stack(fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_adjust_config)),
4013 rockchip_sram_stack-(NR_CPUS-1)*PAUSE_CPU_STACK_SIZE);
4015 local_irq_restore(flags);
4019 static void ddr_adjust_config(void)
4021 uint32 dtar[CH_MAX];
4024 //get data training address before idle port
4025 ddr_get_datatraing_addr(dtar);
4027 call_with_single_cpu(&_ddr_adjust_config, (void*)dtar);
4028 //_ddr_adjust_config(dtar);
4029 //disable unused channel
4030 for(i=0;i<CH_MAX;i++)
4032 if(p_ddr_ch[i]->mem_type != DRAM_MAX)
4039 static int __ddr_change_freq(uint32_t nMHz, struct ddr_freq_t ddr_freq_t)
4045 freq.p_ddr_freq_t = &ddr_freq_t;
4046 ret = call_with_single_cpu(&ddr_change_freq_sram,
4052 static int _ddr_change_freq(uint32 nMHz)
4054 struct ddr_freq_t ddr_freq_t;
4055 #if defined (DDR_CHANGE_FREQ_IN_LCDC_VSYNC)
4056 unsigned long remain_t, vblank_t, pass_t;
4057 static unsigned long reserve_t = 800;//us
4058 unsigned long long tmp;
4063 memset(&ddr_freq_t, 0x00, sizeof(ddr_freq_t));
4065 #if defined (DDR_CHANGE_FREQ_IN_LCDC_VSYNC)
4068 ddr_freq_t.screen_ft_us = rk_fb_get_prmry_screen_ft();
4069 ddr_freq_t.t0 = rk_fb_get_prmry_screen_framedone_t();
4070 if (!ddr_freq_t.screen_ft_us)
4071 return __ddr_change_freq(nMHz, ddr_freq_t);
4073 tmp = cpu_clock(0) - ddr_freq_t.t0;
4076 //lost frame interrupt
4077 while (pass_t > ddr_freq_t.screen_ft_us){
4078 int n = pass_t/ddr_freq_t.screen_ft_us;
4080 //printk("lost frame int, pass_t:%lu\n", pass_t);
4081 pass_t -= n*ddr_freq_t.screen_ft_us;
4082 ddr_freq_t.t0 += n*ddr_freq_t.screen_ft_us*1000;
4085 remain_t = ddr_freq_t.screen_ft_us - pass_t;
4086 if (remain_t < reserve_t) {
4087 //printk("remain_t(%lu) < reserve_t(%lu)\n", remain_t, reserve_t);
4088 vblank_t = rk_fb_get_prmry_screen_vbt();
4089 usleep_range(remain_t+vblank_t, remain_t+vblank_t);
4097 ddr_freq_t.screen_ft_us = 0xfefefefe;
4099 //printk("ft:%lu, pass_t:%lu, remaint_t:%lu, reservet_t:%lu\n",
4100 // ddr_freq_t.screen_ft_us, (unsigned long)pass_t, remain_t, reserve_t);
4101 usleep_range(remain_t-reserve_t, remain_t-reserve_t);
4104 ret = __ddr_change_freq(nMHz, ddr_freq_t);
4109 if (reserve_t < 3000)
4114 ret = __ddr_change_freq(nMHz, ddr_freq_t);
4120 static long _ddr_round_rate(uint32 nMHz)
4122 return p_ddr_set_pll(nMHz, 0);
4125 static void _ddr_set_auto_self_refresh(bool en)
4127 //set auto self-refresh idle
4128 *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_sr_idle)) = en ? SR_IDLE : 0;
4131 #define PERI_ACLK_DIV_MASK 0x1f
4132 #define PERI_ACLK_DIV_OFF 0
4134 #define PERI_HCLK_DIV_MASK 0x3
4135 #define PERI_HCLK_DIV_OFF 8
4137 #define PERI_PCLK_DIV_MASK 0x3
4138 #define PERI_PCLK_DIV_OFF 12
4140 static __sramdata u32 cru_sel32_sram;
4141 static void __sramfunc ddr_suspend(void)
4145 volatile unsigned int * temp=(volatile unsigned int *)SRAM_CODE_OFFSET;
4148 pll_id=GET_DDR_PLL_SRC();
4149 /** 1. Make sure there is no host access */
4154 for(i=0;i<SRAM_SIZE/4096;i++)
4160 n= pDDR_Reg->SCFG.d32;
4162 n= pCRU_Reg->CRU_PLL_CON[0][0];
4163 n= pPMU_Reg->PMU_WAKEUP_CFG[0];
4164 n= *(volatile uint32_t *)SysSrv_DdrConf;
4168 ddr_selfrefresh_enter(0);
4170 SET_PLL_MODE(pll_id, 0); //PLL slow-mode
4173 SET_PLL_PD(pll_id, 1); //PLL power-down
4178 cru_sel32_sram= pCRU_Reg->CRU_CLKSEL_CON[10];
4180 pCRU_Reg->CRU_CLKSEL_CON[10]=CRU_W_MSK_SETBITS(0, PERI_ACLK_DIV_OFF, PERI_ACLK_DIV_MASK)
4181 | CRU_W_MSK_SETBITS(0, PERI_HCLK_DIV_OFF, PERI_HCLK_DIV_MASK)
4182 |CRU_W_MSK_SETBITS(0, PERI_PCLK_DIV_OFF, PERI_PCLK_DIV_MASK);
4184 pPHY_Reg->DSGCR = pPHY_Reg->DSGCR&(~((0x1<<28)|(0x1<<29))); //CKOE
4187 static void __sramfunc ddr_resume(void)
4192 pll_id=GET_DDR_PLL_SRC();
4193 pPHY_Reg->DSGCR = pPHY_Reg->DSGCR|((0x1<<28)|(0x1<<29)); //CKOE
4197 pCRU_Reg->CRU_CLKSEL_CON[10]=0xffff0000|cru_sel32_sram;
4199 SET_PLL_PD(pll_id, 0); //PLL no power-down
4203 if (GET_DPLL_LOCK_STATUS())
4209 SET_PLL_MODE(pll_id, 1); //PLL normal
4212 ddr_selfrefresh_exit();
4216 //pArg:Ö¸ÕëÄÚÈݱíʾpll pd or not¡£
4217 void ddr_reg_save(uint32 *pArg)
4220 pDDR_REG_T pDDR_Reg=NULL;
4221 pDDRPHY_REG_T pPHY_Reg=NULL;
4222 pMSCH_REG pMSCH_Reg;
4224 p_ddr_reg->tag = 0x56313031;
4225 if(p_ddr_ch[0]->mem_type != DRAM_MAX)
4227 p_ddr_reg->pctlAddr[0] = RK3288_DDR_PCTL0_PHYS;
4228 p_ddr_reg->publAddr[0] = RK3288_DDR_PUBL0_PHYS;
4229 p_ddr_reg->nocAddr[0] = RK3288_SERVICE_BUS_PHYS;
4230 pDDR_Reg = p_ddr_ch[0]->pDDR_Reg;
4231 pPHY_Reg = p_ddr_ch[0]->pPHY_Reg;
4235 p_ddr_reg->pctlAddr[0] = 0xFFFFFFFF;
4236 p_ddr_reg->publAddr[0] = 0xFFFFFFFF;
4237 p_ddr_reg->nocAddr[0] = 0xFFFFFFFF;
4239 if(p_ddr_ch[1]->mem_type != DRAM_MAX)
4241 p_ddr_reg->pctlAddr[1] = RK3288_DDR_PCTL1_PHYS;
4242 p_ddr_reg->publAddr[1] = RK3288_DDR_PUBL1_PHYS;
4243 p_ddr_reg->nocAddr[1] = RK3288_SERVICE_BUS_PHYS+0x80;
4244 if((pDDR_Reg == NULL) || (pPHY_Reg == NULL))
4246 pDDR_Reg = p_ddr_ch[1]->pDDR_Reg;
4247 pPHY_Reg = p_ddr_ch[1]->pPHY_Reg;
4252 p_ddr_reg->pctlAddr[1] = 0xFFFFFFFF;
4253 p_ddr_reg->publAddr[1] = 0xFFFFFFFF;
4254 p_ddr_reg->nocAddr[1] = 0xFFFFFFFF;
4258 (fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_copy)))((uint64_t*)&(p_ddr_reg->pctl.pctl_timing.togcnt1u), (uint64_t *)&(pDDR_Reg->TOGCNT1U), 17);
4259 p_ddr_reg->pctl.SCFG = pDDR_Reg->SCFG.d32;
4260 p_ddr_reg->pctl.CMDTSTATEN = pDDR_Reg->CMDTSTATEN;
4261 p_ddr_reg->pctl.MCFG1 = pDDR_Reg->MCFG1;
4262 p_ddr_reg->pctl.MCFG = pDDR_Reg->MCFG;
4263 p_ddr_reg->pctl.pctl_timing.ddrFreq = *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_freq));
4264 p_ddr_reg->pctl.DFITCTRLDELAY = pDDR_Reg->DFITCTRLDELAY;
4265 p_ddr_reg->pctl.DFIODTCFG = pDDR_Reg->DFIODTCFG;
4266 p_ddr_reg->pctl.DFIODTCFG1 = pDDR_Reg->DFIODTCFG1;
4267 p_ddr_reg->pctl.DFIODTRANKMAP = pDDR_Reg->DFIODTRANKMAP;
4268 p_ddr_reg->pctl.DFITPHYWRDATA = pDDR_Reg->DFITPHYWRDATA;
4269 p_ddr_reg->pctl.DFITPHYWRLAT = pDDR_Reg->DFITPHYWRLAT;
4270 p_ddr_reg->pctl.DFITRDDATAEN = pDDR_Reg->DFITRDDATAEN;
4271 p_ddr_reg->pctl.DFITPHYRDLAT = pDDR_Reg->DFITPHYRDLAT;
4272 p_ddr_reg->pctl.DFITPHYUPDTYPE0 = pDDR_Reg->DFITPHYUPDTYPE0;
4273 p_ddr_reg->pctl.DFITPHYUPDTYPE1 = pDDR_Reg->DFITPHYUPDTYPE1;
4274 p_ddr_reg->pctl.DFITPHYUPDTYPE2 = pDDR_Reg->DFITPHYUPDTYPE2;
4275 p_ddr_reg->pctl.DFITPHYUPDTYPE3 = pDDR_Reg->DFITPHYUPDTYPE3;
4276 p_ddr_reg->pctl.DFITCTRLUPDMIN = pDDR_Reg->DFITCTRLUPDMIN;
4277 p_ddr_reg->pctl.DFITCTRLUPDMAX = pDDR_Reg->DFITCTRLUPDMAX;
4278 p_ddr_reg->pctl.DFITCTRLUPDDLY = pDDR_Reg->DFITCTRLUPDDLY;
4280 p_ddr_reg->pctl.DFIUPDCFG = pDDR_Reg->DFIUPDCFG;
4281 p_ddr_reg->pctl.DFITREFMSKI = pDDR_Reg->DFITREFMSKI;
4282 p_ddr_reg->pctl.DFITCTRLUPDI = pDDR_Reg->DFITCTRLUPDI;
4283 p_ddr_reg->pctl.DFISTCFG0 = pDDR_Reg->DFISTCFG0;
4284 p_ddr_reg->pctl.DFISTCFG1 = pDDR_Reg->DFISTCFG1;
4285 p_ddr_reg->pctl.DFITDRAMCLKEN = pDDR_Reg->DFITDRAMCLKEN;
4286 p_ddr_reg->pctl.DFITDRAMCLKDIS = pDDR_Reg->DFITDRAMCLKDIS;
4287 p_ddr_reg->pctl.DFISTCFG2 = pDDR_Reg->DFISTCFG2;
4288 p_ddr_reg->pctl.DFILPCFG0 = pDDR_Reg->DFILPCFG0;
4291 p_ddr_reg->publ.phy_timing.dtpr0.d32 = pPHY_Reg->DTPR[0];
4292 (fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_copy)))((uint64_t*)&(p_ddr_reg->publ.phy_timing.dtpr1), (uint64_t *)&(pPHY_Reg->DTPR[1]), 3);
4293 p_ddr_reg->publ.PIR = pPHY_Reg->PIR;
4294 p_ddr_reg->publ.PGCR = pPHY_Reg->PGCR;
4295 p_ddr_reg->publ.DLLGCR = pPHY_Reg->DLLGCR;
4296 p_ddr_reg->publ.ACDLLCR = pPHY_Reg->ACDLLCR;
4297 p_ddr_reg->publ.PTR[0] = pPHY_Reg->PTR[0];
4298 p_ddr_reg->publ.PTR[1] = pPHY_Reg->PTR[1];
4299 p_ddr_reg->publ.PTR[2] = pPHY_Reg->PTR[2];
4300 p_ddr_reg->publ.ACIOCR = pPHY_Reg->ACIOCR;
4301 p_ddr_reg->publ.DXCCR = pPHY_Reg->DXCCR;
4302 p_ddr_reg->publ.DSGCR = pPHY_Reg->DSGCR;
4303 p_ddr_reg->publ.DCR = pPHY_Reg->DCR.d32;
4304 p_ddr_reg->publ.ODTCR = pPHY_Reg->ODTCR;
4305 p_ddr_reg->publ.DTAR = pPHY_Reg->DTAR;
4306 p_ddr_reg->publ.ZQ0CR0 = (pPHY_Reg->ZQ0SR[0] & 0x0FFFFFFF) | (0x1<<28);
4307 p_ddr_reg->publ.ZQ1CR0 = (pPHY_Reg->ZQ1SR[0] & 0x0FFFFFFF) | (0x1<<28);
4309 for(ch=0;ch<CH_MAX;ch++)
4311 if(p_ddr_ch[0]->mem_type != DRAM_MAX)
4313 pPHY_Reg = p_ddr_ch[ch]->pPHY_Reg;
4314 p_ddr_reg->dqs[ch].DX0GCR = pPHY_Reg->DATX8[0].DXGCR;
4315 p_ddr_reg->dqs[ch].DX0DLLCR = pPHY_Reg->DATX8[0].DXDLLCR;
4316 p_ddr_reg->dqs[ch].DX0DQTR = pPHY_Reg->DATX8[0].DXDQTR;
4317 p_ddr_reg->dqs[ch].DX0DQSTR = pPHY_Reg->DATX8[0].DXDQSTR;
4319 p_ddr_reg->dqs[ch].DX1GCR = pPHY_Reg->DATX8[1].DXGCR;
4320 p_ddr_reg->dqs[ch].DX1DLLCR = pPHY_Reg->DATX8[1].DXDLLCR;
4321 p_ddr_reg->dqs[ch].DX1DQTR = pPHY_Reg->DATX8[1].DXDQTR;
4322 p_ddr_reg->dqs[ch].DX1DQSTR = pPHY_Reg->DATX8[1].DXDQSTR;
4324 p_ddr_reg->dqs[ch].DX2GCR = pPHY_Reg->DATX8[2].DXGCR;
4325 p_ddr_reg->dqs[ch].DX2DLLCR = pPHY_Reg->DATX8[2].DXDLLCR;
4326 p_ddr_reg->dqs[ch].DX2DQTR = pPHY_Reg->DATX8[2].DXDQTR;
4327 p_ddr_reg->dqs[ch].DX2DQSTR = pPHY_Reg->DATX8[2].DXDQSTR;
4329 p_ddr_reg->dqs[ch].DX3GCR = pPHY_Reg->DATX8[3].DXGCR;
4330 p_ddr_reg->dqs[ch].DX3DLLCR = pPHY_Reg->DATX8[3].DXDLLCR;
4331 p_ddr_reg->dqs[ch].DX3DQTR = pPHY_Reg->DATX8[3].DXDQTR;
4332 p_ddr_reg->dqs[ch].DX3DQSTR = pPHY_Reg->DATX8[3].DXDQSTR;
4335 pMSCH_Reg= p_ddr_ch[ch]->pMSCH_Reg;
4336 p_ddr_reg->noc[ch].ddrconf = pMSCH_Reg->ddrconf;
4337 p_ddr_reg->noc[ch].ddrtiming.d32 = pMSCH_Reg->ddrtiming.d32;
4338 p_ddr_reg->noc[ch].ddrmode = pMSCH_Reg->ddrmode;
4339 p_ddr_reg->noc[ch].readlatency = pMSCH_Reg->readlatency;
4340 p_ddr_reg->noc[ch].activate.d32 = pMSCH_Reg->activate.d32;
4341 p_ddr_reg->noc[ch].devtodev = pMSCH_Reg->devtodev;
4346 p_ddr_reg->pllpdAddr = (uint32_t)pArg; //pll power-down tag addr
4347 p_ddr_reg->pllpdMask = 1;
4348 p_ddr_reg->pllpdVal = 1;
4351 p_ddr_reg->dpllmodeAddr = RK3288_CRU_PHYS + 0x50; //APCRU_MODE_CON
4352 p_ddr_reg->dpllSlowMode = ((3<<4)<<16) | (0<<4);
4353 p_ddr_reg->dpllNormalMode = ((3<<4)<<16) | (1<<4);
4354 p_ddr_reg->dpllResetAddr = RK3288_CRU_PHYS + 0x1c; //APCRU_DPLL_CON3
4355 p_ddr_reg->dpllReset = (((0x1<<5)<<16) | (0x1<<5));
4356 p_ddr_reg->dpllDeReset = (((0x1<<5)<<16) | (0x0<<5));
4357 p_ddr_reg->dpllConAddr = RK3288_CRU_PHYS + 0x10; //APCRU_DPLL_CON0
4358 p_ddr_reg->dpllCon[0] = pCRU_Reg->CRU_PLL_CON[DPLL][0] | (0xFFFF<<16);
4359 p_ddr_reg->dpllCon[1] = pCRU_Reg->CRU_PLL_CON[DPLL][1] | (0xFFFF<<16);
4360 p_ddr_reg->dpllCon[2] = pCRU_Reg->CRU_PLL_CON[DPLL][2] | (0xFFFF<<16);
4361 p_ddr_reg->dpllCon[3] = pCRU_Reg->CRU_PLL_CON[DPLL][3] | (0xFFFF<<16);
4362 p_ddr_reg->dpllLockAddr = RK3288_GRF_PHYS + 0x284; //GRF_SOC_STATUS1
4363 p_ddr_reg->dpllLockMask = (1<<5);
4364 p_ddr_reg->dpllLockVal = (1<<5);
4367 p_ddr_reg->ddrPllSrcDivAddr = RK3288_CRU_PHYS + 0xc8;
4368 p_ddr_reg->ddrPllSrcDiv = (pCRU_Reg->CRU_CLKSEL_CON[26] & 0x7) | (0x7<<16);
4370 p_ddr_reg->retenDisAddr = RK3288_PMU_PHYS+0x18; //pmu_pwrmode_con
4371 p_ddr_reg->retenDisVal = (3<<21); //OR operation
4372 p_ddr_reg->retenStAddr = RK3288_PMU_PHYS+0x1c; //pmu_pwrmode_con
4373 p_ddr_reg->retenStMask = (1<<6);
4374 p_ddr_reg->retenStVal = (0<<6);
4376 p_ddr_reg->grfRegCnt = 3;
4377 //DDR_16BIT,DDR_HW_WAKEUP,DDR_TYPE
4378 p_ddr_reg->grf[0].addr = RK3288_GRF_PHYS + 0x244;
4379 p_ddr_reg->grf[0].val = (pGRF_Reg->GRF_SOC_CON[0] & ((0x3<<8)|(0x3<<5)|(0x3<<3))) | (((0x3<<8)|(0x3<<5)|(0x3<<3))<<16);
4382 p_ddr_reg->grf[1].addr = RK3288_GRF_PHYS + 0x24c;
4383 p_ddr_reg->grf[1].val = (pGRF_Reg->GRF_SOC_CON[2] & (0x3f<<8)) | ((0x3f<<8)<<16);
4386 p_ddr_reg->grf[2].addr = RK3288_SGRF_PHYS + 0x8;
4387 p_ddr_reg->grf[2].val = READ_DDR_STRIDE() | (0x1F<<16);
4389 p_ddr_reg->endTag = 0xFFFFFFFF;
4392 __attribute__((aligned(4))) uint32 ddr_reg_resume[]=
4394 #include "ddr_reg_resume.inc"
4397 char * ddr_get_resume_code_info(u32 *size)
4399 *size=sizeof(ddr_reg_resume);
4401 return (char *)ddr_reg_resume;
4404 EXPORT_SYMBOL(ddr_get_resume_code_info);
4406 char * ddr_get_resume_data_info(u32 *size)
4408 *size=sizeof(DATA(ddr_reg));
4409 return (char *) kern_to_pie(rockchip_pie_chunk, &DATA(ddr_reg));
4411 EXPORT_SYMBOL(ddr_get_resume_data_info);
4413 /**********************ddr bandwidth calc*********************/
4414 enum ddr_bandwidth_id {
4423 #define grf_readl(offset) readl_relaxed(RK_GRF_VIRT + offset)
4424 #define grf_writel(v, offset) \
4425 do { writel_relaxed(v, RK_GRF_VIRT + offset); dsb(); } while (0)
4427 #define noc_readl(offset) readl_relaxed(RK3288_SERVICE_BUS_VIRT + offset)
4428 #define noc_writel(v, offset) \
4429 do { writel_relaxed(v, RK3288_SERVICE_BUS_VIRT + offset); \
4432 static void ddr_monitor_start(void)
4436 for (i = 1; i < 8; i++) {
4437 noc_writel(0x8, (0x400*i+0x8));
4438 noc_writel(0x1, (0x400*i+0xc));
4439 noc_writel(0x6, (0x400*i+0x138));
4440 noc_writel(0x10, (0x400*i+0x14c));
4441 noc_writel(0x8, (0x400*i+0x160));
4442 noc_writel(0x10, (0x400*i+0x174));
4445 grf_writel((((readl_relaxed(RK_PMU_VIRT+0x9c)>>13)&7) == 3) ?
4446 0xc000c000 : 0xe000e000, RK3288_GRF_SOC_CON4);
4448 for (i = 1; i < 8; i++)
4449 noc_writel(0x1, (0x400*i+0x28));
4452 static void ddr_monitor_stop(void)
4454 grf_writel(0xc0000000, RK3288_GRF_SOC_CON4);
4457 static void _ddr_bandwidth_get(struct ddr_bw_info *ddr_bw_ch0,
4458 struct ddr_bw_info *ddr_bw_ch1)
4460 u32 ddr_bw_val[2][ddrbw_id_end], ddr_freq;
4465 for (j = 0; j < 2; j++) {
4466 for (i = 0; i < ddrbw_eff; i++)
4468 grf_readl(RK3288_GRF_SOC_STATUS11+i*4+j*16);
4470 if (!ddr_bw_val[0][ddrbw_time_num])
4474 ddr_freq = readl_relaxed(RK_DDR_VIRT + 0xc0);
4476 temp64 = ((u64)ddr_bw_val[0][0]+ddr_bw_val[0][1])*4*100;
4477 do_div(temp64, ddr_bw_val[0][ddrbw_time_num]);
4478 ddr_bw_val[0][ddrbw_eff] = temp64;
4480 ddr_bw_ch0->ddr_percent = temp64;
4481 ddr_bw_ch0->ddr_time =
4482 ddr_bw_val[0][ddrbw_time_num]/(ddr_freq*1000);
4483 ddr_bw_ch0->ddr_wr =
4484 (ddr_bw_val[0][ddrbw_wr_num]*8*4)*
4485 ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4486 ddr_bw_ch0->ddr_rd =
4487 (ddr_bw_val[0][ddrbw_rd_num]*8*4)*
4488 ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4489 ddr_bw_ch0->ddr_act =
4490 ddr_bw_val[0][ddrbw_act_num];
4491 ddr_bw_ch0->ddr_total =
4494 ddr_bw_ch0->cpum = (noc_readl(0x400+0x178)<<16)
4495 + (noc_readl(0x400+0x164));
4496 ddr_bw_ch0->gpu = (noc_readl(0x800+0x178)<<16)
4497 + (noc_readl(0x800+0x164));
4498 ddr_bw_ch0->peri = (noc_readl(0xc00+0x178)<<16)
4499 + (noc_readl(0xc00+0x164));
4500 ddr_bw_ch0->video = (noc_readl(0x1000+0x178)<<16)
4501 + (noc_readl(0x1000+0x164));
4502 ddr_bw_ch0->vio0 = (noc_readl(0x1400+0x178)<<16)
4503 + (noc_readl(0x1400+0x164));
4504 ddr_bw_ch0->vio1 = (noc_readl(0x1800+0x178)<<16)
4505 + (noc_readl(0x1800+0x164));
4506 ddr_bw_ch0->vio2 = (noc_readl(0x1c00+0x178)<<16)
4507 + (noc_readl(0x1c00+0x164));
4510 ddr_bw_ch0->cpum*ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4512 ddr_bw_ch0->gpu*ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4514 ddr_bw_ch0->peri*ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4517 ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4519 ddr_bw_ch0->vio0*ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4521 ddr_bw_ch0->vio1*ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4523 ddr_bw_ch0->vio2*ddr_freq/ddr_bw_val[0][ddrbw_time_num];
4526 ddr_monitor_start();
4529 /******************************************************************/
4531 static int ddr_init(uint32 dram_speed_bin, uint32 freq)
4537 uint32 ch,cap=0,cs_cap;
4539 ddr_print("version 1.00 20150126 \n");
4541 p_ddr_reg = kern_to_pie(rockchip_pie_chunk, &DATA(ddr_reg));
4542 p_ddr_set_pll = fn_to_pie(rockchip_pie_chunk, &FUNC(ddr_set_pll));
4543 DATA(p_cpu_pause) = kern_to_pie(rockchip_pie_chunk, &DATA(cpu_pause[0]));
4545 tmp = clk_get_rate(clk_get(NULL, "clk_ddr"))/1000000;
4546 *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_freq)) = tmp;
4547 *kern_to_pie(rockchip_pie_chunk, &DATA(ddr_sr_idle)) = 0;
4549 for(ch=0;ch<CH_MAX;ch++)
4551 p_ddr_ch[ch] = kern_to_pie(rockchip_pie_chunk, &DATA(ddr_ch[ch]));
4553 p_ddr_ch[ch]->chNum = ch;
4554 p_ddr_ch[ch]->pDDR_Reg = pDDR_REG(ch);
4555 p_ddr_ch[ch]->pPHY_Reg = pPHY_REG(ch);
4556 p_ddr_ch[ch]->pMSCH_Reg = pMSCH_REG(ch);
4558 if(!(READ_CH_INFO()&(1<<ch)))
4560 p_ddr_ch[ch]->mem_type = DRAM_MAX;
4567 ddr_print("Channel b: \n");
4571 ddr_print("Channel a: \n");
4573 tmp = p_ddr_ch[ch]->pPHY_Reg->DCR.b.DDRMD;
4574 if((tmp == LPDDR2) && (READ_DRAMTYPE_INFO() == 6))
4581 ddr_print("DDR3 Device\n");
4584 ddr_print("LPDDR3 Device\n");
4587 ddr_print("LPDDR2 Device\n");
4590 ddr_print("Unkown Device\n");
4594 p_ddr_ch[ch]->mem_type = tmp;
4597 p_ddr_ch[ch]->mem_type = DRAM_MAX;
4602 p_ddr_ch[ch]->ddr_speed_bin = dram_speed_bin;
4603 //get capability per chip, not total size, used for calculate tRFC
4604 die = (8<<READ_BW_INFO(ch))/(8<<READ_DIE_BW_INFO(ch));
4605 cap = (1 << (READ_ROW_INFO(ch,0)+READ_COL_INFO(ch)+READ_BK_INFO(ch)+READ_BW_INFO(ch)));
4607 if(READ_CS_INFO(ch) > 1)
4609 cap += cap >> (READ_ROW_INFO(ch,0)-READ_ROW_INFO(ch,1));
4611 if(READ_CH_ROW_INFO(ch))
4615 p_ddr_ch[ch]->ddr_capability_per_die = cs_cap/die;
4616 ddr_print("Bus Width=%d Col=%d Bank=%d Row=%d CS=%d Total Capability=%dMB\n",
4617 READ_BW_INFO(ch)*16,\
4618 READ_COL_INFO(ch), \
4619 (0x1<<(READ_BK_INFO(ch))), \
4620 READ_ROW_INFO(ch,0), \
4625 ddr_adjust_config();
4627 clk = clk_get(NULL, "clk_ddr");
4629 ddr_print("failed to get ddr clk\n");
4633 tmp = clk_set_rate(clk, 1000*1000*freq);
4635 tmp = clk_set_rate(clk, clk_get_rate(clk));
4636 ddr_print("init success!!! freq=%luMHz\n", clk ? clk_get_rate(clk)/1000000 : freq);
4638 for(ch=0;ch<CH_MAX;ch++)
4640 if(p_ddr_ch[ch]->mem_type != DRAM_MAX)
4644 ddr_print("Channel b: \n");
4648 ddr_print("Channel a: \n");
4650 for(tmp=0;tmp<4;tmp++)
4652 gsr = p_ddr_ch[ch]->pPHY_Reg->DATX8[tmp].DXGSR[0];
4653 dqstr = p_ddr_ch[ch]->pPHY_Reg->DATX8[tmp].DXDQSTR;
4654 ddr_print("DTONE=0x%x, DTERR=0x%x, DTIERR=0x%x, DTPASS=%d,%d, DGSL=%d,%d extra clock, DGPS=%d,%d\n", \
4655 (gsr&0xF), ((gsr>>4)&0xF), ((gsr>>8)&0xF), \
4656 ((gsr>>13)&0x7), ((gsr>>16)&0x7),\
4657 (dqstr&0x7), ((dqstr>>3)&0x7),\
4658 ((((dqstr>>12)&0x3)+1)*90), ((((dqstr>>14)&0x3)+1)*90));
4660 ddr_print("ZERR=%x, ZDONE=%x, ZPD=0x%x, ZPU=0x%x, OPD=0x%x, OPU=0x%x\n", \
4661 (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[0]>>30)&0x1, \
4662 (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[0]>>31)&0x1, \
4663 p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[1]&0x3,\
4664 (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[1]>>2)&0x3,\
4665 (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[1]>>4)&0x3,\
4666 (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[1]>>6)&0x3);
4667 ddr_print("DRV Pull-Up=0x%x, DRV Pull-Dwn=0x%x\n", p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[0]&0x1F, (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[0]>>5)&0x1F);
4668 ddr_print("ODT Pull-Up=0x%x, ODT Pull-Dwn=0x%x\n", (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[0]>>10)&0x1F, (p_ddr_ch[ch]->pPHY_Reg->ZQ0SR[0]>>15)&0x1F);