ARM: DRA7-evm: Enable HW leveling
[platform/kernel/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                       = 0x0000493E,
195         .ref_ctrl_final                 = 0x0000144A,
196         .sdram_tim1                     = 0xD113781C,
197         .sdram_tim2                     = 0x308F7FE3,
198         .sdram_tim3                     = 0x009F86A8,
199         .read_idle_ctrl                 = 0x00050000,
200         .zq_config                      = 0x0007190B,
201         .temp_alert_config              = 0x00000000,
202         .emif_ddr_phy_ctlr_1_init       = 0x0E24400D,
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         = 0x00000000,
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 };
538
539 const struct lpddr2_mr_regs mr_regs = {
540         .mr1    = MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8,
541         .mr2    = 0x6,
542         .mr3    = 0x1,
543         .mr10   = MR10_ZQ_ZQINIT,
544         .mr16   = MR16_REF_FULL_ARRAY
545 };
546
547 void __weak emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
548                                              const u32 **regs,
549                                              u32 *size)
550 {
551         switch (omap_revision()) {
552         case OMAP5430_ES1_0:
553         case OMAP5430_ES2_0:
554                 *regs = ext_phy_ctrl_const_base;
555                 *size = ARRAY_SIZE(ext_phy_ctrl_const_base);
556                 break;
557         case OMAP5432_ES1_0:
558                 *regs = ddr3_ext_phy_ctrl_const_base_es1;
559                 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);
560                 break;
561         case OMAP5432_ES2_0:
562                 *regs = ddr3_ext_phy_ctrl_const_base_es2;
563                 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
564                 break;
565         case DRA752_ES1_0:
566         case DRA752_ES1_1:
567                 if (emif_nr == 1) {
568                         *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
569                         *size =
570                         ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1);
571                 } else {
572                         *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
573                         *size =
574                         ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2);
575                 }
576                 break;
577         case DRA722_ES1_0:
578                 *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz;
579                 *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz);
580                 break;
581         default:
582                 *regs = ddr3_ext_phy_ctrl_const_base_es2;
583                 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
584
585         }
586 }
587
588 void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
589 {
590         *regs = &mr_regs;
591 }
592
593 static void do_ext_phy_settings_omap5(u32 base, const struct emif_regs *regs)
594 {
595         u32 *ext_phy_ctrl_base = 0;
596         u32 *emif_ext_phy_ctrl_base = 0;
597         u32 emif_nr;
598         const u32 *ext_phy_ctrl_const_regs;
599         u32 i = 0;
600         u32 size;
601
602         emif_nr = (base == EMIF1_BASE) ? 1 : 2;
603
604         struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
605
606         ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
607         emif_ext_phy_ctrl_base = (u32 *) &(emif->emif_ddr_ext_phy_ctrl_1);
608
609         /* Configure external phy control timing registers */
610         for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
611                 writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
612                 /* Update shadow registers */
613                 writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
614         }
615
616         /*
617          * external phy 6-24 registers do not change with
618          * ddr frequency
619          */
620         emif_get_ext_phy_ctrl_const_regs(emif_nr,
621                                          &ext_phy_ctrl_const_regs, &size);
622
623         for (i = 0; i < size; i++) {
624                 writel(ext_phy_ctrl_const_regs[i],
625                        emif_ext_phy_ctrl_base++);
626                 /* Update shadow registers */
627                 writel(ext_phy_ctrl_const_regs[i],
628                        emif_ext_phy_ctrl_base++);
629         }
630 }
631
632 static void do_ext_phy_settings_dra7(u32 base, const struct emif_regs *regs)
633 {
634         struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
635         u32 *emif_ext_phy_ctrl_base = 0;
636         u32 emif_nr;
637         const u32 *ext_phy_ctrl_const_regs;
638         u32 i, hw_leveling, size;
639
640         emif_nr = (base == EMIF1_BASE) ? 1 : 2;
641
642         hw_leveling = regs->emif_rd_wr_lvl_rmp_ctl >> EMIF_REG_RDWRLVL_EN_SHIFT;
643
644         emif_ext_phy_ctrl_base = (u32 *)&(emif->emif_ddr_ext_phy_ctrl_1);
645
646         emif_get_ext_phy_ctrl_const_regs(emif_nr,
647                                          &ext_phy_ctrl_const_regs, &size);
648
649         writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[0]);
650         writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[1]);
651
652         if (!hw_leveling) {
653                 /*
654                  * Copy the predefined PHY register values
655                  * in case of sw leveling
656                  */
657                 for (i = 1; i < 25; i++) {
658                         writel(ext_phy_ctrl_const_regs[i],
659                                &emif_ext_phy_ctrl_base[i * 2]);
660                         writel(ext_phy_ctrl_const_regs[i],
661                                &emif_ext_phy_ctrl_base[i * 2 + 1]);
662                 }
663         } else {
664                 /*
665                  * Write the init value for HW levling to occur
666                  */
667                 for (i = 21; i < 35; i++) {
668                         writel(ext_phy_ctrl_const_regs[i],
669                                &emif_ext_phy_ctrl_base[i * 2]);
670                         writel(ext_phy_ctrl_const_regs[i],
671                                &emif_ext_phy_ctrl_base[i * 2 + 1]);
672                 }
673         }
674 }
675
676 void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
677 {
678         if (is_omap54xx())
679                 do_ext_phy_settings_omap5(base, regs);
680         else
681                 do_ext_phy_settings_dra7(base, regs);
682 }
683
684 #ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
685 static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
686         .max_freq       = 532000000,
687         .RL             = 8,
688         .tRPab          = 21,
689         .tRCD           = 18,
690         .tWR            = 15,
691         .tRASmin        = 42,
692         .tRRD           = 10,
693         .tWTRx2         = 15,
694         .tXSR           = 140,
695         .tXPx2          = 15,
696         .tRFCab         = 130,
697         .tRTPx2         = 15,
698         .tCKE           = 3,
699         .tCKESR         = 15,
700         .tZQCS          = 90,
701         .tZQCL          = 360,
702         .tZQINIT        = 1000,
703         .tDQSCKMAXx2    = 11,
704         .tRASmax        = 70,
705         .tFAW           = 50
706 };
707
708 static const struct lpddr2_min_tck min_tck = {
709         .tRL            = 3,
710         .tRP_AB         = 3,
711         .tRCD           = 3,
712         .tWR            = 3,
713         .tRAS_MIN       = 3,
714         .tRRD           = 2,
715         .tWTR           = 2,
716         .tXP            = 2,
717         .tRTP           = 2,
718         .tCKE           = 3,
719         .tCKESR         = 3,
720         .tFAW           = 8
721 };
722
723 static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
724         &timings_jedec_532_mhz
725 };
726
727 static const struct lpddr2_device_timings dev_4G_S4_timings = {
728         .ac_timings     = ac_timings,
729         .min_tck        = &min_tck,
730 };
731
732 /*
733  * List of status registers to be controlled back to control registers
734  * after initial leveling
735  * readreg, writereg
736  */
737 const struct read_write_regs omap5_bug_00339_regs[] = {
738         { 8,  5 },
739         { 9,  6 },
740         { 10, 7 },
741         { 14, 8 },
742         { 15, 9 },
743         { 16, 10 },
744         { 11, 2 },
745         { 12, 3 },
746         { 13, 4 },
747         { 17, 11 },
748         { 18, 12 },
749         { 19, 13 },
750 };
751
752 const struct read_write_regs dra_bug_00339_regs[] = {
753         { 7,  7 },
754         { 8,  8 },
755         { 9,  9 },
756         { 10, 10 },
757         { 11, 11 },
758         { 12, 2 },
759         { 13, 3 },
760         { 14, 4 },
761         { 15, 5 },
762         { 16, 6 },
763         { 17, 12 },
764         { 18, 13 },
765         { 19, 14 },
766         { 20, 15 },
767         { 21, 16 },
768         { 22, 17 },
769         { 23, 18 },
770         { 24, 19 },
771         { 25, 20 },
772         { 26, 21}
773 };
774
775 const struct read_write_regs *get_bug_regs(u32 *iterations)
776 {
777         const struct read_write_regs *bug_00339_regs_ptr = NULL;
778
779         switch (omap_revision()) {
780         case OMAP5430_ES1_0:
781         case OMAP5430_ES2_0:
782         case OMAP5432_ES1_0:
783         case OMAP5432_ES2_0:
784                 bug_00339_regs_ptr = omap5_bug_00339_regs;
785                 *iterations = sizeof(omap5_bug_00339_regs)/
786                              sizeof(omap5_bug_00339_regs[0]);
787                 break;
788         case DRA752_ES1_0:
789         case DRA752_ES1_1:
790         case DRA722_ES1_0:
791                 bug_00339_regs_ptr = dra_bug_00339_regs;
792                 *iterations = sizeof(dra_bug_00339_regs)/
793                              sizeof(dra_bug_00339_regs[0]);
794                 break;
795         default:
796                 printf("\n Error: UnKnown SOC");
797         }
798
799         return bug_00339_regs_ptr;
800 }
801
802 void emif_get_device_timings_sdp(u32 emif_nr,
803                 const struct lpddr2_device_timings **cs0_device_timings,
804                 const struct lpddr2_device_timings **cs1_device_timings)
805 {
806         /* Identical devices on EMIF1 & EMIF2 */
807         *cs0_device_timings = &dev_4G_S4_timings;
808         *cs1_device_timings = &dev_4G_S4_timings;
809 }
810
811 void emif_get_device_timings(u32 emif_nr,
812                 const struct lpddr2_device_timings **cs0_device_timings,
813                 const struct lpddr2_device_timings **cs1_device_timings)
814         __attribute__((weak, alias("emif_get_device_timings_sdp")));
815
816 #endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */