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