xref: /arm-trusted-firmware/drivers/renesas/common/ddr/ddr_a/ddr_init_v3m.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 <lib/utils_def.h>
10*91f16700Schasinglulu #include <stdint.h>
11*91f16700Schasinglulu #include "boot_init_dram.h"
12*91f16700Schasinglulu #include "rcar_def.h"
13*91f16700Schasinglulu #include "../ddr_regs.h"
14*91f16700Schasinglulu 
15*91f16700Schasinglulu static uint32_t init_ddr_v3m_1600(void)
16*91f16700Schasinglulu {
17*91f16700Schasinglulu 	uint32_t i, r2, r5, r6, r7, r12;
18*91f16700Schasinglulu 
19*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00001234);
20*91f16700Schasinglulu 	mmio_write_32(DBSC_DBKIND, 0x00000007);
21*91f16700Schasinglulu #if RCAR_DRAM_DDR3L_MEMCONF == 0
22*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x0f030a02); // 1GB: Eagle
23*91f16700Schasinglulu #else
24*91f16700Schasinglulu 	mmio_write_32(DBSC_DBMEMCONF_0_0, 0x10030a02); // 2GB: V3MSK
25*91f16700Schasinglulu #endif
26*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPHYCONF0, 0x00000001);
27*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR0, 0x0000000B);
28*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR1, 0x00000008);
29*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR3, 0x0000000B);
30*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR4, 0x000B000B);
31*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR5, 0x00000027);
32*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR6, 0x0000001C);
33*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR7, 0x00060006);
34*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR8, 0x00000020);
35*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR9, 0x00000006);
36*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR10, 0x0000000C);
37*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR11, 0x0000000B);
38*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR12, 0x00120012);
39*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR13, 0x01180118);
40*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR14, 0x00140005);
41*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR15, 0x00050004);
42*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR16, 0x071D0305);
43*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR17, 0x040C0010);
44*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR18, 0x00000200);
45*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR19, 0x01000040);
46*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR20, 0x02000120);
47*91f16700Schasinglulu 	mmio_write_32(DBSC_DBTR21, 0x00040004);
48*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBL, 0x00000000);
49*91f16700Schasinglulu 	mmio_write_32(DBSC_DBODT0, 0x00000001);
50*91f16700Schasinglulu 	mmio_write_32(DBSC_DBADJ0, 0x00000001);
51*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF1, 0x00082010);
52*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF2, 0x00002000);
53*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHCNT0, 0x080f003f);
54*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHCNT1, 0x00001010);
55*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHSZ0, 0x00000001);
56*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW0, 0x00000200);
57*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW1, 0x00000040);
58*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS40, 0x00000600);
59*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS41, 0x00000480);
60*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS42, 0x00000300);
61*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS43, 0x00000180);
62*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS90, 0x00000400);
63*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS91, 0x00000300);
64*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS92, 0x00000200);
65*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS93, 0x00000100);
66*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS130, 0x00000300);
67*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS131, 0x00000240);
68*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS132, 0x00000180);
69*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS133, 0x000000c0);
70*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS140, 0x00000200);
71*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS141, 0x00000180);
72*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS142, 0x00000100);
73*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS143, 0x00000080);
74*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS150, 0x00000100);
75*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS151, 0x000000c0);
76*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS152, 0x00000080);
77*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHQOS153, 0x00000040);
78*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCONF1, 0x00000002);
79*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF1, 0x00040C04);
80*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCAM0CNF2, 0x000001c4);
81*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHSZ0, 0x00000003);
82*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSCHRW1, 0x001a0080);
83*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICNT_0, 0x00000010);
84*91f16700Schasinglulu 
85*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x0000A55A);
86*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x01000001);
87*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08000000);
88*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
89*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x80010000);
90*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
91*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
92*91f16700Schasinglulu 		;
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000008);
95*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000B8000);
96*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
97*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058904);
98*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000091);
99*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6D);
100*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000095);
101*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6B);
102*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000099);
103*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0007BB6D);
104*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
105*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
106*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
107*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024641E);
108*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
109*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010073);
110*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
111*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
112*91f16700Schasinglulu 		;
113*91f16700Schasinglulu 
114*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
115*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0C058900);
116*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000090);
117*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x04058900);
118*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
119*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
120*91f16700Schasinglulu 		;
121*91f16700Schasinglulu 
122*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
123*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0780C700);
124*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
125*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(30)))
126*91f16700Schasinglulu 		;
127*91f16700Schasinglulu 
128*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000004);
129*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x08C0C170);
130*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000022);
131*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x1000040B);
132*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000023);
133*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x2D9C0B66);
134*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000024);
135*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x2A88C400);
136*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000025);
137*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x30005200);
138*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000026);
139*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0014A9C9);
140*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000027);
141*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000D70);
142*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000028);
143*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000004);
144*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000029);
145*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00000018);
146*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
147*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003047);
148*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000020);
149*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00181884);
150*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000001A);
151*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x13C03C10);
152*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
153*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
154*91f16700Schasinglulu 		;
155*91f16700Schasinglulu 
156*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A7);
157*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
158*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A8);
159*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
160*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A9);
161*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
162*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C7);
163*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
164*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C8);
165*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
166*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C9);
167*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
168*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E7);
169*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
170*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E8);
171*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
172*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E9);
173*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
174*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000107);
175*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
176*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000108);
177*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0D0D0D0D);
178*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000109);
179*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x000D0D0D);
180*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
181*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010181);
182*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCMD, 0x08000001);
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 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
188*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010601);
189*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
190*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
191*91f16700Schasinglulu 		;
192*91f16700Schasinglulu 
193*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
194*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
195*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 8;
196*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
197*91f16700Schasinglulu 		r6 = mmio_read_32(DBSC_DBPDRGD_0) & 0xFF;
198*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
199*91f16700Schasinglulu 		r7 = mmio_read_32(DBSC_DBPDRGD_0) & 0x7;
200*91f16700Schasinglulu 
201*91f16700Schasinglulu 		if (r6 > 0) {
202*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
203*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8);
204*91f16700Schasinglulu 
205*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
206*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, ((r7 + 1) & 0x7) | r2);
207*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
208*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00);
209*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
210*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r6);
211*91f16700Schasinglulu 		} else {
212*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
213*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8);
214*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
215*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 | r7);
216*91f16700Schasinglulu 
217*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
218*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00);
219*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
220*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
221*91f16700Schasinglulu 						     (((r5 << 1) + r6) & 0xFF));
222*91f16700Schasinglulu 		}
223*91f16700Schasinglulu 	}
224*91f16700Schasinglulu 
225*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
226*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00A0);
227*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
228*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
229*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
230*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
231*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
232*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
233*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
234*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
235*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
236*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010801);
237*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
238*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
239*91f16700Schasinglulu 		;
240*91f16700Schasinglulu 
241*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000005);
242*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0xC1AA00B8);
243*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
244*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0001F001);
245*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
246*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
247*91f16700Schasinglulu 		;
248*91f16700Schasinglulu 
249*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
250*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
251*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
252*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
253*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
254*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
255*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
256*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C000285);
257*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x0000002C);
258*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x81003087);
259*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
260*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00010401);
261*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
262*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
263*91f16700Schasinglulu 		;
264*91f16700Schasinglulu 
265*91f16700Schasinglulu 	for (i = 0; i < 4; i++) {
266*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB1 + i * 0x20);
267*91f16700Schasinglulu 		r5 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF00) >> 8;
268*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB4 + i * 0x20);
269*91f16700Schasinglulu 		r6 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFF);
270*91f16700Schasinglulu 
271*91f16700Schasinglulu 		mmio_write_32(DBSC_DBPDRGA_0, 0xB3 + i * 0x20);
272*91f16700Schasinglulu 		r7 = (mmio_read_32(DBSC_DBPDRGD_0) & 0x7);
273*91f16700Schasinglulu 		r12 = (r5 >> 2);
274*91f16700Schasinglulu 		if (r6 - r12 > 0) {
275*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
276*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8);
277*91f16700Schasinglulu 
278*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
279*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, ((r7 + 1) & 0x7) | r2);
280*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
281*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00);
282*91f16700Schasinglulu 
283*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
284*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, ((r6 - r12) & 0xFF) | r2);
285*91f16700Schasinglulu 		} else {
286*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
287*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFFF8);
288*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB2 + i * 0x20);
289*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, (r7 & 0x7) | r2);
290*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
291*91f16700Schasinglulu 			r2 = (mmio_read_32(DBSC_DBPDRGD_0) & 0xFFFFFF00);
292*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGA_0, 0xB0 + i * 0x20);
293*91f16700Schasinglulu 			mmio_write_32(DBSC_DBPDRGD_0, r2 |
294*91f16700Schasinglulu 						     ((r6 + r5 +
295*91f16700Schasinglulu 						      (r5 >> 1) + r12) & 0xFF));
296*91f16700Schasinglulu 		}
297*91f16700Schasinglulu 	}
298*91f16700Schasinglulu 
299*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000A0);
300*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
301*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000C0);
302*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
303*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x000000E0);
304*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
305*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000100);
306*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x7C0002C5);
307*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000001);
308*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x00015001);
309*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000006);
310*91f16700Schasinglulu 	while (!(mmio_read_32(DBSC_DBPDRGD_0) & BIT(0)))
311*91f16700Schasinglulu 		;
312*91f16700Schasinglulu 
313*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000003);
314*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0380C700);
315*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000007);
316*91f16700Schasinglulu 	while (mmio_read_32(DBSC_DBPDRGD_0) & BIT(30))
317*91f16700Schasinglulu 		;
318*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGA_0, 0x00000021);
319*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDRGD_0, 0x0024643E);
320*91f16700Schasinglulu 
321*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBUS0CNF1, 0x00000000);
322*91f16700Schasinglulu 	mmio_write_32(DBSC_DBBUS0CNF0, 0x00010001);
323*91f16700Schasinglulu 	mmio_write_32(DBSC_DBCALCNF, 0x0100200E);
324*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF1, 0x00081860);
325*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFCNF2, 0x00010000);
326*91f16700Schasinglulu 	mmio_write_32(DBSC_DBDFICUPDCNF, 0x40100001);
327*91f16700Schasinglulu 	mmio_write_32(DBSC_DBRFEN, 0x00000001);
328*91f16700Schasinglulu 	mmio_write_32(DBSC_DBACEN, 0x00000001);
329*91f16700Schasinglulu 	mmio_write_32(DBSC_DBPDLK_0, 0x00000000);
330*91f16700Schasinglulu 	mmio_write_32(0xE67F0024, 0x00000001);
331*91f16700Schasinglulu 	mmio_write_32(DBSC_DBSYSCNT0, 0x00000000);
332*91f16700Schasinglulu 
333*91f16700Schasinglulu 	return INITDRAM_OK;
334*91f16700Schasinglulu }
335*91f16700Schasinglulu 
336*91f16700Schasinglulu int32_t rcar_dram_init(void)
337*91f16700Schasinglulu {
338*91f16700Schasinglulu 	return init_ddr_v3m_1600();
339*91f16700Schasinglulu }
340