blob: 3022b9e06e22f4bb3888de1a1105e59e49a3b21d [file] [log] [blame]
Sricharan62a86502011-11-15 09:50:00 -05001/*
SRICHARAN R99c43be2012-03-12 02:25:45 +00002 * Timing and Organization details of the ddr device parts used in OMAP5
Sricharan62a86502011-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 Denkd79de1d2013-07-08 09:37:19 +020011 * SPDX-License-Identifier: GPL-2.0+
Sricharan62a86502011-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 R99c43be2012-03-12 02:25:45 +000035const struct emif_regs emif_regs_532_mhz_2cs = {
SRICHARAN R3d534962012-03-12 02:25:37 +000036 .sdram_config_init = 0x80800EBA,
37 .sdram_config = 0x808022BA,
Sricharan62a86502011-11-15 09:50:00 -050038 .ref_ctrl = 0x0000081A,
39 .sdram_tim1 = 0x772F6873,
SRICHARAN R3d534962012-03-12 02:25:37 +000040 .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
Lokesh Vutla79a9ec72013-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 R99c43be2012-03-12 02:25:45 +000073const struct emif_regs emif_regs_266_mhz_2cs = {
SRICHARAN R3d534962012-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,
Sricharan62a86502011-11-15 09:50:00 -050080 .read_idle_ctrl = 0x00050000,
SRICHARAN R3d534962012-03-12 02:25:37 +000081 .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
Sricharan62a86502011-11-15 09:50:00 -050090};
91
Lokesh Vutlac5b931a2012-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 Rffa98182013-05-30 03:19:39 +000095 .sdram_config2 = 0x0,
Lokesh Vutlac5b931a2012-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 Vutla79a9ec72013-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 Rffa98182013-05-30 03:19:39 +0000119 .sdram_config2 = 0x0,
Lokesh Vutla79a9ec72013-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 Rffa98182013-05-30 03:19:39 +0000140const 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,
Lokesh Vutlab7eecd72015-02-16 10:15:56 +0530144 .ref_ctrl = 0x000040F1,
145 .ref_ctrl_final = 0x00001035,
Sricharan Rffa98182013-05-30 03:19:39 +0000146 .sdram_tim1 = 0xCCCF36B3,
147 .sdram_tim2 = 0x308F7FDA,
148 .sdram_tim3 = 0x027F88A8,
Sricharan R6ff822d2014-07-31 12:05:50 +0530149 .read_idle_ctrl = 0x00050001,
Sricharan Rffa98182013-05-30 03:19:39 +0000150 .zq_config = 0x0007190B,
151 .temp_alert_config = 0x00000000,
Lokesh Vutlabf6aeab2015-06-03 14:43:23 +0530152 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
153 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530154 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
Lokesh Vutla440336f2015-02-16 10:15:57 +0530155 .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,
Sricharan Rffa98182013-05-30 03:19:39 +0000159 .emif_rd_wr_lvl_rmp_win = 0x00000000,
Lokesh Vutlabf6aeab2015-06-03 14:43:23 +0530160 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
Sricharan Rffa98182013-05-30 03:19:39 +0000161 .emif_rd_wr_lvl_ctl = 0x00000000,
162 .emif_rd_wr_exec_thresh = 0x00000305
163};
164
165const 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,
Lokesh Vutlab7eecd72015-02-16 10:15:56 +0530169 .ref_ctrl = 0x000040F1,
170 .ref_ctrl_final = 0x00001035,
Sricharan Rffa98182013-05-30 03:19:39 +0000171 .sdram_tim1 = 0xCCCF36B3,
172 .sdram_tim2 = 0x308F7FDA,
173 .sdram_tim3 = 0x027F88A8,
Sricharan R6ff822d2014-07-31 12:05:50 +0530174 .read_idle_ctrl = 0x00050001,
Sricharan Rffa98182013-05-30 03:19:39 +0000175 .zq_config = 0x0007190B,
176 .temp_alert_config = 0x00000000,
Lokesh Vutlabf6aeab2015-06-03 14:43:23 +0530177 .emif_ddr_phy_ctlr_1_init = 0x0024400B,
178 .emif_ddr_phy_ctlr_1 = 0x0E24400B,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530179 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
Lokesh Vutla440336f2015-02-16 10:15:57 +0530180 .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,
Sricharan Rffa98182013-05-30 03:19:39 +0000184 .emif_rd_wr_lvl_rmp_win = 0x00000000,
Lokesh Vutlabf6aeab2015-06-03 14:43:23 +0530185 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
Sricharan Rffa98182013-05-30 03:19:39 +0000186 .emif_rd_wr_lvl_ctl = 0x00000000,
187 .emif_rd_wr_exec_thresh = 0x00000305
188};
189
R Sricharan5a9d4d12014-08-28 12:01:04 +0530190const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra_es1 = {
Angela Stegmaier94dc3f22015-02-16 10:15:55 +0530191 .sdram_config_init = 0x61862B32,
192 .sdram_config = 0x61862B32,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530193 .sdram_config2 = 0x08000000,
Lokesh Vutla7adac4a2015-06-03 14:43:24 +0530194 .ref_ctrl = 0x0000514C,
Lokesh Vutlab7eecd72015-02-16 10:15:56 +0530195 .ref_ctrl_final = 0x0000144A,
Angela Stegmaier94dc3f22015-02-16 10:15:55 +0530196 .sdram_tim1 = 0xD113781C,
Lokesh Vutla7adac4a2015-06-03 14:43:24 +0530197 .sdram_tim2 = 0x305A7FDA,
198 .sdram_tim3 = 0x409F86A8,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530199 .read_idle_ctrl = 0x00050000,
Lokesh Vutla7adac4a2015-06-03 14:43:24 +0530200 .zq_config = 0x5007190B,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530201 .temp_alert_config = 0x00000000,
Lokesh Vutla7adac4a2015-06-03 14:43:24 +0530202 .emif_ddr_phy_ctlr_1_init = 0x0024400D,
Angela Stegmaier94dc3f22015-02-16 10:15:55 +0530203 .emif_ddr_phy_ctlr_1 = 0x0E24400D,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530204 .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,
Lokesh Vutla7adac4a2015-06-03 14:43:24 +0530210 .emif_rd_wr_lvl_rmp_ctl = 0x80000000,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530211 .emif_rd_wr_lvl_ctl = 0x00000000,
212 .emif_rd_wr_exec_thresh = 0x00000305
213};
214
SRICHARAN R3d534962012-03-12 02:25:37 +0000215const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
216 .dmm_lisa_map_0 = 0x0,
SRICHARAN Re06bc102012-05-17 00:12:07 +0000217 .dmm_lisa_map_1 = 0x0,
218 .dmm_lisa_map_2 = 0x80740300,
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000219 .dmm_lisa_map_3 = 0xFF020100,
220 .is_ma_present = 0x1
Sricharan62a86502011-11-15 09:50:00 -0500221};
222
Sricharan Rffa98182013-05-30 03:19:39 +0000223/*
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 */
229const 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 */
240const struct dmm_lisa_map_regs lisa_map_2G_x_1_x_2 = {
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000241 .dmm_lisa_map_0 = 0x0,
242 .dmm_lisa_map_1 = 0x0,
Sricharan Rffa98182013-05-30 03:19:39 +0000243 .dmm_lisa_map_2 = 0x80500100,
244 .dmm_lisa_map_3 = 0xFF020100,
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000245 .is_ma_present = 0x1
246};
247
Sricharan Rffa98182013-05-30 03:19:39 +0000248/*
249 * DRA752 EVM EMIF2 ONLY CONFIGURATION
250 */
251const 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
Lokesh Vutla4d3be732014-05-15 11:08:41 +0530259/*
260 * DRA722 EVM EMIF1 CONFIGURATION
261 */
262const 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
Lokesh Vutla05dab552013-02-04 04:22:03 +0000270static 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;
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000279 case OMAP5430_ES2_0:
280 *regs = &emif_regs_532_mhz_2cs_es2;
281 break;
282 case OMAP5432_ES2_0:
Sricharan Rffa98182013-05-30 03:19:39 +0000283 *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
284 break;
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000285 case DRA752_ES1_0:
Nishanth Menon60475ff2014-01-14 10:54:42 -0600286 case DRA752_ES1_1:
Sricharan Rffa98182013-05-30 03:19:39 +0000287 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;
Lokesh Vutla4d3be732014-05-15 11:08:41 +0530296 case DRA722_ES1_0:
R Sricharan5a9d4d12014-08-28 12:01:04 +0530297 *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra_es1;
298 break;
Lokesh Vutla05dab552013-02-04 04:22:03 +0000299 default:
Sricharan Rffa98182013-05-30 03:19:39 +0000300 *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
Lokesh Vutla05dab552013-02-04 04:22:03 +0000301 }
302}
303
304void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
305 __attribute__((weak, alias("emif_get_reg_dump_sdp")));
306
307static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
308 **dmm_lisa_regs)
309{
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000310 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:
Nishanth Menon60475ff2014-01-14 10:54:42 -0600318 case DRA752_ES1_1:
Sricharan Rffa98182013-05-30 03:19:39 +0000319 *dmm_lisa_regs = &lisa_map_2G_x_2_x_2_2G_x_1_x_2;
Lokesh Vutla4d3be732014-05-15 11:08:41 +0530320 break;
321 case DRA722_ES1_0:
322 default:
323 *dmm_lisa_regs = &lisa_map_2G_x_2;
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000324 }
325
Lokesh Vutla05dab552013-02-04 04:22:03 +0000326}
327
328void 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
332static 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
339static 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
348void 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
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530355const u32 ext_phy_ctrl_const_base[] = {
SRICHARAN R3d534962012-03-12 02:25:37 +0000356 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,
Sricharan Rffa98182013-05-30 03:19:39 +0000374 0x00000077,
375 0x0
SRICHARAN R3d534962012-03-12 02:25:37 +0000376};
377
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530378const u32 ddr3_ext_phy_ctrl_const_base_es1[] = {
Lokesh Vutlac5b931a2012-05-22 00:03:24 +0000379 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,
Sricharan Rffa98182013-05-30 03:19:39 +0000397 0x00000057,
398 0x0
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000399};
400
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530401const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000402 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,
Sricharan Rffa98182013-05-30 03:19:39 +0000420 0x00000057,
421 0x0
Lokesh Vutlac5b931a2012-05-22 00:03:24 +0000422};
423
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530424/* Ext phy ctrl 1-35 regs */
Sricharan Rffa98182013-05-30 03:19:39 +0000425const u32
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530426dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530427 0x10040100,
428 0x00910091,
429 0x00950095,
430 0x009B009B,
431 0x009E009E,
Lokesh Vutla440336f2015-02-16 10:15:57 +0530432 0x00980098,
433 0x00340034,
434 0x00350035,
435 0x00340034,
436 0x00310031,
437 0x00340034,
Sricharan R6ff822d2014-07-31 12:05:50 +0530438 0x007F007F,
439 0x007F007F,
440 0x007F007F,
441 0x007F007F,
442 0x007F007F,
Lokesh Vutla440336f2015-02-16 10:15:57 +0530443 0x00480048,
444 0x004A004A,
445 0x00520052,
446 0x00550055,
447 0x00500050,
Sricharan R6ff822d2014-07-31 12:05:50 +0530448 0x00000000,
449 0x00600020,
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530450 0x40011080,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530451 0x08102040,
452 0x0,
453 0x0,
454 0x0,
455 0x0,
Lokesh Vutlabf6aeab2015-06-03 14:43:23 +0530456 0x0,
457 0x0,
458 0x0,
459 0x0,
460 0x0,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530461 0x0
Sricharan Rffa98182013-05-30 03:19:39 +0000462};
463
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530464/* Ext phy ctrl 1-35 regs */
Sricharan Rffa98182013-05-30 03:19:39 +0000465const u32
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530466dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530467 0x10040100,
468 0x00910091,
469 0x00950095,
470 0x009B009B,
471 0x009E009E,
Lokesh Vutla440336f2015-02-16 10:15:57 +0530472 0x00980098,
473 0x00330033,
474 0x00330033,
475 0x002F002F,
476 0x00320032,
477 0x00310031,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530478 0x007F007F,
479 0x007F007F,
480 0x007F007F,
481 0x007F007F,
482 0x007F007F,
Lokesh Vutla440336f2015-02-16 10:15:57 +0530483 0x00520052,
484 0x00520052,
485 0x00470047,
486 0x00490049,
487 0x00500050,
Sricharan R6ff822d2014-07-31 12:05:50 +0530488 0x00000000,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530489 0x00600020,
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530490 0x40011080,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530491 0x08102040,
492 0x0,
493 0x0,
494 0x0,
495 0x0,
Lokesh Vutlabf6aeab2015-06-03 14:43:23 +0530496 0x0,
497 0x0,
498 0x0,
499 0x0,
500 0x0,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530501 0x0
Sricharan Rffa98182013-05-30 03:19:39 +0000502};
503
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530504/* Ext phy ctrl 1-35 regs */
R Sricharan5a9d4d12014-08-28 12:01:04 +0530505const u32
506dra_ddr3_ext_phy_ctrl_const_base_666MHz[] = {
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530507 0x10040100,
508 0x00A400A4,
509 0x00A900A9,
510 0x00B000B0,
511 0x00B000B0,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530512 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,
Lokesh Vutla7adac4a2015-06-03 14:43:24 +0530536 0x0,
537 0x0,
538 0x0,
539 0x0,
540 0x0,
R Sricharan5a9d4d12014-08-28 12:01:04 +0530541 0x0
542};
543
Lokesh Vutla05dab552013-02-04 04:22:03 +0000544const 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};
Sricharan62a86502011-11-15 09:50:00 -0500551
Felipe Balbiab7df842014-11-06 08:28:49 -0600552void __weak emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530553 const u32 **regs,
554 u32 *size)
Sricharan62a86502011-11-15 09:50:00 -0500555{
Lokesh Vutla05dab552013-02-04 04:22:03 +0000556 switch (omap_revision()) {
557 case OMAP5430_ES1_0:
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000558 case OMAP5430_ES2_0:
Lokesh Vutla05dab552013-02-04 04:22:03 +0000559 *regs = ext_phy_ctrl_const_base;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530560 *size = ARRAY_SIZE(ext_phy_ctrl_const_base);
Lokesh Vutla05dab552013-02-04 04:22:03 +0000561 break;
562 case OMAP5432_ES1_0:
563 *regs = ddr3_ext_phy_ctrl_const_base_es1;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530564 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);
Lokesh Vutla05dab552013-02-04 04:22:03 +0000565 break;
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000566 case OMAP5432_ES2_0:
Sricharan Rffa98182013-05-30 03:19:39 +0000567 *regs = ddr3_ext_phy_ctrl_const_base_es2;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530568 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
Sricharan Rffa98182013-05-30 03:19:39 +0000569 break;
Lokesh Vutla8caa56c2013-02-12 21:29:07 +0000570 case DRA752_ES1_0:
Nishanth Menon60475ff2014-01-14 10:54:42 -0600571 case DRA752_ES1_1:
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530572 if (emif_nr == 1) {
Sricharan Rffa98182013-05-30 03:19:39 +0000573 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530574 *size =
575 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1);
576 } else {
Sricharan Rffa98182013-05-30 03:19:39 +0000577 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530578 *size =
579 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2);
580 }
Sricharan Rffa98182013-05-30 03:19:39 +0000581 break;
R Sricharan5a9d4d12014-08-28 12:01:04 +0530582 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;
Lokesh Vutla05dab552013-02-04 04:22:03 +0000586 default:
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000587 *regs = ddr3_ext_phy_ctrl_const_base_es2;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530588 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
Lokesh Vutla79a9ec72013-02-12 01:33:44 +0000589
Lokesh Vutla05dab552013-02-04 04:22:03 +0000590 }
Sricharan62a86502011-11-15 09:50:00 -0500591}
592
Lokesh Vutla05dab552013-02-04 04:22:03 +0000593void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
Sricharan62a86502011-11-15 09:50:00 -0500594{
Lokesh Vutla05dab552013-02-04 04:22:03 +0000595 *regs = &mr_regs;
Sricharan62a86502011-11-15 09:50:00 -0500596}
597
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530598static void do_ext_phy_settings_omap5(u32 base, const struct emif_regs *regs)
SRICHARAN Rb9f10a52012-06-04 03:40:23 +0000599{
600 u32 *ext_phy_ctrl_base = 0;
601 u32 *emif_ext_phy_ctrl_base = 0;
Sricharan Rffa98182013-05-30 03:19:39 +0000602 u32 emif_nr;
Lokesh Vutla05dab552013-02-04 04:22:03 +0000603 const u32 *ext_phy_ctrl_const_regs;
SRICHARAN Rb9f10a52012-06-04 03:40:23 +0000604 u32 i = 0;
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530605 u32 size;
SRICHARAN Rb9f10a52012-06-04 03:40:23 +0000606
Sricharan Rffa98182013-05-30 03:19:39 +0000607 emif_nr = (base == EMIF1_BASE) ? 1 : 2;
608
SRICHARAN Rb9f10a52012-06-04 03:40:23 +0000609 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 */
SRICHARAN Re02f5f82013-11-08 17:40:37 +0530625 emif_get_ext_phy_ctrl_const_regs(emif_nr,
626 &ext_phy_ctrl_const_regs, &size);
627
628 for (i = 0; i < size; i++) {
Lokesh Vutla05dab552013-02-04 04:22:03 +0000629 writel(ext_phy_ctrl_const_regs[i],
630 emif_ext_phy_ctrl_base++);
SRICHARAN Rb9f10a52012-06-04 03:40:23 +0000631 /* Update shadow registers */
Lokesh Vutla05dab552013-02-04 04:22:03 +0000632 writel(ext_phy_ctrl_const_regs[i],
633 emif_ext_phy_ctrl_base++);
SRICHARAN Rb9f10a52012-06-04 03:40:23 +0000634 }
635}
636
Lokesh Vutla979d2c32015-06-03 14:43:21 +0530637static 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
681void 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
Sricharan62a86502011-11-15 09:50:00 -0500689#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
690static 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
SRICHARAN R99c43be2012-03-12 02:25:45 +0000713static const struct lpddr2_min_tck min_tck = {
Sricharan62a86502011-11-15 09:50:00 -0500714 .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
SRICHARAN R99c43be2012-03-12 02:25:45 +0000728static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
Sricharan62a86502011-11-15 09:50:00 -0500729 &timings_jedec_532_mhz
730};
731
SRICHARAN R99c43be2012-03-12 02:25:45 +0000732static const struct lpddr2_device_timings dev_4G_S4_timings = {
733 .ac_timings = ac_timings,
734 .min_tck = &min_tck,
Sricharan62a86502011-11-15 09:50:00 -0500735};
736
SRICHARAN R4796b7a2013-11-08 17:40:38 +0530737/*
738 * List of status registers to be controlled back to control registers
739 * after initial leveling
740 * readreg, writereg
741 */
742const 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
757const 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
780const 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:
Nishanth Menon60475ff2014-01-14 10:54:42 -0600794 case DRA752_ES1_1:
Lokesh Vutla4d3be732014-05-15 11:08:41 +0530795 case DRA722_ES1_0:
SRICHARAN R4796b7a2013-11-08 17:40:38 +0530796 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
Sricharan62a86502011-11-15 09:50:00 -0500807void 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 */
SRICHARAN R99c43be2012-03-12 02:25:45 +0000812 *cs0_device_timings = &dev_4G_S4_timings;
813 *cs1_device_timings = &dev_4G_S4_timings;
Sricharan62a86502011-11-15 09:50:00 -0500814}
815
816void 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 */