xref: /arm-trusted-firmware/drivers/renesas/common/ddr/ddr_a/ddr_init_d3.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2021, 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 <stdint.h>
9*91f16700Schasinglulu #include <lib/mmio.h>
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include "rcar_def.h"
12*91f16700Schasinglulu #include "../ddr_regs.h"
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #define RCAR_DDR_VERSION	"rev.0.02"
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /* Average periodic refresh interval[ns]. Support 3900,7800 */
17*91f16700Schasinglulu #define REFRESH_RATE  3900
18*91f16700Schasinglulu 
19*91f16700Schasinglulu 
20*91f16700Schasinglulu #if RCAR_LSI != RCAR_D3
21*91f16700Schasinglulu #error "Don't have DDR initialize routine."
22*91f16700Schasinglulu #endif
23*91f16700Schasinglulu 
24*91f16700Schasinglulu static void init_ddr_d3_1866(void)
25*91f16700Schasinglulu {
26*91f16700Schasinglulu 	uint32_t i, r2, r3, r5, r6, r7, r12;
27*91f16700Schasinglulu 
28*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
29*91f16700Schasinglulu 	mmio_write_32(DBSC_DBKIND, 0x00000007);
30*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a01);
31*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPHYCONF0, 0x00000001);
32*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR0, 0x0000000D);
33*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR1, 0x00000009);
34*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR2, 0x00000000);
35*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR3, 0x0000000D);
36*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR4, 0x000D000D);
37*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR5, 0x0000002D);
38*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR6, 0x00000020);
39*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR7, 0x00060006);
40*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR8, 0x00000021);
41*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR9, 0x00000007);
42*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR10, 0x0000000E);
43*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR11, 0x0000000C);
44*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR12, 0x00140014);
45*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR13, 0x000000F2);
46*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR14, 0x00170006);
47*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR15, 0x00060005);
48*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR16, 0x09210507);
49*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR17, 0x040E0000);
50*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR18, 0x00000200);
51*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR19, 0x0129004B);
52*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR20, 0x020000FB);
53*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR21, 0x00040004);
54*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBL, 0x00000000);
55*91f16700Schasinglulu 	mmio_write_32(DBSC_DBODT0, 0x00000001);
56*91f16700Schasinglulu 	mmio_write_32(DBSC_DBADJ0, 0x00000001);
57*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
58*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICNT_0, 0x00000010);
59*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBCAMDIS, 0x00000001);
60*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW1, 0x00000046);
61*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST0, 0x0C050B03);
62*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST1, 0x0305030C);
63*91f16700Schasinglulu 
64*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A);
65*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x01000001);
66*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08000000);
67*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
68*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x80010000);
69*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
70*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
71*91f16700Schasinglulu 		;
72*91f16700Schasinglulu 
73*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000008);
74*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000);
75*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
76*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058A04);
77*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000091);
78*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
79*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000095);
80*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BBAD);
81*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000099);
82*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
83*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
84*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00);
85*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
86*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E);
87*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
88*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010073);
89*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
90*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
91*91f16700Schasinglulu 		;
92*91f16700Schasinglulu 
93*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
94*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0C058A00);
95*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
96*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058A00);
97*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
98*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
99*91f16700Schasinglulu 		;
100*91f16700Schasinglulu 
101*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
102*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700);
103*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
104*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)))
105*91f16700Schasinglulu 		;
106*91f16700Schasinglulu 
107*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000004);
108*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0,
109*91f16700Schasinglulu 		(uint32_t) (REFRESH_RATE * 928 / 125) - 400
110*91f16700Schasinglulu 			+ 0x0A300000);
111*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000022);
112*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B);
113*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000023);
114*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x35A00D77);
115*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000024);
116*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x2A8A2C28);
117*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000025);
118*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x30005E00);
119*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000026);
120*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0014CB49);
121*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000027);
122*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000F14);
123*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000028);
124*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000046);
125*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000029);
126*91f16700Schasinglulu 	if (REFRESH_RATE > 3900) {
127*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000020);
128*91f16700Schasinglulu 	} else {
129*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x000000A0);
130*91f16700Schasinglulu 	}
131*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
132*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003047);
133*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000020);
134*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00181884);
135*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A);
136*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x33C03C10);
137*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
138*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
139*91f16700Schasinglulu 		;
140*91f16700Schasinglulu 
141*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7);
142*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
143*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8);
144*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
145*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9);
146*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
147*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7);
148*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
149*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8);
150*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
151*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9);
152*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
153*91f16700Schasinglulu 
154*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000000E);
155*91f16700Schasinglulu 	r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0x0000FF00) >> 0x9;
156*91f16700Schasinglulu 	r3 = (r2 << 16) + (r2 << 8) + r2;
157*91f16700Schasinglulu 	r6 = (r2 << 24) + (r2 << 16) + (r2 << 8) + r2;
158*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000011);
159*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r3);
160*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000012);
161*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r3);
162*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000016);
163*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
164*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000017);
165*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
166*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000018);
167*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
168*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000019);
169*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
170*91f16700Schasinglulu 
171*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
172*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010181);
173*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08000001);
174*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
175*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
176*91f16700Schasinglulu 		;
177*91f16700Schasinglulu 
178*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
179*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010601);
180*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
181*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
182*91f16700Schasinglulu 		;
183*91f16700Schasinglulu 
184*91f16700Schasinglulu 	for (i = 0; i < 2; i++) {
185*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
186*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8;
187*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
188*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
189*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
190*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
191*91f16700Schasinglulu 
192*91f16700Schasinglulu 		if (r6 > 0) {
193*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
194*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
195*91f16700Schasinglulu 
196*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
197*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
198*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
199*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
200*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
201*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r6);
202*91f16700Schasinglulu 		} else {
203*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
204*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
205*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
206*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r7);
207*91f16700Schasinglulu 
208*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
209*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
210*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
211*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
212*91f16700Schasinglulu 						     ((r6 + (r5 << 1)) & 0xFF));
213*91f16700Schasinglulu 		}
214*91f16700Schasinglulu 	}
215*91f16700Schasinglulu 
216*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
217*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00C0);
218*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
219*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
220*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
221*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
222*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
223*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010801);
224*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
225*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
226*91f16700Schasinglulu 		;
227*91f16700Schasinglulu 
228*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
229*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00D8);
230*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
231*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0001F001);
232*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
233*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
234*91f16700Schasinglulu 		;
235*91f16700Schasinglulu 
236*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF);
237*91f16700Schasinglulu 	r2 = mmio_read_32(DBSC_DBPDRGD_0);
238*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF);
239*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00));
240*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF);
241*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF);
242*91f16700Schasinglulu 	r2 = mmio_read_32(DBSC_DBPDRGD_0);
243*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00));
244*91f16700Schasinglulu 
245*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
246*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
247*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
248*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
249*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
250*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003087);
251*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
252*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010401);
253*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
254*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
255*91f16700Schasinglulu 		;
256*91f16700Schasinglulu 
257*91f16700Schasinglulu 	for (i = 0; i < 2; i++) {
258*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
259*91f16700Schasinglulu 		r5 = ((mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8);
260*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
261*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
262*91f16700Schasinglulu 
263*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
264*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
265*91f16700Schasinglulu 		r12 = (r5 >> 0x2);
266*91f16700Schasinglulu 
267*91f16700Schasinglulu 		if (r12 < r6) {
268*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
269*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
270*91f16700Schasinglulu 
271*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
272*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
273*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
274*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
275*91f16700Schasinglulu 
276*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
277*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 - r12) & 0xFF));
278*91f16700Schasinglulu 		} else {
279*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
280*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
281*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
282*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | (r7 & 0x7));
283*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
284*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
285*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
286*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
287*91f16700Schasinglulu 						     ((r6 + r5 +
288*91f16700Schasinglulu 						      (r5 >> 1) + r12) & 0xFF));
289*91f16700Schasinglulu 		}
290*91f16700Schasinglulu 	}
291*91f16700Schasinglulu 
292*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
293*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
294*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
295*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
296*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
297*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00015001);
298*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
299*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
300*91f16700Schasinglulu 		;
301*91f16700Schasinglulu 
302*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
303*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700);
304*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
305*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))
306*91f16700Schasinglulu 		;
307*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
308*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E);
309*91f16700Schasinglulu 
310*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010);
311*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCALCNF,
312*91f16700Schasinglulu 		(uint32_t) (64000000 / REFRESH_RATE) + 0x01000000);
313*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF1,
314*91f16700Schasinglulu 		(uint32_t) (REFRESH_RATE * 116 / 125) + 0x00080000);
315*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
316*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
317*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFEN, 0x00000001);
318*91f16700Schasinglulu 	mmio_write_32(DBSC_DBACEN, 0x00000001);
319*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x00000000);
320*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
321*91f16700Schasinglulu 
322*91f16700Schasinglulu #ifdef ddr_qos_init_setting // only for non qos_init
323*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
324*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218);
325*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4);
326*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037);
327*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
328*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW0, 0x22421111);
329*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST2, 0x012F1123);
330*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00);
331*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00);
332*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS02, 0x00000000);
333*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS03, 0x00000000);
334*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS40, 0x00000300);
335*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0);
336*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS42, 0x00000200);
337*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS43, 0x00000100);
338*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS90, 0x00000300);
339*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS91, 0x000002F0);
340*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS92, 0x00000200);
341*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS93, 0x00000100);
342*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS130, 0x00000100);
343*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0);
344*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0);
345*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS133, 0x00000040);
346*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0);
347*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0);
348*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS142, 0x00000080);
349*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS143, 0x00000040);
350*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS150, 0x00000040);
351*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS151, 0x00000030);
352*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS152, 0x00000020);
353*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS153, 0x00000010);
354*91f16700Schasinglulu 	mmio_write_32(0xE67F0018, 0x00000001);
355*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
356*91f16700Schasinglulu #endif
357*91f16700Schasinglulu }
358*91f16700Schasinglulu 
359*91f16700Schasinglulu static void init_ddr_d3_1600(void)
360*91f16700Schasinglulu {
361*91f16700Schasinglulu 	uint32_t i, r2, r3, r5, r6, r7, r12;
362*91f16700Schasinglulu 
363*91f16700Schasinglulu 	mmio_write_32(CPG_CPGWPR, 0x5A5AFFFF);
364*91f16700Schasinglulu 	mmio_write_32(CPG_CPGWPCR, 0xA5A50000);
365*91f16700Schasinglulu 
366*91f16700Schasinglulu 	mmio_write_32(CPG_SRCR4, 0x20000000);
367*91f16700Schasinglulu 
368*91f16700Schasinglulu 	mmio_write_32(0xE61500DC, 0xe2200000);
369*91f16700Schasinglulu 	while (!(mmio_read_32(CPG_PLLECR) & BIT(11)))
370*91f16700Schasinglulu 		;
371*91f16700Schasinglulu 
372*91f16700Schasinglulu 	mmio_write_32(CPG_SRSTCLR4, 0x20000000);
373*91f16700Schasinglulu 
374*91f16700Schasinglulu 	mmio_write_32(CPG_CPGWPCR, 0xA5A50001);
375*91f16700Schasinglulu 
376*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
377*91f16700Schasinglulu 	mmio_write_32(DBSC_DBKIND, 0x00000007);
378*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a01);
379*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPHYCONF0, 0x00000001);
380*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR0, 0x0000000B);
381*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR1, 0x00000008);
382*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR2, 0x00000000);
383*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR3, 0x0000000B);
384*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR4, 0x000B000B);
385*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR5, 0x00000027);
386*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR6, 0x0000001C);
387*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR7, 0x00060006);
388*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR8, 0x00000020);
389*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR9, 0x00000006);
390*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR10, 0x0000000C);
391*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR11, 0x0000000A);
392*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR12, 0x00120012);
393*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR13, 0x000000CE);
394*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR14, 0x00140005);
395*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR15, 0x00050004);
396*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR16, 0x071F0305);
397*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR17, 0x040C0000);
398*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR18, 0x00000200);
399*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR19, 0x01000040);
400*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR20, 0x020000D6);
401*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR21, 0x00040004);
402*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBL, 0x00000000);
403*91f16700Schasinglulu 	mmio_write_32(DBSC_DBODT0, 0x00000001);
404*91f16700Schasinglulu 	mmio_write_32(DBSC_DBADJ0, 0x00000001);
405*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
406*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICNT_0, 0x00000010);
407*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBCAMDIS, 0x00000001);
408*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW1, 0x00000046);
409*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST0, 0x0D050B03);
410*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST1, 0x0306030C);
411*91f16700Schasinglulu 
412*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A);
413*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x01000001);
414*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08000000);
415*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
416*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x80010000);
417*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
418*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
419*91f16700Schasinglulu 		;
420*91f16700Schasinglulu 
421*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000008);
422*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000);
423*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
424*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058904);
425*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000091);
426*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
427*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000095);
428*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BBAD);
429*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000099);
430*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
431*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
432*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
433*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
434*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E);
435*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
436*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010073);
437*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
438*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
439*91f16700Schasinglulu 		;
440*91f16700Schasinglulu 
441*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
442*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900);
443*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
444*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
445*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
446*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
447*91f16700Schasinglulu 		;
448*91f16700Schasinglulu 
449*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
450*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700);
451*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
452*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)))
453*91f16700Schasinglulu 		;
454*91f16700Schasinglulu 
455*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000004);
456*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0,
457*91f16700Schasinglulu 		(uint32_t) (REFRESH_RATE * 792 / 125) - 400 + 0x08B00000);
458*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000022);
459*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B);
460*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000023);
461*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x2D9C0B66);
462*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000024);
463*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x2A88B400);
464*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000025);
465*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x30005200);
466*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000026);
467*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0014A9C9);
468*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000027);
469*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000D70);
470*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000028);
471*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000046);
472*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000029);
473*91f16700Schasinglulu 	if (REFRESH_RATE > 3900) {
474*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000018);
475*91f16700Schasinglulu 	} else {
476*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGD_0, 0x00000098);
477*91f16700Schasinglulu 	}
478*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
479*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003047);
480*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000020);
481*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00181884);
482*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A);
483*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x33C03C10);
484*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
485*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
486*91f16700Schasinglulu 		;
487*91f16700Schasinglulu 
488*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7);
489*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
490*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8);
491*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
492*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9);
493*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
494*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7);
495*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
496*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8);
497*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
498*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9);
499*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
500*91f16700Schasinglulu 
501*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000000E);
502*91f16700Schasinglulu 	r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0x0000FF00) >> 0x9;
503*91f16700Schasinglulu 	r3 = (r2 << 16) + (r2 << 8) + r2;
504*91f16700Schasinglulu 	r6 = (r2 << 24) + (r2 << 16) + (r2 << 8) + r2;
505*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000011);
506*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r3);
507*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000012);
508*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r3);
509*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000016);
510*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
511*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000017);
512*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
513*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000018);
514*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
515*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000019);
516*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, r6);
517*91f16700Schasinglulu 
518*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
519*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010181);
520*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08000001);
521*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
522*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
523*91f16700Schasinglulu 		;
524*91f16700Schasinglulu 
525*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
526*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010601);
527*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
528*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
529*91f16700Schasinglulu 		;
530*91f16700Schasinglulu 
531*91f16700Schasinglulu 	for (i = 0; i < 2; i++) {
532*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
533*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8;
534*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
535*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
536*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
537*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
538*91f16700Schasinglulu 		if (r6 > 0) {
539*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
540*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
541*91f16700Schasinglulu 
542*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
543*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
544*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
545*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
546*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
547*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r6);
548*91f16700Schasinglulu 		} else {
549*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
550*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
551*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
552*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r7);
553*91f16700Schasinglulu 
554*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
555*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
556*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
557*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
558*91f16700Schasinglulu 						     ((r6 + (r5 << 1)) & 0xFF));
559*91f16700Schasinglulu 		}
560*91f16700Schasinglulu 	}
561*91f16700Schasinglulu 
562*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
563*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00C0);
564*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
565*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
566*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
567*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
568*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
569*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010801);
570*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
571*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
572*91f16700Schasinglulu 		;
573*91f16700Schasinglulu 
574*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
575*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00D8);
576*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
577*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0001F001);
578*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
579*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
580*91f16700Schasinglulu 		;
581*91f16700Schasinglulu 
582*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF);
583*91f16700Schasinglulu 	r2 = mmio_read_32(DBSC_DBPDRGD_0);
584*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000AF);
585*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00));
586*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF);
587*91f16700Schasinglulu 	r2 = mmio_read_32(DBSC_DBPDRGD_0);
588*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000CF);
589*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, ((r2 + 0x1) & 0xFF) | (r2 & 0xFFFFFF00));
590*91f16700Schasinglulu 
591*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
592*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
593*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
594*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
595*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
596*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003087);
597*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
598*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010401);
599*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
600*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
601*91f16700Schasinglulu 		;
602*91f16700Schasinglulu 
603*91f16700Schasinglulu 	for (i = 0; i < 2; i++) {
604*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
605*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 0x8;
606*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
607*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
608*91f16700Schasinglulu 
609*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
610*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
611*91f16700Schasinglulu 		r12 = (r5 >> 0x2);
612*91f16700Schasinglulu 
613*91f16700Schasinglulu 		if (r12 < r6) {
614*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
615*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
616*91f16700Schasinglulu 
617*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
618*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r7 + 0x1) & 0x7));
619*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
620*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
621*91f16700Schasinglulu 
622*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
623*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | ((r6 - r12) & 0xFF));
624*91f16700Schasinglulu 		} else {
625*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
626*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8;
627*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
628*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | (r7 & 0x7));
629*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
630*91f16700Schasinglulu 			r2 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00;
631*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
632*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
633*91f16700Schasinglulu 						     ((r6 + r5 +
634*91f16700Schasinglulu 						      (r5 >> 1) + r12) & 0xFF));
635*91f16700Schasinglulu 		}
636*91f16700Schasinglulu 	}
637*91f16700Schasinglulu 
638*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
639*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
640*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
641*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
642*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
643*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00015001);
644*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
645*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
646*91f16700Schasinglulu 		;
647*91f16700Schasinglulu 
648*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
649*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700);
650*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
651*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))
652*91f16700Schasinglulu 		;
653*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
654*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E);
655*91f16700Schasinglulu 
656*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBUS0CNF1, 0x00000010);
657*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCALCNF,
658*91f16700Schasinglulu 		(uint32_t) (64000000 / REFRESH_RATE) + 0x01000000);
659*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF1,
660*91f16700Schasinglulu 		(uint32_t) (REFRESH_RATE * 99 / 125) + 0x00080000);
661*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
662*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
663*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFEN, 0x00000001);
664*91f16700Schasinglulu 	mmio_write_32(DBSC_DBACEN, 0x00000001);
665*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x00000000);
666*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
667*91f16700Schasinglulu 
668*91f16700Schasinglulu #ifdef ddr_qos_init_setting // only for non qos_init
669*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
670*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF1, 0x00043218);
671*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF2, 0x000000F4);
672*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHCNT0, 0x000f0037);
673*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
674*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW0, 0x22421111);
675*91f16700Schasinglulu 	mmio_write_32(DBSC_SCFCTST2, 0x012F1123);
676*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS00, 0x00000F00);
677*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS01, 0x00000B00);
678*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS02, 0x00000000);
679*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS03, 0x00000000);
680*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS40, 0x00000300);
681*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS41, 0x000002F0);
682*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS42, 0x00000200);
683*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS43, 0x00000100);
684*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS90, 0x00000300);
685*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS91, 0x000002F0);
686*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS92, 0x00000200);
687*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS93, 0x00000100);
688*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS130, 0x00000100);
689*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS131, 0x000000F0);
690*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS132, 0x000000A0);
691*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS133, 0x00000040);
692*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS140, 0x000000C0);
693*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS141, 0x000000B0);
694*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS142, 0x00000080);
695*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS143, 0x00000040);
696*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS150, 0x00000040);
697*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS151, 0x00000030);
698*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS152, 0x00000020);
699*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS153, 0x00000010);
700*91f16700Schasinglulu 	mmio_write_32(0xE67F0018, 0x00000001);
701*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
702*91f16700Schasinglulu #endif
703*91f16700Schasinglulu }
704*91f16700Schasinglulu 
705*91f16700Schasinglulu #define PRR			0xFFF00044U
706*91f16700Schasinglulu #define PRR_PRODUCT_MASK	0x00007F00U
707*91f16700Schasinglulu #define PRR_PRODUCT_D3		0x00005800U
708*91f16700Schasinglulu 
709*91f16700Schasinglulu #define	MODEMR_MD19		BIT(19)
710*91f16700Schasinglulu 
711*91f16700Schasinglulu int32_t rcar_dram_init(void)
712*91f16700Schasinglulu {
713*91f16700Schasinglulu 	uint32_t reg;
714*91f16700Schasinglulu 	uint32_t ddr_mbps;
715*91f16700Schasinglulu 
716*91f16700Schasinglulu 	reg = mmio_read_32(PRR);
717*91f16700Schasinglulu 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_D3) {
718*91f16700Schasinglulu 		ERROR("LSI Product ID (PRR=0x%x) DDR initialize not supported.\n",
719*91f16700Schasinglulu 		      reg);
720*91f16700Schasinglulu 		panic();
721*91f16700Schasinglulu 	}
722*91f16700Schasinglulu 
723*91f16700Schasinglulu 	reg = mmio_read_32(RST_MODEMR);
724*91f16700Schasinglulu 	if (reg & MODEMR_MD19) {
725*91f16700Schasinglulu 		init_ddr_d3_1866();
726*91f16700Schasinglulu 		ddr_mbps = 1866;
727*91f16700Schasinglulu 	} else {
728*91f16700Schasinglulu 		init_ddr_d3_1600();
729*91f16700Schasinglulu 		ddr_mbps = 1600;
730*91f16700Schasinglulu 	}
731*91f16700Schasinglulu 
732*91f16700Schasinglulu 	NOTICE("BL2: DDR%d(%s)\n", ddr_mbps, RCAR_DDR_VERSION);
733*91f16700Schasinglulu 
734*91f16700Schasinglulu 	return 0;
735*91f16700Schasinglulu }
736