xref: /arm-trusted-firmware/plat/hisilicon/hikey/hikey_ddr.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <errno.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <arch_helpers.h>
11*91f16700Schasinglulu #include <common/debug.h>
12*91f16700Schasinglulu #include <drivers/arm/sp804_delay_timer.h>
13*91f16700Schasinglulu #include <lib/mmio.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #include <hi6220.h>
16*91f16700Schasinglulu #include <hi6553.h>
17*91f16700Schasinglulu #include <hisi_sram_map.h>
18*91f16700Schasinglulu #include "hikey_private.h"
19*91f16700Schasinglulu 
20*91f16700Schasinglulu static void init_pll(void)
21*91f16700Schasinglulu {
22*91f16700Schasinglulu 	unsigned int data;
23*91f16700Schasinglulu 
24*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x000));
25*91f16700Schasinglulu 	data |= 0x1;
26*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x000), data);
27*91f16700Schasinglulu 	do {
28*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x000));
29*91f16700Schasinglulu 	} while (!(data & (1 << 28)));
30*91f16700Schasinglulu 
31*91f16700Schasinglulu 	data = mmio_read_32((0xf7800000 + 0x000));
32*91f16700Schasinglulu 	data &= ~0x007;
33*91f16700Schasinglulu 	data |= 0x004;
34*91f16700Schasinglulu 	mmio_write_32((0xf7800000 + 0x000), data);
35*91f16700Schasinglulu 	do {
36*91f16700Schasinglulu 		data = mmio_read_32((0xf7800000 + 0x014));
37*91f16700Schasinglulu 		data &= 0x007;
38*91f16700Schasinglulu 	} while (data != 0x004);
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
41*91f16700Schasinglulu 	dsb();
42*91f16700Schasinglulu 	isb();
43*91f16700Schasinglulu 	udelay(10);
44*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
45*91f16700Schasinglulu 	dsb();
46*91f16700Schasinglulu 	isb();
47*91f16700Schasinglulu 	udelay(10);
48*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
49*91f16700Schasinglulu 	dsb();
50*91f16700Schasinglulu 	isb();
51*91f16700Schasinglulu 	udelay(10);
52*91f16700Schasinglulu 	mmio_write_32(0xf7032000 + 0x02c, 0x5110103e);
53*91f16700Schasinglulu 	dsb();
54*91f16700Schasinglulu 	isb();
55*91f16700Schasinglulu 	udelay(10);
56*91f16700Schasinglulu 	data = mmio_read_32(0xf7032000 + 0x050);
57*91f16700Schasinglulu 	data |= 1 << 28;
58*91f16700Schasinglulu 	mmio_write_32(0xf7032000 + 0x050, data);
59*91f16700Schasinglulu 	dsb();
60*91f16700Schasinglulu 	isb();
61*91f16700Schasinglulu 	udelay(10);
62*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101);
63*91f16700Schasinglulu 	dsb();
64*91f16700Schasinglulu 	isb();
65*91f16700Schasinglulu 	udelay(10);
66*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001);
67*91f16700Schasinglulu 	dsb();
68*91f16700Schasinglulu 	isb();
69*91f16700Schasinglulu 	udelay(10);
70*91f16700Schasinglulu 	mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201);
71*91f16700Schasinglulu 	dsb();
72*91f16700Schasinglulu 	isb();
73*91f16700Schasinglulu 	udelay(10);
74*91f16700Schasinglulu }
75*91f16700Schasinglulu 
76*91f16700Schasinglulu static void init_freq(void)
77*91f16700Schasinglulu {
78*91f16700Schasinglulu 	unsigned int data, tmp;
79*91f16700Schasinglulu 	unsigned int cpuext_cfg, ddr_cfg;
80*91f16700Schasinglulu 
81*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x374), 0x4a);
82*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x368), 0xda);
83*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x36c), 0x01);
84*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x370), 0x01);
85*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x360), 0x60);
86*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x364), 0x60);
87*91f16700Schasinglulu 
88*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x114), 0x1000);
89*91f16700Schasinglulu 
90*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x110));
91*91f16700Schasinglulu 	data |= (3 << 12);
92*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x110), data);
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x110));
95*91f16700Schasinglulu 	data |= (1 << 4);
96*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x110), data);
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 
99*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x110));
100*91f16700Schasinglulu 	data &= ~0x7;
101*91f16700Schasinglulu 	data |= 0x5;
102*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x110), data);
103*91f16700Schasinglulu 	dsb();
104*91f16700Schasinglulu 	mdelay(10);
105*91f16700Schasinglulu 
106*91f16700Schasinglulu 
107*91f16700Schasinglulu 	do {
108*91f16700Schasinglulu 		data = mmio_read_32((0xf6504000 + 0x008));
109*91f16700Schasinglulu 		data &= (3 << 20);
110*91f16700Schasinglulu 	} while (data != (3 << 20));
111*91f16700Schasinglulu 	dsb();
112*91f16700Schasinglulu 	mdelay(10);
113*91f16700Schasinglulu 
114*91f16700Schasinglulu 
115*91f16700Schasinglulu 	data = mmio_read_32((0xf6504000 + 0x054));
116*91f16700Schasinglulu 	data &= ~((1 << 0) | (1 << 11));
117*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x054), data);
118*91f16700Schasinglulu 	mdelay(10);
119*91f16700Schasinglulu 
120*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
121*91f16700Schasinglulu 	data &= ~(3 << 8);
122*91f16700Schasinglulu 	data |= (1 << 8);
123*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
124*91f16700Schasinglulu 
125*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x100));
126*91f16700Schasinglulu 	data |= (1 << 0);
127*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x100), data);
128*91f16700Schasinglulu 	dsb();
129*91f16700Schasinglulu 
130*91f16700Schasinglulu 	do {
131*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x100));
132*91f16700Schasinglulu 		data &= (1 << 2);
133*91f16700Schasinglulu 	} while (data != (1 << 2));
134*91f16700Schasinglulu 
135*91f16700Schasinglulu 	data = mmio_read_32((0xf6504000 + 0x06c));
136*91f16700Schasinglulu 	data &= ~0xffff;
137*91f16700Schasinglulu 	data |= 0x56;
138*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x06c), data);
139*91f16700Schasinglulu 
140*91f16700Schasinglulu 	data = mmio_read_32((0xf6504000 + 0x06c));
141*91f16700Schasinglulu 	data &= ~(0xffffffu << 8);
142*91f16700Schasinglulu 	data |= 0xc7a << 8;
143*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x06c), data);
144*91f16700Schasinglulu 
145*91f16700Schasinglulu 	data = mmio_read_32((0xf6504000 + 0x058));
146*91f16700Schasinglulu 	data &= ((1 << 13) - 1);
147*91f16700Schasinglulu 	data |= 0xccb;
148*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x058), data);
149*91f16700Schasinglulu 
150*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x060), 0x1fff);
151*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x064), 0x1ffffff);
152*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x068), 0x7fffffff);
153*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x05c), 0x1);
154*91f16700Schasinglulu 
155*91f16700Schasinglulu 	data = mmio_read_32((0xf6504000 + 0x054));
156*91f16700Schasinglulu 	data &= ~(0xf << 12);
157*91f16700Schasinglulu 	data |= 1 << 12;
158*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x054), data);
159*91f16700Schasinglulu 	dsb();
160*91f16700Schasinglulu 
161*91f16700Schasinglulu 
162*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x000));
163*91f16700Schasinglulu 	data &= ~(1 << 0);
164*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x000), data);
165*91f16700Schasinglulu 
166*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x004), 0x5110207d);
167*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x134), 0x10000005);
168*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x134));
169*91f16700Schasinglulu 
170*91f16700Schasinglulu 
171*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x000));
172*91f16700Schasinglulu 	data |= (1 << 0);
173*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x000), data);
174*91f16700Schasinglulu 
175*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x368), 0x100da);
176*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x378));
177*91f16700Schasinglulu 	data &= ~((1 << 7) - 1);
178*91f16700Schasinglulu 	data |= 0x6b;
179*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x378), data);
180*91f16700Schasinglulu 	dsb();
181*91f16700Schasinglulu 	do {
182*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x378));
183*91f16700Schasinglulu 		tmp = data & 0x7f;
184*91f16700Schasinglulu 		data = (data & (0x7f << 8)) >> 8;
185*91f16700Schasinglulu 		if (data != tmp)
186*91f16700Schasinglulu 			continue;
187*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x37c));
188*91f16700Schasinglulu 	} while (!(data & 1));
189*91f16700Schasinglulu 
190*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
191*91f16700Schasinglulu 	data &= ~((3 << 0) |
192*91f16700Schasinglulu 			(3 << 8));
193*91f16700Schasinglulu 	cpuext_cfg = 1;
194*91f16700Schasinglulu 	ddr_cfg = 1;
195*91f16700Schasinglulu 	data |= cpuext_cfg | (ddr_cfg << 8);
196*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
197*91f16700Schasinglulu 	dsb();
198*91f16700Schasinglulu 
199*91f16700Schasinglulu 	do {
200*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x104));
201*91f16700Schasinglulu 		tmp = (data & (3 << 16)) >> 16;
202*91f16700Schasinglulu 		if (cpuext_cfg != tmp)
203*91f16700Schasinglulu 			continue;
204*91f16700Schasinglulu 		tmp = (data & (3 << 24)) >> 24;
205*91f16700Schasinglulu 		if (ddr_cfg != tmp)
206*91f16700Schasinglulu 			continue;
207*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x000));
208*91f16700Schasinglulu 		data &= 1 << 28;
209*91f16700Schasinglulu 	} while (!data);
210*91f16700Schasinglulu 
211*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x100));
212*91f16700Schasinglulu 	data &= ~(1 << 0);
213*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x100), data);
214*91f16700Schasinglulu 	dsb();
215*91f16700Schasinglulu 	do {
216*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x100));
217*91f16700Schasinglulu 		data &= (1 << 1);
218*91f16700Schasinglulu 	} while (data != (1 << 1));
219*91f16700Schasinglulu 	mdelay(1000);
220*91f16700Schasinglulu 
221*91f16700Schasinglulu 	data = mmio_read_32((0xf6504000 + 0x054));
222*91f16700Schasinglulu 	data &= ~(1 << 28);
223*91f16700Schasinglulu 	mmio_write_32((0xf6504000 + 0x054), data);
224*91f16700Schasinglulu 	dsb();
225*91f16700Schasinglulu 
226*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x110));
227*91f16700Schasinglulu 	data &= ~((1 << 4) |
228*91f16700Schasinglulu 			(3 << 12));
229*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x110), data);
230*91f16700Schasinglulu }
231*91f16700Schasinglulu 
232*91f16700Schasinglulu int cat_533mhz_800mhz(void)
233*91f16700Schasinglulu {
234*91f16700Schasinglulu 	unsigned int data, i;
235*91f16700Schasinglulu 	unsigned int bdl[5];
236*91f16700Schasinglulu 
237*91f16700Schasinglulu 
238*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x1c8));
239*91f16700Schasinglulu 	data &= 0xfffff0f0;
240*91f16700Schasinglulu 	data |= 0x100f01;
241*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1c8), data);
242*91f16700Schasinglulu 
243*91f16700Schasinglulu 	for (i = 0; i < 0x20; i++) {
244*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
245*91f16700Schasinglulu 		data = (i << 0x10) + i;
246*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x140), data);
247*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x144), data);
248*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x148), data);
249*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x14c), data);
250*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x150), data);
251*91f16700Schasinglulu 
252*91f16700Schasinglulu 
253*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x070));
254*91f16700Schasinglulu 		data |= 0x80000;
255*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x070), data);
256*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x070));
257*91f16700Schasinglulu 		data &= 0xfff7ffff;
258*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x070), data);
259*91f16700Schasinglulu 
260*91f16700Schasinglulu 
261*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
262*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x0);
263*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x801);
264*91f16700Schasinglulu 		do {
265*91f16700Schasinglulu 			data = mmio_read_32((0xf712c000 + 0x004));
266*91f16700Schasinglulu 		} while (data & 1);
267*91f16700Schasinglulu 
268*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x008));
269*91f16700Schasinglulu 		if ((data & 0x400) == 0) {
270*91f16700Schasinglulu 			mdelay(10);
271*91f16700Schasinglulu 			return 0;
272*91f16700Schasinglulu 		}
273*91f16700Schasinglulu 		WARN("lpddr3 cat fail\n");
274*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x1d4));
275*91f16700Schasinglulu 		if ((data & 0x1f00) && ((data & 0x1f) == 0)) {
276*91f16700Schasinglulu 			bdl[0] = mmio_read_32((0xf712c000 + 0x140));
277*91f16700Schasinglulu 			bdl[1] = mmio_read_32((0xf712c000 + 0x144));
278*91f16700Schasinglulu 			bdl[2] = mmio_read_32((0xf712c000 + 0x148));
279*91f16700Schasinglulu 			bdl[3] = mmio_read_32((0xf712c000 + 0x14c));
280*91f16700Schasinglulu 			bdl[4] = mmio_read_32((0xf712c000 + 0x150));
281*91f16700Schasinglulu 			if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) ||
282*91f16700Schasinglulu 					(!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) ||
283*91f16700Schasinglulu 					(!(bdl[4] & 0x1f001f))) {
284*91f16700Schasinglulu 				WARN("lpddr3 cat deskew error\n");
285*91f16700Schasinglulu 				if (i == 0x1f) {
286*91f16700Schasinglulu 					WARN("addrnbdl is max\n");
287*91f16700Schasinglulu 					return -EINVAL;
288*91f16700Schasinglulu 				}
289*91f16700Schasinglulu 				mmio_write_32((0xf712c000 + 0x008), 0x400);
290*91f16700Schasinglulu 			} else {
291*91f16700Schasinglulu 				WARN("lpddr3 cat other error1\n");
292*91f16700Schasinglulu 				return -EINVAL;
293*91f16700Schasinglulu 			}
294*91f16700Schasinglulu 		} else {
295*91f16700Schasinglulu 			WARN("lpddr3 cat other error2\n");
296*91f16700Schasinglulu 			return -EINVAL;
297*91f16700Schasinglulu 		}
298*91f16700Schasinglulu 	}
299*91f16700Schasinglulu 	return -EINVAL;
300*91f16700Schasinglulu }
301*91f16700Schasinglulu 
302*91f16700Schasinglulu static void ddrx_rdet(void)
303*91f16700Schasinglulu {
304*91f16700Schasinglulu 	unsigned int data, rdet, bdl[4];
305*91f16700Schasinglulu 
306*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0d0));
307*91f16700Schasinglulu 	data &= 0xf800ffff;
308*91f16700Schasinglulu 	data |= 0x8f0000;
309*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0d0), data);
310*91f16700Schasinglulu 
311*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0dc));
312*91f16700Schasinglulu 	data &= 0xfffffff0;
313*91f16700Schasinglulu 	data |= 0xf;
314*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0dc), data);
315*91f16700Schasinglulu 
316*91f16700Schasinglulu 
317*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
318*91f16700Schasinglulu 	data |= 0x80000;
319*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
320*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
321*91f16700Schasinglulu 	data &= 0xfff7ffff;
322*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
323*91f16700Schasinglulu 
324*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x8000);
325*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0);
326*91f16700Schasinglulu 
327*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0d0));
328*91f16700Schasinglulu 	data &= ~0xf0000000;
329*91f16700Schasinglulu 	data |= 0x80000000;
330*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0d0), data);
331*91f16700Schasinglulu 
332*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x101);
333*91f16700Schasinglulu 	do {
334*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
335*91f16700Schasinglulu 	} while (!(data & 1));
336*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
337*91f16700Schasinglulu 	if (data & 0x100)
338*91f16700Schasinglulu 		WARN("rdet lbs fail\n");
339*91f16700Schasinglulu 
340*91f16700Schasinglulu 	bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f;
341*91f16700Schasinglulu 	bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f;
342*91f16700Schasinglulu 	bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f;
343*91f16700Schasinglulu 	bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f;
344*91f16700Schasinglulu 	do {
345*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x22c));
346*91f16700Schasinglulu 		data &= ~0x7f;
347*91f16700Schasinglulu 		data |= bdl[0];
348*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x22c), data);
349*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x2ac));
350*91f16700Schasinglulu 		data &= ~0x7f;
351*91f16700Schasinglulu 		data |= bdl[1];
352*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x2ac), data);
353*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x32c));
354*91f16700Schasinglulu 		data &= ~0x7f;
355*91f16700Schasinglulu 		data |= bdl[2];
356*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x32c), data);
357*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x3ac));
358*91f16700Schasinglulu 		data &= ~0x7f;
359*91f16700Schasinglulu 		data |= bdl[3];
360*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x3ac), data);
361*91f16700Schasinglulu 
362*91f16700Schasinglulu 
363*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x070));
364*91f16700Schasinglulu 		data |= 0x80000;
365*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x070), data);
366*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x070));
367*91f16700Schasinglulu 		data &= 0xfff7ffff;
368*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x070), data);
369*91f16700Schasinglulu 
370*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
371*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0);
372*91f16700Schasinglulu 
373*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x0d0));
374*91f16700Schasinglulu 		data &= ~0xf0000000;
375*91f16700Schasinglulu 		data |= 0x40000000;
376*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x0d0), data);
377*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x101);
378*91f16700Schasinglulu 		do {
379*91f16700Schasinglulu 			data = mmio_read_32((0xf712c000 + 0x004));
380*91f16700Schasinglulu 		} while (data & 1);
381*91f16700Schasinglulu 
382*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x008));
383*91f16700Schasinglulu 		rdet = data & 0x100;
384*91f16700Schasinglulu 		if (rdet) {
385*91f16700Schasinglulu 			INFO("rdet ds fail\n");
386*91f16700Schasinglulu 			mmio_write_32((0xf712c000 + 0x008), 0x100);
387*91f16700Schasinglulu 		}
388*91f16700Schasinglulu 		bdl[0]++;
389*91f16700Schasinglulu 		bdl[1]++;
390*91f16700Schasinglulu 		bdl[2]++;
391*91f16700Schasinglulu 		bdl[3]++;
392*91f16700Schasinglulu 	} while (rdet);
393*91f16700Schasinglulu 
394*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0d0));
395*91f16700Schasinglulu 	data &= ~0xf0000000;
396*91f16700Schasinglulu 	data |= 0x30000000;
397*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0d0), data);
398*91f16700Schasinglulu 
399*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x101);
400*91f16700Schasinglulu 	do {
401*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
402*91f16700Schasinglulu 	} while (data & 1);
403*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
404*91f16700Schasinglulu 	if (data & 0x100)
405*91f16700Schasinglulu 		INFO("rdet rbs av fail\n");
406*91f16700Schasinglulu }
407*91f16700Schasinglulu 
408*91f16700Schasinglulu static void ddrx_wdet(void)
409*91f16700Schasinglulu {
410*91f16700Schasinglulu 	unsigned int data, wdet, zero_bdl = 0, dq[4];
411*91f16700Schasinglulu 	int i;
412*91f16700Schasinglulu 
413*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0d0));
414*91f16700Schasinglulu 	data &= ~0xf;
415*91f16700Schasinglulu 	data |= 0xf;
416*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0d0), data);
417*91f16700Schasinglulu 
418*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
419*91f16700Schasinglulu 	data |= 0x80000;
420*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
421*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
422*91f16700Schasinglulu 	data &= ~0x80000;
423*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
424*91f16700Schasinglulu 
425*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x8000);
426*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0);
427*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0d0));
428*91f16700Schasinglulu 	data &= ~0xf000;
429*91f16700Schasinglulu 	data |= 0x8000;
430*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0d0), data);
431*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x201);
432*91f16700Schasinglulu 	do {
433*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
434*91f16700Schasinglulu 	} while (data & 1);
435*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
436*91f16700Schasinglulu 	if (data & 0x200)
437*91f16700Schasinglulu 		INFO("wdet lbs fail\n");
438*91f16700Schasinglulu 
439*91f16700Schasinglulu 	dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00;
440*91f16700Schasinglulu 	dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00;
441*91f16700Schasinglulu 	dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00;
442*91f16700Schasinglulu 	dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00;
443*91f16700Schasinglulu 
444*91f16700Schasinglulu 	do {
445*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x234), dq[0]);
446*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x2b4), dq[1]);
447*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x334), dq[2]);
448*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x3b4), dq[3]);
449*91f16700Schasinglulu 
450*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x070));
451*91f16700Schasinglulu 		data |= 0x80000;
452*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x070), data);
453*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x070));
454*91f16700Schasinglulu 		data &= ~0x80000;
455*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x070), data);
456*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x8000);
457*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0);
458*91f16700Schasinglulu 
459*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x0d0));
460*91f16700Schasinglulu 		data &= ~0xf000;
461*91f16700Schasinglulu 		data |= 0x4000;
462*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x0d0), data);
463*91f16700Schasinglulu 		mmio_write_32((0xf712c000 + 0x004), 0x201);
464*91f16700Schasinglulu 		do {
465*91f16700Schasinglulu 			data = mmio_read_32((0xf712c000 + 0x004));
466*91f16700Schasinglulu 		} while (data & 1);
467*91f16700Schasinglulu 
468*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x008));
469*91f16700Schasinglulu 		wdet = data & 0x200;
470*91f16700Schasinglulu 		if (wdet) {
471*91f16700Schasinglulu 			INFO("wdet ds fail\n");
472*91f16700Schasinglulu 			mmio_write_32((0xf712c000 + 0x008), 0x200);
473*91f16700Schasinglulu 		}
474*91f16700Schasinglulu 		mdelay(10);
475*91f16700Schasinglulu 
476*91f16700Schasinglulu 		for (i = 0; i < 4; i++) {
477*91f16700Schasinglulu 			data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80));
478*91f16700Schasinglulu 			if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
479*91f16700Schasinglulu 			    (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
480*91f16700Schasinglulu 				zero_bdl = 1;
481*91f16700Schasinglulu 			data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80));
482*91f16700Schasinglulu 			if ((!(data & 0x1f)) || (!(data & 0x1f00)) ||
483*91f16700Schasinglulu 			    (!(data & 0x1f0000)) || (!(data & 0x1f000000)))
484*91f16700Schasinglulu 				zero_bdl = 1;
485*91f16700Schasinglulu 			data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80));
486*91f16700Schasinglulu 			if (!(data & 0x1f))
487*91f16700Schasinglulu 				zero_bdl = 1;
488*91f16700Schasinglulu 			if (zero_bdl) {
489*91f16700Schasinglulu 				if (i == 0)
490*91f16700Schasinglulu 					dq[0] = dq[0] - 0x100;
491*91f16700Schasinglulu 				if (i == 1)
492*91f16700Schasinglulu 					dq[1] = dq[1] - 0x100;
493*91f16700Schasinglulu 				if (i == 2)
494*91f16700Schasinglulu 					dq[2] = dq[2] - 0x100;
495*91f16700Schasinglulu 				if (i == 3)
496*91f16700Schasinglulu 					dq[3] = dq[3] - 0x100;
497*91f16700Schasinglulu 			}
498*91f16700Schasinglulu 		}
499*91f16700Schasinglulu 	} while (wdet);
500*91f16700Schasinglulu 
501*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x0d0));
502*91f16700Schasinglulu 	data &= ~0xf000;
503*91f16700Schasinglulu 	data |= 0x3000;
504*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0d0), data);
505*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x201);
506*91f16700Schasinglulu 	do {
507*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
508*91f16700Schasinglulu 	} while (data & 1);
509*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
510*91f16700Schasinglulu 	if (data & 0x200)
511*91f16700Schasinglulu 		INFO("wdet rbs av fail\n");
512*91f16700Schasinglulu }
513*91f16700Schasinglulu 
514*91f16700Schasinglulu void set_ddrc_150mhz(void)
515*91f16700Schasinglulu {
516*91f16700Schasinglulu 	unsigned int data;
517*91f16700Schasinglulu 
518*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x580), 0x1);
519*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x5a8), 0x7);
520*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
521*91f16700Schasinglulu 	data &= 0xfffffcff;
522*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
523*91f16700Schasinglulu 
524*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x050), 0x31);
525*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
526*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
527*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
528*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
529*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
530*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
531*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x258), 0x720);
532*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
533*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x358), 0x720);
534*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
535*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
536*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
537*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
538*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
539*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
540*91f16700Schasinglulu 
541*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x078));
542*91f16700Schasinglulu 	data |= 4;
543*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x078), data);
544*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
545*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
546*91f16700Schasinglulu 	data &= 0xfffffffe;
547*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
548*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
549*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
550*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x014), 0x10);
551*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x1e4));
552*91f16700Schasinglulu 	data &= 0xffffff00;
553*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1e4), data);
554*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x030), 0x30c82355);
555*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x034), 0x62112bb);
556*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x038), 0x20041022);
557*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x03c), 0x63177497);
558*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x040), 0x3008407);
559*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
560*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
561*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
562*91f16700Schasinglulu 	data &= 0xffff0000;
563*91f16700Schasinglulu 	data |= 0x184;
564*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
565*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
566*91f16700Schasinglulu 	data &= 0xbfffffff;
567*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
568*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
569*91f16700Schasinglulu 	data &= ~0x10;
570*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
571*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x080));
572*91f16700Schasinglulu 	data &= ~0x2000;
573*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x080), data);
574*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x270), 0x3);
575*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
576*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x370), 0x3);
577*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
578*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
579*91f16700Schasinglulu 
580*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x040), 0x0);
581*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
582*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
583*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x060), 0x133);
584*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x064), 0x133);
585*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
586*91f16700Schasinglulu 
587*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x100), 0xb3290d08);
588*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x104), 0x9621821);
589*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x108), 0x45009023);
590*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145);
591*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
592*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x114), 0x11080806);
593*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x118), 0x44);
594*91f16700Schasinglulu 	do {
595*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
596*91f16700Schasinglulu 	} while (data & 1);
597*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
598*91f16700Schasinglulu 	if (data & 8) {
599*91f16700Schasinglulu 		NOTICE("fail to init ddr3 rank0\n");
600*91f16700Schasinglulu 		return;
601*91f16700Schasinglulu 	}
602*91f16700Schasinglulu 
603*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
604*91f16700Schasinglulu 	data |= 1;
605*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
606*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x21);
607*91f16700Schasinglulu 	do {
608*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
609*91f16700Schasinglulu 	} while (data & 1);
610*91f16700Schasinglulu 
611*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
612*91f16700Schasinglulu 	if (data & 0x8)
613*91f16700Schasinglulu 		NOTICE("ddr3 rank1 init failure\n");
614*91f16700Schasinglulu 	else
615*91f16700Schasinglulu 		INFO("ddr3 rank1 init pass\n");
616*91f16700Schasinglulu 
617*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
618*91f16700Schasinglulu 	data &= ~0xf;
619*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
620*91f16700Schasinglulu 	INFO("succeed to set ddrc 150mhz\n");
621*91f16700Schasinglulu }
622*91f16700Schasinglulu 
623*91f16700Schasinglulu void set_ddrc_266mhz(void)
624*91f16700Schasinglulu {
625*91f16700Schasinglulu 	unsigned int data;
626*91f16700Schasinglulu 
627*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x580), 0x3);
628*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
629*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
630*91f16700Schasinglulu 	data &= 0xfffffcff;
631*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
632*91f16700Schasinglulu 
633*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x050), 0x31);
634*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
635*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
636*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
637*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
638*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
639*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
640*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x258), 0x720);
641*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
642*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x358), 0x720);
643*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
644*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
645*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
646*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
647*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
648*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
649*91f16700Schasinglulu 
650*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x078));
651*91f16700Schasinglulu 	data |= 4;
652*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x078), data);
653*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
654*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
655*91f16700Schasinglulu 	data &= 0xfffffffe;
656*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
657*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
658*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
659*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x014), 0x10);
660*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x1e4));
661*91f16700Schasinglulu 	data &= 0xffffff00;
662*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1e4), data);
663*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x030), 0x510d4455);
664*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x034), 0x8391ebb);
665*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x038), 0x2005103c);
666*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x03c), 0x6329950b);
667*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x040), 0x300858c);
668*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
669*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
670*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
671*91f16700Schasinglulu 	data &= 0xffff0000;
672*91f16700Schasinglulu 	data |= 0x184;
673*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
674*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
675*91f16700Schasinglulu 	data &= 0xbfffffff;
676*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
677*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
678*91f16700Schasinglulu 	data &= ~0x10;
679*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
680*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x080));
681*91f16700Schasinglulu 	data &= ~0x2000;
682*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x080), data);
683*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x270), 0x3);
684*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
685*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x370), 0x3);
686*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
687*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
688*91f16700Schasinglulu 
689*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x040), 0x0);
690*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
691*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
692*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x060), 0x133);
693*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x064), 0x133);
694*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
695*91f16700Schasinglulu 
696*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x100), 0xb441d50d);
697*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x104), 0xf721839);
698*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x108), 0x5500f03f);
699*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x10c), 0xaf486145);
700*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
701*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x114), 0x12080d06);
702*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x118), 0x44);
703*91f16700Schasinglulu 	do {
704*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
705*91f16700Schasinglulu 	} while (data & 1);
706*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
707*91f16700Schasinglulu 	if (data & 8) {
708*91f16700Schasinglulu 		NOTICE("fail to init ddr3 rank0\n");
709*91f16700Schasinglulu 		return;
710*91f16700Schasinglulu 	}
711*91f16700Schasinglulu 
712*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
713*91f16700Schasinglulu 	data |= 1;
714*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
715*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x21);
716*91f16700Schasinglulu 	do {
717*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
718*91f16700Schasinglulu 	} while (data & 1);
719*91f16700Schasinglulu 
720*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
721*91f16700Schasinglulu 	if (data & 0x8)
722*91f16700Schasinglulu 		NOTICE("ddr3 rank1 init failure\n");
723*91f16700Schasinglulu 	else
724*91f16700Schasinglulu 		INFO("ddr3 rank1 init pass\n");
725*91f16700Schasinglulu 
726*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
727*91f16700Schasinglulu 	data &= ~0xf;
728*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
729*91f16700Schasinglulu 	INFO("succeed to set ddrc 266mhz\n");
730*91f16700Schasinglulu }
731*91f16700Schasinglulu 
732*91f16700Schasinglulu void set_ddrc_400mhz(void)
733*91f16700Schasinglulu {
734*91f16700Schasinglulu 	unsigned int data;
735*91f16700Schasinglulu 
736*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x580), 0x2);
737*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
738*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
739*91f16700Schasinglulu 	data &= 0xfffffcff;
740*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
741*91f16700Schasinglulu 
742*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x050), 0x31);
743*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
744*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
745*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f);
746*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0xf0f);
747*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
748*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x090), 0x7200000);
749*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x258), 0x720);
750*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2d8), 0x720);
751*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x358), 0x720);
752*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3d8), 0x720);
753*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
754*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
755*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
756*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
757*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
758*91f16700Schasinglulu 
759*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x078));
760*91f16700Schasinglulu 	data |= 4;
761*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x078), data);
762*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
763*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
764*91f16700Schasinglulu 	data &= 0xfffffffe;
765*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
766*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
767*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
768*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x014), 0x10);
769*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x1e4));
770*91f16700Schasinglulu 	data &= 0xffffff00;
771*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1e4), data);
772*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x030), 0x75525655);
773*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x034), 0xa552abb);
774*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x038), 0x20071059);
775*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x03c), 0x633e8591);
776*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x040), 0x3008691);
777*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x064), 0x10483);
778*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
779*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
780*91f16700Schasinglulu 	data &= 0xffff0000;
781*91f16700Schasinglulu 	data |= 0x184;
782*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
783*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
784*91f16700Schasinglulu 	data &= 0xbfffffff;
785*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
786*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
787*91f16700Schasinglulu 	data &= ~0x10;
788*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
789*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x080));
790*91f16700Schasinglulu 	data &= ~0x2000;
791*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x080), data);
792*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x270), 0x3);
793*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
794*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x370), 0x3);
795*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
796*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), 0x90420880);
797*91f16700Schasinglulu 
798*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x040), 0x0);
799*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x146d);
800*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
801*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x060), 0x133);
802*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x064), 0x133);
803*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
804*91f16700Schasinglulu 
805*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12);
806*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x104), 0x17721855);
807*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x108), 0x7501505f);
808*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245);
809*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
810*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x114), 0x13081306);
811*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x118), 0x44);
812*91f16700Schasinglulu 	do {
813*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
814*91f16700Schasinglulu 	} while (data & 1);
815*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
816*91f16700Schasinglulu 	if (data & 8) {
817*91f16700Schasinglulu 		NOTICE("fail to init ddr3 rank0\n");
818*91f16700Schasinglulu 		return;
819*91f16700Schasinglulu 	}
820*91f16700Schasinglulu 
821*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
822*91f16700Schasinglulu 	data |= 1;
823*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
824*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x21);
825*91f16700Schasinglulu 	do {
826*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
827*91f16700Schasinglulu 	} while (data & 1);
828*91f16700Schasinglulu 
829*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
830*91f16700Schasinglulu 	if (data & 0x8)
831*91f16700Schasinglulu 		NOTICE("ddr3 rank1 init failure\n");
832*91f16700Schasinglulu 	else
833*91f16700Schasinglulu 		INFO("ddr3 rank1 init pass\n");
834*91f16700Schasinglulu 
835*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
836*91f16700Schasinglulu 	data &= ~0xf;
837*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
838*91f16700Schasinglulu 	INFO("succeed to set ddrc 400mhz\n");
839*91f16700Schasinglulu }
840*91f16700Schasinglulu 
841*91f16700Schasinglulu void set_ddrc_533mhz(void)
842*91f16700Schasinglulu {
843*91f16700Schasinglulu 	unsigned int data;
844*91f16700Schasinglulu 
845*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x580), 0x3);
846*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x5a8), 0x11111);
847*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
848*91f16700Schasinglulu 	data |= 0x100;
849*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
850*91f16700Schasinglulu 
851*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x050), 0x30);
852*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
853*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
854*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
855*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
856*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
857*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x090), 0x6400000);
858*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x258), 0x640);
859*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2d8), 0x640);
860*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x358), 0x640);
861*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3d8), 0x640);
862*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x0);
863*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
864*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
865*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
866*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
867*91f16700Schasinglulu 
868*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x078));
869*91f16700Schasinglulu 	data |= 4;
870*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x078), data);
871*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
872*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
873*91f16700Schasinglulu 	data &= 0xfffffffe;
874*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
875*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
876*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
877*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x014), 0x10);
878*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x1e4));
879*91f16700Schasinglulu 	data &= 0xffffff00;
880*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1e4), data);
881*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x030), 0x9dd87855);
882*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x034), 0xa7138bb);
883*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x038), 0x20091477);
884*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x03c), 0x84534e16);
885*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x040), 0x3008817);
886*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x064), 0x106c3);
887*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
888*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
889*91f16700Schasinglulu 	data &= 0xffff0000;
890*91f16700Schasinglulu 	data |= 0x305;
891*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
892*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
893*91f16700Schasinglulu 	data |= 0x40000000;
894*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
895*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
896*91f16700Schasinglulu 	data &= ~0x10;
897*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
898*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x080));
899*91f16700Schasinglulu 	data &= ~0x2000;
900*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x080), data);
901*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x270), 0x3);
902*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
903*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x370), 0x3);
904*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
905*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
906*91f16700Schasinglulu 
907*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x040), 0x0);
908*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x140f);
909*91f16700Schasinglulu 	do {
910*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
911*91f16700Schasinglulu 	} while (data & 1);
912*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
913*91f16700Schasinglulu 	if (data & 0x7fe) {
914*91f16700Schasinglulu 		NOTICE("failed to init lpddr3 rank0 dram phy\n");
915*91f16700Schasinglulu 		return;
916*91f16700Schasinglulu 	}
917*91f16700Schasinglulu 	cat_533mhz_800mhz();
918*91f16700Schasinglulu 
919*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0xf1);
920*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x050), 0x100123);
921*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x060), 0x133);
922*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x064), 0x133);
923*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
924*91f16700Schasinglulu 
925*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x100), 0xb77b6718);
926*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x104), 0x1e82a071);
927*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x108), 0x9501c07e);
928*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255);
929*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x110), 0x10b00000);
930*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x114), 0x13181908);
931*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x118), 0x44);
932*91f16700Schasinglulu 	do {
933*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
934*91f16700Schasinglulu 	} while (data & 1);
935*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
936*91f16700Schasinglulu 	if (data & 0x7fe) {
937*91f16700Schasinglulu 		NOTICE("fail to init ddr3 rank0\n");
938*91f16700Schasinglulu 		return;
939*91f16700Schasinglulu 	}
940*91f16700Schasinglulu 	ddrx_rdet();
941*91f16700Schasinglulu 	ddrx_wdet();
942*91f16700Schasinglulu 
943*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
944*91f16700Schasinglulu 	data |= 1;
945*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
946*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x21);
947*91f16700Schasinglulu 	do {
948*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
949*91f16700Schasinglulu 	} while (data & 1);
950*91f16700Schasinglulu 
951*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
952*91f16700Schasinglulu 	if (data & 0x7fe)
953*91f16700Schasinglulu 		NOTICE("ddr3 rank1 init failure\n");
954*91f16700Schasinglulu 	else
955*91f16700Schasinglulu 		INFO("ddr3 rank1 init pass\n");
956*91f16700Schasinglulu 
957*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
958*91f16700Schasinglulu 	data &= ~0xf;
959*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
960*91f16700Schasinglulu 	INFO("succeed to set ddrc 533mhz\n");
961*91f16700Schasinglulu }
962*91f16700Schasinglulu 
963*91f16700Schasinglulu void set_ddrc_800mhz(void)
964*91f16700Schasinglulu {
965*91f16700Schasinglulu 	unsigned int data;
966*91f16700Schasinglulu 
967*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x580), 0x2);
968*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x5a8), 0x1003);
969*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x104));
970*91f16700Schasinglulu 	data &= 0xfffffcff;
971*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x104), data);
972*91f16700Schasinglulu 
973*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x050), 0x30);
974*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x240), 0x5ffff);
975*91f16700Schasinglulu 	mmio_write_32((0xf7030000 + 0x344), 0xf5ff);
976*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
977*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x00c), 0x400);
978*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x7);
979*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x090), 0x5400000);
980*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x258), 0x540);
981*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2d8), 0x540);
982*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x358), 0x540);
983*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3d8), 0x540);
984*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x018), 0x0);
985*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f);
986*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x0b4), 0xf);
987*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x088), 0x3fff801);
988*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), 0x8940000);
989*91f16700Schasinglulu 
990*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x078));
991*91f16700Schasinglulu 	data |= 4;
992*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x078), data);
993*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x01c), 0x8000080);
994*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
995*91f16700Schasinglulu 	data &= 0xfffffffe;
996*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
997*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1d4), 0xc0000);
998*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x010), 0x500000f);
999*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x014), 0x10);
1000*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x1e4));
1001*91f16700Schasinglulu 	data &= 0xffffff00;
1002*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1e4), data);
1003*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x030), 0xe663ab77);
1004*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x034), 0xea952db);
1005*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1);
1006*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721);
1007*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x040), 0x3008aa1);
1008*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x064), 0x11a43);
1009*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x068), 0xff0a0000);
1010*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x070));
1011*91f16700Schasinglulu 	data &= 0xffff0000;
1012*91f16700Schasinglulu 	data |= 0x507;
1013*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x070), data);
1014*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
1015*91f16700Schasinglulu 	data |= 0x40000000;
1016*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
1017*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x020));
1018*91f16700Schasinglulu 	data &= 0xffffffef;
1019*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x020), data);
1020*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x080));
1021*91f16700Schasinglulu 	data &= 0xffffdfff;
1022*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x080), data);
1023*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x270), 0x3);
1024*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x2f0), 0x3);
1025*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x370), 0x3);
1026*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x3f0), 0x3);
1027*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), 0xd0420900);
1028*91f16700Schasinglulu 
1029*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x040), 0x2001);
1030*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x140f);
1031*91f16700Schasinglulu 	do {
1032*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
1033*91f16700Schasinglulu 	} while (data & 1);
1034*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
1035*91f16700Schasinglulu 	if (data & 0x7fe) {
1036*91f16700Schasinglulu 		WARN("failed to init lpddr3 rank0 dram phy\n");
1037*91f16700Schasinglulu 		return;
1038*91f16700Schasinglulu 	}
1039*91f16700Schasinglulu 	cat_533mhz_800mhz();
1040*91f16700Schasinglulu 
1041*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0xf1);
1042*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x050), 0x100023);
1043*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x060), 0x133);
1044*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x064), 0x133);
1045*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x200), 0xa1000);
1046*91f16700Schasinglulu 
1047*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x100), 0x755a9d12);
1048*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x104), 0x1753b055);
1049*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x108), 0x7401505f);
1050*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x10c), 0x578ca244);
1051*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x110), 0x10700000);
1052*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x114), 0x13141306);
1053*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x118), 0x44);
1054*91f16700Schasinglulu 	do {
1055*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
1056*91f16700Schasinglulu 	} while (data & 1);
1057*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
1058*91f16700Schasinglulu 	if (data & 0x7fe) {
1059*91f16700Schasinglulu 		NOTICE("fail to init ddr3 rank0\n");
1060*91f16700Schasinglulu 		return;
1061*91f16700Schasinglulu 	}
1062*91f16700Schasinglulu 	ddrx_rdet();
1063*91f16700Schasinglulu 	ddrx_wdet();
1064*91f16700Schasinglulu 
1065*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
1066*91f16700Schasinglulu 	data |= 1;
1067*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
1068*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x004), 0x21);
1069*91f16700Schasinglulu 	do {
1070*91f16700Schasinglulu 		data = mmio_read_32((0xf712c000 + 0x004));
1071*91f16700Schasinglulu 	} while (data & 1);
1072*91f16700Schasinglulu 
1073*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x008));
1074*91f16700Schasinglulu 	if (data & 0x7fe)
1075*91f16700Schasinglulu 		NOTICE("ddr3 rank1 init failure\n");
1076*91f16700Schasinglulu 	else
1077*91f16700Schasinglulu 		INFO("ddr3 rank1 init pass\n");
1078*91f16700Schasinglulu 
1079*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x048));
1080*91f16700Schasinglulu 	data &= ~0xf;
1081*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x048), data);
1082*91f16700Schasinglulu 	INFO("succeed to set ddrc 800mhz\n");
1083*91f16700Schasinglulu }
1084*91f16700Schasinglulu 
1085*91f16700Schasinglulu static void ddrc_common_init(int freq)
1086*91f16700Schasinglulu {
1087*91f16700Schasinglulu 	unsigned int data;
1088*91f16700Schasinglulu 
1089*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x020), 0x1);
1090*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x100), 0x1700);
1091*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1092*91f16700Schasinglulu 	mmio_write_32((0xf7121400 + 0x104), 0xf);
1093*91f16700Schasinglulu 	mmio_write_32((0xf7121800 + 0x104), 0xf);
1094*91f16700Schasinglulu 	mmio_write_32((0xf7121c00 + 0x104), 0xf);
1095*91f16700Schasinglulu 	mmio_write_32((0xf7122000 + 0x104), 0xf);
1096*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x02c), 0x6);
1097*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x020), 0x30003);
1098*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x028), 0x310201);
1099*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600);
1100*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x01c), 0xaf001);
1101*91f16700Schasinglulu 
1102*91f16700Schasinglulu 
1103*91f16700Schasinglulu 	data = mmio_read_32((0xf7128000 + 0x280));
1104*91f16700Schasinglulu 	data |= 1 << 7;
1105*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x280), data);
1106*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x244), 0x3);
1107*91f16700Schasinglulu 
1108*91f16700Schasinglulu 	if (freq == DDR_FREQ_800M)
1109*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024);
1110*91f16700Schasinglulu 	else
1111*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024);
1112*91f16700Schasinglulu 
1113*91f16700Schasinglulu 	data = mmio_read_32((0xf712c000 + 0x080));
1114*91f16700Schasinglulu 	data &= 0xffff;
1115*91f16700Schasinglulu 	data |= 0x4002000;
1116*91f16700Schasinglulu 	mmio_write_32((0xf712c000 + 0x080), data);
1117*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x000), 0x0);
1118*91f16700Schasinglulu 	do {
1119*91f16700Schasinglulu 		data = mmio_read_32((0xf7128000 + 0x294));
1120*91f16700Schasinglulu 	} while (data & 1);
1121*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x000), 0x2);
1122*91f16700Schasinglulu }
1123*91f16700Schasinglulu 
1124*91f16700Schasinglulu 
1125*91f16700Schasinglulu static int dienum_det_and_rowcol_cfg(void)
1126*91f16700Schasinglulu {
1127*91f16700Schasinglulu 	unsigned int data;
1128*91f16700Schasinglulu 
1129*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x210), 0x87);
1130*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
1131*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
1132*91f16700Schasinglulu 	do {
1133*91f16700Schasinglulu 		data = mmio_read_32((0xf7128000 + 0x00c));
1134*91f16700Schasinglulu 	} while (data & 1);
1135*91f16700Schasinglulu 	data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc;
1136*91f16700Schasinglulu 	switch (data) {
1137*91f16700Schasinglulu 	case 0x18:
1138*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x060), 0x132);
1139*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x064), 0x132);
1140*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x100), 0x1600);
1141*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1142*91f16700Schasinglulu 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x40000000);
1143*91f16700Schasinglulu 		break;
1144*91f16700Schasinglulu 	case 0x1c:
1145*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x060), 0x142);
1146*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x064), 0x142);
1147*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x100), 0x1700);
1148*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1149*91f16700Schasinglulu 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
1150*91f16700Schasinglulu 		break;
1151*91f16700Schasinglulu 	case 0x58:
1152*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x060), 0x133);
1153*91f16700Schasinglulu 		mmio_write_32((0xf7128000 + 0x064), 0x133);
1154*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x100), 0x1700);
1155*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x104), 0x71040004);
1156*91f16700Schasinglulu 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
1157*91f16700Schasinglulu 		break;
1158*91f16700Schasinglulu 	default:
1159*91f16700Schasinglulu 		mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000);
1160*91f16700Schasinglulu 		break;
1161*91f16700Schasinglulu 	}
1162*91f16700Schasinglulu 	if (!data)
1163*91f16700Schasinglulu 		return -EINVAL;
1164*91f16700Schasinglulu 	return 0;
1165*91f16700Schasinglulu }
1166*91f16700Schasinglulu 
1167*91f16700Schasinglulu static int detect_ddr_chip_info(void)
1168*91f16700Schasinglulu {
1169*91f16700Schasinglulu 	unsigned int data, mr5, mr6, mr7;
1170*91f16700Schasinglulu 
1171*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x210), 0x57);
1172*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
1173*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
1174*91f16700Schasinglulu 
1175*91f16700Schasinglulu 	do {
1176*91f16700Schasinglulu 		data = mmio_read_32((0xf7128000 + 0x00c));
1177*91f16700Schasinglulu 	} while (data & 1);
1178*91f16700Schasinglulu 
1179*91f16700Schasinglulu 	data = mmio_read_32((0xf7128000 + 0x4a8));
1180*91f16700Schasinglulu 	mr5 = data & 0xff;
1181*91f16700Schasinglulu 	switch (mr5) {
1182*91f16700Schasinglulu 	case 1:
1183*91f16700Schasinglulu 		INFO("Samsung DDR\n");
1184*91f16700Schasinglulu 		break;
1185*91f16700Schasinglulu 	case 6:
1186*91f16700Schasinglulu 		INFO("Hynix DDR\n");
1187*91f16700Schasinglulu 		break;
1188*91f16700Schasinglulu 	case 3:
1189*91f16700Schasinglulu 		INFO("Elpida DDR\n");
1190*91f16700Schasinglulu 		break;
1191*91f16700Schasinglulu 	default:
1192*91f16700Schasinglulu 		INFO("DDR from other vendors\n");
1193*91f16700Schasinglulu 		break;
1194*91f16700Schasinglulu 	}
1195*91f16700Schasinglulu 
1196*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x210), 0x67);
1197*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
1198*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
1199*91f16700Schasinglulu 	do {
1200*91f16700Schasinglulu 		data = mmio_read_32((0xf7128000 + 0x00c));
1201*91f16700Schasinglulu 	} while (data & 1);
1202*91f16700Schasinglulu 	data = mmio_read_32((0xf7128000 + 0x4a8));
1203*91f16700Schasinglulu 	mr6 = data & 0xff;
1204*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x210), 0x77);
1205*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x218), 0x10000);
1206*91f16700Schasinglulu 	mmio_write_32((0xf7128000 + 0x00c), 0x1);
1207*91f16700Schasinglulu 	do {
1208*91f16700Schasinglulu 		data = mmio_read_32((0xf7128000 + 0x00c));
1209*91f16700Schasinglulu 	} while (data & 1);
1210*91f16700Schasinglulu 	data = mmio_read_32((0xf7128000 + 0x4a8));
1211*91f16700Schasinglulu 	mr7 = data & 0xff;
1212*91f16700Schasinglulu 	data = mr5 + (mr6 << 8) + (mr7 << 16);
1213*91f16700Schasinglulu 	return data;
1214*91f16700Schasinglulu }
1215*91f16700Schasinglulu 
1216*91f16700Schasinglulu void ddr_phy_reset(void)
1217*91f16700Schasinglulu {
1218*91f16700Schasinglulu 	mmio_write_32(0xf7030340, 0xa000);
1219*91f16700Schasinglulu 	mmio_write_32(0xf7030344, 0xa000);
1220*91f16700Schasinglulu }
1221*91f16700Schasinglulu 
1222*91f16700Schasinglulu void lpddrx_save_ddl_para_bypass(uint32_t *ddr_ddl_para, unsigned int index)
1223*91f16700Schasinglulu {
1224*91f16700Schasinglulu 	uint32_t value;
1225*91f16700Schasinglulu 	uint32_t cnt = index;
1226*91f16700Schasinglulu 	uint32_t i;
1227*91f16700Schasinglulu 
1228*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
1229*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80);
1230*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1231*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80);
1232*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1233*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80);
1234*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1235*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80);
1236*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1237*91f16700Schasinglulu 	}
1238*91f16700Schasinglulu }
1239*91f16700Schasinglulu 
1240*91f16700Schasinglulu void lpddrx_save_ddl_para_mission(uint32_t *ddr_ddl_para, unsigned int index)
1241*91f16700Schasinglulu {
1242*91f16700Schasinglulu 	uint32_t value;
1243*91f16700Schasinglulu 	uint32_t cnt = index;
1244*91f16700Schasinglulu 	uint32_t i;
1245*91f16700Schasinglulu 
1246*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x140);
1247*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1248*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x144);
1249*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1250*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x148);
1251*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1252*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x14c);
1253*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1254*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x150);
1255*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1256*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x1d4);
1257*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1258*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
1259*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x210 + i * 0x80);
1260*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1261*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x214 + i * 0x80);
1262*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1263*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x218 + i * 0x80);
1264*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1265*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x21c + i * 0x80);
1266*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1267*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x220 + i * 0x80);
1268*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1269*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x224 + i * 0x80);
1270*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1271*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x228 + i * 0x80);
1272*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1273*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80);
1274*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1275*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x230 + i * 0x80);
1276*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1277*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x234 + i * 0x80);
1278*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1279*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x238 + i * 0x80);
1280*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1281*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80);
1282*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1283*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80);
1284*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1285*91f16700Schasinglulu 		value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80);
1286*91f16700Schasinglulu 		ddr_ddl_para[cnt++] = value;
1287*91f16700Schasinglulu 	}
1288*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x168);
1289*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1290*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x24c + 0 * 0x80);
1291*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1292*91f16700Schasinglulu 	value = mmio_read_32(0xf712c000 + 0x24c + 2 * 0x80);
1293*91f16700Schasinglulu 	ddr_ddl_para[cnt++] = value;
1294*91f16700Schasinglulu }
1295*91f16700Schasinglulu 
1296*91f16700Schasinglulu int lpddr3_freq_init(int freq)
1297*91f16700Schasinglulu {
1298*91f16700Schasinglulu 	set_ddrc_150mhz();
1299*91f16700Schasinglulu 	lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 0);
1300*91f16700Schasinglulu 	if (freq > DDR_FREQ_150M) {
1301*91f16700Schasinglulu 		ddr_phy_reset();
1302*91f16700Schasinglulu 		set_ddrc_266mhz();
1303*91f16700Schasinglulu 		lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1304*91f16700Schasinglulu 					    16);
1305*91f16700Schasinglulu 	}
1306*91f16700Schasinglulu 	if (freq > DDR_FREQ_266M) {
1307*91f16700Schasinglulu 		ddr_phy_reset();
1308*91f16700Schasinglulu 		set_ddrc_400mhz();
1309*91f16700Schasinglulu 		lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1310*91f16700Schasinglulu 					    16 * 2);
1311*91f16700Schasinglulu 	}
1312*91f16700Schasinglulu 	if (freq > DDR_FREQ_400M) {
1313*91f16700Schasinglulu 		ddr_phy_reset();
1314*91f16700Schasinglulu 		set_ddrc_533mhz();
1315*91f16700Schasinglulu 		lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1316*91f16700Schasinglulu 					     16 * 3);
1317*91f16700Schasinglulu 	}
1318*91f16700Schasinglulu 	if (freq > DDR_FREQ_533M) {
1319*91f16700Schasinglulu 		ddr_phy_reset();
1320*91f16700Schasinglulu 		set_ddrc_800mhz();
1321*91f16700Schasinglulu 		lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR,
1322*91f16700Schasinglulu 					     16 * 3 + 61);
1323*91f16700Schasinglulu 	}
1324*91f16700Schasinglulu 	return 0;
1325*91f16700Schasinglulu }
1326*91f16700Schasinglulu 
1327*91f16700Schasinglulu static void init_ddr(int freq)
1328*91f16700Schasinglulu {
1329*91f16700Schasinglulu 	unsigned int data;
1330*91f16700Schasinglulu 	int ret;
1331*91f16700Schasinglulu 
1332*91f16700Schasinglulu 
1333*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x030));
1334*91f16700Schasinglulu 	data |= 1;
1335*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x030), data);
1336*91f16700Schasinglulu 	data = mmio_read_32((0xf7032000 + 0x010));
1337*91f16700Schasinglulu 	data |= 1;
1338*91f16700Schasinglulu 	mmio_write_32((0xf7032000 + 0x010), data);
1339*91f16700Schasinglulu 
1340*91f16700Schasinglulu 	udelay(300);
1341*91f16700Schasinglulu 	do {
1342*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x030));
1343*91f16700Schasinglulu 		data &= 3 << 28;
1344*91f16700Schasinglulu 	} while (data != (3 << 28));
1345*91f16700Schasinglulu 	do {
1346*91f16700Schasinglulu 		data = mmio_read_32((0xf7032000 + 0x010));
1347*91f16700Schasinglulu 		data &= 3 << 28;
1348*91f16700Schasinglulu 	} while (data != (3 << 28));
1349*91f16700Schasinglulu 
1350*91f16700Schasinglulu 	ret = lpddr3_freq_init(freq);
1351*91f16700Schasinglulu 	if (ret)
1352*91f16700Schasinglulu 		return;
1353*91f16700Schasinglulu }
1354*91f16700Schasinglulu 
1355*91f16700Schasinglulu static void init_ddrc_qos(void)
1356*91f16700Schasinglulu {
1357*91f16700Schasinglulu 	unsigned int port, data;
1358*91f16700Schasinglulu 
1359*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x088), 1);
1360*91f16700Schasinglulu 
1361*91f16700Schasinglulu 	port = 0;
1362*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
1363*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111);
1364*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111);
1365*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007);
1366*91f16700Schasinglulu 
1367*91f16700Schasinglulu 	for (port = 3; port <= 4; port++) {
1368*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210);
1369*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777);
1370*91f16700Schasinglulu 		mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777);
1371*91f16700Schasinglulu 	}
1372*91f16700Schasinglulu 
1373*91f16700Schasinglulu 	port = 1;
1374*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
1375*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
1376*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
1377*91f16700Schasinglulu 
1378*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x1f0), 0);
1379*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
1380*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
1381*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x1f4), 0x01000100);
1382*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402);
1383*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31);
1384*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x000), 0x7);
1385*91f16700Schasinglulu 
1386*91f16700Schasinglulu 	data = mmio_read_32((0xf7124000 + 0x09c));
1387*91f16700Schasinglulu 	data &= ~0xff0000;
1388*91f16700Schasinglulu 	data |= 0x400000;
1389*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x09c), data);
1390*91f16700Schasinglulu 	data = mmio_read_32((0xf7124000 + 0x0ac));
1391*91f16700Schasinglulu 	data &= ~0xff0000;
1392*91f16700Schasinglulu 	data |= 0x400000;
1393*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0ac), data);
1394*91f16700Schasinglulu 	port = 2;
1395*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000);
1396*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567);
1397*91f16700Schasinglulu 	mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567);
1398*91f16700Schasinglulu 
1399*91f16700Schasinglulu 
1400*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x09c), 0xff7fff);
1401*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0a0), 0xff);
1402*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff);
1403*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0b0), 0xff);
1404*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0bc), 0x3020100);
1405*91f16700Schasinglulu 	mmio_write_32((0xf7124000 + 0x0d0), 0x3020100);
1406*91f16700Schasinglulu }
1407*91f16700Schasinglulu 
1408*91f16700Schasinglulu void hikey_ddr_init(unsigned int ddr_freq)
1409*91f16700Schasinglulu {
1410*91f16700Schasinglulu 	uint32_t data;
1411*91f16700Schasinglulu 
1412*91f16700Schasinglulu 	assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) ||
1413*91f16700Schasinglulu 	       (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) ||
1414*91f16700Schasinglulu 	       (ddr_freq == DDR_FREQ_800M));
1415*91f16700Schasinglulu 	init_pll();
1416*91f16700Schasinglulu 	init_freq();
1417*91f16700Schasinglulu 
1418*91f16700Schasinglulu 	init_ddr(ddr_freq);
1419*91f16700Schasinglulu 
1420*91f16700Schasinglulu 	ddrc_common_init(ddr_freq);
1421*91f16700Schasinglulu 	dienum_det_and_rowcol_cfg();
1422*91f16700Schasinglulu 	detect_ddr_chip_info();
1423*91f16700Schasinglulu 
1424*91f16700Schasinglulu 	if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) {
1425*91f16700Schasinglulu 		data = mmio_read_32(0xf7032000 + 0x010);
1426*91f16700Schasinglulu 		data &= ~0x1;
1427*91f16700Schasinglulu 		mmio_write_32(0xf7032000 + 0x010, data);
1428*91f16700Schasinglulu 	} else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) {
1429*91f16700Schasinglulu 		data = mmio_read_32(0xf7032000 + 0x030);
1430*91f16700Schasinglulu 		data &= ~0x1;
1431*91f16700Schasinglulu 		mmio_write_32(0xf7032000 + 0x030, data);
1432*91f16700Schasinglulu 	} else {
1433*91f16700Schasinglulu 		data = mmio_read_32(0xf7032000 + 0x010);
1434*91f16700Schasinglulu 		data &= ~0x1;
1435*91f16700Schasinglulu 		mmio_write_32(0xf7032000 + 0x010, data);
1436*91f16700Schasinglulu 		data = mmio_read_32(0xf7032000 + 0x030);
1437*91f16700Schasinglulu 		data &= ~0x1;
1438*91f16700Schasinglulu 		mmio_write_32(0xf7032000 + 0x030, data);
1439*91f16700Schasinglulu 	}
1440*91f16700Schasinglulu 	dsb();
1441*91f16700Schasinglulu 	isb();
1442*91f16700Schasinglulu 
1443*91f16700Schasinglulu 	/*
1444*91f16700Schasinglulu 	 * Test memory access. Do not use address 0x0 because the compiler
1445*91f16700Schasinglulu 	 * may assume it is not a valid address and generate incorrect code
1446*91f16700Schasinglulu 	 * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance).
1447*91f16700Schasinglulu 	 */
1448*91f16700Schasinglulu 	mmio_write_32(0x4, 0xa5a55a5a);
1449*91f16700Schasinglulu 	INFO("ddr test value:0x%x\n", mmio_read_32(0x4));
1450*91f16700Schasinglulu 	init_ddrc_qos();
1451*91f16700Schasinglulu }
1452