blob: 8fb962e39dcb020a17935063a0aada77bdcf6d78 [file] [log] [blame]
Sricharanbb772a52011-11-15 09:50:00 -05001/*
SRICHARAN R971f2ba2012-03-12 02:25:45 +00002 * Timing and Organization details of the ddr device parts used in OMAP5
Sricharanbb772a52011-11-15 09:50:00 -05003 * 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 *
Wolfgang Denk1a459662013-07-08 09:37:19 +020011 * SPDX-License-Identifier: GPL-2.0+
Sricharanbb772a52011-11-15 09:50:00 -050012 */
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
SRICHARAN R971f2ba2012-03-12 02:25:45 +000035const struct emif_regs emif_regs_532_mhz_2cs = {
SRICHARAN Rf4010732012-03-12 02:25:37 +000036 .sdram_config_init = 0x80800EBA,
37 .sdram_config = 0x808022BA,
Sricharanbb772a52011-11-15 09:50:00 -050038 .ref_ctrl = 0x0000081A,
39 .sdram_tim1 = 0x772F6873,
SRICHARAN Rf4010732012-03-12 02:25:37 +000040 .sdram_tim2 = 0x304a129a,
41 .sdram_tim3 = 0x02f7e45f,
Sricharanbb772a52011-11-15 09:50:00 -050042 .read_idle_ctrl = 0x00050000,
SRICHARAN Rf4010732012-03-12 02:25:37 +000043 .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
Sricharanbb772a52011-11-15 09:50:00 -050052};
53
Lokesh Vutla9100ede2013-02-12 01:33:44 +000054const 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
SRICHARAN R971f2ba2012-03-12 02:25:45 +000073const struct emif_regs emif_regs_266_mhz_2cs = {
SRICHARAN Rf4010732012-03-12 02:25:37 +000074 .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
Lokesh Vutla43037d72012-05-22 00:03:24 +000092const struct emif_regs emif_regs_ddr3_532_mhz_1cs = {
93 .sdram_config_init = 0x61851B32,
94 .sdram_config = 0x61851B32,
Sricharan R92b04822013-05-30 03:19:39 +000095 .sdram_config2 = 0x0,
Lokesh Vutla43037d72012-05-22 00:03:24 +000096 .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
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000116const struct emif_regs emif_regs_ddr3_532_mhz_1cs_es2 = {
117 .sdram_config_init = 0x61851B32,
118 .sdram_config = 0x61851B32,
Sricharan R92b04822013-05-30 03:19:39 +0000119 .sdram_config2 = 0x0,
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000120 .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
SRICHARAN Rf4010732012-03-12 02:25:37 +0000140const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
141 .dmm_lisa_map_0 = 0x0,
SRICHARAN R77efdeb2012-05-17 00:12:07 +0000142 .dmm_lisa_map_1 = 0x0,
143 .dmm_lisa_map_2 = 0x80740300,
Lokesh Vutla78314192013-02-12 21:29:07 +0000144 .dmm_lisa_map_3 = 0xFF020100,
145 .is_ma_present = 0x1
146};
147
Sricharanbb772a52011-11-15 09:50:00 -0500148static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
149{
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000150 switch (omap_revision()) {
151 case OMAP5430_ES1_0:
Lokesh Vutla43037d72012-05-22 00:03:24 +0000152 *regs = &emif_regs_532_mhz_2cs;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000153 break;
154 case OMAP5432_ES1_0:
155 *regs = &emif_regs_ddr3_532_mhz_1cs;
156 break;
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000157 case OMAP5430_ES2_0:
158 *regs = &emif_regs_532_mhz_2cs_es2;
159 break;
160 case OMAP5432_ES2_0:
Lokesh Vutlaa7638832016-03-08 09:18:06 +0530161 default:
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000162 *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
Sricharan R92b04822013-05-30 03:19:39 +0000163 break;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000164 }
Sricharanbb772a52011-11-15 09:50:00 -0500165}
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000166
Sricharanbb772a52011-11-15 09:50:00 -0500167void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
168 __attribute__((weak, alias("emif_get_reg_dump_sdp")));
169
170static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
171 **dmm_lisa_regs)
172{
Lokesh Vutla78314192013-02-12 21:29:07 +0000173 switch (omap_revision()) {
174 case OMAP5430_ES1_0:
175 case OMAP5430_ES2_0:
176 case OMAP5432_ES1_0:
177 case OMAP5432_ES2_0:
Lokesh Vutlaa7638832016-03-08 09:18:06 +0530178 default:
Lokesh Vutla78314192013-02-12 21:29:07 +0000179 *dmm_lisa_regs = &lisa_map_4G_x_2_x_2;
180 break;
Lokesh Vutla78314192013-02-12 21:29:07 +0000181 }
182
Sricharanbb772a52011-11-15 09:50:00 -0500183}
184
185void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
186 __attribute__((weak, alias("emif_get_dmm_regs_sdp")));
Sricharanbb772a52011-11-15 09:50:00 -0500187#else
188
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000189static const struct lpddr2_device_details dev_4G_S4_details = {
Sricharanbb772a52011-11-15 09:50:00 -0500190 .type = LPDDR2_TYPE_S4,
191 .density = LPDDR2_DENSITY_4Gb,
192 .io_width = LPDDR2_IO_WIDTH_32,
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000193 .manufacturer = LPDDR2_MANUFACTURER_SAMSUNG
Sricharanbb772a52011-11-15 09:50:00 -0500194};
195
196static void emif_get_device_details_sdp(u32 emif_nr,
197 struct lpddr2_device_details *cs0_device_details,
198 struct lpddr2_device_details *cs1_device_details)
199{
200 /* EMIF1 & EMIF2 have identical configuration */
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000201 *cs0_device_details = dev_4G_S4_details;
202 *cs1_device_details = dev_4G_S4_details;
Sricharanbb772a52011-11-15 09:50:00 -0500203}
204
205void emif_get_device_details(u32 emif_nr,
206 struct lpddr2_device_details *cs0_device_details,
207 struct lpddr2_device_details *cs1_device_details)
208 __attribute__((weak, alias("emif_get_device_details_sdp")));
209
210#endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
211
SRICHARAN R6c709352013-11-08 17:40:37 +0530212const u32 ext_phy_ctrl_const_base[] = {
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000213 0x01004010,
214 0x00001004,
215 0x04010040,
216 0x01004010,
217 0x00001004,
218 0x00000000,
219 0x00000000,
220 0x00000000,
221 0x80080080,
222 0x00800800,
223 0x08102040,
224 0x00000001,
225 0x540A8150,
226 0xA81502a0,
227 0x002A0540,
228 0x00000000,
229 0x00000000,
230 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000231 0x00000077,
232 0x0
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000233};
234
SRICHARAN R6c709352013-11-08 17:40:37 +0530235const u32 ddr3_ext_phy_ctrl_const_base_es1[] = {
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000236 0x01004010,
237 0x00001004,
238 0x04010040,
239 0x01004010,
240 0x00001004,
241 0x00000000,
242 0x00000000,
243 0x00000000,
244 0x80080080,
245 0x00800800,
246 0x08102040,
247 0x00000002,
248 0x0,
249 0x0,
250 0x0,
251 0x00000000,
252 0x00000000,
253 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000254 0x00000057,
255 0x0
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000256};
257
SRICHARAN R6c709352013-11-08 17:40:37 +0530258const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000259 0x50D4350D,
260 0x00000D43,
261 0x04010040,
262 0x01004010,
263 0x00001004,
264 0x00000000,
265 0x00000000,
266 0x00000000,
267 0x80080080,
268 0x00800800,
269 0x08102040,
270 0x00000002,
271 0x00000000,
272 0x00000000,
273 0x00000000,
274 0x00000000,
275 0x00000000,
276 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000277 0x00000057,
278 0x0
279};
280
Lokesh Vutla6213db72015-06-03 14:43:21 +0530281/* Ext phy ctrl 1-35 regs */
Sricharan R92b04822013-05-30 03:19:39 +0000282const u32
SRICHARAN R6c709352013-11-08 17:40:37 +0530283dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
Lokesh Vutla6213db72015-06-03 14:43:21 +0530284 0x10040100,
285 0x00910091,
286 0x00950095,
287 0x009B009B,
288 0x009E009E,
Lokesh Vutla1860d102015-02-16 10:15:57 +0530289 0x00980098,
290 0x00340034,
291 0x00350035,
292 0x00340034,
293 0x00310031,
294 0x00340034,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530295 0x007F007F,
296 0x007F007F,
297 0x007F007F,
298 0x007F007F,
299 0x007F007F,
Lokesh Vutla1860d102015-02-16 10:15:57 +0530300 0x00480048,
301 0x004A004A,
302 0x00520052,
303 0x00550055,
304 0x00500050,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530305 0x00000000,
306 0x00600020,
Lokesh Vutla6213db72015-06-03 14:43:21 +0530307 0x40011080,
SRICHARAN R6c709352013-11-08 17:40:37 +0530308 0x08102040,
309 0x0,
310 0x0,
311 0x0,
312 0x0,
Lokesh Vutla920638f2015-06-03 14:43:23 +0530313 0x0,
314 0x0,
315 0x0,
316 0x0,
317 0x0,
SRICHARAN R6c709352013-11-08 17:40:37 +0530318 0x0
Sricharan R92b04822013-05-30 03:19:39 +0000319};
320
Lokesh Vutla6213db72015-06-03 14:43:21 +0530321/* Ext phy ctrl 1-35 regs */
Sricharan R92b04822013-05-30 03:19:39 +0000322const u32
SRICHARAN R6c709352013-11-08 17:40:37 +0530323dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
Lokesh Vutla6213db72015-06-03 14:43:21 +0530324 0x10040100,
325 0x00910091,
326 0x00950095,
327 0x009B009B,
328 0x009E009E,
Lokesh Vutla1860d102015-02-16 10:15:57 +0530329 0x00980098,
330 0x00330033,
331 0x00330033,
332 0x002F002F,
333 0x00320032,
334 0x00310031,
SRICHARAN R6c709352013-11-08 17:40:37 +0530335 0x007F007F,
336 0x007F007F,
337 0x007F007F,
338 0x007F007F,
339 0x007F007F,
Lokesh Vutla1860d102015-02-16 10:15:57 +0530340 0x00520052,
341 0x00520052,
342 0x00470047,
343 0x00490049,
344 0x00500050,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530345 0x00000000,
SRICHARAN R6c709352013-11-08 17:40:37 +0530346 0x00600020,
Lokesh Vutla6213db72015-06-03 14:43:21 +0530347 0x40011080,
SRICHARAN R6c709352013-11-08 17:40:37 +0530348 0x08102040,
349 0x0,
350 0x0,
351 0x0,
352 0x0,
Lokesh Vutla920638f2015-06-03 14:43:23 +0530353 0x0,
354 0x0,
355 0x0,
356 0x0,
357 0x0,
SRICHARAN R6c709352013-11-08 17:40:37 +0530358 0x0
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000359};
360
Lokesh Vutla6213db72015-06-03 14:43:21 +0530361/* Ext phy ctrl 1-35 regs */
R Sricharan681f7852014-08-28 12:01:04 +0530362const u32
363dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
Lokesh Vutla6213db72015-06-03 14:43:21 +0530364 0x10040100,
365 0x00A400A4,
366 0x00A900A9,
367 0x00B000B0,
368 0x00B000B0,
R Sricharan681f7852014-08-28 12:01:04 +0530369 0x00A400A4,
370 0x00390039,
371 0x00320032,
372 0x00320032,
373 0x00320032,
374 0x00440044,
375 0x00550055,
376 0x00550055,
377 0x00550055,
378 0x00550055,
379 0x007F007F,
380 0x004D004D,
381 0x00430043,
382 0x00560056,
383 0x00540054,
384 0x00600060,
385 0x0,
386 0x00600020,
387 0x40010080,
388 0x08102040,
389 0x0,
390 0x0,
391 0x0,
392 0x0,
Lokesh Vutlaf308b4f2015-06-03 14:43:24 +0530393 0x0,
394 0x0,
395 0x0,
396 0x0,
397 0x0,
R Sricharan681f7852014-08-28 12:01:04 +0530398 0x0
399};
400
Nishanth Menon9c90f512016-03-15 18:09:13 -0500401const u32 dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2[] = {
402 0x04040100,
403 0x006B009F,
404 0x006B00A2,
405 0x006B00A8,
406 0x006B00A8,
407 0x006B00B2,
408 0x002F002F,
409 0x002F002F,
410 0x002F002F,
411 0x002F002F,
412 0x002F002F,
413 0x00600073,
414 0x00600071,
415 0x0060007C,
416 0x0060007E,
417 0x00600084,
418 0x00400053,
419 0x00400051,
420 0x0040005C,
421 0x0040005E,
422 0x00400064,
423 0x00800080,
424 0x00800080,
425 0x40010080,
426 0x08102040,
427 0x005B008F,
428 0x005B0092,
429 0x005B0098,
430 0x005B0098,
431 0x005B00A2,
432 0x00300043,
433 0x00300041,
434 0x0030004C,
435 0x0030004E,
436 0x00300054,
437 0x00000077
438};
439
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000440const struct lpddr2_mr_regs mr_regs = {
441 .mr1 = MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8,
442 .mr2 = 0x6,
443 .mr3 = 0x1,
444 .mr10 = MR10_ZQ_ZQINIT,
445 .mr16 = MR16_REF_FULL_ARRAY
446};
447
Felipe Balbieedd9912014-11-06 08:28:49 -0600448void __weak emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
SRICHARAN R6c709352013-11-08 17:40:37 +0530449 const u32 **regs,
450 u32 *size)
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000451{
452 switch (omap_revision()) {
453 case OMAP5430_ES1_0:
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000454 case OMAP5430_ES2_0:
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000455 *regs = ext_phy_ctrl_const_base;
SRICHARAN R6c709352013-11-08 17:40:37 +0530456 *size = ARRAY_SIZE(ext_phy_ctrl_const_base);
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000457 break;
458 case OMAP5432_ES1_0:
459 *regs = ddr3_ext_phy_ctrl_const_base_es1;
SRICHARAN R6c709352013-11-08 17:40:37 +0530460 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000461 break;
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000462 case OMAP5432_ES2_0:
Sricharan R92b04822013-05-30 03:19:39 +0000463 *regs = ddr3_ext_phy_ctrl_const_base_es2;
SRICHARAN R6c709352013-11-08 17:40:37 +0530464 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
Sricharan R92b04822013-05-30 03:19:39 +0000465 break;
Lokesh Vutla78314192013-02-12 21:29:07 +0000466 case DRA752_ES1_0:
Nishanth Menon3ac8c0b2014-01-14 10:54:42 -0600467 case DRA752_ES1_1:
Nishanth Menonc1ea3be2015-08-13 09:50:58 -0500468 case DRA752_ES2_0:
SRICHARAN R6c709352013-11-08 17:40:37 +0530469 if (emif_nr == 1) {
Sricharan R92b04822013-05-30 03:19:39 +0000470 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
SRICHARAN R6c709352013-11-08 17:40:37 +0530471 *size =
472 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1);
473 } else {
Sricharan R92b04822013-05-30 03:19:39 +0000474 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
SRICHARAN R6c709352013-11-08 17:40:37 +0530475 *size =
476 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2);
477 }
Sricharan R92b04822013-05-30 03:19:39 +0000478 break;
R Sricharan681f7852014-08-28 12:01:04 +0530479 case DRA722_ES1_0:
480 *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz;
481 *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz);
482 break;
Lokesh Vutlac9a7c172017-08-21 12:50:55 +0530483 case DRA762_ES1_0:
Nishanth Menon9c90f512016-03-15 18:09:13 -0500484 case DRA722_ES2_0:
Vishal Mahaveerba396082017-08-26 16:51:22 -0500485 case DRA722_ES2_1:
Nishanth Menon9c90f512016-03-15 18:09:13 -0500486 *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2;
487 *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2);
488 break;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000489 default:
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000490 *regs = ddr3_ext_phy_ctrl_const_base_es2;
SRICHARAN R6c709352013-11-08 17:40:37 +0530491 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000492
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000493 }
494}
495
496void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
497{
498 *regs = &mr_regs;
499}
500
Lokesh Vutla6213db72015-06-03 14:43:21 +0530501static void do_ext_phy_settings_omap5(u32 base, const struct emif_regs *regs)
SRICHARAN R25476382012-06-04 03:40:23 +0000502{
503 u32 *ext_phy_ctrl_base = 0;
504 u32 *emif_ext_phy_ctrl_base = 0;
Sricharan R92b04822013-05-30 03:19:39 +0000505 u32 emif_nr;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000506 const u32 *ext_phy_ctrl_const_regs;
SRICHARAN R25476382012-06-04 03:40:23 +0000507 u32 i = 0;
SRICHARAN R6c709352013-11-08 17:40:37 +0530508 u32 size;
SRICHARAN R25476382012-06-04 03:40:23 +0000509
Sricharan R92b04822013-05-30 03:19:39 +0000510 emif_nr = (base == EMIF1_BASE) ? 1 : 2;
511
SRICHARAN R25476382012-06-04 03:40:23 +0000512 struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
513
514 ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
515 emif_ext_phy_ctrl_base = (u32 *) &(emif->emif_ddr_ext_phy_ctrl_1);
516
517 /* Configure external phy control timing registers */
518 for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
519 writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
520 /* Update shadow registers */
521 writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
522 }
523
524 /*
525 * external phy 6-24 registers do not change with
526 * ddr frequency
527 */
SRICHARAN R6c709352013-11-08 17:40:37 +0530528 emif_get_ext_phy_ctrl_const_regs(emif_nr,
529 &ext_phy_ctrl_const_regs, &size);
530
531 for (i = 0; i < size; i++) {
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000532 writel(ext_phy_ctrl_const_regs[i],
533 emif_ext_phy_ctrl_base++);
SRICHARAN R25476382012-06-04 03:40:23 +0000534 /* Update shadow registers */
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000535 writel(ext_phy_ctrl_const_regs[i],
536 emif_ext_phy_ctrl_base++);
SRICHARAN R25476382012-06-04 03:40:23 +0000537 }
538}
539
Lokesh Vutla6213db72015-06-03 14:43:21 +0530540static void do_ext_phy_settings_dra7(u32 base, const struct emif_regs *regs)
541{
542 struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
543 u32 *emif_ext_phy_ctrl_base = 0;
544 u32 emif_nr;
545 const u32 *ext_phy_ctrl_const_regs;
Lokesh Vutlae3ce3aa2016-03-05 17:32:30 +0530546 u32 i, hw_leveling, size, phy;
Lokesh Vutla6213db72015-06-03 14:43:21 +0530547
548 emif_nr = (base == EMIF1_BASE) ? 1 : 2;
549
550 hw_leveling = regs->emif_rd_wr_lvl_rmp_ctl >> EMIF_REG_RDWRLVL_EN_SHIFT;
Lokesh Vutlae3ce3aa2016-03-05 17:32:30 +0530551 phy = regs->emif_ddr_phy_ctlr_1_init;
Lokesh Vutla6213db72015-06-03 14:43:21 +0530552
553 emif_ext_phy_ctrl_base = (u32 *)&(emif->emif_ddr_ext_phy_ctrl_1);
554
555 emif_get_ext_phy_ctrl_const_regs(emif_nr,
556 &ext_phy_ctrl_const_regs, &size);
557
558 writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[0]);
559 writel(ext_phy_ctrl_const_regs[0], &emif_ext_phy_ctrl_base[1]);
560
Lokesh Vutlae3ce3aa2016-03-05 17:32:30 +0530561 /*
562 * Copy the predefined PHY register values
563 * if leveling is disabled.
564 */
565 if (phy & EMIF_DDR_PHY_CTRL_1_RDLVLGATE_MASK_MASK)
566 for (i = 1; i < 6; i++) {
Lokesh Vutla6213db72015-06-03 14:43:21 +0530567 writel(ext_phy_ctrl_const_regs[i],
568 &emif_ext_phy_ctrl_base[i * 2]);
569 writel(ext_phy_ctrl_const_regs[i],
570 &emif_ext_phy_ctrl_base[i * 2 + 1]);
571 }
Lokesh Vutlae3ce3aa2016-03-05 17:32:30 +0530572
573 if (phy & EMIF_DDR_PHY_CTRL_1_RDLVL_MASK_MASK)
574 for (i = 6; i < 11; i++) {
575 writel(ext_phy_ctrl_const_regs[i],
576 &emif_ext_phy_ctrl_base[i * 2]);
577 writel(ext_phy_ctrl_const_regs[i],
578 &emif_ext_phy_ctrl_base[i * 2 + 1]);
579 }
580
581 if (phy & EMIF_DDR_PHY_CTRL_1_WRLVL_MASK_MASK)
582 for (i = 11; i < 25; i++) {
583 writel(ext_phy_ctrl_const_regs[i],
584 &emif_ext_phy_ctrl_base[i * 2]);
585 writel(ext_phy_ctrl_const_regs[i],
586 &emif_ext_phy_ctrl_base[i * 2 + 1]);
587 }
588
589 if (hw_leveling) {
Lokesh Vutla6213db72015-06-03 14:43:21 +0530590 /*
591 * Write the init value for HW levling to occur
592 */
593 for (i = 21; i < 35; i++) {
594 writel(ext_phy_ctrl_const_regs[i],
595 &emif_ext_phy_ctrl_base[i * 2]);
596 writel(ext_phy_ctrl_const_regs[i],
597 &emif_ext_phy_ctrl_base[i * 2 + 1]);
598 }
599 }
600}
601
602void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
603{
604 if (is_omap54xx())
605 do_ext_phy_settings_omap5(base, regs);
606 else
607 do_ext_phy_settings_dra7(base, regs);
608}
609
Sricharanbb772a52011-11-15 09:50:00 -0500610#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
611static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
612 .max_freq = 532000000,
613 .RL = 8,
614 .tRPab = 21,
615 .tRCD = 18,
616 .tWR = 15,
617 .tRASmin = 42,
618 .tRRD = 10,
619 .tWTRx2 = 15,
620 .tXSR = 140,
621 .tXPx2 = 15,
622 .tRFCab = 130,
623 .tRTPx2 = 15,
624 .tCKE = 3,
625 .tCKESR = 15,
626 .tZQCS = 90,
627 .tZQCL = 360,
628 .tZQINIT = 1000,
629 .tDQSCKMAXx2 = 11,
630 .tRASmax = 70,
631 .tFAW = 50
632};
633
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000634static const struct lpddr2_min_tck min_tck = {
Sricharanbb772a52011-11-15 09:50:00 -0500635 .tRL = 3,
636 .tRP_AB = 3,
637 .tRCD = 3,
638 .tWR = 3,
639 .tRAS_MIN = 3,
640 .tRRD = 2,
641 .tWTR = 2,
642 .tXP = 2,
643 .tRTP = 2,
644 .tCKE = 3,
645 .tCKESR = 3,
646 .tFAW = 8
647};
648
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000649static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
Sricharanbb772a52011-11-15 09:50:00 -0500650 &timings_jedec_532_mhz
651};
652
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000653static const struct lpddr2_device_timings dev_4G_S4_timings = {
654 .ac_timings = ac_timings,
655 .min_tck = &min_tck,
Sricharanbb772a52011-11-15 09:50:00 -0500656};
657
SRICHARAN R54d022e2013-11-08 17:40:38 +0530658/*
659 * List of status registers to be controlled back to control registers
660 * after initial leveling
661 * readreg, writereg
662 */
663const struct read_write_regs omap5_bug_00339_regs[] = {
664 { 8, 5 },
665 { 9, 6 },
666 { 10, 7 },
667 { 14, 8 },
668 { 15, 9 },
669 { 16, 10 },
670 { 11, 2 },
671 { 12, 3 },
672 { 13, 4 },
673 { 17, 11 },
674 { 18, 12 },
675 { 19, 13 },
676};
677
678const struct read_write_regs dra_bug_00339_regs[] = {
679 { 7, 7 },
680 { 8, 8 },
681 { 9, 9 },
682 { 10, 10 },
683 { 11, 11 },
684 { 12, 2 },
685 { 13, 3 },
686 { 14, 4 },
687 { 15, 5 },
688 { 16, 6 },
689 { 17, 12 },
690 { 18, 13 },
691 { 19, 14 },
692 { 20, 15 },
693 { 21, 16 },
694 { 22, 17 },
695 { 23, 18 },
696 { 24, 19 },
697 { 25, 20 },
698 { 26, 21}
699};
700
701const struct read_write_regs *get_bug_regs(u32 *iterations)
702{
703 const struct read_write_regs *bug_00339_regs_ptr = NULL;
704
705 switch (omap_revision()) {
706 case OMAP5430_ES1_0:
707 case OMAP5430_ES2_0:
708 case OMAP5432_ES1_0:
709 case OMAP5432_ES2_0:
710 bug_00339_regs_ptr = omap5_bug_00339_regs;
711 *iterations = sizeof(omap5_bug_00339_regs)/
712 sizeof(omap5_bug_00339_regs[0]);
713 break;
Lokesh Vutlac9a7c172017-08-21 12:50:55 +0530714 case DRA762_ES1_0:
SRICHARAN R54d022e2013-11-08 17:40:38 +0530715 case DRA752_ES1_0:
Nishanth Menon3ac8c0b2014-01-14 10:54:42 -0600716 case DRA752_ES1_1:
Nishanth Menonc1ea3be2015-08-13 09:50:58 -0500717 case DRA752_ES2_0:
Lokesh Vutla9fcf3d32014-05-15 11:08:41 +0530718 case DRA722_ES1_0:
Ravi Babud851ad32016-03-15 18:09:11 -0500719 case DRA722_ES2_0:
Vishal Mahaveerba396082017-08-26 16:51:22 -0500720 case DRA722_ES2_1:
SRICHARAN R54d022e2013-11-08 17:40:38 +0530721 bug_00339_regs_ptr = dra_bug_00339_regs;
722 *iterations = sizeof(dra_bug_00339_regs)/
723 sizeof(dra_bug_00339_regs[0]);
724 break;
725 default:
726 printf("\n Error: UnKnown SOC");
727 }
728
729 return bug_00339_regs_ptr;
730}
731
Sricharanbb772a52011-11-15 09:50:00 -0500732void emif_get_device_timings_sdp(u32 emif_nr,
733 const struct lpddr2_device_timings **cs0_device_timings,
734 const struct lpddr2_device_timings **cs1_device_timings)
735{
736 /* Identical devices on EMIF1 & EMIF2 */
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000737 *cs0_device_timings = &dev_4G_S4_timings;
738 *cs1_device_timings = &dev_4G_S4_timings;
Sricharanbb772a52011-11-15 09:50:00 -0500739}
740
741void emif_get_device_timings(u32 emif_nr,
742 const struct lpddr2_device_timings **cs0_device_timings,
743 const struct lpddr2_device_timings **cs1_device_timings)
744 __attribute__((weak, alias("emif_get_device_timings_sdp")));
745
746#endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */