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