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