183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2e6e505b9SAlexander Graf /*
3e6e505b9SAlexander Graf  * sunxi DRAM controller initialization
4e6e505b9SAlexander Graf  * (C) Copyright 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
5e6e505b9SAlexander Graf  * (C) Copyright 2013 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
6e6e505b9SAlexander Graf  *
7e6e505b9SAlexander Graf  * Based on sun4i Linux kernel sources mach-sunxi/pm/standby/dram*.c
8*297963f5SPriit Laes  * and earlier U-Boot Allwinner A10 SPL work
9e6e505b9SAlexander Graf  *
10e6e505b9SAlexander Graf  * (C) Copyright 2007-2012
11e6e505b9SAlexander Graf  * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
12e6e505b9SAlexander Graf  * Berg Xing <bergxing@allwinnertech.com>
13e6e505b9SAlexander Graf  * Tom Cubie <tangliang@allwinnertech.com>
14e6e505b9SAlexander Graf  */
15e6e505b9SAlexander Graf 
16e6e505b9SAlexander Graf /*
17e6e505b9SAlexander Graf  * Unfortunately the only documentation we have on the sun7i DRAM
18e6e505b9SAlexander Graf  * controller is Allwinner boot0 + boot1 code, and that code uses
19e6e505b9SAlexander Graf  * magic numbers & shifts with no explanations. Hence this code is
20e6e505b9SAlexander Graf  * rather undocumented and full of magic.
21e6e505b9SAlexander Graf  */
22e6e505b9SAlexander Graf 
23e6e505b9SAlexander Graf #include <common.h>
24e6e505b9SAlexander Graf #include <asm/io.h>
25e6e505b9SAlexander Graf #include <asm/arch/clock.h>
26e6e505b9SAlexander Graf #include <asm/arch/dram.h>
27e6e505b9SAlexander Graf #include <asm/arch/timer.h>
28e6e505b9SAlexander Graf #include <asm/arch/sys_proto.h>
29e6e505b9SAlexander Graf 
30e6e505b9SAlexander Graf #define CPU_CFG_CHIP_VER(n) ((n) << 6)
31e6e505b9SAlexander Graf #define CPU_CFG_CHIP_VER_MASK CPU_CFG_CHIP_VER(0x3)
32e6e505b9SAlexander Graf #define CPU_CFG_CHIP_REV_A 0x0
33e6e505b9SAlexander Graf #define CPU_CFG_CHIP_REV_C1 0x1
34e6e505b9SAlexander Graf #define CPU_CFG_CHIP_REV_C2 0x2
35e6e505b9SAlexander Graf #define CPU_CFG_CHIP_REV_B 0x3
36e6e505b9SAlexander Graf 
37e6e505b9SAlexander Graf /*
38e6e505b9SAlexander Graf  * Wait up to 1s for mask to be clear in given reg.
39e6e505b9SAlexander Graf  */
await_bits_clear(u32 * reg,u32 mask)40e6e505b9SAlexander Graf static inline void await_bits_clear(u32 *reg, u32 mask)
41e6e505b9SAlexander Graf {
42e6e505b9SAlexander Graf 	mctl_await_completion(reg, mask, 0);
43e6e505b9SAlexander Graf }
44e6e505b9SAlexander Graf 
45e6e505b9SAlexander Graf /*
46e6e505b9SAlexander Graf  * Wait up to 1s for mask to be set in given reg.
47e6e505b9SAlexander Graf  */
await_bits_set(u32 * reg,u32 mask)48e6e505b9SAlexander Graf static inline void await_bits_set(u32 *reg, u32 mask)
49e6e505b9SAlexander Graf {
50e6e505b9SAlexander Graf 	mctl_await_completion(reg, mask, mask);
51e6e505b9SAlexander Graf }
52e6e505b9SAlexander Graf 
53e6e505b9SAlexander Graf /*
54e6e505b9SAlexander Graf  * This performs the external DRAM reset by driving the RESET pin low and
55e6e505b9SAlexander Graf  * then high again. According to the DDR3 spec, the RESET pin needs to be
56e6e505b9SAlexander Graf  * kept low for at least 200 us.
57e6e505b9SAlexander Graf  */
mctl_ddr3_reset(void)58e6e505b9SAlexander Graf static void mctl_ddr3_reset(void)
59e6e505b9SAlexander Graf {
60e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram =
61e6e505b9SAlexander Graf 			(struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
62e6e505b9SAlexander Graf 
63e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN4I
64e6e505b9SAlexander Graf 	struct sunxi_timer_reg *timer =
65e6e505b9SAlexander Graf 			(struct sunxi_timer_reg *)SUNXI_TIMER_BASE;
66e6e505b9SAlexander Graf 	u32 reg_val;
67e6e505b9SAlexander Graf 
68e6e505b9SAlexander Graf 	writel(0, &timer->cpu_cfg);
69e6e505b9SAlexander Graf 	reg_val = readl(&timer->cpu_cfg);
70e6e505b9SAlexander Graf 
71e6e505b9SAlexander Graf 	if ((reg_val & CPU_CFG_CHIP_VER_MASK) !=
72e6e505b9SAlexander Graf 	    CPU_CFG_CHIP_VER(CPU_CFG_CHIP_REV_A)) {
73e6e505b9SAlexander Graf 		setbits_le32(&dram->mcr, DRAM_MCR_RESET);
74e6e505b9SAlexander Graf 		udelay(200);
75e6e505b9SAlexander Graf 		clrbits_le32(&dram->mcr, DRAM_MCR_RESET);
76e6e505b9SAlexander Graf 	} else
77e6e505b9SAlexander Graf #endif
78e6e505b9SAlexander Graf 	{
79e6e505b9SAlexander Graf 		clrbits_le32(&dram->mcr, DRAM_MCR_RESET);
80e6e505b9SAlexander Graf 		udelay(200);
81e6e505b9SAlexander Graf 		setbits_le32(&dram->mcr, DRAM_MCR_RESET);
82e6e505b9SAlexander Graf 	}
83e6e505b9SAlexander Graf 	/* After the RESET pin is de-asserted, the DDR3 spec requires to wait
84e6e505b9SAlexander Graf 	 * for additional 500 us before driving the CKE pin (Clock Enable)
85e6e505b9SAlexander Graf 	 * high. The duration of this delay can be configured in the SDR_IDCR
86e6e505b9SAlexander Graf 	 * (Initialization Delay Configuration Register) and applied
87e6e505b9SAlexander Graf 	 * automatically by the DRAM controller during the DDR3 initialization
88e6e505b9SAlexander Graf 	 * step. But SDR_IDCR has limited range on sun4i/sun5i hardware and
89e6e505b9SAlexander Graf 	 * can't provide sufficient delay at DRAM clock frequencies higher than
90e6e505b9SAlexander Graf 	 * 524 MHz (while Allwinner A13 supports DRAM clock frequency up to
91e6e505b9SAlexander Graf 	 * 533 MHz according to the datasheet). Additionally, there is no
92e6e505b9SAlexander Graf 	 * official documentation for the SDR_IDCR register anywhere, and
93e6e505b9SAlexander Graf 	 * there is always a chance that we are interpreting it wrong.
94e6e505b9SAlexander Graf 	 * Better be safe than sorry, so add an explicit delay here. */
95e6e505b9SAlexander Graf 	udelay(500);
96e6e505b9SAlexander Graf }
97e6e505b9SAlexander Graf 
mctl_set_drive(void)98e6e505b9SAlexander Graf static void mctl_set_drive(void)
99e6e505b9SAlexander Graf {
100e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
101e6e505b9SAlexander Graf 
102e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN7I
103e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->mcr, DRAM_MCR_MODE_NORM(0x3) | (0x3 << 28),
104e6e505b9SAlexander Graf #else
105e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->mcr, DRAM_MCR_MODE_NORM(0x3),
106e6e505b9SAlexander Graf #endif
107e6e505b9SAlexander Graf 			DRAM_MCR_MODE_EN(0x3) |
108e6e505b9SAlexander Graf 			0xffc);
109e6e505b9SAlexander Graf }
110e6e505b9SAlexander Graf 
mctl_itm_disable(void)111e6e505b9SAlexander Graf static void mctl_itm_disable(void)
112e6e505b9SAlexander Graf {
113e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
114e6e505b9SAlexander Graf 
115e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->ccr, DRAM_CCR_INIT, DRAM_CCR_ITM_OFF);
116e6e505b9SAlexander Graf }
117e6e505b9SAlexander Graf 
mctl_itm_enable(void)118e6e505b9SAlexander Graf static void mctl_itm_enable(void)
119e6e505b9SAlexander Graf {
120e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
121e6e505b9SAlexander Graf 
122e6e505b9SAlexander Graf 	clrbits_le32(&dram->ccr, DRAM_CCR_ITM_OFF);
123e6e505b9SAlexander Graf }
124e6e505b9SAlexander Graf 
mctl_itm_reset(void)125e6e505b9SAlexander Graf static void mctl_itm_reset(void)
126e6e505b9SAlexander Graf {
127e6e505b9SAlexander Graf 	mctl_itm_disable();
128e6e505b9SAlexander Graf 	udelay(1); /* ITM reset needs a bit of delay */
129e6e505b9SAlexander Graf 	mctl_itm_enable();
130e6e505b9SAlexander Graf 	udelay(1);
131e6e505b9SAlexander Graf }
132e6e505b9SAlexander Graf 
mctl_enable_dll0(u32 phase)133e6e505b9SAlexander Graf static void mctl_enable_dll0(u32 phase)
134e6e505b9SAlexander Graf {
135e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
136e6e505b9SAlexander Graf 
137e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->dllcr[0], 0x3f << 6,
138e6e505b9SAlexander Graf 			((phase >> 16) & 0x3f) << 6);
139e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->dllcr[0], DRAM_DLLCR_NRESET, DRAM_DLLCR_DISABLE);
140e6e505b9SAlexander Graf 	udelay(2);
141e6e505b9SAlexander Graf 
142e6e505b9SAlexander Graf 	clrbits_le32(&dram->dllcr[0], DRAM_DLLCR_NRESET | DRAM_DLLCR_DISABLE);
143e6e505b9SAlexander Graf 	udelay(22);
144e6e505b9SAlexander Graf 
145e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->dllcr[0], DRAM_DLLCR_DISABLE, DRAM_DLLCR_NRESET);
146e6e505b9SAlexander Graf 	udelay(22);
147e6e505b9SAlexander Graf }
148e6e505b9SAlexander Graf 
149e6e505b9SAlexander Graf /* Get the number of DDR byte lanes */
mctl_get_number_of_lanes(void)150e6e505b9SAlexander Graf static u32 mctl_get_number_of_lanes(void)
151e6e505b9SAlexander Graf {
152e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
153e6e505b9SAlexander Graf 	if ((readl(&dram->dcr) & DRAM_DCR_BUS_WIDTH_MASK) ==
154e6e505b9SAlexander Graf 				DRAM_DCR_BUS_WIDTH(DRAM_DCR_BUS_WIDTH_32BIT))
155e6e505b9SAlexander Graf 		return 4;
156e6e505b9SAlexander Graf 	else
157e6e505b9SAlexander Graf 		return 2;
158e6e505b9SAlexander Graf }
159e6e505b9SAlexander Graf 
160e6e505b9SAlexander Graf /*
161e6e505b9SAlexander Graf  * Note: This differs from pm/standby in that it checks the bus width
162e6e505b9SAlexander Graf  */
mctl_enable_dllx(u32 phase)163e6e505b9SAlexander Graf static void mctl_enable_dllx(u32 phase)
164e6e505b9SAlexander Graf {
165e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
166e6e505b9SAlexander Graf 	u32 i, number_of_lanes;
167e6e505b9SAlexander Graf 
168e6e505b9SAlexander Graf 	number_of_lanes = mctl_get_number_of_lanes();
169e6e505b9SAlexander Graf 
170e6e505b9SAlexander Graf 	for (i = 1; i <= number_of_lanes; i++) {
171e6e505b9SAlexander Graf 		clrsetbits_le32(&dram->dllcr[i], 0xf << 14,
172e6e505b9SAlexander Graf 				(phase & 0xf) << 14);
173e6e505b9SAlexander Graf 		clrsetbits_le32(&dram->dllcr[i], DRAM_DLLCR_NRESET,
174e6e505b9SAlexander Graf 				DRAM_DLLCR_DISABLE);
175e6e505b9SAlexander Graf 		phase >>= 4;
176e6e505b9SAlexander Graf 	}
177e6e505b9SAlexander Graf 	udelay(2);
178e6e505b9SAlexander Graf 
179e6e505b9SAlexander Graf 	for (i = 1; i <= number_of_lanes; i++)
180e6e505b9SAlexander Graf 		clrbits_le32(&dram->dllcr[i], DRAM_DLLCR_NRESET |
181e6e505b9SAlexander Graf 			     DRAM_DLLCR_DISABLE);
182e6e505b9SAlexander Graf 	udelay(22);
183e6e505b9SAlexander Graf 
184e6e505b9SAlexander Graf 	for (i = 1; i <= number_of_lanes; i++)
185e6e505b9SAlexander Graf 		clrsetbits_le32(&dram->dllcr[i], DRAM_DLLCR_DISABLE,
186e6e505b9SAlexander Graf 				DRAM_DLLCR_NRESET);
187e6e505b9SAlexander Graf 	udelay(22);
188e6e505b9SAlexander Graf }
189e6e505b9SAlexander Graf 
190e6e505b9SAlexander Graf static u32 hpcr_value[32] = {
191e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN5I
192e6e505b9SAlexander Graf 	0, 0, 0, 0,
193e6e505b9SAlexander Graf 	0, 0, 0, 0,
194e6e505b9SAlexander Graf 	0, 0, 0, 0,
195e6e505b9SAlexander Graf 	0, 0, 0, 0,
196e6e505b9SAlexander Graf 	0x1031, 0x1031, 0x0735, 0x1035,
197e6e505b9SAlexander Graf 	0x1035, 0x0731, 0x1031, 0,
198e6e505b9SAlexander Graf 	0x0301, 0x0301, 0x0301, 0x0301,
199e6e505b9SAlexander Graf 	0x0301, 0x0301, 0x0301, 0
200e6e505b9SAlexander Graf #endif
201e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN4I
202e6e505b9SAlexander Graf 	0x0301, 0x0301, 0x0301, 0x0301,
203e6e505b9SAlexander Graf 	0x0301, 0x0301, 0, 0,
204e6e505b9SAlexander Graf 	0, 0, 0, 0,
205e6e505b9SAlexander Graf 	0, 0, 0, 0,
206e6e505b9SAlexander Graf 	0x1031, 0x1031, 0x0735, 0x5031,
207e6e505b9SAlexander Graf 	0x1035, 0x0731, 0x1031, 0x0735,
208e6e505b9SAlexander Graf 	0x1035, 0x1031, 0x0731, 0x1035,
209e6e505b9SAlexander Graf 	0x1031, 0x0301, 0x0301, 0x0731
210e6e505b9SAlexander Graf #endif
211e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN7I
212e6e505b9SAlexander Graf 	0x0301, 0x0301, 0x0301, 0x0301,
213e6e505b9SAlexander Graf 	0x0301, 0x0301, 0x0301, 0x0301,
214e6e505b9SAlexander Graf 	0, 0, 0, 0,
215e6e505b9SAlexander Graf 	0, 0, 0, 0,
216e6e505b9SAlexander Graf 	0x1031, 0x1031, 0x0735, 0x1035,
217e6e505b9SAlexander Graf 	0x1035, 0x0731, 0x1031, 0x0735,
218e6e505b9SAlexander Graf 	0x1035, 0x1031, 0x0731, 0x1035,
219e6e505b9SAlexander Graf 	0x0001, 0x1031, 0, 0x1031
220e6e505b9SAlexander Graf 	/* last row differs from boot0 source table
221e6e505b9SAlexander Graf 	 * 0x1031, 0x0301, 0x0301, 0x0731
222e6e505b9SAlexander Graf 	 * but boot0 code skips #28 and #30, and sets #29 and #31 to the
223e6e505b9SAlexander Graf 	 * value from #28 entry (0x1031)
224e6e505b9SAlexander Graf 	 */
225e6e505b9SAlexander Graf #endif
226e6e505b9SAlexander Graf };
227e6e505b9SAlexander Graf 
mctl_configure_hostport(void)228e6e505b9SAlexander Graf static void mctl_configure_hostport(void)
229e6e505b9SAlexander Graf {
230e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
231e6e505b9SAlexander Graf 	u32 i;
232e6e505b9SAlexander Graf 
233e6e505b9SAlexander Graf 	for (i = 0; i < 32; i++)
234e6e505b9SAlexander Graf 		writel(hpcr_value[i], &dram->hpcr[i]);
235e6e505b9SAlexander Graf }
236e6e505b9SAlexander Graf 
mctl_setup_dram_clock(u32 clk,u32 mbus_clk)237e6e505b9SAlexander Graf static void mctl_setup_dram_clock(u32 clk, u32 mbus_clk)
238e6e505b9SAlexander Graf {
239e6e505b9SAlexander Graf 	u32 reg_val;
240e6e505b9SAlexander Graf 	struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
241e6e505b9SAlexander Graf 	u32 pll5p_clk, pll6x_clk;
242e6e505b9SAlexander Graf 	u32 pll5p_div, pll6x_div;
243e6e505b9SAlexander Graf 	u32 pll5p_rate, pll6x_rate;
244e6e505b9SAlexander Graf 
245e6e505b9SAlexander Graf 	/* setup DRAM PLL */
246e6e505b9SAlexander Graf 	reg_val = readl(&ccm->pll5_cfg);
247e6e505b9SAlexander Graf 	reg_val &= ~CCM_PLL5_CTRL_M_MASK;		/* set M to 0 (x1) */
248e6e505b9SAlexander Graf 	reg_val &= ~CCM_PLL5_CTRL_K_MASK;		/* set K to 0 (x1) */
249e6e505b9SAlexander Graf 	reg_val &= ~CCM_PLL5_CTRL_N_MASK;		/* set N to 0 (x0) */
250e6e505b9SAlexander Graf 	reg_val &= ~CCM_PLL5_CTRL_P_MASK;		/* set P to 0 (x1) */
251e6e505b9SAlexander Graf #ifdef CONFIG_OLD_SUNXI_KERNEL_COMPAT
252e6e505b9SAlexander Graf 	/* Old kernels are hardcoded to P=1 (divide by 2) */
253e6e505b9SAlexander Graf 	reg_val |= CCM_PLL5_CTRL_P(1);
254e6e505b9SAlexander Graf #endif
255e6e505b9SAlexander Graf 	if (clk >= 540 && clk < 552) {
256e6e505b9SAlexander Graf 		/* dram = 540MHz */
257e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
258e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
259e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(15));
260e6e505b9SAlexander Graf 	} else if (clk >= 512 && clk < 528) {
261e6e505b9SAlexander Graf 		/* dram = 512MHz */
262e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(3));
263e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(4));
264e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(16));
265e6e505b9SAlexander Graf 	} else if (clk >= 496 && clk < 504) {
266e6e505b9SAlexander Graf 		/* dram = 496MHz */
267e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(3));
268e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(2));
269e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(31));
270e6e505b9SAlexander Graf 	} else if (clk >= 468 && clk < 480) {
271e6e505b9SAlexander Graf 		/* dram = 468MHz */
272e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
273e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
274e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(13));
275e6e505b9SAlexander Graf 	} else if (clk >= 396 && clk < 408) {
276e6e505b9SAlexander Graf 		/* dram = 396MHz */
277e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
278e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(3));
279e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(11));
280e6e505b9SAlexander Graf 	} else 	{
281e6e505b9SAlexander Graf 		/* any other frequency that is a multiple of 24 */
282e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_M(CCM_PLL5_CTRL_M_X(2));
283e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_K(CCM_PLL5_CTRL_K_X(2));
284e6e505b9SAlexander Graf 		reg_val |= CCM_PLL5_CTRL_N(CCM_PLL5_CTRL_N_X(clk / 24));
285e6e505b9SAlexander Graf 	}
286e6e505b9SAlexander Graf 	reg_val &= ~CCM_PLL5_CTRL_VCO_GAIN;		/* PLL VCO Gain off */
287e6e505b9SAlexander Graf 	reg_val |= CCM_PLL5_CTRL_EN;			/* PLL On */
288e6e505b9SAlexander Graf 	writel(reg_val, &ccm->pll5_cfg);
289e6e505b9SAlexander Graf 	udelay(5500);
290e6e505b9SAlexander Graf 
291e6e505b9SAlexander Graf 	setbits_le32(&ccm->pll5_cfg, CCM_PLL5_CTRL_DDR_CLK);
292e6e505b9SAlexander Graf 
293e6e505b9SAlexander Graf #if defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN7I)
294e6e505b9SAlexander Graf 	/* reset GPS */
295e6e505b9SAlexander Graf 	clrbits_le32(&ccm->gps_clk_cfg, CCM_GPS_CTRL_RESET | CCM_GPS_CTRL_GATE);
296e6e505b9SAlexander Graf 	setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_GPS);
297e6e505b9SAlexander Graf 	udelay(1);
298e6e505b9SAlexander Graf 	clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_GPS);
299e6e505b9SAlexander Graf #endif
300e6e505b9SAlexander Graf 
301e6e505b9SAlexander Graf 	/* setup MBUS clock */
302e6e505b9SAlexander Graf 	if (!mbus_clk)
303e6e505b9SAlexander Graf 		mbus_clk = 300;
304e6e505b9SAlexander Graf 
305e6e505b9SAlexander Graf 	/* PLL5P and PLL6 are the potential clock sources for MBUS */
306e6e505b9SAlexander Graf 	pll6x_clk = clock_get_pll6() / 1000000;
307e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN7I
308e6e505b9SAlexander Graf 	pll6x_clk *= 2; /* sun7i uses PLL6*2, sun5i uses just PLL6 */
309e6e505b9SAlexander Graf #endif
310e6e505b9SAlexander Graf 	pll5p_clk = clock_get_pll5p() / 1000000;
311e6e505b9SAlexander Graf 	pll6x_div = DIV_ROUND_UP(pll6x_clk, mbus_clk);
312e6e505b9SAlexander Graf 	pll5p_div = DIV_ROUND_UP(pll5p_clk, mbus_clk);
313e6e505b9SAlexander Graf 	pll6x_rate = pll6x_clk / pll6x_div;
314e6e505b9SAlexander Graf 	pll5p_rate = pll5p_clk / pll5p_div;
315e6e505b9SAlexander Graf 
316e6e505b9SAlexander Graf 	if (pll6x_div <= 16 && pll6x_rate > pll5p_rate) {
317e6e505b9SAlexander Graf 		/* use PLL6 as the MBUS clock source */
318e6e505b9SAlexander Graf 		reg_val = CCM_MBUS_CTRL_GATE |
319e6e505b9SAlexander Graf 			  CCM_MBUS_CTRL_CLK_SRC(CCM_MBUS_CTRL_CLK_SRC_PLL6) |
320e6e505b9SAlexander Graf 			  CCM_MBUS_CTRL_N(CCM_MBUS_CTRL_N_X(1)) |
321e6e505b9SAlexander Graf 			  CCM_MBUS_CTRL_M(CCM_MBUS_CTRL_M_X(pll6x_div));
322e6e505b9SAlexander Graf 	} else if (pll5p_div <= 16) {
323e6e505b9SAlexander Graf 		/* use PLL5P as the MBUS clock source */
324e6e505b9SAlexander Graf 		reg_val = CCM_MBUS_CTRL_GATE |
325e6e505b9SAlexander Graf 			  CCM_MBUS_CTRL_CLK_SRC(CCM_MBUS_CTRL_CLK_SRC_PLL5) |
326e6e505b9SAlexander Graf 			  CCM_MBUS_CTRL_N(CCM_MBUS_CTRL_N_X(1)) |
327e6e505b9SAlexander Graf 			  CCM_MBUS_CTRL_M(CCM_MBUS_CTRL_M_X(pll5p_div));
328e6e505b9SAlexander Graf 	} else {
329e6e505b9SAlexander Graf 		panic("Bad mbus_clk\n");
330e6e505b9SAlexander Graf 	}
331e6e505b9SAlexander Graf 	writel(reg_val, &ccm->mbus_clk_cfg);
332e6e505b9SAlexander Graf 
333e6e505b9SAlexander Graf 	/*
334e6e505b9SAlexander Graf 	 * open DRAMC AHB & DLL register clock
335e6e505b9SAlexander Graf 	 * close it first
336e6e505b9SAlexander Graf 	 */
337e6e505b9SAlexander Graf #if defined(CONFIG_MACH_SUN5I) || defined(CONFIG_MACH_SUN7I)
338e6e505b9SAlexander Graf 	clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM | CCM_AHB_GATE_DLL);
339e6e505b9SAlexander Graf #else
340e6e505b9SAlexander Graf 	clrbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM);
341e6e505b9SAlexander Graf #endif
342e6e505b9SAlexander Graf 	udelay(22);
343e6e505b9SAlexander Graf 
344e6e505b9SAlexander Graf 	/* then open it */
345e6e505b9SAlexander Graf #if defined(CONFIG_MACH_SUN5I) || defined(CONFIG_MACH_SUN7I)
346e6e505b9SAlexander Graf 	setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM | CCM_AHB_GATE_DLL);
347e6e505b9SAlexander Graf #else
348e6e505b9SAlexander Graf 	setbits_le32(&ccm->ahb_gate0, CCM_AHB_GATE_SDRAM);
349e6e505b9SAlexander Graf #endif
350e6e505b9SAlexander Graf 	udelay(22);
351e6e505b9SAlexander Graf }
352e6e505b9SAlexander Graf 
353e6e505b9SAlexander Graf /*
354e6e505b9SAlexander Graf  * The data from rslrX and rdgrX registers (X=rank) is stored
355e6e505b9SAlexander Graf  * in a single 32-bit value using the following format:
356e6e505b9SAlexander Graf  *   bits [31:26] - DQS gating system latency for byte lane 3
357e6e505b9SAlexander Graf  *   bits [25:24] - DQS gating phase select for byte lane 3
358e6e505b9SAlexander Graf  *   bits [23:18] - DQS gating system latency for byte lane 2
359e6e505b9SAlexander Graf  *   bits [17:16] - DQS gating phase select for byte lane 2
360e6e505b9SAlexander Graf  *   bits [15:10] - DQS gating system latency for byte lane 1
361e6e505b9SAlexander Graf  *   bits [ 9:8 ] - DQS gating phase select for byte lane 1
362e6e505b9SAlexander Graf  *   bits [ 7:2 ] - DQS gating system latency for byte lane 0
363e6e505b9SAlexander Graf  *   bits [ 1:0 ] - DQS gating phase select for byte lane 0
364e6e505b9SAlexander Graf  */
mctl_set_dqs_gating_delay(int rank,u32 dqs_gating_delay)365e6e505b9SAlexander Graf static void mctl_set_dqs_gating_delay(int rank, u32 dqs_gating_delay)
366e6e505b9SAlexander Graf {
367e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
368e6e505b9SAlexander Graf 	u32 lane, number_of_lanes = mctl_get_number_of_lanes();
369e6e505b9SAlexander Graf 	/* rank0 gating system latency (3 bits per lane: cycles) */
370e6e505b9SAlexander Graf 	u32 slr = readl(rank == 0 ? &dram->rslr0 : &dram->rslr1);
371e6e505b9SAlexander Graf 	/* rank0 gating phase select (2 bits per lane: 90, 180, 270, 360) */
372e6e505b9SAlexander Graf 	u32 dgr = readl(rank == 0 ? &dram->rdgr0 : &dram->rdgr1);
373e6e505b9SAlexander Graf 	for (lane = 0; lane < number_of_lanes; lane++) {
374e6e505b9SAlexander Graf 		u32 tmp = dqs_gating_delay >> (lane * 8);
375e6e505b9SAlexander Graf 		slr &= ~(7 << (lane * 3));
376e6e505b9SAlexander Graf 		slr |= ((tmp >> 2) & 7) << (lane * 3);
377e6e505b9SAlexander Graf 		dgr &= ~(3 << (lane * 2));
378e6e505b9SAlexander Graf 		dgr |= (tmp & 3) << (lane * 2);
379e6e505b9SAlexander Graf 	}
380e6e505b9SAlexander Graf 	writel(slr, rank == 0 ? &dram->rslr0 : &dram->rslr1);
381e6e505b9SAlexander Graf 	writel(dgr, rank == 0 ? &dram->rdgr0 : &dram->rdgr1);
382e6e505b9SAlexander Graf }
383e6e505b9SAlexander Graf 
dramc_scan_readpipe(void)384e6e505b9SAlexander Graf static int dramc_scan_readpipe(void)
385e6e505b9SAlexander Graf {
386e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
387e6e505b9SAlexander Graf 	u32 reg_val;
388e6e505b9SAlexander Graf 
389e6e505b9SAlexander Graf 	/* data training trigger */
390e6e505b9SAlexander Graf 	clrbits_le32(&dram->csr, DRAM_CSR_FAILED);
391e6e505b9SAlexander Graf 	setbits_le32(&dram->ccr, DRAM_CCR_DATA_TRAINING);
392e6e505b9SAlexander Graf 
393e6e505b9SAlexander Graf 	/* check whether data training process has completed */
394e6e505b9SAlexander Graf 	await_bits_clear(&dram->ccr, DRAM_CCR_DATA_TRAINING);
395e6e505b9SAlexander Graf 
396e6e505b9SAlexander Graf 	/* check data training result */
397e6e505b9SAlexander Graf 	reg_val = readl(&dram->csr);
398e6e505b9SAlexander Graf 	if (reg_val & DRAM_CSR_FAILED)
399e6e505b9SAlexander Graf 		return -1;
400e6e505b9SAlexander Graf 
401e6e505b9SAlexander Graf 	return 0;
402e6e505b9SAlexander Graf }
403e6e505b9SAlexander Graf 
dramc_clock_output_en(u32 on)404e6e505b9SAlexander Graf static void dramc_clock_output_en(u32 on)
405e6e505b9SAlexander Graf {
406e6e505b9SAlexander Graf #if defined(CONFIG_MACH_SUN5I) || defined(CONFIG_MACH_SUN7I)
407e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
408e6e505b9SAlexander Graf 
409e6e505b9SAlexander Graf 	if (on)
410e6e505b9SAlexander Graf 		setbits_le32(&dram->mcr, DRAM_MCR_DCLK_OUT);
411e6e505b9SAlexander Graf 	else
412e6e505b9SAlexander Graf 		clrbits_le32(&dram->mcr, DRAM_MCR_DCLK_OUT);
413e6e505b9SAlexander Graf #endif
414e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN4I
415e6e505b9SAlexander Graf 	struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
416e6e505b9SAlexander Graf 	if (on)
417e6e505b9SAlexander Graf 		setbits_le32(&ccm->dram_clk_gate, CCM_DRAM_CTRL_DCLK_OUT);
418e6e505b9SAlexander Graf 	else
419e6e505b9SAlexander Graf 		clrbits_le32(&ccm->dram_clk_gate, CCM_DRAM_CTRL_DCLK_OUT);
420e6e505b9SAlexander Graf #endif
421e6e505b9SAlexander Graf }
422e6e505b9SAlexander Graf 
423e6e505b9SAlexander Graf /* tRFC in nanoseconds for different densities (from the DDR3 spec) */
424e6e505b9SAlexander Graf static const u16 tRFC_DDR3_table[6] = {
425e6e505b9SAlexander Graf 	/* 256Mb    512Mb    1Gb      2Gb      4Gb      8Gb */
426e6e505b9SAlexander Graf 	   90,      90,      110,     160,     300,     350
427e6e505b9SAlexander Graf };
428e6e505b9SAlexander Graf 
dramc_set_autorefresh_cycle(u32 clk,u32 density)429e6e505b9SAlexander Graf static void dramc_set_autorefresh_cycle(u32 clk, u32 density)
430e6e505b9SAlexander Graf {
431e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
432e6e505b9SAlexander Graf 	u32 tRFC, tREFI;
433e6e505b9SAlexander Graf 
434e6e505b9SAlexander Graf 	tRFC = (tRFC_DDR3_table[density] * clk + 999) / 1000;
435e6e505b9SAlexander Graf 	tREFI = (7987 * clk) >> 10;	/* <= 7.8us */
436e6e505b9SAlexander Graf 
437e6e505b9SAlexander Graf 	writel(DRAM_DRR_TREFI(tREFI) | DRAM_DRR_TRFC(tRFC), &dram->drr);
438e6e505b9SAlexander Graf }
439e6e505b9SAlexander Graf 
440e6e505b9SAlexander Graf /* Calculate the value for A11, A10, A9 bits in MR0 (write recovery) */
ddr3_write_recovery(u32 clk)441e6e505b9SAlexander Graf static u32 ddr3_write_recovery(u32 clk)
442e6e505b9SAlexander Graf {
443e6e505b9SAlexander Graf 	u32 twr_ns = 15; /* DDR3 spec says that it is 15ns for all speed bins */
444e6e505b9SAlexander Graf 	u32 twr_ck = (twr_ns * clk + 999) / 1000;
445e6e505b9SAlexander Graf 	if (twr_ck < 5)
446e6e505b9SAlexander Graf 		return 1;
447e6e505b9SAlexander Graf 	else if (twr_ck <= 8)
448e6e505b9SAlexander Graf 		return twr_ck - 4;
449e6e505b9SAlexander Graf 	else if (twr_ck <= 10)
450e6e505b9SAlexander Graf 		return 5;
451e6e505b9SAlexander Graf 	else
452e6e505b9SAlexander Graf 		return 6;
453e6e505b9SAlexander Graf }
454e6e505b9SAlexander Graf 
455e6e505b9SAlexander Graf /*
456e6e505b9SAlexander Graf  * If the dram->ppwrsctl (SDR_DPCR) register has the lowest bit set to 1, this
457e6e505b9SAlexander Graf  * means that DRAM is currently in self-refresh mode and retaining the old
458e6e505b9SAlexander Graf  * data. Since we have no idea what to do in this situation yet, just set this
459e6e505b9SAlexander Graf  * register to 0 and initialize DRAM in the same way as on any normal reboot
460e6e505b9SAlexander Graf  * (discarding whatever was stored there).
461e6e505b9SAlexander Graf  *
462e6e505b9SAlexander Graf  * Note: on sun7i hardware, the highest 16 bits need to be set to 0x1651 magic
463e6e505b9SAlexander Graf  * value for this write operation to have any effect. On sun5i hadware this
464e6e505b9SAlexander Graf  * magic value is not necessary. And on sun4i hardware the writes to this
465e6e505b9SAlexander Graf  * register seem to have no effect at all.
466e6e505b9SAlexander Graf  */
mctl_disable_power_save(void)467e6e505b9SAlexander Graf static void mctl_disable_power_save(void)
468e6e505b9SAlexander Graf {
469e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
470e6e505b9SAlexander Graf 	writel(0x16510000, &dram->ppwrsctl);
471e6e505b9SAlexander Graf }
472e6e505b9SAlexander Graf 
473e6e505b9SAlexander Graf /*
474e6e505b9SAlexander Graf  * After the DRAM is powered up or reset, the DDR3 spec requires to wait at
475e6e505b9SAlexander Graf  * least 500 us before driving the CKE pin (Clock Enable) high. The dram->idct
476e6e505b9SAlexander Graf  * (SDR_IDCR) register appears to configure this delay, which gets applied
477e6e505b9SAlexander Graf  * right at the time when the DRAM initialization is activated in the
478e6e505b9SAlexander Graf  * 'mctl_ddr3_initialize' function.
479e6e505b9SAlexander Graf  */
mctl_set_cke_delay(void)480e6e505b9SAlexander Graf static void mctl_set_cke_delay(void)
481e6e505b9SAlexander Graf {
482e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
483e6e505b9SAlexander Graf 
484e6e505b9SAlexander Graf 	/* The CKE delay is represented in DRAM clock cycles, multiplied by N
485e6e505b9SAlexander Graf 	 * (where N=2 for sun4i/sun5i and N=3 for sun7i). Here it is set to
486e6e505b9SAlexander Graf 	 * the maximum possible value 0x1ffff, just like in the Allwinner's
487e6e505b9SAlexander Graf 	 * boot0 bootloader. The resulting delay value is somewhere between
488e6e505b9SAlexander Graf 	 * ~0.4 ms (sun5i with 648 MHz DRAM clock speed) and ~1.1 ms (sun7i
489e6e505b9SAlexander Graf 	 * with 360 MHz DRAM clock speed). */
490e6e505b9SAlexander Graf 	setbits_le32(&dram->idcr, 0x1ffff);
491e6e505b9SAlexander Graf }
492e6e505b9SAlexander Graf 
493e6e505b9SAlexander Graf /*
494e6e505b9SAlexander Graf  * This triggers the DRAM initialization. It performs sending the mode registers
495e6e505b9SAlexander Graf  * to the DRAM among other things. Very likely the ZQCL command is also getting
496e6e505b9SAlexander Graf  * executed (to do the initial impedance calibration on the DRAM side of the
497e6e505b9SAlexander Graf  * wire). The memory controller and the PHY must be already configured before
498e6e505b9SAlexander Graf  * calling this function.
499e6e505b9SAlexander Graf  */
mctl_ddr3_initialize(void)500e6e505b9SAlexander Graf static void mctl_ddr3_initialize(void)
501e6e505b9SAlexander Graf {
502e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
503e6e505b9SAlexander Graf 	setbits_le32(&dram->ccr, DRAM_CCR_INIT);
504e6e505b9SAlexander Graf 	await_bits_clear(&dram->ccr, DRAM_CCR_INIT);
505e6e505b9SAlexander Graf }
506e6e505b9SAlexander Graf 
507e6e505b9SAlexander Graf /*
508e6e505b9SAlexander Graf  * Perform impedance calibration on the DRAM controller side of the wire.
509e6e505b9SAlexander Graf  */
mctl_set_impedance(u32 zq,bool odt_en)510e6e505b9SAlexander Graf static void mctl_set_impedance(u32 zq, bool odt_en)
511e6e505b9SAlexander Graf {
512e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
513e6e505b9SAlexander Graf 	u32 reg_val;
514e6e505b9SAlexander Graf 	u32 zprog = zq & 0xFF, zdata = (zq >> 8) & 0xFFFFF;
515e6e505b9SAlexander Graf 
516e6e505b9SAlexander Graf #ifndef CONFIG_MACH_SUN7I
517e6e505b9SAlexander Graf 	/* Appears that some kind of automatically initiated default
518e6e505b9SAlexander Graf 	 * ZQ calibration is already in progress at this point on sun4i/sun5i
519e6e505b9SAlexander Graf 	 * hardware, but not on sun7i. So it is reasonable to wait for its
520e6e505b9SAlexander Graf 	 * completion before doing anything else. */
521e6e505b9SAlexander Graf 	await_bits_set(&dram->zqsr, DRAM_ZQSR_ZDONE);
522e6e505b9SAlexander Graf #endif
523e6e505b9SAlexander Graf 
524e6e505b9SAlexander Graf 	/* ZQ calibration is not really useful unless ODT is enabled */
525e6e505b9SAlexander Graf 	if (!odt_en)
526e6e505b9SAlexander Graf 		return;
527e6e505b9SAlexander Graf 
528e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN7I
529e6e505b9SAlexander Graf 	/* Enabling ODT in SDR_IOCR on sun7i hardware results in a deadlock
530e6e505b9SAlexander Graf 	 * unless bit 24 is set in SDR_ZQCR1. Not much is known about the
531e6e505b9SAlexander Graf 	 * SDR_ZQCR1 register, but there are hints indicating that it might
532e6e505b9SAlexander Graf 	 * be related to periodic impedance re-calibration. This particular
533e6e505b9SAlexander Graf 	 * magic value is borrowed from the Allwinner boot0 bootloader, and
534e6e505b9SAlexander Graf 	 * using it helps to avoid troubles */
535e6e505b9SAlexander Graf 	writel((1 << 24) | (1 << 1), &dram->zqcr1);
536e6e505b9SAlexander Graf #endif
537e6e505b9SAlexander Graf 
538e6e505b9SAlexander Graf 	/* Needed at least for sun5i, because it does not self clear there */
539e6e505b9SAlexander Graf 	clrbits_le32(&dram->zqcr0, DRAM_ZQCR0_ZCAL);
540e6e505b9SAlexander Graf 
541e6e505b9SAlexander Graf 	if (zdata) {
542e6e505b9SAlexander Graf 		/* Set the user supplied impedance data */
543e6e505b9SAlexander Graf 		reg_val = DRAM_ZQCR0_ZDEN | zdata;
544e6e505b9SAlexander Graf 		writel(reg_val, &dram->zqcr0);
545e6e505b9SAlexander Graf 		/* no need to wait, this takes effect immediately */
546e6e505b9SAlexander Graf 	} else {
547e6e505b9SAlexander Graf 		/* Do the calibration using the external resistor */
548e6e505b9SAlexander Graf 		reg_val = DRAM_ZQCR0_ZCAL | DRAM_ZQCR0_IMP_DIV(zprog);
549e6e505b9SAlexander Graf 		writel(reg_val, &dram->zqcr0);
550e6e505b9SAlexander Graf 		/* Wait for the new impedance configuration to settle */
551e6e505b9SAlexander Graf 		await_bits_set(&dram->zqsr, DRAM_ZQSR_ZDONE);
552e6e505b9SAlexander Graf 	}
553e6e505b9SAlexander Graf 
554e6e505b9SAlexander Graf 	/* Needed at least for sun5i, because it does not self clear there */
555e6e505b9SAlexander Graf 	clrbits_le32(&dram->zqcr0, DRAM_ZQCR0_ZCAL);
556e6e505b9SAlexander Graf 
557e6e505b9SAlexander Graf 	/* Set I/O configure register */
558e6e505b9SAlexander Graf 	writel(DRAM_IOCR_ODT_EN, &dram->iocr);
559e6e505b9SAlexander Graf }
560e6e505b9SAlexander Graf 
dramc_init_helper(struct dram_para * para)561e6e505b9SAlexander Graf static unsigned long dramc_init_helper(struct dram_para *para)
562e6e505b9SAlexander Graf {
563e6e505b9SAlexander Graf 	struct sunxi_dram_reg *dram = (struct sunxi_dram_reg *)SUNXI_DRAMC_BASE;
564e6e505b9SAlexander Graf 	u32 reg_val;
565e6e505b9SAlexander Graf 	u32 density;
566e6e505b9SAlexander Graf 	int ret_val;
567e6e505b9SAlexander Graf 
568e6e505b9SAlexander Graf 	/*
569e6e505b9SAlexander Graf 	 * only single rank DDR3 is supported by this code even though the
570e6e505b9SAlexander Graf 	 * hardware can theoretically support DDR2 and up to two ranks
571e6e505b9SAlexander Graf 	 */
572e6e505b9SAlexander Graf 	if (para->type != DRAM_MEMORY_TYPE_DDR3 || para->rank_num != 1)
573e6e505b9SAlexander Graf 		return 0;
574e6e505b9SAlexander Graf 
575e6e505b9SAlexander Graf 	/* setup DRAM relative clock */
576e6e505b9SAlexander Graf 	mctl_setup_dram_clock(para->clock, para->mbus_clock);
577e6e505b9SAlexander Graf 
578e6e505b9SAlexander Graf 	/* Disable any pad power save control */
579e6e505b9SAlexander Graf 	mctl_disable_power_save();
580e6e505b9SAlexander Graf 
581e6e505b9SAlexander Graf 	mctl_set_drive();
582e6e505b9SAlexander Graf 
583e6e505b9SAlexander Graf 	/* dram clock off */
584e6e505b9SAlexander Graf 	dramc_clock_output_en(0);
585e6e505b9SAlexander Graf 
586e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN4I
587e6e505b9SAlexander Graf 	/* select dram controller 1 */
588e6e505b9SAlexander Graf 	writel(DRAM_CSEL_MAGIC, &dram->csel);
589e6e505b9SAlexander Graf #endif
590e6e505b9SAlexander Graf 
591e6e505b9SAlexander Graf 	mctl_itm_disable();
592e6e505b9SAlexander Graf 	mctl_enable_dll0(para->tpr3);
593e6e505b9SAlexander Graf 
594e6e505b9SAlexander Graf 	/* configure external DRAM */
595e6e505b9SAlexander Graf 	reg_val = DRAM_DCR_TYPE_DDR3;
596e6e505b9SAlexander Graf 	reg_val |= DRAM_DCR_IO_WIDTH(para->io_width >> 3);
597e6e505b9SAlexander Graf 
598e6e505b9SAlexander Graf 	if (para->density == 256)
599e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_256M;
600e6e505b9SAlexander Graf 	else if (para->density == 512)
601e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_512M;
602e6e505b9SAlexander Graf 	else if (para->density == 1024)
603e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_1024M;
604e6e505b9SAlexander Graf 	else if (para->density == 2048)
605e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_2048M;
606e6e505b9SAlexander Graf 	else if (para->density == 4096)
607e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_4096M;
608e6e505b9SAlexander Graf 	else if (para->density == 8192)
609e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_8192M;
610e6e505b9SAlexander Graf 	else
611e6e505b9SAlexander Graf 		density = DRAM_DCR_CHIP_DENSITY_256M;
612e6e505b9SAlexander Graf 
613e6e505b9SAlexander Graf 	reg_val |= DRAM_DCR_CHIP_DENSITY(density);
614e6e505b9SAlexander Graf 	reg_val |= DRAM_DCR_BUS_WIDTH((para->bus_width >> 3) - 1);
615e6e505b9SAlexander Graf 	reg_val |= DRAM_DCR_RANK_SEL(para->rank_num - 1);
616e6e505b9SAlexander Graf 	reg_val |= DRAM_DCR_CMD_RANK_ALL;
617e6e505b9SAlexander Graf 	reg_val |= DRAM_DCR_MODE(DRAM_DCR_MODE_INTERLEAVE);
618e6e505b9SAlexander Graf 	writel(reg_val, &dram->dcr);
619e6e505b9SAlexander Graf 
620e6e505b9SAlexander Graf 	dramc_clock_output_en(1);
621e6e505b9SAlexander Graf 
622e6e505b9SAlexander Graf 	mctl_set_impedance(para->zq, para->odt_en);
623e6e505b9SAlexander Graf 
624e6e505b9SAlexander Graf 	mctl_set_cke_delay();
625e6e505b9SAlexander Graf 
626e6e505b9SAlexander Graf 	mctl_ddr3_reset();
627e6e505b9SAlexander Graf 
628e6e505b9SAlexander Graf 	udelay(1);
629e6e505b9SAlexander Graf 
630e6e505b9SAlexander Graf 	await_bits_clear(&dram->ccr, DRAM_CCR_INIT);
631e6e505b9SAlexander Graf 
632e6e505b9SAlexander Graf 	mctl_enable_dllx(para->tpr3);
633e6e505b9SAlexander Graf 
634e6e505b9SAlexander Graf 	/* set refresh period */
635e6e505b9SAlexander Graf 	dramc_set_autorefresh_cycle(para->clock, density);
636e6e505b9SAlexander Graf 
637e6e505b9SAlexander Graf 	/* set timing parameters */
638e6e505b9SAlexander Graf 	writel(para->tpr0, &dram->tpr0);
639e6e505b9SAlexander Graf 	writel(para->tpr1, &dram->tpr1);
640e6e505b9SAlexander Graf 	writel(para->tpr2, &dram->tpr2);
641e6e505b9SAlexander Graf 
642e6e505b9SAlexander Graf 	reg_val = DRAM_MR_BURST_LENGTH(0x0);
643e6e505b9SAlexander Graf #if (defined(CONFIG_MACH_SUN5I) || defined(CONFIG_MACH_SUN7I))
644e6e505b9SAlexander Graf 	reg_val |= DRAM_MR_POWER_DOWN;
645e6e505b9SAlexander Graf #endif
646e6e505b9SAlexander Graf 	reg_val |= DRAM_MR_CAS_LAT(para->cas - 4);
647e6e505b9SAlexander Graf 	reg_val |= DRAM_MR_WRITE_RECOVERY(ddr3_write_recovery(para->clock));
648e6e505b9SAlexander Graf 	writel(reg_val, &dram->mr);
649e6e505b9SAlexander Graf 
650e6e505b9SAlexander Graf 	writel(para->emr1, &dram->emr);
651e6e505b9SAlexander Graf 	writel(para->emr2, &dram->emr2);
652e6e505b9SAlexander Graf 	writel(para->emr3, &dram->emr3);
653e6e505b9SAlexander Graf 
654e6e505b9SAlexander Graf 	/* disable drift compensation and set passive DQS window mode */
655e6e505b9SAlexander Graf 	clrsetbits_le32(&dram->ccr, DRAM_CCR_DQS_DRIFT_COMP, DRAM_CCR_DQS_GATE);
656e6e505b9SAlexander Graf 
657e6e505b9SAlexander Graf #ifdef CONFIG_MACH_SUN7I
658e6e505b9SAlexander Graf 	/* Command rate timing mode 2T & 1T */
659e6e505b9SAlexander Graf 	if (para->tpr4 & 0x1)
660e6e505b9SAlexander Graf 		setbits_le32(&dram->ccr, DRAM_CCR_COMMAND_RATE_1T);
661e6e505b9SAlexander Graf #endif
662e6e505b9SAlexander Graf 	/* initialize external DRAM */
663e6e505b9SAlexander Graf 	mctl_ddr3_initialize();
664e6e505b9SAlexander Graf 
665e6e505b9SAlexander Graf 	/* scan read pipe value */
666e6e505b9SAlexander Graf 	mctl_itm_enable();
667e6e505b9SAlexander Graf 
668e6e505b9SAlexander Graf 	/* Hardware DQS gate training */
669e6e505b9SAlexander Graf 	ret_val = dramc_scan_readpipe();
670e6e505b9SAlexander Graf 
671e6e505b9SAlexander Graf 	if (ret_val < 0)
672e6e505b9SAlexander Graf 		return 0;
673e6e505b9SAlexander Graf 
674e6e505b9SAlexander Graf 	/* allow to override the DQS training results with a custom delay */
675e6e505b9SAlexander Graf 	if (para->dqs_gating_delay)
676e6e505b9SAlexander Graf 		mctl_set_dqs_gating_delay(0, para->dqs_gating_delay);
677e6e505b9SAlexander Graf 
678e6e505b9SAlexander Graf 	/* set the DQS gating window type */
679e6e505b9SAlexander Graf 	if (para->active_windowing)
680e6e505b9SAlexander Graf 		clrbits_le32(&dram->ccr, DRAM_CCR_DQS_GATE);
681e6e505b9SAlexander Graf 	else
682e6e505b9SAlexander Graf 		setbits_le32(&dram->ccr, DRAM_CCR_DQS_GATE);
683e6e505b9SAlexander Graf 
684e6e505b9SAlexander Graf 	mctl_itm_reset();
685e6e505b9SAlexander Graf 
686e6e505b9SAlexander Graf 	/* configure all host port */
687e6e505b9SAlexander Graf 	mctl_configure_hostport();
688e6e505b9SAlexander Graf 
689e6e505b9SAlexander Graf 	return get_ram_size((long *)PHYS_SDRAM_0, PHYS_SDRAM_0_SIZE);
690e6e505b9SAlexander Graf }
691e6e505b9SAlexander Graf 
dramc_init(struct dram_para * para)692e6e505b9SAlexander Graf unsigned long dramc_init(struct dram_para *para)
693e6e505b9SAlexander Graf {
694e6e505b9SAlexander Graf 	unsigned long dram_size, actual_density;
695e6e505b9SAlexander Graf 
696e6e505b9SAlexander Graf 	/* If the dram configuration is not provided, use a default */
697e6e505b9SAlexander Graf 	if (!para)
698e6e505b9SAlexander Graf 		return 0;
699e6e505b9SAlexander Graf 
700e6e505b9SAlexander Graf 	/* if everything is known, then autodetection is not necessary */
701e6e505b9SAlexander Graf 	if (para->io_width && para->bus_width && para->density)
702e6e505b9SAlexander Graf 		return dramc_init_helper(para);
703e6e505b9SAlexander Graf 
704e6e505b9SAlexander Graf 	/* try to autodetect the DRAM bus width and density */
705e6e505b9SAlexander Graf 	para->io_width  = 16;
706e6e505b9SAlexander Graf 	para->bus_width = 32;
707e6e505b9SAlexander Graf #if defined(CONFIG_MACH_SUN4I) || defined(CONFIG_MACH_SUN5I)
708e6e505b9SAlexander Graf 	/* only A0-A14 address lines on A10/A13, limiting max density to 4096 */
709e6e505b9SAlexander Graf 	para->density = 4096;
710e6e505b9SAlexander Graf #else
711e6e505b9SAlexander Graf 	/* all A0-A15 address lines on A20, which allow density 8192 */
712e6e505b9SAlexander Graf 	para->density = 8192;
713e6e505b9SAlexander Graf #endif
714e6e505b9SAlexander Graf 
715e6e505b9SAlexander Graf 	dram_size = dramc_init_helper(para);
716e6e505b9SAlexander Graf 	if (!dram_size) {
717e6e505b9SAlexander Graf 		/* if 32-bit bus width failed, try 16-bit bus width instead */
718e6e505b9SAlexander Graf 		para->bus_width = 16;
719e6e505b9SAlexander Graf 		dram_size = dramc_init_helper(para);
720e6e505b9SAlexander Graf 		if (!dram_size) {
721e6e505b9SAlexander Graf 			/* if 16-bit bus width also failed, then bail out */
722e6e505b9SAlexander Graf 			return dram_size;
723e6e505b9SAlexander Graf 		}
724e6e505b9SAlexander Graf 	}
725e6e505b9SAlexander Graf 
726e6e505b9SAlexander Graf 	/* check if we need to adjust the density */
727e6e505b9SAlexander Graf 	actual_density = (dram_size >> 17) * para->io_width / para->bus_width;
728e6e505b9SAlexander Graf 
729e6e505b9SAlexander Graf 	if (actual_density != para->density) {
730e6e505b9SAlexander Graf 		/* update the density and re-initialize DRAM again */
731e6e505b9SAlexander Graf 		para->density = actual_density;
732e6e505b9SAlexander Graf 		dram_size = dramc_init_helper(para);
733e6e505b9SAlexander Graf 	}
734e6e505b9SAlexander Graf 
735e6e505b9SAlexander Graf 	return dram_size;
736e6e505b9SAlexander Graf }
737