2 * sunxi DRAM controller initialization
3 * (C) Copyright 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
4 * (C) Copyright 2013 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
6 * Based on sun4i Linux kernel sources mach-sunxi/pm/standby/dram*.c
7 * and earlier U-Boot Allwiner A10 SPL work
9 * (C) Copyright 2007-2012
10 * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
11 * Berg Xing <bergxing@allwinnertech.com>
12 * Tom Cubie <tangliang@allwinnertech.com>
14 * SPDX-License-Identifier: GPL-2.0+
18 * Unfortunately the only documentation we have on the sun7i DRAM
19 * controller is Allwinner boot0 + boot1 code, and that code uses
20 * magic numbers & shifts with no explanations. Hence this code is
21 * rather undocumented and full of magic.
26 #include <asm/arch/clock.h>
27 #include <asm/arch/dram.h>
28 #include <asm/arch/timer.h>
29 #include <asm/arch/sys_proto.h>
31 #define CPU_CFG_CHIP_VER(n) ((n) << 6)
32 #define CPU_CFG_CHIP_VER_MASK CPU_CFG_CHIP_VER(0x3)
33 #define CPU_CFG_CHIP_REV_A 0x0
34 #define CPU_CFG_CHIP_REV_C1 0x1
35 #define CPU_CFG_CHIP_REV_C2 0x2
36 #define CPU_CFG_CHIP_REV_B 0x3
39 * Wait up to 1s for mask to be clear in given reg.
41 static void await_completion(u32 *reg, u32 mask)
43 unsigned long tmo = timer_get_us() + 1000000;
45 while (readl(reg) & mask) {
46 if (timer_get_us() > tmo)
47 panic("Timeout initialising DRAM\n");
51 static void mctl_ddr3_reset(void)
53 struct sunxi_dram_reg *dram =
54 (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
56 clrbits_le32(&dram->mcr, DRAM_MCR_RESET);
58 setbits_le32(&dram->mcr, DRAM_MCR_RESET);
61 static void mctl_set_drive(void)
63 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
65 clrsetbits_le32(&dram->mcr, DRAM_MCR_MODE_NORM(0x3) | (0x3 << 28),
66 DRAM_MCR_MODE_EN(0x3) |
70 static void mctl_itm_disable(void)
72 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
74 clrsetbits_le32(&dram->ccr, DRAM_CCR_INIT, DRAM_CCR_ITM_OFF);
77 static void mctl_itm_enable(void)
79 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
81 clrbits_le32(&dram->ccr, DRAM_CCR_ITM_OFF);
84 static void mctl_enable_dll0(u32 phase)
86 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
88 clrsetbits_le32(&dram->dllcr[0], 0x3f << 6,
89 ((phase >> 16) & 0x3f) << 6);
90 clrsetbits_le32(&dram->dllcr[0], DRAM_DLLCR_NRESET, DRAM_DLLCR_DISABLE);
93 clrbits_le32(&dram->dllcr[0], DRAM_DLLCR_NRESET | DRAM_DLLCR_DISABLE);
96 clrsetbits_le32(&dram->dllcr[0], DRAM_DLLCR_DISABLE, DRAM_DLLCR_NRESET);
101 * Note: This differs from pm/standby in that it checks the bus width
103 static void mctl_enable_dllx(u32 phase)
105 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
108 bus_width = readl(&dram->dcr);
110 if ((bus_width & DRAM_DCR_BUS_WIDTH_MASK) ==
111 DRAM_DCR_BUS_WIDTH(DRAM_DCR_BUS_WIDTH_32BIT))
112 n = DRAM_DCR_NR_DLLCR_32BIT;
114 n = DRAM_DCR_NR_DLLCR_16BIT;
116 for (i = 1; i < n; i++) {
117 clrsetbits_le32(&dram->dllcr[i], 0xf << 14,
118 (phase & 0xf) << 14);
119 clrsetbits_le32(&dram->dllcr[i], DRAM_DLLCR_NRESET,
125 for (i = 1; i < n; i++)
126 clrbits_le32(&dram->dllcr[i], DRAM_DLLCR_NRESET |
130 for (i = 1; i < n; i++)
131 clrsetbits_le32(&dram->dllcr[i], DRAM_DLLCR_DISABLE,
136 static u32 hpcr_value[32] = {
138 0x0301, 0x0301, 0x0301, 0x0301,
139 0x0301, 0x0301, 0x0301, 0x0301,
142 0x1031, 0x1031, 0x0735, 0x1035,
143 0x1035, 0x0731, 0x1031, 0x0735,
144 0x1035, 0x1031, 0x0731, 0x1035,
145 0x0001, 0x1031, 0, 0x1031
146 /* last row differs from boot0 source table
147 * 0x1031, 0x0301, 0x0301, 0x0731
148 * but boot0 code skips #28 and #30, and sets #29 and #31 to the
149 * value from #28 entry (0x1031)
154 static void mctl_configure_hostport(void)
156 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
159 for (i = 0; i < 32; i++)
160 writel(hpcr_value[i], &dram->hpcr[i]);
163 static void mctl_setup_dram_clock(u32 clk)
166 struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
169 reg_val = readl(&ccm->pll5_cfg);
170 reg_val &= ~CCM_PLL5_CTRL_M_MASK; /* set M to 0 (x1) */
171 reg_val &= ~CCM_PLL5_CTRL_K_MASK; /* set K to 0 (x1) */
172 reg_val &= ~CCM_PLL5_CTRL_N_MASK; /* set N to 0 (x0) */
173 reg_val &= ~CCM_PLL5_CTRL_P_MASK; /* set P to 0 (x1) */
174 if (clk >= 540 && clk < 552) {
175 /* dram = 540MHz, pll5p = 540MHz */
176 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
177 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
178 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(15));
179 reg_val |= CCM_PLL5_CTRL_P(1);
180 } else if (clk >= 512 && clk < 528) {
181 /* dram = 512MHz, pll5p = 384MHz */
182 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(3));
183 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(4));
184 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(16));
185 reg_val |= CCM_PLL5_CTRL_P(2);
186 } else if (clk >= 496 && clk < 504) {
187 /* dram = 496MHz, pll5p = 372MHz */
188 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(3));
189 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(2));
190 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(31));
191 reg_val |= CCM_PLL5_CTRL_P(2);
192 } else if (clk >= 468 && clk < 480) {
193 /* dram = 468MHz, pll5p = 468MHz */
194 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
195 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
196 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(13));
197 reg_val |= CCM_PLL5_CTRL_P(1);
198 } else if (clk >= 396 && clk < 408) {
199 /* dram = 396MHz, pll5p = 396MHz */
200 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
201 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
202 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(11));
203 reg_val |= CCM_PLL5_CTRL_P(1);
205 /* any other frequency that is a multiple of 24 */
206 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
207 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(2));
208 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(clk / 24));
209 reg_val |= CCM_PLL5_CTRL_P(CCM_PLL5_CTRL_P_X(2));
211 reg_val &= ~CCM_PLL5_CTRL_VCO_GAIN; /* PLL VCO Gain off */
212 reg_val |= CCM_PLL5_CTRL_EN; /* PLL On */
213 writel(reg_val, &ccm->pll5_cfg);
216 setbits_le32(&ccm->pll5_cfg, CCM_PLL5_CTRL_DDR_CLK);
218 #if defined(CONFIG_SUN4I) || defined(CONFIG_SUN7I)
220 clrbits_le32(&ccm->gps_clk_cfg, CCM_GPS_CTRL_RESET | CCM_GPS_CTRL_GATE);
221 setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_GPS);
223 clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_GPS);
226 /* setup MBUS clock */
227 reg_val = CCM_MBUS_CTRL_GATE |
228 CCM_MBUS_CTRL_CLK_SRC(CCM_MBUS_CTRL_CLK_SRC_PLL6) |
229 CCM_MBUS_CTRL_N(CCM_MBUS_CTRL_N_X(2)) |
230 CCM_MBUS_CTRL_M(CCM_MBUS_CTRL_M_X(2));
231 writel(reg_val, &ccm->mbus_clk_cfg);
234 * open DRAMC AHB & DLL register clock
237 clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM | CCM_AHB_GATE_DLL);
241 setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM | CCM_AHB_GATE_DLL);
245 static int dramc_scan_readpipe(void)
247 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
250 /* data training trigger */
252 clrbits_le32(&dram->csr, DRAM_CSR_FAILED);
254 setbits_le32(&dram->ccr, DRAM_CCR_DATA_TRAINING);
256 /* check whether data training process has completed */
257 await_completion(&dram->ccr, DRAM_CCR_DATA_TRAINING);
259 /* check data training result */
260 reg_val = readl(&dram->csr);
261 if (reg_val & DRAM_CSR_FAILED)
267 static int dramc_scan_dll_para(void)
269 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
270 const u32 dqs_dly[7] = {0x3, 0x2, 0x1, 0x0, 0xe, 0xd, 0xc};
271 const u32 clk_dly[15] = {0x07, 0x06, 0x05, 0x04, 0x03,
272 0x02, 0x01, 0x00, 0x08, 0x10,
273 0x18, 0x20, 0x28, 0x30, 0x38};
274 u32 clk_dqs_count[15];
275 u32 dqs_i, clk_i, cr_i;
276 u32 max_val, min_val;
277 u32 dqs_index, clk_index;
279 /* Find DQS_DLY Pass Count for every CLK_DLY */
280 for (clk_i = 0; clk_i < 15; clk_i++) {
281 clk_dqs_count[clk_i] = 0;
282 clrsetbits_le32(&dram->dllcr[0], 0x3f << 6,
283 (clk_dly[clk_i] & 0x3f) << 6);
284 for (dqs_i = 0; dqs_i < 7; dqs_i++) {
285 for (cr_i = 1; cr_i < 5; cr_i++) {
286 clrsetbits_le32(&dram->dllcr[cr_i],
288 (dqs_dly[dqs_i] & 0x4f) << 14);
291 if (dramc_scan_readpipe() == 0)
292 clk_dqs_count[clk_i]++;
295 /* Test DQS_DLY Pass Count for every CLK_DLY from up to down */
296 for (dqs_i = 15; dqs_i > 0; dqs_i--) {
299 for (clk_i = 0; clk_i < 15; clk_i++) {
300 if (clk_dqs_count[clk_i] == dqs_i) {
310 /* Check if Find a CLK_DLY failed */
314 /* Find the middle index of CLK_DLY */
315 clk_index = (max_val + min_val) >> 1;
316 if ((max_val == (15 - 1)) && (min_val > 0))
317 /* if CLK_DLY[MCTL_CLK_DLY_COUNT] is very good, then the middle
318 * value can be more close to the max_val
320 clk_index = (15 + clk_index) >> 1;
321 else if ((max_val < (15 - 1)) && (min_val == 0))
322 /* if CLK_DLY[0] is very good, then the middle value can be more
323 * close to the min_val
326 if (clk_dqs_count[clk_index] < dqs_i)
329 /* Find the middle index of DQS_DLY for the CLK_DLY got above, and Scan
332 clrsetbits_le32(&dram->dllcr[0], 0x3f << 6,
333 (clk_dly[clk_index] & 0x3f) << 6);
336 for (dqs_i = 0; dqs_i < 7; dqs_i++) {
337 clk_dqs_count[dqs_i] = 0;
338 for (cr_i = 1; cr_i < 5; cr_i++) {
339 clrsetbits_le32(&dram->dllcr[cr_i],
341 (dqs_dly[dqs_i] & 0x4f) << 14);
344 if (dramc_scan_readpipe() == 0) {
345 clk_dqs_count[dqs_i] = 1;
353 dqs_index = (max_val + min_val) >> 1;
354 if ((max_val == (7-1)) && (min_val > 0))
355 dqs_index = (7 + dqs_index) >> 1;
356 else if ((max_val < (7-1)) && (min_val == 0))
358 if (!clk_dqs_count[dqs_index])
360 for (cr_i = 1; cr_i < 5; cr_i++) {
361 clrsetbits_le32(&dram->dllcr[cr_i],
363 (dqs_dly[dqs_index] & 0x4f) << 14);
366 return dramc_scan_readpipe();
370 clrbits_le32(&dram->dllcr[0], 0x3f << 6);
371 for (cr_i = 1; cr_i < 5; cr_i++)
372 clrbits_le32(&dram->dllcr[cr_i], 0x4f << 14);
375 return dramc_scan_readpipe();
378 static void dramc_clock_output_en(u32 on)
380 #if defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I)
381 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
384 setbits_le32(&dram->mcr, DRAM_MCR_DCLK_OUT);
386 clrbits_le32(&dram->mcr, DRAM_MCR_DCLK_OUT);
390 static const u16 tRFC_table[2][6] = {
391 /* 256Mb 512Mb 1Gb 2Gb 4Gb 8Gb */
392 /* DDR2 75ns 105ns 127.5ns 195ns 327.5ns invalid */
393 { 77, 108, 131, 200, 336, 336 },
394 /* DDR3 invalid 90ns 110ns 160ns 300ns 350ns */
395 { 93, 93, 113, 164, 308, 359 }
398 static void dramc_set_autorefresh_cycle(u32 clk, u32 type, u32 density)
400 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
403 tRFC = (tRFC_table[type][density] * clk + 1023) >> 10;
404 tREFI = (7987 * clk) >> 10; /* <= 7.8us */
406 writel(DRAM_DRR_TREFI(tREFI) | DRAM_DRR_TRFC(tRFC), &dram->drr);
409 unsigned long dramc_init(struct dram_para *para)
411 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
416 /* check input dram parameter structure */
420 /* setup DRAM relative clock */
421 mctl_setup_dram_clock(para->clock);
423 /* reset external DRAM */
427 dramc_clock_output_en(0);
430 mctl_enable_dll0(para->tpr3);
432 /* configure external DRAM */
434 if (para->type == DRAM_MEMORY_TYPE_DDR3)
435 reg_val |= DRAM_DCR_TYPE_DDR3;
436 reg_val |= DRAM_DCR_IO_WIDTH(para->io_width >> 3);
438 if (para->density == 256)
439 density = DRAM_DCR_CHIP_DENSITY_256M;
440 else if (para->density == 512)
441 density = DRAM_DCR_CHIP_DENSITY_512M;
442 else if (para->density == 1024)
443 density = DRAM_DCR_CHIP_DENSITY_1024M;
444 else if (para->density == 2048)
445 density = DRAM_DCR_CHIP_DENSITY_2048M;
446 else if (para->density == 4096)
447 density = DRAM_DCR_CHIP_DENSITY_4096M;
448 else if (para->density == 8192)
449 density = DRAM_DCR_CHIP_DENSITY_8192M;
451 density = DRAM_DCR_CHIP_DENSITY_256M;
453 reg_val |= DRAM_DCR_CHIP_DENSITY(density);
454 reg_val |= DRAM_DCR_BUS_WIDTH((para->bus_width >> 3) - 1);
455 reg_val |= DRAM_DCR_RANK_SEL(para->rank_num - 1);
456 reg_val |= DRAM_DCR_CMD_RANK_ALL;
457 reg_val |= DRAM_DCR_MODE(DRAM_DCR_MODE_INTERLEAVE);
458 writel(reg_val, &dram->dcr);
461 setbits_le32(&dram->zqcr1, (0x1 << 24) | (0x1 << 1));
462 if (para->tpr4 & 0x2)
463 clrsetbits_le32(&dram->zqcr1, (0x1 << 24), (0x1 << 1));
464 dramc_clock_output_en(1);
467 #if (defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I))
468 /* set odt impendance divide ratio */
469 reg_val = ((para->zq) >> 8) & 0xfffff;
470 reg_val |= ((para->zq) & 0xff) << 20;
471 reg_val |= (para->zq) & 0xf0000000;
472 writel(reg_val, &dram->zqcr0);
476 /* Set CKE Delay to about 1ms */
477 setbits_le32(&dram->idcr, 0x1ffff);
481 if ((readl(&dram->ppwrsctl) & 0x1) != 0x1)
484 setbits_le32(&dram->mcr, DRAM_MCR_RESET);
489 await_completion(&dram->ccr, DRAM_CCR_INIT);
491 mctl_enable_dllx(para->tpr3);
493 /* set refresh period */
494 dramc_set_autorefresh_cycle(para->clock, para->type - 2, density);
496 /* set timing parameters */
497 writel(para->tpr0, &dram->tpr0);
498 writel(para->tpr1, &dram->tpr1);
499 writel(para->tpr2, &dram->tpr2);
501 if (para->type == DRAM_MEMORY_TYPE_DDR3) {
502 reg_val = DRAM_MR_BURST_LENGTH(0x0);
503 #if (defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I))
504 reg_val |= DRAM_MR_POWER_DOWN;
506 reg_val |= DRAM_MR_CAS_LAT(para->cas - 4);
507 reg_val |= DRAM_MR_WRITE_RECOVERY(0x5);
508 } else if (para->type == DRAM_MEMORY_TYPE_DDR2) {
509 reg_val = DRAM_MR_BURST_LENGTH(0x2);
510 reg_val |= DRAM_MR_CAS_LAT(para->cas);
511 reg_val |= DRAM_MR_WRITE_RECOVERY(0x5);
513 writel(reg_val, &dram->mr);
515 writel(para->emr1, &dram->emr);
516 writel(para->emr2, &dram->emr2);
517 writel(para->emr3, &dram->emr3);
519 /* set DQS window mode */
520 clrsetbits_le32(&dram->ccr, DRAM_CCR_DQS_DRIFT_COMP, DRAM_CCR_DQS_GATE);
523 /* Command rate timing mode 2T & 1T */
524 if (para->tpr4 & 0x1)
525 setbits_le32(&dram->ccr, DRAM_CCR_COMMAND_RATE_1T);
527 /* reset external DRAM */
528 setbits_le32(&dram->ccr, DRAM_CCR_INIT);
529 await_completion(&dram->ccr, DRAM_CCR_INIT);
532 /* setup zq calibration manual */
533 reg_val = readl(&dram->ppwrsctl);
534 if ((reg_val & 0x1) == 1) {
535 /* super_standby_flag = 1 */
537 reg_val = readl(0x01c20c00 + 0x120); /* rtc */
538 reg_val &= 0x000fffff;
539 reg_val |= 0x17b00000;
540 writel(reg_val, &dram->zqcr0);
542 /* exit self-refresh state */
543 clrsetbits_le32(&dram->dcr, 0x1f << 27, 0x12 << 27);
544 /* check whether command has been executed */
545 await_completion(&dram->dcr, 0x1 << 31);
549 /* dram pad hold off */
550 setbits_le32(&dram->ppwrsctl, 0x16510000);
552 await_completion(&dram->ppwrsctl, 0x1);
554 /* exit self-refresh state */
555 clrsetbits_le32(&dram->dcr, 0x1f << 27, 0x12 << 27);
557 /* check whether command has been executed */
558 await_completion(&dram->dcr, 0x1 << 31);
562 /* issue a refresh command */
563 clrsetbits_le32(&dram->dcr, 0x1f << 27, 0x13 << 27);
564 await_completion(&dram->dcr, 0x1 << 31);
570 /* scan read pipe value */
572 if (para->tpr3 & (0x1 << 31)) {
573 ret_val = dramc_scan_dll_para();
576 (((readl(&dram->dllcr[0]) >> 6) & 0x3f) << 16) |
577 (((readl(&dram->dllcr[1]) >> 14) & 0xf) << 0) |
578 (((readl(&dram->dllcr[2]) >> 14) & 0xf) << 4) |
579 (((readl(&dram->dllcr[3]) >> 14) & 0xf) << 8) |
580 (((readl(&dram->dllcr[4]) >> 14) & 0xf) << 12
583 ret_val = dramc_scan_readpipe();
589 /* configure all host port */
590 mctl_configure_hostport();
592 return get_ram_size((long *)PHYS_SDRAM_0, PHYS_SDRAM_0_SIZE);