]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/arm/cpu/armv7/omap5/sdram.c
ARM: DRA72-evm: Enable HW leveling
[people/ms/u-boot.git] / arch / arm / cpu / armv7 / omap5 / sdram.c
1 /*
2 * Timing and Organization details of the ddr device parts used in OMAP5
3 * EVM
4 *
5 * (C) Copyright 2010
6 * Texas Instruments, <www.ti.com>
7 *
8 * Aneesh V <aneesh@ti.com>
9 * Sricharan R <r.sricharan@ti.com>
10 *
11 * SPDX-License-Identifier: GPL-2.0+
12 */
13
14 #include <asm/emif.h>
15 #include <asm/arch/sys_proto.h>
16
17 /*
18 * This file provides details of the LPDDR2 SDRAM parts used on OMAP5
19 * EVM. Since the parts used and geometry are identical for
20 * evm for a given OMAP5 revision, this information is kept
21 * here instead of being in board directory. However the key functions
22 * exported are weakly linked so that they can be over-ridden in the board
23 * directory if there is a OMAP5 board in the future that uses a different
24 * memory device or geometry.
25 *
26 * For any new board with different memory devices over-ride one or more
27 * of the following functions as per the CONFIG flags you intend to enable:
28 * - emif_get_reg_dump()
29 * - emif_get_dmm_regs()
30 * - emif_get_device_details()
31 * - emif_get_device_timings()
32 */
33
34 #ifdef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS
35 const struct emif_regs emif_regs_532_mhz_2cs = {
36 .sdram_config_init = 0x80800EBA,
37 .sdram_config = 0x808022BA,
38 .ref_ctrl = 0x0000081A,
39 .sdram_tim1 = 0x772F6873,
40 .sdram_tim2 = 0x304a129a,
41 .sdram_tim3 = 0x02f7e45f,
42 .read_idle_ctrl = 0x00050000,
43 .zq_config = 0x000b3215,
44 .temp_alert_config = 0x08000a05,
45 .emif_ddr_phy_ctlr_1_init = 0x0E28420d,
46 .emif_ddr_phy_ctlr_1 = 0x0E28420d,
47 .emif_ddr_ext_phy_ctrl_1 = 0x04020080,
48 .emif_ddr_ext_phy_ctrl_2 = 0x28C518A3,
49 .emif_ddr_ext_phy_ctrl_3 = 0x518A3146,
50 .emif_ddr_ext_phy_ctrl_4 = 0x0014628C,
51 .emif_ddr_ext_phy_ctrl_5 = 0x04010040
52 };
53
54 const struct emif_regs emif_regs_532_mhz_2cs_es2 = {
55 .sdram_config_init = 0x80800EBA,
56 .sdram_config = 0x808022BA,
57 .ref_ctrl = 0x0000081A,
58 .sdram_tim1 = 0x772F6873,
59 .sdram_tim2 = 0x304a129a,
60 .sdram_tim3 = 0x02f7e45f,
61 .read_idle_ctrl = 0x00050000,
62 .zq_config = 0x100b3215,
63 .temp_alert_config = 0x08000a05,
64 .emif_ddr_phy_ctlr_1_init = 0x0E30400d,
65 .emif_ddr_phy_ctlr_1 = 0x0E30400d,
66 .emif_ddr_ext_phy_ctrl_1 = 0x04020080,
67 .emif_ddr_ext_phy_ctrl_2 = 0x28C518A3,
68 .emif_ddr_ext_phy_ctrl_3 = 0x518A3146,
69 .emif_ddr_ext_phy_ctrl_4 = 0x0014628C,
70 .emif_ddr_ext_phy_ctrl_5 = 0xC330CC33,
71 };
72
73 const struct emif_regs emif_regs_266_mhz_2cs = {
74 .sdram_config_init = 0x80800EBA,
75 .sdram_config = 0x808022BA,
76 .ref_ctrl = 0x0000040D,
77 .sdram_tim1 = 0x2A86B419,
78 .sdram_tim2 = 0x1025094A,
79 .sdram_tim3 = 0x026BA22F,
80 .read_idle_ctrl = 0x00050000,
81 .zq_config = 0x000b3215,
82 .temp_alert_config = 0x08000a05,
83 .emif_ddr_phy_ctlr_1_init = 0x0E28420d,
84 .emif_ddr_phy_ctlr_1 = 0x0E28420d,
85 .emif_ddr_ext_phy_ctrl_1 = 0x04020080,
86 .emif_ddr_ext_phy_ctrl_2 = 0x0A414829,
87 .emif_ddr_ext_phy_ctrl_3 = 0x14829052,
88 .emif_ddr_ext_phy_ctrl_4 = 0x000520A4,
89 .emif_ddr_ext_phy_ctrl_5 = 0x04010040
90 };
91
92 const struct emif_regs emif_regs_ddr3_532_mhz_1cs = {
93 .sdram_config_init = 0x61851B32,
94 .sdram_config = 0x61851B32,
95 .sdram_config2 = 0x0,
96 .ref_ctrl = 0x00001035,
97 .sdram_tim1 = 0xCCCF36B3,
98 .sdram_tim2 = 0x308F7FDA,
99 .sdram_tim3 = 0x027F88A8,
100 .read_idle_ctrl = 0x00050000,
101 .zq_config = 0x0007190B,
102 .temp_alert_config = 0x00000000,
103 .emif_ddr_phy_ctlr_1_init = 0x0020420A,
104 .emif_ddr_phy_ctlr_1 = 0x0024420A,
105 .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
106 .emif_ddr_ext_phy_ctrl_2 = 0x00000000,
107 .emif_ddr_ext_phy_ctrl_3 = 0x00000000,
108 .emif_ddr_ext_phy_ctrl_4 = 0x00000000,
109 .emif_ddr_ext_phy_ctrl_5 = 0x04010040,
110 .emif_rd_wr_lvl_rmp_win = 0x00000000,
111 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
112 .emif_rd_wr_lvl_ctl = 0x00000000,
113 .emif_rd_wr_exec_thresh = 0x00000305
114 };
115
116 const struct emif_regs emif_regs_ddr3_532_mhz_1cs_es2 = {
117 .sdram_config_init = 0x61851B32,
118 .sdram_config = 0x61851B32,
119 .sdram_config2 = 0x0,
120 .ref_ctrl = 0x00001035,
121 .sdram_tim1 = 0xCCCF36B3,
122 .sdram_tim2 = 0x308F7FDA,
123 .sdram_tim3 = 0x027F88A8,
124 .read_idle_ctrl = 0x00050000,
125 .zq_config = 0x1007190B,
126 .temp_alert_config = 0x00000000,
127 .emif_ddr_phy_ctlr_1_init = 0x0030400A,
128 .emif_ddr_phy_ctlr_1 = 0x0034400A,
129 .emif_ddr_ext_phy_ctrl_1 = 0x04040100,
130 .emif_ddr_ext_phy_ctrl_2 = 0x00000000,
131 .emif_ddr_ext_phy_ctrl_3 = 0x00000000,
132 .emif_ddr_ext_phy_ctrl_4 = 0x00000000,
133 .emif_ddr_ext_phy_ctrl_5 = 0x4350D435,
134 .emif_rd_wr_lvl_rmp_win = 0x00000000,
135 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
136 .emif_rd_wr_lvl_ctl = 0x00000000,
137 .emif_rd_wr_exec_thresh = 0x40000305
138 };
139
140 const struct emif_regs emif_1_regs_ddr3_532_mhz_1cs_dra_es1 = {
141 .sdram_config_init = 0x61851ab2,
142 .sdram_config = 0x61851ab2,
143 .sdram_config2 = 0x08000000,
144 .ref_ctrl = 0x000040F1,
145 .ref_ctrl_final = 0x00001035,
146 .sdram_tim1 = 0xCCCF36B3,
147 .sdram_tim2 = 0x308F7FDA,
148 .sdram_tim3 = 0x027F88A8,
149 .read_idle_ctrl = 0x00050001,
150 .zq_config = 0x0007190B,
151 .temp_alert_config = 0x00000000,
152 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
153 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
154 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
155 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
156 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
157 .emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
158 .emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
159 .emif_rd_wr_lvl_rmp_win = 0x00000000,
160 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
161 .emif_rd_wr_lvl_ctl = 0x00000000,
162 .emif_rd_wr_exec_thresh = 0x00000305
163 };
164
165 const struct emif_regs emif_2_regs_ddr3_532_mhz_1cs_dra_es1 = {
166 .sdram_config_init = 0x61851B32,
167 .sdram_config = 0x61851B32,
168 .sdram_config2 = 0x08000000,
169 .ref_ctrl = 0x000040F1,
170 .ref_ctrl_final = 0x00001035,
171 .sdram_tim1 = 0xCCCF36B3,
172 .sdram_tim2 = 0x308F7FDA,
173 .sdram_tim3 = 0x027F88A8,
174 .read_idle_ctrl = 0x00050001,
175 .zq_config = 0x0007190B,
176 .temp_alert_config = 0x00000000,
177 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
178 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
179 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
180 .emif_ddr_ext_phy_ctrl_2 = 0x00910091,
181 .emif_ddr_ext_phy_ctrl_3 = 0x00950095,
182 .emif_ddr_ext_phy_ctrl_4 = 0x009B009B,
183 .emif_ddr_ext_phy_ctrl_5 = 0x009E009E,
184 .emif_rd_wr_lvl_rmp_win = 0x00000000,
185 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
186 .emif_rd_wr_lvl_ctl = 0x00000000,
187 .emif_rd_wr_exec_thresh = 0x00000305
188 };
189
190 const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra_es1 = {
191 .sdram_config_init = 0x61862B32,
192 .sdram_config = 0x61862B32,
193 .sdram_config2 = 0x08000000,
194 .ref_ctrl = 0x0000514C,
195 .ref_ctrl_final = 0x0000144A,
196 .sdram_tim1 = 0xD113781C,
197 .sdram_tim2 = 0x305A7FDA,
198 .sdram_tim3 = 0x409F86A8,
199 .read_idle_ctrl = 0x00050000,
200 .zq_config = 0x5007190B,
201 .temp_alert_config = 0x00000000,
202 .emif_ddr_phy_ctlr_1_init = 0x0024400D,
203 .emif_ddr_phy_ctlr_1 = 0x0E24400D,
204 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
205 .emif_ddr_ext_phy_ctrl_2 = 0x00A400A4,
206 .emif_ddr_ext_phy_ctrl_3 = 0x00A900A9,
207 .emif_ddr_ext_phy_ctrl_4 = 0x00B000B0,
208 .emif_ddr_ext_phy_ctrl_5 = 0x00B000B0,
209 .emif_rd_wr_lvl_rmp_win = 0x00000000,
210 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
211 .emif_rd_wr_lvl_ctl = 0x00000000,
212 .emif_rd_wr_exec_thresh = 0x00000305
213 };
214
215 const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
216 .dmm_lisa_map_0 = 0x0,
217 .dmm_lisa_map_1 = 0x0,
218 .dmm_lisa_map_2 = 0x80740300,
219 .dmm_lisa_map_3 = 0xFF020100,
220 .is_ma_present = 0x1
221 };
222
223 /*
224 * DRA752 EVM board has 1.5 GB of memory
225 * EMIF1 --> 2Gb * 2 = 512MB
226 * EMIF2 --> 2Gb * 4 = 1GB
227 * so mapping 1GB interleaved and 512MB non-interleaved
228 */
229 const struct dmm_lisa_map_regs lisa_map_2G_x_2_x_2_2G_x_1_x_2 = {
230 .dmm_lisa_map_0 = 0x0,
231 .dmm_lisa_map_1 = 0x80640300,
232 .dmm_lisa_map_2 = 0xC0500220,
233 .dmm_lisa_map_3 = 0xFF020100,
234 .is_ma_present = 0x1
235 };
236
237 /*
238 * DRA752 EVM EMIF1 ONLY CONFIGURATION
239 */
240 const struct dmm_lisa_map_regs lisa_map_2G_x_1_x_2 = {
241 .dmm_lisa_map_0 = 0x0,
242 .dmm_lisa_map_1 = 0x0,
243 .dmm_lisa_map_2 = 0x80500100,
244 .dmm_lisa_map_3 = 0xFF020100,
245 .is_ma_present = 0x1
246 };
247
248 /*
249 * DRA752 EVM EMIF2 ONLY CONFIGURATION
250 */
251 const struct dmm_lisa_map_regs lisa_map_2G_x_2_x_2 = {
252 .dmm_lisa_map_0 = 0x0,
253 .dmm_lisa_map_1 = 0x0,
254 .dmm_lisa_map_2 = 0x80600200,
255 .dmm_lisa_map_3 = 0xFF020100,
256 .is_ma_present = 0x1
257 };
258
259 /*
260 * DRA722 EVM EMIF1 CONFIGURATION
261 */
262 const struct dmm_lisa_map_regs lisa_map_2G_x_2 = {
263 .dmm_lisa_map_0 = 0x0,
264 .dmm_lisa_map_1 = 0x0,
265 .dmm_lisa_map_2 = 0x80600100,
266 .dmm_lisa_map_3 = 0xFF020100,
267 .is_ma_present = 0x1
268 };
269
270 static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
271 {
272 switch (omap_revision()) {
273 case OMAP5430_ES1_0:
274 *regs = &emif_regs_532_mhz_2cs;
275 break;
276 case OMAP5432_ES1_0:
277 *regs = &emif_regs_ddr3_532_mhz_1cs;
278 break;
279 case OMAP5430_ES2_0:
280 *regs = &emif_regs_532_mhz_2cs_es2;
281 break;
282 case OMAP5432_ES2_0:
283 *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
284 break;
285 case DRA752_ES1_0:
286 case DRA752_ES1_1:
287 switch (emif_nr) {
288 case 1:
289 *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
290 break;
291 case 2:
292 *regs = &emif_2_regs_ddr3_532_mhz_1cs_dra_es1;
293 break;
294 }
295 break;
296 case DRA722_ES1_0:
297 *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra_es1;
298 break;
299 default:
300 *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
301 }
302 }
303
304 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
305 __attribute__((weak, alias("emif_get_reg_dump_sdp")));
306
307 static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
308 **dmm_lisa_regs)
309 {
310 switch (omap_revision()) {
311 case OMAP5430_ES1_0:
312 case OMAP5430_ES2_0:
313 case OMAP5432_ES1_0:
314 case OMAP5432_ES2_0:
315 *dmm_lisa_regs = &lisa_map_4G_x_2_x_2;
316 break;
317 case DRA752_ES1_0:
318 case DRA752_ES1_1:
319 *dmm_lisa_regs = &lisa_map_2G_x_2_x_2_2G_x_1_x_2;
320 break;
321 case DRA722_ES1_0:
322 default:
323 *dmm_lisa_regs = &lisa_map_2G_x_2;
324 }
325
326 }
327
328 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
329 __attribute__((weak, alias("emif_get_dmm_regs_sdp")));
330 #else
331
332 static const struct lpddr2_device_details dev_4G_S4_details = {
333 .type = LPDDR2_TYPE_S4,
334 .density = LPDDR2_DENSITY_4Gb,
335 .io_width = LPDDR2_IO_WIDTH_32,
336 .manufacturer = LPDDR2_MANUFACTURER_SAMSUNG
337 };
338
339 static void emif_get_device_details_sdp(u32 emif_nr,
340 struct lpddr2_device_details *cs0_device_details,
341 struct lpddr2_device_details *cs1_device_details)
342 {
343 /* EMIF1 & EMIF2 have identical configuration */
344 *cs0_device_details = dev_4G_S4_details;
345 *cs1_device_details = dev_4G_S4_details;
346 }
347
348 void emif_get_device_details(u32 emif_nr,
349 struct lpddr2_device_details *cs0_device_details,
350 struct lpddr2_device_details *cs1_device_details)
351 __attribute__((weak, alias("emif_get_device_details_sdp")));
352
353 #endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
354
355 const u32 ext_phy_ctrl_const_base[] = {
356 0x01004010,
357 0x00001004,
358 0x04010040,
359 0x01004010,
360 0x00001004,
361 0x00000000,
362 0x00000000,
363 0x00000000,
364 0x80080080,
365 0x00800800,
366 0x08102040,
367 0x00000001,
368 0x540A8150,
369 0xA81502a0,
370 0x002A0540,
371 0x00000000,
372 0x00000000,
373 0x00000000,
374 0x00000077,
375 0x0
376 };
377
378 const u32 ddr3_ext_phy_ctrl_const_base_es1[] = {
379 0x01004010,
380 0x00001004,
381 0x04010040,
382 0x01004010,
383 0x00001004,
384 0x00000000,
385 0x00000000,
386 0x00000000,
387 0x80080080,
388 0x00800800,
389 0x08102040,
390 0x00000002,
391 0x0,
392 0x0,
393 0x0,
394 0x00000000,
395 0x00000000,
396 0x00000000,
397 0x00000057,
398 0x0
399 };
400
401 const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {
402 0x50D4350D,
403 0x00000D43,
404 0x04010040,
405 0x01004010,
406 0x00001004,
407 0x00000000,
408 0x00000000,
409 0x00000000,
410 0x80080080,
411 0x00800800,
412 0x08102040,
413 0x00000002,
414 0x00000000,
415 0x00000000,
416 0x00000000,
417 0x00000000,
418 0x00000000,
419 0x00000000,
420 0x00000057,
421 0x0
422 };
423
424 /* Ext phy ctrl 1-35 regs */
425 const u32
426 dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
427 0x10040100,
428 0x00910091,
429 0x00950095,
430 0x009B009B,
431 0x009E009E,
432 0x00980098,
433 0x00340034,
434 0x00350035,
435 0x00340034,
436 0x00310031,
437 0x00340034,
438 0x007F007F,
439 0x007F007F,
440 0x007F007F,
441 0x007F007F,
442 0x007F007F,
443 0x00480048,
444 0x004A004A,
445 0x00520052,
446 0x00550055,
447 0x00500050,
448 0x00000000,
449 0x00600020,
450 0x40011080,
451 0x08102040,
452 0x0,
453 0x0,
454 0x0,
455 0x0,
456 0x0,
457 0x0,
458 0x0,
459 0x0,
460 0x0,
461 0x0
462 };
463
464 /* Ext phy ctrl 1-35 regs */
465 const u32
466 dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
467 0x10040100,
468 0x00910091,
469 0x00950095,
470 0x009B009B,
471 0x009E009E,
472 0x00980098,
473 0x00330033,
474 0x00330033,
475 0x002F002F,
476 0x00320032,
477 0x00310031,
478 0x007F007F,
479 0x007F007F,
480 0x007F007F,
481 0x007F007F,
482 0x007F007F,
483 0x00520052,
484 0x00520052,
485 0x00470047,
486 0x00490049,
487 0x00500050,
488 0x00000000,
489 0x00600020,
490 0x40011080,
491 0x08102040,
492 0x0,
493 0x0,
494 0x0,
495 0x0,
496 0x0,
497 0x0,
498 0x0,
499 0x0,
500 0x0,
501 0x0
502 };
503
504 /* Ext phy ctrl 1-35 regs */
505 const u32
506 dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
507 0x10040100,
508 0x00A400A4,
509 0x00A900A9,
510 0x00B000B0,
511 0x00B000B0,
512 0x00A400A4,
513 0x00390039,
514 0x00320032,
515 0x00320032,
516 0x00320032,
517 0x00440044,
518 0x00550055,
519 0x00550055,
520 0x00550055,
521 0x00550055,
522 0x007F007F,
523 0x004D004D,
524 0x00430043,
525 0x00560056,
526 0x00540054,
527 0x00600060,
528 0x0,
529 0x00600020,
530 0x40010080,
531 0x08102040,
532 0x0,
533 0x0,
534 0x0,
535 0x0,
536 0x0,
537 0x0,
538 0x0,
539 0x0,
540 0x0,
541 0x0
542 };
543
544 const struct lpddr2_mr_regs mr_regs = {
545 .mr1 = MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8,
546 .mr2 = 0x6,
547 .mr3 = 0x1,
548 .mr10 = MR10_ZQ_ZQINIT,
549 .mr16 = MR16_REF_FULL_ARRAY
550 };
551
552 void __weak emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
553 const u32 **regs,
554 u32 *size)
555 {
556 switch (omap_revision()) {
557 case OMAP5430_ES1_0:
558 case OMAP5430_ES2_0:
559 *regs = ext_phy_ctrl_const_base;
560 *size = ARRAY_SIZE(ext_phy_ctrl_const_base);
561 break;
562 case OMAP5432_ES1_0:
563 *regs = ddr3_ext_phy_ctrl_const_base_es1;
564 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);
565 break;
566 case OMAP5432_ES2_0:
567 *regs = ddr3_ext_phy_ctrl_const_base_es2;
568 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
569 break;
570 case DRA752_ES1_0:
571 case DRA752_ES1_1:
572 if (emif_nr == 1) {
573 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
574 *size =
575 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1);
576 } else {
577 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
578 *size =
579 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2);
580 }
581 break;
582 case DRA722_ES1_0:
583 *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz;
584 *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz);
585 break;
586 default:
587 *regs = ddr3_ext_phy_ctrl_const_base_es2;
588 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
589
590 }
591 }
592
593 void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
594 {
595 *regs = &mr_regs;
596 }
597
598 static void do_ext_phy_settings_omap5(u32 base, const struct emif_regs *regs)
599 {
600 u32 *ext_phy_ctrl_base = 0;
601 u32 *emif_ext_phy_ctrl_base = 0;
602 u32 emif_nr;
603 const u32 *ext_phy_ctrl_const_regs;
604 u32 i = 0;
605 u32 size;
606
607 emif_nr = (base == EMIF1_BASE) ? 1 : 2;
608
609 struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
610
611 ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
612 emif_ext_phy_ctrl_base = (u32 *) &(emif->emif_ddr_ext_phy_ctrl_1);
613
614 /* Configure external phy control timing registers */
615 for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
616 writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
617 /* Update shadow registers */
618 writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
619 }
620
621 /*
622 * external phy 6-24 registers do not change with
623 * ddr frequency
624 */
625 emif_get_ext_phy_ctrl_const_regs(emif_nr,
626 &ext_phy_ctrl_const_regs, &size);
627
628 for (i = 0; i < size; i++) {
629 writel(ext_phy_ctrl_const_regs[i],
630 emif_ext_phy_ctrl_base++);
631 /* Update shadow registers */
632 writel(ext_phy_ctrl_const_regs[i],
633 emif_ext_phy_ctrl_base++);
634 }
635 }
636
637 static void do_ext_phy_settings_dra7(u32 base, const struct emif_regs *regs)
638 {
639 struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
640 u32 *emif_ext_phy_ctrl_base = 0;
641 u32 emif_nr;
642 const u32 *ext_phy_ctrl_const_regs;
643 u32 i, hw_leveling, size;
644
645 emif_nr = (base == EMIF1_BASE) ? 1 : 2;
646
647 hw_leveling = regs->emif_rd_wr_lvl_rmp_ctl >> EMIF_REG_RDWRLVL_EN_SHIFT;
648
649 emif_ext_phy_ctrl_base = (u32 *)&(emif->emif_ddr_ext_phy_ctrl_1);
650
651 emif_get_ext_phy_ctrl_const_regs(emif_nr,
652 &ext_phy_ctrl_const_regs, &size);
653
654 writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[0]);
655 writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[1]);
656
657 if (!hw_leveling) {
658 /*
659 * Copy the predefined PHY register values
660 * in case of sw leveling
661 */
662 for (i = 1; i < 25; i++) {
663 writel(ext_phy_ctrl_const_regs[i],
664 &emif_ext_phy_ctrl_base[i * 2]);
665 writel(ext_phy_ctrl_const_regs[i],
666 &emif_ext_phy_ctrl_base[i * 2 + 1]);
667 }
668 } else {
669 /*
670 * Write the init value for HW levling to occur
671 */
672 for (i = 21; i < 35; i++) {
673 writel(ext_phy_ctrl_const_regs[i],
674 &emif_ext_phy_ctrl_base[i * 2]);
675 writel(ext_phy_ctrl_const_regs[i],
676 &emif_ext_phy_ctrl_base[i * 2 + 1]);
677 }
678 }
679 }
680
681 void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
682 {
683 if (is_omap54xx())
684 do_ext_phy_settings_omap5(base, regs);
685 else
686 do_ext_phy_settings_dra7(base, regs);
687 }
688
689 #ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
690 static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
691 .max_freq = 532000000,
692 .RL = 8,
693 .tRPab = 21,
694 .tRCD = 18,
695 .tWR = 15,
696 .tRASmin = 42,
697 .tRRD = 10,
698 .tWTRx2 = 15,
699 .tXSR = 140,
700 .tXPx2 = 15,
701 .tRFCab = 130,
702 .tRTPx2 = 15,
703 .tCKE = 3,
704 .tCKESR = 15,
705 .tZQCS = 90,
706 .tZQCL = 360,
707 .tZQINIT = 1000,
708 .tDQSCKMAXx2 = 11,
709 .tRASmax = 70,
710 .tFAW = 50
711 };
712
713 static const struct lpddr2_min_tck min_tck = {
714 .tRL = 3,
715 .tRP_AB = 3,
716 .tRCD = 3,
717 .tWR = 3,
718 .tRAS_MIN = 3,
719 .tRRD = 2,
720 .tWTR = 2,
721 .tXP = 2,
722 .tRTP = 2,
723 .tCKE = 3,
724 .tCKESR = 3,
725 .tFAW = 8
726 };
727
728 static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
729 &timings_jedec_532_mhz
730 };
731
732 static const struct lpddr2_device_timings dev_4G_S4_timings = {
733 .ac_timings = ac_timings,
734 .min_tck = &min_tck,
735 };
736
737 /*
738 * List of status registers to be controlled back to control registers
739 * after initial leveling
740 * readreg, writereg
741 */
742 const struct read_write_regs omap5_bug_00339_regs[] = {
743 { 8, 5 },
744 { 9, 6 },
745 { 10, 7 },
746 { 14, 8 },
747 { 15, 9 },
748 { 16, 10 },
749 { 11, 2 },
750 { 12, 3 },
751 { 13, 4 },
752 { 17, 11 },
753 { 18, 12 },
754 { 19, 13 },
755 };
756
757 const struct read_write_regs dra_bug_00339_regs[] = {
758 { 7, 7 },
759 { 8, 8 },
760 { 9, 9 },
761 { 10, 10 },
762 { 11, 11 },
763 { 12, 2 },
764 { 13, 3 },
765 { 14, 4 },
766 { 15, 5 },
767 { 16, 6 },
768 { 17, 12 },
769 { 18, 13 },
770 { 19, 14 },
771 { 20, 15 },
772 { 21, 16 },
773 { 22, 17 },
774 { 23, 18 },
775 { 24, 19 },
776 { 25, 20 },
777 { 26, 21}
778 };
779
780 const struct read_write_regs *get_bug_regs(u32 *iterations)
781 {
782 const struct read_write_regs *bug_00339_regs_ptr = NULL;
783
784 switch (omap_revision()) {
785 case OMAP5430_ES1_0:
786 case OMAP5430_ES2_0:
787 case OMAP5432_ES1_0:
788 case OMAP5432_ES2_0:
789 bug_00339_regs_ptr = omap5_bug_00339_regs;
790 *iterations = sizeof(omap5_bug_00339_regs)/
791 sizeof(omap5_bug_00339_regs[0]);
792 break;
793 case DRA752_ES1_0:
794 case DRA752_ES1_1:
795 case DRA722_ES1_0:
796 bug_00339_regs_ptr = dra_bug_00339_regs;
797 *iterations = sizeof(dra_bug_00339_regs)/
798 sizeof(dra_bug_00339_regs[0]);
799 break;
800 default:
801 printf("\n Error: UnKnown SOC");
802 }
803
804 return bug_00339_regs_ptr;
805 }
806
807 void emif_get_device_timings_sdp(u32 emif_nr,
808 const struct lpddr2_device_timings **cs0_device_timings,
809 const struct lpddr2_device_timings **cs1_device_timings)
810 {
811 /* Identical devices on EMIF1 & EMIF2 */
812 *cs0_device_timings = &dev_4G_S4_timings;
813 *cs1_device_timings = &dev_4G_S4_timings;
814 }
815
816 void emif_get_device_timings(u32 emif_nr,
817 const struct lpddr2_device_timings **cs0_device_timings,
818 const struct lpddr2_device_timings **cs1_device_timings)
819 __attribute__((weak, alias("emif_get_device_timings_sdp")));
820
821 #endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */