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 value to be set in given part of reg.
41 static void await_completion(u32 *reg, u32 mask, u32 val)
43 unsigned long tmo = timer_get_us() + 1000000;
45 while ((readl(reg) & mask) != val) {
46 if (timer_get_us() > tmo)
47 panic("Timeout initialising DRAM\n");
52 * Wait up to 1s for mask to be clear in given reg.
54 static inline void await_bits_clear(u32 *reg, u32 mask)
56 await_completion(reg, mask, 0);
60 * Wait up to 1s for mask to be set in given reg.
62 static inline void await_bits_set(u32 *reg, u32 mask)
64 await_completion(reg, mask, mask);
68 * This performs the external DRAM reset by driving the RESET pin low and
69 * then high again. According to the DDR3 spec, the RESET pin needs to be
70 * kept low for at least 200 us.
72 static void mctl_ddr3_reset(void)
74 struct sunxi_dram_reg *dram =
75 (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
78 struct sunxi_timer_reg *timer =
79 (struct sunxi_timer_reg *)SUNXI_TIMER_BASE;
82 writel(0, &timer->cpu_cfg);
83 reg_val = readl(&timer->cpu_cfg);
85 if ((reg_val & CPU_CFG_CHIP_VER_MASK) !=
86 CPU_CFG_CHIP_VER(CPU_CFG_CHIP_REV_A)) {
87 setbits_le32(&dram->mcr, DRAM_MCR_RESET);
89 clrbits_le32(&dram->mcr, DRAM_MCR_RESET);
93 clrbits_le32(&dram->mcr, DRAM_MCR_RESET);
95 setbits_le32(&dram->mcr, DRAM_MCR_RESET);
97 /* After the RESET pin is de-asserted, the DDR3 spec requires to wait
98 * for additional 500 us before driving the CKE pin (Clock Enable)
99 * high. The duration of this delay can be configured in the SDR_IDCR
100 * (Initialization Delay Configuration Register) and applied
101 * automatically by the DRAM controller during the DDR3 initialization
102 * step. But SDR_IDCR has limited range on sun4i/sun5i hardware and
103 * can't provide sufficient delay at DRAM clock frequencies higher than
104 * 524 MHz (while Allwinner A13 supports DRAM clock frequency up to
105 * 533 MHz according to the datasheet). Additionally, there is no
106 * official documentation for the SDR_IDCR register anywhere, and
107 * there is always a chance that we are interpreting it wrong.
108 * Better be safe than sorry, so add an explicit delay here. */
112 static void mctl_set_drive(void)
114 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
117 clrsetbits_le32(&dram->mcr, DRAM_MCR_MODE_NORM(0x3) | (0x3 << 28),
119 clrsetbits_le32(&dram->mcr, DRAM_MCR_MODE_NORM(0x3),
121 DRAM_MCR_MODE_EN(0x3) |
125 static void mctl_itm_disable(void)
127 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
129 clrsetbits_le32(&dram->ccr, DRAM_CCR_INIT, DRAM_CCR_ITM_OFF);
132 static void mctl_itm_enable(void)
134 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
136 clrbits_le32(&dram->ccr, DRAM_CCR_ITM_OFF);
139 static void mctl_enable_dll0(u32 phase)
141 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
143 clrsetbits_le32(&dram->dllcr[0], 0x3f << 6,
144 ((phase >> 16) & 0x3f) << 6);
145 clrsetbits_le32(&dram->dllcr[0], DRAM_DLLCR_NRESET, DRAM_DLLCR_DISABLE);
148 clrbits_le32(&dram->dllcr[0], DRAM_DLLCR_NRESET | DRAM_DLLCR_DISABLE);
151 clrsetbits_le32(&dram->dllcr[0], DRAM_DLLCR_DISABLE, DRAM_DLLCR_NRESET);
156 * Note: This differs from pm/standby in that it checks the bus width
158 static void mctl_enable_dllx(u32 phase)
160 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
163 bus_width = readl(&dram->dcr);
165 if ((bus_width & DRAM_DCR_BUS_WIDTH_MASK) ==
166 DRAM_DCR_BUS_WIDTH(DRAM_DCR_BUS_WIDTH_32BIT))
167 n = DRAM_DCR_NR_DLLCR_32BIT;
169 n = DRAM_DCR_NR_DLLCR_16BIT;
171 for (i = 1; i < n; i++) {
172 clrsetbits_le32(&dram->dllcr[i], 0xf << 14,
173 (phase & 0xf) << 14);
174 clrsetbits_le32(&dram->dllcr[i], DRAM_DLLCR_NRESET,
180 for (i = 1; i < n; i++)
181 clrbits_le32(&dram->dllcr[i], DRAM_DLLCR_NRESET |
185 for (i = 1; i < n; i++)
186 clrsetbits_le32(&dram->dllcr[i], DRAM_DLLCR_DISABLE,
191 static u32 hpcr_value[32] = {
197 0x1031, 0x1031, 0x0735, 0x1035,
198 0x1035, 0x0731, 0x1031, 0,
199 0x0301, 0x0301, 0x0301, 0x0301,
200 0x0301, 0x0301, 0x0301, 0
203 0x0301, 0x0301, 0x0301, 0x0301,
204 0x0301, 0x0301, 0, 0,
207 0x1031, 0x1031, 0x0735, 0x5031,
208 0x1035, 0x0731, 0x1031, 0x0735,
209 0x1035, 0x1031, 0x0731, 0x1035,
210 0x1031, 0x0301, 0x0301, 0x0731
213 0x0301, 0x0301, 0x0301, 0x0301,
214 0x0301, 0x0301, 0x0301, 0x0301,
217 0x1031, 0x1031, 0x0735, 0x1035,
218 0x1035, 0x0731, 0x1031, 0x0735,
219 0x1035, 0x1031, 0x0731, 0x1035,
220 0x0001, 0x1031, 0, 0x1031
221 /* last row differs from boot0 source table
222 * 0x1031, 0x0301, 0x0301, 0x0731
223 * but boot0 code skips #28 and #30, and sets #29 and #31 to the
224 * value from #28 entry (0x1031)
229 static void mctl_configure_hostport(void)
231 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
234 for (i = 0; i < 32; i++)
235 writel(hpcr_value[i], &dram->hpcr[i]);
238 static void mctl_setup_dram_clock(u32 clk)
241 struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
244 reg_val = readl(&ccm->pll5_cfg);
245 reg_val &= ~CCM_PLL5_CTRL_M_MASK; /* set M to 0 (x1) */
246 reg_val &= ~CCM_PLL5_CTRL_K_MASK; /* set K to 0 (x1) */
247 reg_val &= ~CCM_PLL5_CTRL_N_MASK; /* set N to 0 (x0) */
248 reg_val &= ~CCM_PLL5_CTRL_P_MASK; /* set P to 0 (x1) */
249 if (clk >= 540 && clk < 552) {
250 /* dram = 540MHz, pll5p = 540MHz */
251 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
252 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
253 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(15));
254 reg_val |= CCM_PLL5_CTRL_P(1);
255 } else if (clk >= 512 && clk < 528) {
256 /* dram = 512MHz, pll5p = 384MHz */
257 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(3));
258 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(4));
259 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(16));
260 reg_val |= CCM_PLL5_CTRL_P(2);
261 } else if (clk >= 496 && clk < 504) {
262 /* dram = 496MHz, pll5p = 372MHz */
263 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(3));
264 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(2));
265 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(31));
266 reg_val |= CCM_PLL5_CTRL_P(2);
267 } else if (clk >= 468 && clk < 480) {
268 /* dram = 468MHz, pll5p = 468MHz */
269 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
270 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
271 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(13));
272 reg_val |= CCM_PLL5_CTRL_P(1);
273 } else if (clk >= 396 && clk < 408) {
274 /* dram = 396MHz, pll5p = 396MHz */
275 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
276 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
277 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(11));
278 reg_val |= CCM_PLL5_CTRL_P(1);
280 /* any other frequency that is a multiple of 24 */
281 reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
282 reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(2));
283 reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(clk / 24));
284 reg_val |= CCM_PLL5_CTRL_P(CCM_PLL5_CTRL_P_X(2));
286 reg_val &= ~CCM_PLL5_CTRL_VCO_GAIN; /* PLL VCO Gain off */
287 reg_val |= CCM_PLL5_CTRL_EN; /* PLL On */
288 writel(reg_val, &ccm->pll5_cfg);
291 setbits_le32(&ccm->pll5_cfg, CCM_PLL5_CTRL_DDR_CLK);
293 #if defined(CONFIG_SUN4I) || defined(CONFIG_SUN7I)
295 clrbits_le32(&ccm->gps_clk_cfg, CCM_GPS_CTRL_RESET | CCM_GPS_CTRL_GATE);
296 setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_GPS);
298 clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_GPS);
301 #if defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I)
302 /* setup MBUS clock */
303 reg_val = CCM_MBUS_CTRL_GATE |
305 CCM_MBUS_CTRL_CLK_SRC(CCM_MBUS_CTRL_CLK_SRC_PLL6) |
306 CCM_MBUS_CTRL_N(CCM_MBUS_CTRL_N_X(2)) |
307 CCM_MBUS_CTRL_M(CCM_MBUS_CTRL_M_X(2));
308 #else /* defined(CONFIG_SUN5I) */
309 CCM_MBUS_CTRL_CLK_SRC(CCM_MBUS_CTRL_CLK_SRC_PLL5) |
310 CCM_MBUS_CTRL_N(CCM_MBUS_CTRL_N_X(1)) |
311 CCM_MBUS_CTRL_M(CCM_MBUS_CTRL_M_X(2));
313 writel(reg_val, &ccm->mbus_clk_cfg);
317 * open DRAMC AHB & DLL register clock
320 #if defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I)
321 clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM | CCM_AHB_GATE_DLL);
323 clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM);
328 #if defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I)
329 setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM | CCM_AHB_GATE_DLL);
331 setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM);
336 static int dramc_scan_readpipe(void)
338 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
341 /* data training trigger */
343 clrbits_le32(&dram->csr, DRAM_CSR_FAILED);
345 setbits_le32(&dram->ccr, DRAM_CCR_DATA_TRAINING);
347 /* check whether data training process has completed */
348 await_bits_clear(&dram->ccr, DRAM_CCR_DATA_TRAINING);
350 /* check data training result */
351 reg_val = readl(&dram->csr);
352 if (reg_val & DRAM_CSR_FAILED)
358 static void dramc_clock_output_en(u32 on)
360 #if defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I)
361 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
364 setbits_le32(&dram->mcr, DRAM_MCR_DCLK_OUT);
366 clrbits_le32(&dram->mcr, DRAM_MCR_DCLK_OUT);
369 struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
371 setbits_le32(&ccm->dram_clk_cfg, CCM_DRAM_CTRL_DCLK_OUT);
373 clrbits_le32(&ccm->dram_clk_cfg, CCM_DRAM_CTRL_DCLK_OUT);
377 static const u16 tRFC_table[2][6] = {
378 /* 256Mb 512Mb 1Gb 2Gb 4Gb 8Gb */
379 /* DDR2 75ns 105ns 127.5ns 195ns 327.5ns invalid */
380 { 77, 108, 131, 200, 336, 336 },
381 /* DDR3 invalid 90ns 110ns 160ns 300ns 350ns */
382 { 93, 93, 113, 164, 308, 359 }
385 static void dramc_set_autorefresh_cycle(u32 clk, u32 type, u32 density)
387 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
390 tRFC = (tRFC_table[type][density] * clk + 1023) >> 10;
391 tREFI = (7987 * clk) >> 10; /* <= 7.8us */
393 writel(DRAM_DRR_TREFI(tREFI) | DRAM_DRR_TRFC(tRFC), &dram->drr);
397 * If the dram->ppwrsctl (SDR_DPCR) register has the lowest bit set to 1, this
398 * means that DRAM is currently in self-refresh mode and retaining the old
399 * data. Since we have no idea what to do in this situation yet, just set this
400 * register to 0 and initialize DRAM in the same way as on any normal reboot
401 * (discarding whatever was stored there).
403 * Note: on sun7i hardware, the highest 16 bits need to be set to 0x1651 magic
404 * value for this write operation to have any effect. On sun5i hadware this
405 * magic value is not necessary. And on sun4i hardware the writes to this
406 * register seem to have no effect at all.
408 static void mctl_disable_power_save(void)
410 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
411 writel(0x16510000, &dram->ppwrsctl);
415 * After the DRAM is powered up or reset, the DDR3 spec requires to wait at
416 * least 500 us before driving the CKE pin (Clock Enable) high. The dram->idct
417 * (SDR_IDCR) register appears to configure this delay, which gets applied
418 * right at the time when the DRAM initialization is activated in the
419 * 'mctl_ddr3_initialize' function.
421 static void mctl_set_cke_delay(void)
423 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
425 /* The CKE delay is represented in DRAM clock cycles, multiplied by N
426 * (where N=2 for sun4i/sun5i and N=3 for sun7i). Here it is set to
427 * the maximum possible value 0x1ffff, just like in the Allwinner's
428 * boot0 bootloader. The resulting delay value is somewhere between
429 * ~0.4 ms (sun5i with 648 MHz DRAM clock speed) and ~1.1 ms (sun7i
430 * with 360 MHz DRAM clock speed). */
431 setbits_le32(&dram->idcr, 0x1ffff);
435 * This triggers the DRAM initialization. It performs sending the mode registers
436 * to the DRAM among other things. Very likely the ZQCL command is also getting
437 * executed (to do the initial impedance calibration on the DRAM side of the
438 * wire). The memory controller and the PHY must be already configured before
439 * calling this function.
441 static void mctl_ddr3_initialize(void)
443 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
444 setbits_le32(&dram->ccr, DRAM_CCR_INIT);
445 await_bits_clear(&dram->ccr, DRAM_CCR_INIT);
448 unsigned long dramc_init(struct dram_para *para)
450 struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
455 /* check input dram parameter structure */
459 /* setup DRAM relative clock */
460 mctl_setup_dram_clock(para->clock);
462 /* Disable any pad power save control */
463 mctl_disable_power_save();
468 dramc_clock_output_en(0);
471 /* select dram controller 1 */
472 writel(DRAM_CSEL_MAGIC, &dram->csel);
476 mctl_enable_dll0(para->tpr3);
478 /* configure external DRAM */
480 if (para->type == DRAM_MEMORY_TYPE_DDR3)
481 reg_val |= DRAM_DCR_TYPE_DDR3;
482 reg_val |= DRAM_DCR_IO_WIDTH(para->io_width >> 3);
484 if (para->density == 256)
485 density = DRAM_DCR_CHIP_DENSITY_256M;
486 else if (para->density == 512)
487 density = DRAM_DCR_CHIP_DENSITY_512M;
488 else if (para->density == 1024)
489 density = DRAM_DCR_CHIP_DENSITY_1024M;
490 else if (para->density == 2048)
491 density = DRAM_DCR_CHIP_DENSITY_2048M;
492 else if (para->density == 4096)
493 density = DRAM_DCR_CHIP_DENSITY_4096M;
494 else if (para->density == 8192)
495 density = DRAM_DCR_CHIP_DENSITY_8192M;
497 density = DRAM_DCR_CHIP_DENSITY_256M;
499 reg_val |= DRAM_DCR_CHIP_DENSITY(density);
500 reg_val |= DRAM_DCR_BUS_WIDTH((para->bus_width >> 3) - 1);
501 reg_val |= DRAM_DCR_RANK_SEL(para->rank_num - 1);
502 reg_val |= DRAM_DCR_CMD_RANK_ALL;
503 reg_val |= DRAM_DCR_MODE(DRAM_DCR_MODE_INTERLEAVE);
504 writel(reg_val, &dram->dcr);
506 dramc_clock_output_en(1);
508 mctl_set_cke_delay();
514 await_bits_clear(&dram->ccr, DRAM_CCR_INIT);
516 mctl_enable_dllx(para->tpr3);
518 /* set refresh period */
519 dramc_set_autorefresh_cycle(para->clock, para->type - 2, density);
521 /* set timing parameters */
522 writel(para->tpr0, &dram->tpr0);
523 writel(para->tpr1, &dram->tpr1);
524 writel(para->tpr2, &dram->tpr2);
526 if (para->type == DRAM_MEMORY_TYPE_DDR3) {
527 reg_val = DRAM_MR_BURST_LENGTH(0x0);
528 #if (defined(CONFIG_SUN5I) || defined(CONFIG_SUN7I))
529 reg_val |= DRAM_MR_POWER_DOWN;
531 reg_val |= DRAM_MR_CAS_LAT(para->cas - 4);
532 reg_val |= DRAM_MR_WRITE_RECOVERY(0x5);
533 } else if (para->type == DRAM_MEMORY_TYPE_DDR2) {
534 reg_val = DRAM_MR_BURST_LENGTH(0x2);
535 reg_val |= DRAM_MR_CAS_LAT(para->cas);
536 reg_val |= DRAM_MR_WRITE_RECOVERY(0x5);
538 writel(reg_val, &dram->mr);
540 writel(para->emr1, &dram->emr);
541 writel(para->emr2, &dram->emr2);
542 writel(para->emr3, &dram->emr3);
544 /* set DQS window mode */
545 clrsetbits_le32(&dram->ccr, DRAM_CCR_DQS_DRIFT_COMP, DRAM_CCR_DQS_GATE);
548 /* Command rate timing mode 2T & 1T */
549 if (para->tpr4 & 0x1)
550 setbits_le32(&dram->ccr, DRAM_CCR_COMMAND_RATE_1T);
552 /* initialize external DRAM */
553 mctl_ddr3_initialize();
555 /* scan read pipe value */
557 ret_val = dramc_scan_readpipe();
562 /* configure all host port */
563 mctl_configure_hostport();
565 return get_ram_size((long *)PHYS_SDRAM_0, PHYS_SDRAM_0_SIZE);