xref: /arm-trusted-firmware/drivers/renesas/common/ddr/ddr_a/ddr_init_e3.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2019, Renesas Electronics Corporation.
3*91f16700Schasinglulu  * All rights reserved.
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <lib/mmio.h>
9*91f16700Schasinglulu #include <stdint.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <common/debug.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include "boot_init_dram.h"
14*91f16700Schasinglulu #include "rcar_def.h"
15*91f16700Schasinglulu #include "../ddr_regs.h"
16*91f16700Schasinglulu 
17*91f16700Schasinglulu #include "../dram_sub_func.h"
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #define RCAR_E3_DDR_VERSION    "rev.0.12"
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /* Average periodic refresh interval[ns]. Support 3900,7800 */
22*91f16700Schasinglulu #ifdef ddr_qos_init_setting
23*91f16700Schasinglulu #define REFRESH_RATE	3900U
24*91f16700Schasinglulu #else
25*91f16700Schasinglulu #if RCAR_REF_INT == 1
26*91f16700Schasinglulu #define REFRESH_RATE	7800U
27*91f16700Schasinglulu #else
28*91f16700Schasinglulu #define REFRESH_RATE	3900U
29*91f16700Schasinglulu #endif
30*91f16700Schasinglulu #endif
31*91f16700Schasinglulu 
32*91f16700Schasinglulu /*
33*91f16700Schasinglulu  *  Initialize ddr
34*91f16700Schasinglulu  */
35*91f16700Schasinglulu uint32_t init_ddr(void)
36*91f16700Schasinglulu {
37*91f16700Schasinglulu 	uint32_t i, r2, r5, r6, r7, r12;
38*91f16700Schasinglulu 	uint32_t ddr_md;
39*91f16700Schasinglulu 	uint32_t regval, j;
40*91f16700Schasinglulu 	uint32_t dqsgd_0c, bdlcount_0c, bdlcount_0c_div2, bdlcount_0c_div4;
41*91f16700Schasinglulu 	uint32_t bdlcount_0c_div8, bdlcount_0c_div16;
42*91f16700Schasinglulu 	uint32_t gatesl_0c, rdqsd_0c, rdqsnd_0c, rbd_0c[4];
43*91f16700Schasinglulu 	uint32_t pdqsr_ctl, lcdl_ctl, lcdl_judge1, lcdl_judge2;
44*91f16700Schasinglulu 	uint32_t pdr_ctl;
45*91f16700Schasinglulu 	uint32_t byp_ctl;
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 	if ((mmio_read_32(0xFFF00044) & 0x000000FF) == 0x00000000) {
48*91f16700Schasinglulu 		pdqsr_ctl = 1;
49*91f16700Schasinglulu 		lcdl_ctl = 1;
50*91f16700Schasinglulu 		pdr_ctl = 1;
51*91f16700Schasinglulu 		byp_ctl = 1;
52*91f16700Schasinglulu 	} else {
53*91f16700Schasinglulu 		pdqsr_ctl = 0;
54*91f16700Schasinglulu 		lcdl_ctl = 0;
55*91f16700Schasinglulu 		pdr_ctl = 0;
56*91f16700Schasinglulu 		byp_ctl = 0;
57*91f16700Schasinglulu 	}
58*91f16700Schasinglulu 
59*91f16700Schasinglulu 	/* Judge the DDR bit rate (ddr_md : 0 = 1584Mbps, 1 = 1856Mbps) */
60*91f16700Schasinglulu 	ddr_md = (mmio_read_32(RST_MODEMR) >> 19) & BIT(0);
61*91f16700Schasinglulu 
62*91f16700Schasinglulu 	/* 1584Mbps setting */
63*91f16700Schasinglulu 	if (ddr_md == 0) {
64*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPR, 0x5A5AFFFF);
65*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPCR, 0xA5A50000);
66*91f16700Schasinglulu 
67*91f16700Schasinglulu 		mmio_write_32(CPG_SRCR4, 0x20000000);
68*91f16700Schasinglulu 
69*91f16700Schasinglulu 		mmio_write_32(0xE61500DC, 0xe2200000);	/* Change to 1584Mbps */
70*91f16700Schasinglulu 		while (!(mmio_read_32(CPG_PLLECR) & BIT(11)))
71*91f16700Schasinglulu 			;
72*91f16700Schasinglulu 
73*91f16700Schasinglulu 		mmio_write_32(CPG_SRSTCLR4, 0x20000000);
74*91f16700Schasinglulu 
75*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPCR, 0xA5A50001);
76*91f16700Schasinglulu 	}
77*91f16700Schasinglulu 
78*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
79*91f16700Schasinglulu 	mmio_write_32(DBSC_DBKIND, 0x00000007);
80*91f16700Schasinglulu 
81*91f16700Schasinglulu #if RCAR_DRAM_DDR3L_MEMCONF == 0
82*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a02);	/* 1GB */
83*91f16700Schasinglulu #else
84*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x10030a02);	/* 2GB(default) */
85*91f16700Schasinglulu #endif
86*91f16700Schasinglulu 
87*91f16700Schasinglulu #if RCAR_DRAM_DDR3L_MEMDUAL == 1
88*91f16700Schasinglulu 	r2 = mmio_read_32(0xE6790614);
89*91f16700Schasinglulu 	mmio_write_32(0xE6790614, r2 | 0x3); /* MCS1_N/MODT1 are activated. */
90*91f16700Schasinglulu #endif
91*91f16700Schasinglulu 
92*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPHYCONF0, 0x1);
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	/* Select setting value in bps */
95*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
96*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR0, 0xB);
97*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR1, 0x8);
98*91f16700Schasinglulu 	} else {		/* 1856Mbps */
99*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR0, 0xD);
100*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR1, 0x9);
101*91f16700Schasinglulu 	}
102*91f16700Schasinglulu 
103*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR2, 0x00000000);
104*91f16700Schasinglulu 
105*91f16700Schasinglulu 	/* Select setting value in bps */
106*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
107*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR3, 0x0000000B);
108*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR4, 0x000B000B);
109*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR5, 0x00000027);
110*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR6, 0x0000001C);
111*91f16700Schasinglulu 	} else {		/* 1856Mbps */
112*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR3, 0x0000000D);
113*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR4, 0x000D000D);
114*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR5, 0x0000002D);
115*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR6, 0x00000020);
116*91f16700Schasinglulu 	}
117*91f16700Schasinglulu 
118*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR7, 0x00060006);
119*91f16700Schasinglulu 
120*91f16700Schasinglulu 	/* Select setting value in bps */
121*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
122*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR8, 0x00000020);
123*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR9, 0x00000006);
124*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR10, 0x0000000C);
125*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR11, 0x0000000A);
126*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR12, 0x00120012);
127*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR13, 0x000000CE);
128*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR14, 0x00140005);
129*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR15, 0x00050004);
130*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR16, 0x071F0305);
131*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR17, 0x040C0000);
132*91f16700Schasinglulu 	} else {		/* 1856Mbps */
133*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR8, 0x00000021);
134*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR9, 0x00000007);
135*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR10, 0x0000000E);
136*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR11, 0x0000000C);
137*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR12, 0x00140014);
138*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR13, 0x000000F2);
139*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR14, 0x00170006);
140*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR15, 0x00060005);
141*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR16, 0x09210507);
142*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR17, 0x040E0000);
143*91f16700Schasinglulu 	}
144*91f16700Schasinglulu 
145*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR18, 0x00000200);
146*91f16700Schasinglulu 
147*91f16700Schasinglulu 	/* Select setting value in bps */
148*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
149*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR19, 0x01000040);
150*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR20, 0x020000D6);
151*91f16700Schasinglulu 	} else {		/* 1856Mbps */
152*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR19, 0x0129004B);
153*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR20, 0x020000FB);
154*91f16700Schasinglulu 	}
155*91f16700Schasinglulu 
156*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR21, 0x00040004);
157*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBL, 0x00000000);
158*91f16700Schasinglulu 	mmio_write_32(DBSC_DBODT0, 0x00000001);
159*91f16700Schasinglulu 	mmio_write_32(DBSC_DBADJ0, 0x00000001);
160*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
161*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICNT_0, 0x00000010);
162*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBCAMDIS, 0x00000001);
163*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW1, 0x00000046);
164*91f16700Schasinglulu 
165*91f16700Schasinglulu 	/* Select setting value in bps */
166*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
167*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST0, 0x0D050B03);
168*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST1, 0x0306030C);
169*91f16700Schasinglulu 	} else {		/* 1856Mbps */
170*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST0, 0x0C050B03);
171*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST1, 0x0305030C);
172*91f16700Schasinglulu 	}
173*91f16700Schasinglulu 
174*91f16700Schasinglulu 	/*
175*91f16700Schasinglulu 	 * Initial_Step0( INITBYP )
176*91f16700Schasinglulu 	 */
177*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A);
178*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x01840001);
179*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08840000);
180*91f16700Schasinglulu 	NOTICE("BL2: [COLD_BOOT]\n");
181*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
182*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x80010000);
183*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
184*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
185*91f16700Schasinglulu 		;
186*91f16700Schasinglulu 
187*91f16700Schasinglulu 	/*
188*91f16700Schasinglulu 	 * Initial_Step1( ZCAL,PLLINIT,DCAL,PHYRST training )
189*91f16700Schasinglulu 	 */
190*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000008);
191*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000);
192*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
193*91f16700Schasinglulu 
194*91f16700Schasinglulu 	/* Select setting value in bps */
195*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
196*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058904);
197*91f16700Schasinglulu 	else			/* 1856Mbps */
198*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058A04);
199*91f16700Schasinglulu 
200*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000091);
201*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
202*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000095);
203*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BBAD);
204*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000099);
205*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
206*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
207*91f16700Schasinglulu 
208*91f16700Schasinglulu 	/* Select setting value in bps */
209*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
210*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
211*91f16700Schasinglulu 	else			/* 1856Mbps */
212*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00);
213*91f16700Schasinglulu 
214*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
215*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E);
216*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
217*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010073);
218*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
219*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
220*91f16700Schasinglulu 		;
221*91f16700Schasinglulu 
222*91f16700Schasinglulu 	/*
223*91f16700Schasinglulu 	 * Initial_Step2( DRAMRST/DRAMINT training )
224*91f16700Schasinglulu 	 */
225*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
226*91f16700Schasinglulu 
227*91f16700Schasinglulu 	/* Select setting value in bps */
228*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
229*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900);
230*91f16700Schasinglulu 	else			/* 1856Mbps */
231*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0C058A00);
232*91f16700Schasinglulu 
233*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
234*91f16700Schasinglulu 
235*91f16700Schasinglulu 	/* Select setting value in bps */
236*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
237*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
238*91f16700Schasinglulu 	else			/* 1856Mbps */
239*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00);
240*91f16700Schasinglulu 
241*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
242*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
243*91f16700Schasinglulu 		;
244*91f16700Schasinglulu 
245*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
246*91f16700Schasinglulu 	if (byp_ctl == 1)
247*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0780C720);
248*91f16700Schasinglulu 	else
249*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700);
250*91f16700Schasinglulu 
251*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
252*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)))
253*91f16700Schasinglulu 		;
254*91f16700Schasinglulu 
255*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000004);
256*91f16700Schasinglulu 
257*91f16700Schasinglulu 	/* Select setting value in bps */
258*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
259*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, (REFRESH_RATE * 792 / 125) -
260*91f16700Schasinglulu 					     400 + 0x08B00000);
261*91f16700Schasinglulu 	} else {		/* 1856Mbps */
262*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, (REFRESH_RATE * 928 / 125) -
263*91f16700Schasinglulu 					     400 + 0x0A300000);
264*91f16700Schasinglulu 	}
265*91f16700Schasinglulu 
266*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000022);
267*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B);
268*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000023);
269*91f16700Schasinglulu 
270*91f16700Schasinglulu 	/* Select setting value in bps */
271*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
272*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x2D9C0B66);
273*91f16700Schasinglulu 	else			/* 1856Mbps */
274*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x35A00D77);
275*91f16700Schasinglulu 
276*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000024);
277*91f16700Schasinglulu 
278*91f16700Schasinglulu 	/* Select setting value in bps */
279*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
280*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x2A88B400);
281*91f16700Schasinglulu 	else			/* 1856Mbps */
282*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x2A8A2C28);
283*91f16700Schasinglulu 
284*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000025);
285*91f16700Schasinglulu 
286*91f16700Schasinglulu 	/* Select setting value in bps */
287*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
288*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x30005200);
289*91f16700Schasinglulu 	else			/* 1856Mbps */
290*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x30005E00);
291*91f16700Schasinglulu 
292*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000026);
293*91f16700Schasinglulu 
294*91f16700Schasinglulu 	/* Select setting value in bps */
295*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
296*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0014A9C9);
297*91f16700Schasinglulu 	else			/* 1856Mbps */
298*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0014CB49);
299*91f16700Schasinglulu 
300*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000027);
301*91f16700Schasinglulu 
302*91f16700Schasinglulu 	/* Select setting value in bps */
303*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
304*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000D70);
305*91f16700Schasinglulu 	else			/* 1856Mbps */
306*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000F14);
307*91f16700Schasinglulu 
308*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000028);
309*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000046);
310*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000029);
311*91f16700Schasinglulu 
312*91f16700Schasinglulu 	/* Select setting value in bps */
313*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
314*91f16700Schasinglulu 		if (REFRESH_RATE > 3900)	/* [7]SRT=0 */
315*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0x18);
316*91f16700Schasinglulu 		else				/* [7]SRT=1 */
317*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0x98);
318*91f16700Schasinglulu 	} else {		/* 1856Mbps */
319*91f16700Schasinglulu 		if (REFRESH_RATE > 3900)	/* [7]SRT=0 */
320*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0x20);
321*91f16700Schasinglulu 		else				/* [7]SRT=1 */
322*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0xA0);
323*91f16700Schasinglulu 	}
324*91f16700Schasinglulu 
325*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
326*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003047);
327*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000020);
328*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00181884);
329*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A);
330*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x33C03C10);
331*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
332*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
333*91f16700Schasinglulu 		;
334*91f16700Schasinglulu 
335*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7);
336*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
337*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8);
338*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
339*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9);
340*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
341*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7);
342*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
343*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8);
344*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
345*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9);
346*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
347*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E7);
348*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
349*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E8);
350*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
351*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E9);
352*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
353*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000107);
354*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
355*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000108);
356*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
357*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000109);
358*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
359*91f16700Schasinglulu 
360*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
361*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010181);
362*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08840001);
363*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
364*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
365*91f16700Schasinglulu 		;
366*91f16700Schasinglulu 
367*91f16700Schasinglulu 	/*
368*91f16700Schasinglulu 	 * Initial_Step3( WL/QSG training )
369*91f16700Schasinglulu 	 */
370*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
371*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010601);
372*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
373*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
374*91f16700Schasinglulu 		;
375*91f16700Schasinglulu 
376*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
377*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
378*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8;
379*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
380*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
381*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
382*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
383*91f16700Schasinglulu 
384*91f16700Schasinglulu 		if (r6 > 0) {
385*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
386*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
387*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
388*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
389*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
390*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
391*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
392*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r6);
393*91f16700Schasinglulu 		} else {
394*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
395*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
396*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
397*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r7);
398*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
399*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
400*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
401*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
402*91f16700Schasinglulu 						     ((r6 + ((r5) << 1)) &
403*91f16700Schasinglulu 						     0xFF));
404*91f16700Schasinglulu 		}
405*91f16700Schasinglulu 	}
406*91f16700Schasinglulu 
407*91f16700Schasinglulu 	/*
408*91f16700Schasinglulu 	 * Initial_Step4( WLADJ training )
409*91f16700Schasinglulu 	 */
410*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
411*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00C0);
412*91f16700Schasinglulu 
413*91f16700Schasinglulu 	if (pdqsr_ctl == 0) {
414*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
415*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
416*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
417*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
418*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
419*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
420*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
421*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
422*91f16700Schasinglulu 	}
423*91f16700Schasinglulu 
424*91f16700Schasinglulu 	/* PDR always off */
425*91f16700Schasinglulu 	if (pdr_ctl == 1) {
426*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
427*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
428*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
429*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
430*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
431*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
432*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
433*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
434*91f16700Schasinglulu 	}
435*91f16700Schasinglulu 
436*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
437*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010801);
438*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
439*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
440*91f16700Schasinglulu 		;
441*91f16700Schasinglulu 
442*91f16700Schasinglulu 	/*
443*91f16700Schasinglulu 	 * Initial_Step5(Read Data Bit Deskew)
444*91f16700Schasinglulu 	 */
445*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
446*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00D8);
447*91f16700Schasinglulu 
448*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
449*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00011001);
450*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
451*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
452*91f16700Schasinglulu 		;
453*91f16700Schasinglulu 
454*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
455*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
456*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
457*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
458*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
459*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
460*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
461*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
462*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
463*91f16700Schasinglulu 	}
464*91f16700Schasinglulu 
465*91f16700Schasinglulu 	/* PDR dynamic */
466*91f16700Schasinglulu 	if (pdr_ctl == 1) {
467*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
468*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
469*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
470*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
471*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
472*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
473*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
474*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
475*91f16700Schasinglulu 	}
476*91f16700Schasinglulu 
477*91f16700Schasinglulu 	/*
478*91f16700Schasinglulu 	 * Initial_Step6(Write Data Bit Deskew)
479*91f16700Schasinglulu 	 */
480*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
481*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00012001);
482*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
483*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
484*91f16700Schasinglulu 		;
485*91f16700Schasinglulu 
486*91f16700Schasinglulu 	/*
487*91f16700Schasinglulu 	 * Initial_Step7(Read Data Eye Training)
488*91f16700Schasinglulu 	 */
489*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
490*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
491*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
492*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
493*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
494*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
495*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
496*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
497*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
498*91f16700Schasinglulu 	}
499*91f16700Schasinglulu 
500*91f16700Schasinglulu 	/* PDR always off */
501*91f16700Schasinglulu 	if (pdr_ctl == 1) {
502*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
503*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
504*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
505*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
506*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
507*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
508*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
509*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
510*91f16700Schasinglulu 	}
511*91f16700Schasinglulu 
512*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
513*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00014001);
514*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
515*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
516*91f16700Schasinglulu 		;
517*91f16700Schasinglulu 
518*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
519*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
520*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
521*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
522*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
523*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
524*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
525*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
526*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
527*91f16700Schasinglulu 	}
528*91f16700Schasinglulu 
529*91f16700Schasinglulu 	/* PDR dynamic */
530*91f16700Schasinglulu 	if (pdr_ctl == 1) {
531*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
532*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
533*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
534*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
535*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
536*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
537*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
538*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
539*91f16700Schasinglulu 	}
540*91f16700Schasinglulu 
541*91f16700Schasinglulu 	/*
542*91f16700Schasinglulu 	 * Initial_Step8(Write Data Eye Training)
543*91f16700Schasinglulu 	 */
544*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
545*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00018001);
546*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
547*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
548*91f16700Schasinglulu 		;
549*91f16700Schasinglulu 
550*91f16700Schasinglulu 	/*
551*91f16700Schasinglulu 	 * Initial_Step3_2( DQS Gate Training )
552*91f16700Schasinglulu 	 */
553*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
554*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
555*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
556*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
557*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
558*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
559*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
560*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
561*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
562*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003087);
563*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
564*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010401);
565*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
566*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
567*91f16700Schasinglulu 		;
568*91f16700Schasinglulu 
569*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
570*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
571*91f16700Schasinglulu 		r5 = ((mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8);
572*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
573*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
574*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
575*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
576*91f16700Schasinglulu 		r12 = (r5 >> 0x2);
577*91f16700Schasinglulu 		if (r12 < r6) {
578*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
579*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
580*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
581*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
582*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
583*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
584*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
585*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 - r12) & 0xFF));
586*91f16700Schasinglulu 		} else {
587*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
588*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
589*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
590*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | (r7 & 0x7));
591*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
592*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
593*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
594*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 + r5 +
595*91f16700Schasinglulu 						     (r5 >> 1) + r12) & 0xFF));
596*91f16700Schasinglulu 		}
597*91f16700Schasinglulu 	}
598*91f16700Schasinglulu 
599*91f16700Schasinglulu 	/*
600*91f16700Schasinglulu 	 * Initial_Step5-2_7-2( Rd bit Rd eye )
601*91f16700Schasinglulu 	 */
602*91f16700Schasinglulu 	if (pdqsr_ctl == 0) {
603*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
604*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
605*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
606*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
607*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
608*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
609*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
610*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
611*91f16700Schasinglulu 	}
612*91f16700Schasinglulu 
613*91f16700Schasinglulu 	/* PDR always off */
614*91f16700Schasinglulu 	if (pdr_ctl == 1) {
615*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
616*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
617*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
618*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
619*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
620*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
621*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
622*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
623*91f16700Schasinglulu 	}
624*91f16700Schasinglulu 
625*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
626*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00015001);
627*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
628*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
629*91f16700Schasinglulu 		;
630*91f16700Schasinglulu 
631*91f16700Schasinglulu 	if (lcdl_ctl == 1) {
632*91f16700Schasinglulu 		for (i = 0; i < 4; i++) {
633*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
634*91f16700Schasinglulu 			dqsgd_0c = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
635*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
636*91f16700Schasinglulu 			bdlcount_0c = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >>
637*91f16700Schasinglulu 					8;
638*91f16700Schasinglulu 			bdlcount_0c_div2 = bdlcount_0c >> 1;
639*91f16700Schasinglulu 			bdlcount_0c_div4 = bdlcount_0c >> 2;
640*91f16700Schasinglulu 			bdlcount_0c_div8 = bdlcount_0c >> 3;
641*91f16700Schasinglulu 			bdlcount_0c_div16 = bdlcount_0c >> 4;
642*91f16700Schasinglulu 
643*91f16700Schasinglulu 			if (ddr_md == 0) {	/* 1584Mbps */
644*91f16700Schasinglulu 				lcdl_judge1 = bdlcount_0c_div2 +
645*91f16700Schasinglulu 					      bdlcount_0c_div4 +
646*91f16700Schasinglulu 					      bdlcount_0c_div8;
647*91f16700Schasinglulu 				lcdl_judge2 = bdlcount_0c +
648*91f16700Schasinglulu 					      bdlcount_0c_div4 +
649*91f16700Schasinglulu 					      bdlcount_0c_div16;
650*91f16700Schasinglulu 			} else {		/* 1856Mbps */
651*91f16700Schasinglulu 				lcdl_judge1 = bdlcount_0c_div2 +
652*91f16700Schasinglulu 					      bdlcount_0c_div4;
653*91f16700Schasinglulu 				lcdl_judge2 = bdlcount_0c +
654*91f16700Schasinglulu 					      bdlcount_0c_div4;
655*91f16700Schasinglulu 			}
656*91f16700Schasinglulu 
657*91f16700Schasinglulu 			if (dqsgd_0c <= lcdl_judge1)
658*91f16700Schasinglulu 				continue;
659*91f16700Schasinglulu 
660*91f16700Schasinglulu 			if (dqsgd_0c <= lcdl_judge2) {
661*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
662*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
663*91f16700Schasinglulu 						0xFFFFFF00;
664*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0,
665*91f16700Schasinglulu 					      (dqsgd_0c - bdlcount_0c_div8) |
666*91f16700Schasinglulu 					      regval);
667*91f16700Schasinglulu 			} else {
668*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
669*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
670*91f16700Schasinglulu 						0xFFFFFF00;
671*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval);
672*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
673*91f16700Schasinglulu 				gatesl_0c = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
674*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
675*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
676*91f16700Schasinglulu 						0xFFFFFFF8;
677*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval |
678*91f16700Schasinglulu 							     (gatesl_0c + 1));
679*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAF + i * 0x20);
680*91f16700Schasinglulu 				regval = (mmio_read_32(DBSC_DBPDRGD_0));
681*91f16700Schasinglulu 				rdqsd_0c = (regval & 0xFF00) >> 8;
682*91f16700Schasinglulu 				rdqsnd_0c = (regval & 0xFF0000) >> 16;
683*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAF + i * 0x20);
684*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0,
685*91f16700Schasinglulu 					      (regval & 0xFF0000FF) |
686*91f16700Schasinglulu 					      ((rdqsd_0c +
687*91f16700Schasinglulu 						bdlcount_0c_div4) << 8) |
688*91f16700Schasinglulu 					      ((rdqsnd_0c +
689*91f16700Schasinglulu 						bdlcount_0c_div4) << 16));
690*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAA + i * 0x20);
691*91f16700Schasinglulu 				regval = (mmio_read_32(DBSC_DBPDRGD_0));
692*91f16700Schasinglulu 				rbd_0c[0] = (regval) & 0x1f;
693*91f16700Schasinglulu 				rbd_0c[1] = (regval >> 8) & 0x1f;
694*91f16700Schasinglulu 				rbd_0c[2] = (regval >> 16) & 0x1f;
695*91f16700Schasinglulu 				rbd_0c[3] = (regval >> 24) & 0x1f;
696*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAA + i * 0x20);
697*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
698*91f16700Schasinglulu 					0xE0E0E0E0;
699*91f16700Schasinglulu 				for (j = 0; j < 4; j++) {
700*91f16700Schasinglulu 					rbd_0c[j] = rbd_0c[j] +
701*91f16700Schasinglulu 						    bdlcount_0c_div4;
702*91f16700Schasinglulu 					if (rbd_0c[j] > 0x1F)
703*91f16700Schasinglulu 						rbd_0c[j] = 0x1F;
704*91f16700Schasinglulu 					regval = regval | (rbd_0c[j] << 8 * j);
705*91f16700Schasinglulu 				}
706*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval);
707*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAB + i * 0x20);
708*91f16700Schasinglulu 				regval = (mmio_read_32(DBSC_DBPDRGD_0));
709*91f16700Schasinglulu 				rbd_0c[0] = (regval) & 0x1f;
710*91f16700Schasinglulu 				rbd_0c[1] = (regval >> 8) & 0x1f;
711*91f16700Schasinglulu 				rbd_0c[2] = (regval >> 16) & 0x1f;
712*91f16700Schasinglulu 				rbd_0c[3] = (regval >> 24) & 0x1f;
713*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAB + i * 0x20);
714*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
715*91f16700Schasinglulu 					0xE0E0E0E0;
716*91f16700Schasinglulu 				for (j = 0; j < 4; j++) {
717*91f16700Schasinglulu 					rbd_0c[j] = rbd_0c[j] +
718*91f16700Schasinglulu 						    bdlcount_0c_div4;
719*91f16700Schasinglulu 					if (rbd_0c[j] > 0x1F)
720*91f16700Schasinglulu 						rbd_0c[j] = 0x1F;
721*91f16700Schasinglulu 					regval = regval | (rbd_0c[j] << 8 * j);
722*91f16700Schasinglulu 				}
723*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval);
724*91f16700Schasinglulu 			}
725*91f16700Schasinglulu 		}
726*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x2);
727*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7D81E37);
728*91f16700Schasinglulu 	}
729*91f16700Schasinglulu 
730*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
731*91f16700Schasinglulu 	if (byp_ctl == 1)
732*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0380C720);
733*91f16700Schasinglulu 	else
734*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700);
735*91f16700Schasinglulu 
736*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
737*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))
738*91f16700Schasinglulu 		;
739*91f16700Schasinglulu 
740*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
741*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E);
742*91f16700Schasinglulu 
743*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010);
744*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCALCNF, (64000000 / REFRESH_RATE) + 0x01000000);
745*91f16700Schasinglulu 	/* Select setting value in bps */
746*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
747*91f16700Schasinglulu 		mmio_write_32(DBSC_DBRFCNF1,
748*91f16700Schasinglulu 			      (REFRESH_RATE * 99 / 125) + 0x00080000);
749*91f16700Schasinglulu 	} else {		/* 1856Mbps */
750*91f16700Schasinglulu 		mmio_write_32(DBSC_DBRFCNF1,
751*91f16700Schasinglulu 			      (REFRESH_RATE * 116 / 125) + 0x00080000);
752*91f16700Schasinglulu 	}
753*91f16700Schasinglulu 
754*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
755*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
756*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFEN, 0x00000001);
757*91f16700Schasinglulu 	mmio_write_32(DBSC_DBACEN, 0x00000001);
758*91f16700Schasinglulu 
759*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
760*91f16700Schasinglulu 		mmio_write_32(0xE67F0018, 0x00000001);
761*91f16700Schasinglulu 		regval = mmio_read_32(0x40000000);
762*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000000);
763*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, regval);
764*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
765*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
766*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
767*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
768*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
769*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
770*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
771*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
772*91f16700Schasinglulu 	}
773*91f16700Schasinglulu 
774*91f16700Schasinglulu 	/* PDR dynamic */
775*91f16700Schasinglulu 	if (pdr_ctl == 1) {
776*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
777*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
778*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
779*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
780*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
781*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
782*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
783*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
784*91f16700Schasinglulu 	}
785*91f16700Schasinglulu 
786*91f16700Schasinglulu 	/*
787*91f16700Schasinglulu 	 * Initial_Step9( Initial End )
788*91f16700Schasinglulu 	 */
789*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x00000000);
790*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
791*91f16700Schasinglulu 
792*91f16700Schasinglulu #ifdef ddr_qos_init_setting /* only for non qos_init */
793*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
794*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218);
795*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4);
796*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037);
797*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
798*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW0, 0x22421111);
799*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST2, 0x012F1123);
800*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00);
801*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00);
802*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS02, 0x00000000);
803*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS03, 0x00000000);
804*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS40, 0x00000300);
805*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0);
806*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS42, 0x00000200);
807*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS43, 0x00000100);
808*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS90, 0x00000100);
809*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS91, 0x000000F0);
810*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS92, 0x000000A0);
811*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS93, 0x00000040);
812*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS130, 0x00000100);
813*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0);
814*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0);
815*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS133, 0x00000040);
816*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0);
817*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0);
818*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS142, 0x00000080);
819*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS143, 0x00000040);
820*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS150, 0x00000040);
821*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS151, 0x00000030);
822*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS152, 0x00000020);
823*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS153, 0x00000010);
824*91f16700Schasinglulu 
825*91f16700Schasinglulu 	if (pdqsr_ctl == 0)
826*91f16700Schasinglulu 		mmio_write_32(0xE67F0018, 0x00000001);
827*91f16700Schasinglulu 
828*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
829*91f16700Schasinglulu #endif
830*91f16700Schasinglulu 
831*91f16700Schasinglulu 	return 1;
832*91f16700Schasinglulu }
833*91f16700Schasinglulu 
834*91f16700Schasinglulu static uint32_t recovery_from_backup_mode(uint32_t ddr_backup)
835*91f16700Schasinglulu {
836*91f16700Schasinglulu 	/*
837*91f16700Schasinglulu 	 * recovery_Step0(DBSC Setting 1) / same "init_ddr"
838*91f16700Schasinglulu 	 */
839*91f16700Schasinglulu 	uint32_t r2, r5, r6, r7, r12, i;
840*91f16700Schasinglulu 	uint32_t ddr_md;
841*91f16700Schasinglulu 	uint32_t err;
842*91f16700Schasinglulu 	uint32_t regval, j;
843*91f16700Schasinglulu 	uint32_t dqsgd_0c, bdlcount_0c, bdlcount_0c_div2, bdlcount_0c_div4;
844*91f16700Schasinglulu 	uint32_t bdlcount_0c_div8, bdlcount_0c_div16;
845*91f16700Schasinglulu 	uint32_t gatesl_0c, rdqsd_0c, rdqsnd_0c, rbd_0c[4];
846*91f16700Schasinglulu 	uint32_t pdqsr_ctl, lcdl_ctl, lcdl_judge1, lcdl_judge2;
847*91f16700Schasinglulu 	uint32_t pdr_ctl;
848*91f16700Schasinglulu 	uint32_t byp_ctl;
849*91f16700Schasinglulu 
850*91f16700Schasinglulu 	if ((mmio_read_32(0xFFF00044) & 0x000000FF) == 0x00000000) {
851*91f16700Schasinglulu 		pdqsr_ctl = 1;
852*91f16700Schasinglulu 		lcdl_ctl = 1;
853*91f16700Schasinglulu 		pdr_ctl = 1;
854*91f16700Schasinglulu 		byp_ctl = 1;
855*91f16700Schasinglulu 	} else {
856*91f16700Schasinglulu 		pdqsr_ctl = 0;
857*91f16700Schasinglulu 		lcdl_ctl = 0;
858*91f16700Schasinglulu 		pdr_ctl = 0;
859*91f16700Schasinglulu 		byp_ctl = 0;
860*91f16700Schasinglulu 	}
861*91f16700Schasinglulu 
862*91f16700Schasinglulu 	/* Judge the DDR bit rate (ddr_md : 0 = 1584Mbps, 1 = 1856Mbps) */
863*91f16700Schasinglulu 	ddr_md = (mmio_read_32(RST_MODEMR) >> 19) & BIT(0);
864*91f16700Schasinglulu 
865*91f16700Schasinglulu 	/* 1584Mbps setting */
866*91f16700Schasinglulu 	if (ddr_md == 0) {
867*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPR, 0x5A5AFFFF);
868*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPCR, 0xA5A50000);
869*91f16700Schasinglulu 
870*91f16700Schasinglulu 		mmio_write_32(CPG_SRCR4, 0x20000000);
871*91f16700Schasinglulu 
872*91f16700Schasinglulu 		mmio_write_32(0xE61500DC, 0xe2200000);	/* Change to 1584Mbps */
873*91f16700Schasinglulu 		while (!(mmio_read_32(CPG_PLLECR) & BIT(11)))
874*91f16700Schasinglulu 			;
875*91f16700Schasinglulu 
876*91f16700Schasinglulu 		mmio_write_32(CPG_SRSTCLR4, 0x20000000);
877*91f16700Schasinglulu 
878*91f16700Schasinglulu 		mmio_write_32(CPG_CPGWPCR, 0xA5A50001);
879*91f16700Schasinglulu 	}
880*91f16700Schasinglulu 
881*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
882*91f16700Schasinglulu 	mmio_write_32(DBSC_DBKIND, 0x00000007);
883*91f16700Schasinglulu 
884*91f16700Schasinglulu #if RCAR_DRAM_DDR3L_MEMCONF == 0
885*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a02);
886*91f16700Schasinglulu #else
887*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x10030a02);
888*91f16700Schasinglulu #endif
889*91f16700Schasinglulu 
890*91f16700Schasinglulu #if RCAR_DRAM_DDR3L_MEMDUAL == 1
891*91f16700Schasinglulu 	r2 = mmio_read_32(0xE6790614);
892*91f16700Schasinglulu 	mmio_write_32(0xE6790614, r2 | 0x3); /* MCS1_N/MODT1 are activated. */
893*91f16700Schasinglulu #endif
894*91f16700Schasinglulu 
895*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPHYCONF0, 0x00000001);
896*91f16700Schasinglulu 
897*91f16700Schasinglulu 	/* Select setting value in bps */
898*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
899*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR0, 0x0000000B);
900*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR1, 0x00000008);
901*91f16700Schasinglulu 	} else {		/* 1856Mbps */
902*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR0, 0x0000000D);
903*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR1, 0x00000009);
904*91f16700Schasinglulu 	}
905*91f16700Schasinglulu 
906*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR2, 0x00000000);
907*91f16700Schasinglulu 
908*91f16700Schasinglulu 	/* Select setting value in bps */
909*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
910*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR3, 0x0000000B);
911*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR4, 0x000B000B);
912*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR5, 0x00000027);
913*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR6, 0x0000001C);
914*91f16700Schasinglulu 	} else {		/* 1856Mbps */
915*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR3, 0x0000000D);
916*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR4, 0x000D000D);
917*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR5, 0x0000002D);
918*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR6, 0x00000020);
919*91f16700Schasinglulu 	}
920*91f16700Schasinglulu 
921*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR7, 0x00060006);
922*91f16700Schasinglulu 
923*91f16700Schasinglulu 	/* Select setting value in bps */
924*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
925*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR8, 0x00000020);
926*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR9, 0x00000006);
927*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR10, 0x0000000C);
928*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR11, 0x0000000A);
929*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR12, 0x00120012);
930*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR13, 0x000000CE);
931*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR14, 0x00140005);
932*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR15, 0x00050004);
933*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR16, 0x071F0305);
934*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR17, 0x040C0000);
935*91f16700Schasinglulu 	} else {		/* 1856Mbps */
936*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR8, 0x00000021);
937*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR9, 0x00000007);
938*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR10, 0x0000000E);
939*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR11, 0x0000000C);
940*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR12, 0x00140014);
941*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR13, 0x000000F2);
942*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR14, 0x00170006);
943*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR15, 0x00060005);
944*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR16, 0x09210507);
945*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR17, 0x040E0000);
946*91f16700Schasinglulu 	}
947*91f16700Schasinglulu 
948*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR18, 0x00000200);
949*91f16700Schasinglulu 
950*91f16700Schasinglulu 	/* Select setting value in bps */
951*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
952*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR19, 0x01000040);
953*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR20, 0x020000D6);
954*91f16700Schasinglulu 	} else {		/* 1856Mbps */
955*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR19, 0x0129004B);
956*91f16700Schasinglulu 		mmio_write_32(DBSC_DBTR20, 0x020000FB);
957*91f16700Schasinglulu 	}
958*91f16700Schasinglulu 
959*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR21, 0x00040004);
960*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBL, 0x00000000);
961*91f16700Schasinglulu 	mmio_write_32(DBSC_DBODT0, 0x00000001);
962*91f16700Schasinglulu 	mmio_write_32(DBSC_DBADJ0, 0x00000001);
963*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
964*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICNT_0, 0x00000010);
965*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBCAMDIS, 0x00000001);
966*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW1, 0x00000046);
967*91f16700Schasinglulu 
968*91f16700Schasinglulu 	/* Select setting value in bps */
969*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
970*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST0, 0x0D050B03);
971*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST1, 0x0306030C);
972*91f16700Schasinglulu 	} else {		/* 1856Mbps */
973*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST0, 0x0C050B03);
974*91f16700Schasinglulu 		mmio_write_32(DBSC_SCFCTST1, 0x0305030C);
975*91f16700Schasinglulu 	}
976*91f16700Schasinglulu 
977*91f16700Schasinglulu 	/*
978*91f16700Schasinglulu 	 * recovery_Step1(PHY setting 1)
979*91f16700Schasinglulu 	 */
980*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A);
981*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x01840001);
982*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x0A840000);
983*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000008);	/* DDR_PLLCR */
984*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000);
985*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);	/* DDR_PGCR1 */
986*91f16700Schasinglulu 	if (byp_ctl == 1)
987*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0780C720);
988*91f16700Schasinglulu 	else
989*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700);
990*91f16700Schasinglulu 
991*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000020);	/* DDR_DXCCR */
992*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00181884);
993*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A);	/* DDR_ACIOCR0 */
994*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x33C03C10);
995*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
996*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)))
997*91f16700Schasinglulu 		;
998*91f16700Schasinglulu 
999*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000004);
1000*91f16700Schasinglulu 
1001*91f16700Schasinglulu 	/* Select setting value in bps */
1002*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
1003*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, (REFRESH_RATE * 792 / 125) -
1004*91f16700Schasinglulu 					     400 + 0x08B00000);
1005*91f16700Schasinglulu 	} else {		/* 1856Mbps */
1006*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, (REFRESH_RATE * 928 / 125) -
1007*91f16700Schasinglulu 					     400 + 0x0A300000);
1008*91f16700Schasinglulu 	}
1009*91f16700Schasinglulu 
1010*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000022);
1011*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B);
1012*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000023);
1013*91f16700Schasinglulu 
1014*91f16700Schasinglulu 	/* Select setting value in bps */
1015*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1016*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x2D9C0B66);
1017*91f16700Schasinglulu 	else			/* 1856Mbps */
1018*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x35A00D77);
1019*91f16700Schasinglulu 
1020*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000024);
1021*91f16700Schasinglulu 
1022*91f16700Schasinglulu 	/* Select setting value in bps */
1023*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1024*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x2A88B400);
1025*91f16700Schasinglulu 	else			/* 1856Mbps */
1026*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x2A8A2C28);
1027*91f16700Schasinglulu 
1028*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000025);
1029*91f16700Schasinglulu 
1030*91f16700Schasinglulu 	/* Select setting value in bps */
1031*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1032*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x30005200);
1033*91f16700Schasinglulu 	else			/* 1856Mbps */
1034*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x30005E00);
1035*91f16700Schasinglulu 
1036*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000026);
1037*91f16700Schasinglulu 
1038*91f16700Schasinglulu 	/* Select setting value in bps */
1039*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1040*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0014A9C9);
1041*91f16700Schasinglulu 	else			/* 1856Mbps */
1042*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0014CB49);
1043*91f16700Schasinglulu 
1044*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000027);
1045*91f16700Schasinglulu 
1046*91f16700Schasinglulu 	/* Select setting value in bps */
1047*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1048*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000D70);
1049*91f16700Schasinglulu 	else			/* 1856Mbps */
1050*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000F14);
1051*91f16700Schasinglulu 
1052*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000028);
1053*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000046);
1054*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000029);
1055*91f16700Schasinglulu 
1056*91f16700Schasinglulu 	/* Select setting value in bps */
1057*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
1058*91f16700Schasinglulu 		if (REFRESH_RATE > 3900)
1059*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0x18);	/* [7]SRT=0 */
1060*91f16700Schasinglulu 		else
1061*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0x98);	/* [7]SRT=1 */
1062*91f16700Schasinglulu 	} else {	/* 1856Mbps */
1063*91f16700Schasinglulu 		if (REFRESH_RATE > 3900)
1064*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0x20);	/* [7]SRT=0 */
1065*91f16700Schasinglulu 		else
1066*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, 0xA0);	/* [7]SRT=1 */
1067*91f16700Schasinglulu 	}
1068*91f16700Schasinglulu 
1069*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
1070*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003047);
1071*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000091);
1072*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
1073*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000095);
1074*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BBAD);
1075*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000099);
1076*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
1077*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);	/* DDR_DSGCR */
1078*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E);
1079*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1080*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1081*91f16700Schasinglulu 		;
1082*91f16700Schasinglulu 
1083*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1084*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x40010000);
1085*91f16700Schasinglulu 
1086*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1087*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1088*91f16700Schasinglulu 		;
1089*91f16700Schasinglulu 
1090*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000092);	/* DDR_ZQ0DR */
1091*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC2C59AB5);
1092*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000096);	/* DDR_ZQ1DR */
1093*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC4285FBF);
1094*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000009A);	/* DDR_ZQ2DR */
1095*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC2C59AB5);
1096*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);	/* DDR_ZQCR */
1097*91f16700Schasinglulu 
1098*91f16700Schasinglulu 	/* Select setting value in bps */
1099*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1100*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900);
1101*91f16700Schasinglulu 	else			/* 1856Mbps */
1102*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0C058A00);
1103*91f16700Schasinglulu 
1104*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);	/* DDR_ZQCR */
1105*91f16700Schasinglulu 
1106*91f16700Schasinglulu 	/* Select setting value in bps */
1107*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1108*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
1109*91f16700Schasinglulu 	else			/* 1856Mbps */
1110*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00);
1111*91f16700Schasinglulu 
1112*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1113*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00050001);
1114*91f16700Schasinglulu 
1115*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1116*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1117*91f16700Schasinglulu 		;
1118*91f16700Schasinglulu 
1119*91f16700Schasinglulu 	/* ddr backupmode end */
1120*91f16700Schasinglulu 	if (ddr_backup)
1121*91f16700Schasinglulu 		NOTICE("BL2: [WARM_BOOT]\n");
1122*91f16700Schasinglulu 	else
1123*91f16700Schasinglulu 		NOTICE("BL2: [COLD_BOOT]\n");
1124*91f16700Schasinglulu 
1125*91f16700Schasinglulu 	err = rcar_dram_update_boot_status(ddr_backup);
1126*91f16700Schasinglulu 	if (err) {
1127*91f16700Schasinglulu 		NOTICE("BL2: [BOOT_STATUS_UPDATE_ERROR]\n");
1128*91f16700Schasinglulu 		return INITDRAM_ERR_I;
1129*91f16700Schasinglulu 	}
1130*91f16700Schasinglulu 
1131*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000092);	/* DDR_ZQ0DR */
1132*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x02C59AB5);
1133*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000096);	/* DDR_ZQ1DR */
1134*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04285FBF);
1135*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000009A);	/* DDR_ZQ2DR */
1136*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x02C59AB5);
1137*91f16700Schasinglulu 
1138*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1139*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x08000000);
1140*91f16700Schasinglulu 
1141*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1142*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000003);
1143*91f16700Schasinglulu 
1144*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1145*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1146*91f16700Schasinglulu 		;
1147*91f16700Schasinglulu 
1148*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1149*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x80010000);
1150*91f16700Schasinglulu 
1151*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1152*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1153*91f16700Schasinglulu 		;
1154*91f16700Schasinglulu 
1155*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1156*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010073);
1157*91f16700Schasinglulu 
1158*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1159*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1160*91f16700Schasinglulu 		;
1161*91f16700Schasinglulu 
1162*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);	/* DDR_ZQCR */
1163*91f16700Schasinglulu 
1164*91f16700Schasinglulu 	/* Select setting value in bps */
1165*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1166*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900);
1167*91f16700Schasinglulu 	else			/* 1856Mbps */
1168*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0C058A00);
1169*91f16700Schasinglulu 
1170*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);	/* DDR_ZQCR */
1171*91f16700Schasinglulu 
1172*91f16700Schasinglulu 	/* Select setting value in bps */
1173*91f16700Schasinglulu 	if (ddr_md == 0)	/* 1584Mbps */
1174*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
1175*91f16700Schasinglulu 	else			/* 1856Mbps */
1176*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00);
1177*91f16700Schasinglulu 
1178*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000000C);
1179*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x18000040);
1180*91f16700Schasinglulu 
1181*91f16700Schasinglulu 	/*
1182*91f16700Schasinglulu 	 * recovery_Step2(PHY setting 2)
1183*91f16700Schasinglulu 	 */
1184*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1185*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1186*91f16700Schasinglulu 		;
1187*91f16700Schasinglulu 
1188*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7);
1189*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1190*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8);
1191*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1192*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9);
1193*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
1194*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7);
1195*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1196*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8);
1197*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1198*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9);
1199*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
1200*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E7);
1201*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1202*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E8);
1203*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1204*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E9);
1205*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
1206*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000107);
1207*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1208*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000108);
1209*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
1210*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000109);
1211*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
1212*91f16700Schasinglulu 
1213*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCALCNF, (64000000 / REFRESH_RATE) + 0x01000000);
1214*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010);
1215*91f16700Schasinglulu 
1216*91f16700Schasinglulu 	/* Select setting value in bps */
1217*91f16700Schasinglulu 	if (ddr_md == 0) {	/* 1584Mbps */
1218*91f16700Schasinglulu 		mmio_write_32(DBSC_DBRFCNF1,
1219*91f16700Schasinglulu 			      (REFRESH_RATE * 99 / 125) + 0x00080000);
1220*91f16700Schasinglulu 	} else {			/* 1856Mbps */
1221*91f16700Schasinglulu 		mmio_write_32(DBSC_DBRFCNF1,
1222*91f16700Schasinglulu 			      (REFRESH_RATE * 116 / 125) + 0x00080000);
1223*91f16700Schasinglulu 	}
1224*91f16700Schasinglulu 
1225*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
1226*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFEN, 0x00000001);
1227*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x0A840001);
1228*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBWAIT) & BIT(0))
1229*91f16700Schasinglulu 		;
1230*91f16700Schasinglulu 
1231*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x00000000);
1232*91f16700Schasinglulu 
1233*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x04840010);
1234*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBWAIT) & BIT(0))
1235*91f16700Schasinglulu 		;
1236*91f16700Schasinglulu 
1237*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1238*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1239*91f16700Schasinglulu 		;
1240*91f16700Schasinglulu 
1241*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);	/* DDR_PIR */
1242*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010701);
1243*91f16700Schasinglulu 
1244*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);	/* DDR_PGSR0 */
1245*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1246*91f16700Schasinglulu 		;
1247*91f16700Schasinglulu 
1248*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
1249*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
1250*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8;
1251*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
1252*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
1253*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
1254*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
1255*91f16700Schasinglulu 
1256*91f16700Schasinglulu 		if (r6 > 0) {
1257*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1258*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
1259*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1260*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
1261*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1262*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
1263*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1264*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r6);
1265*91f16700Schasinglulu 		} else {
1266*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1267*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
1268*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1269*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r7);
1270*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1271*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
1272*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1273*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0,
1274*91f16700Schasinglulu 				      r2 | ((r6 + (r5 << 1)) & 0xFF));
1275*91f16700Schasinglulu 		}
1276*91f16700Schasinglulu 	}
1277*91f16700Schasinglulu 
1278*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
1279*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00C0);
1280*91f16700Schasinglulu 
1281*91f16700Schasinglulu 	if (pdqsr_ctl == 0) {
1282*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1283*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1284*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1285*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1286*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1287*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1288*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1289*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1290*91f16700Schasinglulu 	}
1291*91f16700Schasinglulu 
1292*91f16700Schasinglulu 	/* PDR always off */
1293*91f16700Schasinglulu 	if (pdr_ctl == 1) {
1294*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
1295*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1296*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
1297*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1298*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
1299*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1300*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
1301*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1302*91f16700Schasinglulu 	}
1303*91f16700Schasinglulu 
1304*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1305*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010801);
1306*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1307*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1308*91f16700Schasinglulu 		;
1309*91f16700Schasinglulu 
1310*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
1311*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00D8);
1312*91f16700Schasinglulu 
1313*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1314*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00011001);
1315*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1316*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1317*91f16700Schasinglulu 		;
1318*91f16700Schasinglulu 
1319*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
1320*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1321*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1322*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1323*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1324*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1325*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1326*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1327*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1328*91f16700Schasinglulu 	}
1329*91f16700Schasinglulu 
1330*91f16700Schasinglulu 	/* PDR dynamic */
1331*91f16700Schasinglulu 	if (pdr_ctl == 1) {
1332*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
1333*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1334*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
1335*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1336*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
1337*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1338*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
1339*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1340*91f16700Schasinglulu 	}
1341*91f16700Schasinglulu 
1342*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1343*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00012001);
1344*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1345*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1346*91f16700Schasinglulu 		;
1347*91f16700Schasinglulu 
1348*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
1349*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1350*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1351*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1352*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1353*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1354*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1355*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1356*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1357*91f16700Schasinglulu 	}
1358*91f16700Schasinglulu 
1359*91f16700Schasinglulu 	/* PDR always off */
1360*91f16700Schasinglulu 	if (pdr_ctl == 1) {
1361*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
1362*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1363*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
1364*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1365*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
1366*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1367*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
1368*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1369*91f16700Schasinglulu 	}
1370*91f16700Schasinglulu 
1371*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1372*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00014001);
1373*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1374*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1375*91f16700Schasinglulu 		;
1376*91f16700Schasinglulu 
1377*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
1378*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1379*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1380*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1381*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1382*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1383*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1384*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1385*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1386*91f16700Schasinglulu 	}
1387*91f16700Schasinglulu 
1388*91f16700Schasinglulu 	/* PDR dynamic */
1389*91f16700Schasinglulu 	if (pdr_ctl == 1) {
1390*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
1391*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1392*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
1393*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1394*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
1395*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1396*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
1397*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1398*91f16700Schasinglulu 	}
1399*91f16700Schasinglulu 
1400*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1401*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00018001);
1402*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1403*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1404*91f16700Schasinglulu 		;
1405*91f16700Schasinglulu 
1406*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1407*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1408*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1409*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1410*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1411*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1412*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1413*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
1414*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
1415*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003087);
1416*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1417*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010401);
1418*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1419*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1420*91f16700Schasinglulu 		;
1421*91f16700Schasinglulu 
1422*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
1423*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
1424*91f16700Schasinglulu 		r5 = ((mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8);
1425*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
1426*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
1427*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
1428*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
1429*91f16700Schasinglulu 		r12 = r5 >> 0x2;
1430*91f16700Schasinglulu 
1431*91f16700Schasinglulu 		if (r12 < r6) {
1432*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1433*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
1434*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1435*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
1436*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1437*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
1438*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1439*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 - r12) & 0xFF));
1440*91f16700Schasinglulu 		} else {
1441*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1442*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
1443*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1444*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | (r7 & 0x7));
1445*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1446*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
1447*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1448*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0,
1449*91f16700Schasinglulu 				      r2 |
1450*91f16700Schasinglulu 				      ((r6 + r5 + (r5 >> 1) + r12) & 0xFF));
1451*91f16700Schasinglulu 		}
1452*91f16700Schasinglulu 	}
1453*91f16700Schasinglulu 
1454*91f16700Schasinglulu 	if (pdqsr_ctl == 0) {
1455*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1456*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1457*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1458*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1459*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1460*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1461*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1462*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1463*91f16700Schasinglulu 	}
1464*91f16700Schasinglulu 
1465*91f16700Schasinglulu 	/* PDR always off */
1466*91f16700Schasinglulu 	if (pdr_ctl == 1) {
1467*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
1468*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1469*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
1470*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1471*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
1472*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1473*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
1474*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000008);
1475*91f16700Schasinglulu 	}
1476*91f16700Schasinglulu 
1477*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
1478*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00015001);
1479*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
1480*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
1481*91f16700Schasinglulu 		;
1482*91f16700Schasinglulu 
1483*91f16700Schasinglulu 	if (lcdl_ctl == 1) {
1484*91f16700Schasinglulu 		for (i = 0; i < 4; i++) {
1485*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0x000000B0 + i * 0x20);
1486*91f16700Schasinglulu 			dqsgd_0c = mmio_read_32(DBSC_DBPDRGD_0) & 0x000000FF;
1487*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0x000000B1 + i * 0x20);
1488*91f16700Schasinglulu 			bdlcount_0c = (mmio_read_32(DBSC_DBPDRGD_0) &
1489*91f16700Schasinglulu 					0x0000FF00) >> 8;
1490*91f16700Schasinglulu 			bdlcount_0c_div2 = (bdlcount_0c >> 1);
1491*91f16700Schasinglulu 			bdlcount_0c_div4 = (bdlcount_0c >> 2);
1492*91f16700Schasinglulu 			bdlcount_0c_div8 = (bdlcount_0c >> 3);
1493*91f16700Schasinglulu 			bdlcount_0c_div16 = (bdlcount_0c >> 4);
1494*91f16700Schasinglulu 
1495*91f16700Schasinglulu 			if (ddr_md == 0) {	/* 1584Mbps */
1496*91f16700Schasinglulu 				lcdl_judge1 = bdlcount_0c_div2 +
1497*91f16700Schasinglulu 					      bdlcount_0c_div4 +
1498*91f16700Schasinglulu 					      bdlcount_0c_div8;
1499*91f16700Schasinglulu 				lcdl_judge2 = bdlcount_0c +
1500*91f16700Schasinglulu 					      bdlcount_0c_div4 +
1501*91f16700Schasinglulu 					      bdlcount_0c_div16;
1502*91f16700Schasinglulu 			} else {	/* 1856Mbps */
1503*91f16700Schasinglulu 				lcdl_judge1 = bdlcount_0c_div2 +
1504*91f16700Schasinglulu 					      bdlcount_0c_div4;
1505*91f16700Schasinglulu 				lcdl_judge2 = bdlcount_0c +
1506*91f16700Schasinglulu 					      bdlcount_0c_div4;
1507*91f16700Schasinglulu 			}
1508*91f16700Schasinglulu 
1509*91f16700Schasinglulu 			if (dqsgd_0c <= lcdl_judge1)
1510*91f16700Schasinglulu 				continue;
1511*91f16700Schasinglulu 
1512*91f16700Schasinglulu 			if (dqsgd_0c <= lcdl_judge2) {
1513*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1514*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
1515*91f16700Schasinglulu 						0xFFFFFF00;
1516*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0,
1517*91f16700Schasinglulu 					      (dqsgd_0c - bdlcount_0c_div8) |
1518*91f16700Schasinglulu 					      regval);
1519*91f16700Schasinglulu 			} else {
1520*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
1521*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
1522*91f16700Schasinglulu 						0xFFFFFF00;
1523*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval);
1524*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1525*91f16700Schasinglulu 				gatesl_0c = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
1526*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
1527*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
1528*91f16700Schasinglulu 						0xFFFFFFF8;
1529*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0,
1530*91f16700Schasinglulu 					      regval | (gatesl_0c + 1));
1531*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAF + i * 0x20);
1532*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0);
1533*91f16700Schasinglulu 				rdqsd_0c = (regval & 0xFF00) >> 8;
1534*91f16700Schasinglulu 				rdqsnd_0c = (regval & 0xFF0000) >> 16;
1535*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAF + i * 0x20);
1536*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0,
1537*91f16700Schasinglulu 					      (regval & 0xFF0000FF) |
1538*91f16700Schasinglulu 					      ((rdqsd_0c +
1539*91f16700Schasinglulu 						bdlcount_0c_div4) << 8) |
1540*91f16700Schasinglulu 					      ((rdqsnd_0c +
1541*91f16700Schasinglulu 						bdlcount_0c_div4) << 16));
1542*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAA + i * 0x20);
1543*91f16700Schasinglulu 				regval = (mmio_read_32(DBSC_DBPDRGD_0));
1544*91f16700Schasinglulu 				rbd_0c[0] = (regval) & 0x1f;
1545*91f16700Schasinglulu 				rbd_0c[1] = (regval >>  8) & 0x1f;
1546*91f16700Schasinglulu 				rbd_0c[2] = (regval >> 16) & 0x1f;
1547*91f16700Schasinglulu 				rbd_0c[3] = (regval >> 24) & 0x1f;
1548*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAA + i * 0x20);
1549*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
1550*91f16700Schasinglulu 						0xE0E0E0E0;
1551*91f16700Schasinglulu 				for (j = 0; j < 4; j++) {
1552*91f16700Schasinglulu 					rbd_0c[j] = rbd_0c[j] +
1553*91f16700Schasinglulu 						    bdlcount_0c_div4;
1554*91f16700Schasinglulu 					if (rbd_0c[j] > 0x1F)
1555*91f16700Schasinglulu 						rbd_0c[j] = 0x1F;
1556*91f16700Schasinglulu 					regval = regval | (rbd_0c[j] << 8 * j);
1557*91f16700Schasinglulu 				}
1558*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval);
1559*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAB + i * 0x20);
1560*91f16700Schasinglulu 				regval = (mmio_read_32(DBSC_DBPDRGD_0));
1561*91f16700Schasinglulu 				rbd_0c[0] = regval & 0x1f;
1562*91f16700Schasinglulu 				rbd_0c[1] = (regval >> 8) & 0x1f;
1563*91f16700Schasinglulu 				rbd_0c[2] = (regval >> 16) & 0x1f;
1564*91f16700Schasinglulu 				rbd_0c[3] = (regval >> 24) & 0x1f;
1565*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGA_0, 0xAB + i * 0x20);
1566*91f16700Schasinglulu 				regval = mmio_read_32(DBSC_DBPDRGD_0) &
1567*91f16700Schasinglulu 						0xE0E0E0E0;
1568*91f16700Schasinglulu 				for (j = 0; j < 4; j++) {
1569*91f16700Schasinglulu 					rbd_0c[j] = rbd_0c[j] +
1570*91f16700Schasinglulu 						    bdlcount_0c_div4;
1571*91f16700Schasinglulu 					if (rbd_0c[j] > 0x1F)
1572*91f16700Schasinglulu 						rbd_0c[j] = 0x1F;
1573*91f16700Schasinglulu 					regval = regval | (rbd_0c[j] << 8 * j);
1574*91f16700Schasinglulu 				}
1575*91f16700Schasinglulu 				mmio_write_32(DBSC_DBPDRGD_0, regval);
1576*91f16700Schasinglulu 			}
1577*91f16700Schasinglulu 		}
1578*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000002);
1579*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x07D81E37);
1580*91f16700Schasinglulu 	}
1581*91f16700Schasinglulu 
1582*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
1583*91f16700Schasinglulu 	if (byp_ctl == 1)
1584*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0380C720);
1585*91f16700Schasinglulu 	else
1586*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700);
1587*91f16700Schasinglulu 
1588*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
1589*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))
1590*91f16700Schasinglulu 		;
1591*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
1592*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E);
1593*91f16700Schasinglulu 
1594*91f16700Schasinglulu 	/*
1595*91f16700Schasinglulu 	 * recovery_Step3(DBSC Setting 2)
1596*91f16700Schasinglulu 	 */
1597*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
1598*91f16700Schasinglulu 	mmio_write_32(DBSC_DBACEN, 0x00000001);
1599*91f16700Schasinglulu 
1600*91f16700Schasinglulu 	if (pdqsr_ctl == 1) {
1601*91f16700Schasinglulu 		mmio_write_32(0xE67F0018, 0x00000001);
1602*91f16700Schasinglulu 		regval = mmio_read_32(0x40000000);
1603*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000000);
1604*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, regval);
1605*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
1606*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1607*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
1608*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1609*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
1610*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1611*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
1612*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
1613*91f16700Schasinglulu 	}
1614*91f16700Schasinglulu 
1615*91f16700Schasinglulu 	/* PDR dynamic */
1616*91f16700Schasinglulu 	if (pdr_ctl == 1) {
1617*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000A3);
1618*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1619*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000C3);
1620*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1621*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x000000E3);
1622*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1623*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0x00000103);
1624*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000000);
1625*91f16700Schasinglulu 	}
1626*91f16700Schasinglulu 
1627*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x00000000);
1628*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
1629*91f16700Schasinglulu 
1630*91f16700Schasinglulu #ifdef ddr_qos_init_setting /* only for non qos_init */
1631*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
1632*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218);
1633*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4);
1634*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037);
1635*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
1636*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW0, 0x22421111);
1637*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST2, 0x012F1123);
1638*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00);
1639*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00);
1640*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS02, 0x00000000);
1641*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS03, 0x00000000);
1642*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS40, 0x00000300);
1643*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0);
1644*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS42, 0x00000200);
1645*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS43, 0x00000100);
1646*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS90, 0x00000100);
1647*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS91, 0x000000F0);
1648*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS92, 0x000000A0);
1649*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS93, 0x00000040);
1650*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS130, 0x00000100);
1651*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0);
1652*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0);
1653*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS133, 0x00000040);
1654*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0);
1655*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0);
1656*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS142, 0x00000080);
1657*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS143, 0x00000040);
1658*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS150, 0x00000040);
1659*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS151, 0x00000030);
1660*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS152, 0x00000020);
1661*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS153, 0x00000010);
1662*91f16700Schasinglulu 
1663*91f16700Schasinglulu 	if (pdqsr_ctl == 0)
1664*91f16700Schasinglulu 		mmio_write_32(0xE67F0018, 0x00000001);
1665*91f16700Schasinglulu 
1666*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
1667*91f16700Schasinglulu #endif
1668*91f16700Schasinglulu 
1669*91f16700Schasinglulu 	return 1;
1670*91f16700Schasinglulu 
1671*91f16700Schasinglulu } /* recovery_from_backup_mode */
1672*91f16700Schasinglulu 
1673*91f16700Schasinglulu /*
1674*91f16700Schasinglulu  * init_ddr : MD19=0,DDR3L,1584Mbps / MD19=1,DDR3L,1856Mbps
1675*91f16700Schasinglulu  */
1676*91f16700Schasinglulu 
1677*91f16700Schasinglulu /*
1678*91f16700Schasinglulu  * DDR Initialize entry for IPL
1679*91f16700Schasinglulu  */
1680*91f16700Schasinglulu int32_t rcar_dram_init(void)
1681*91f16700Schasinglulu {
1682*91f16700Schasinglulu 	uint32_t dataL;
1683*91f16700Schasinglulu 	uint32_t failcount;
1684*91f16700Schasinglulu 	uint32_t md = 0;
1685*91f16700Schasinglulu 	uint32_t ddr = 0;
1686*91f16700Schasinglulu 	uint32_t ddr_backup;
1687*91f16700Schasinglulu 
1688*91f16700Schasinglulu 	md = *((volatile uint32_t*)RST_MODEMR);
1689*91f16700Schasinglulu 	ddr = (md & 0x00080000) >> 19;
1690*91f16700Schasinglulu 	if (ddr == 0x0)
1691*91f16700Schasinglulu 		NOTICE("BL2: DDR1584(%s)\n", RCAR_E3_DDR_VERSION);
1692*91f16700Schasinglulu 	else if (ddr == 0x1)
1693*91f16700Schasinglulu 		NOTICE("BL2: DDR1856(%s)\n", RCAR_E3_DDR_VERSION);
1694*91f16700Schasinglulu 
1695*91f16700Schasinglulu 	rcar_dram_get_boot_status(&ddr_backup);
1696*91f16700Schasinglulu 
1697*91f16700Schasinglulu 	if (ddr_backup == DRAM_BOOT_STATUS_WARM)
1698*91f16700Schasinglulu 		dataL = recovery_from_backup_mode(ddr_backup);	/* WARM boot */
1699*91f16700Schasinglulu 	else
1700*91f16700Schasinglulu 		dataL = init_ddr();				/* COLD boot */
1701*91f16700Schasinglulu 
1702*91f16700Schasinglulu 	if (dataL == 1)
1703*91f16700Schasinglulu 		failcount = 0;
1704*91f16700Schasinglulu 	else
1705*91f16700Schasinglulu 		failcount = 1;
1706*91f16700Schasinglulu 
1707*91f16700Schasinglulu 	if (failcount == 0)
1708*91f16700Schasinglulu 		return INITDRAM_OK;
1709*91f16700Schasinglulu 	else
1710*91f16700Schasinglulu 		return INITDRAM_NG;
1711*91f16700Schasinglulu 
1712*91f16700Schasinglulu }
1713