blob: 9105121ff60a04347c4bfd3b271ad625c0e10e1c [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 R92b04822013-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,
144 .ref_ctrl = 0x00001035,
145 .sdram_tim1 = 0xCCCF36B3,
146 .sdram_tim2 = 0x308F7FDA,
147 .sdram_tim3 = 0x027F88A8,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530148 .read_idle_ctrl = 0x00050001,
Sricharan R92b04822013-05-30 03:19:39 +0000149 .zq_config = 0x0007190B,
150 .temp_alert_config = 0x00000000,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530151 .emif_ddr_phy_ctlr_1_init = 0x0E24400A,
152 .emif_ddr_phy_ctlr_1 = 0x0E24400A,
SRICHARAN R6c709352013-11-08 17:40:37 +0530153 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530154 .emif_ddr_ext_phy_ctrl_2 = 0x00BB00BB,
155 .emif_ddr_ext_phy_ctrl_3 = 0x00BB00BB,
156 .emif_ddr_ext_phy_ctrl_4 = 0x00BB00BB,
157 .emif_ddr_ext_phy_ctrl_5 = 0x00BB00BB,
Sricharan R92b04822013-05-30 03:19:39 +0000158 .emif_rd_wr_lvl_rmp_win = 0x00000000,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530159 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000160 .emif_rd_wr_lvl_ctl = 0x00000000,
161 .emif_rd_wr_exec_thresh = 0x00000305
162};
163
164const struct emif_regs emif_2_regs_ddr3_532_mhz_1cs_dra_es1 = {
165 .sdram_config_init = 0x61851B32,
166 .sdram_config = 0x61851B32,
167 .sdram_config2 = 0x08000000,
168 .ref_ctrl = 0x00001035,
169 .sdram_tim1 = 0xCCCF36B3,
170 .sdram_tim2 = 0x308F7FDA,
171 .sdram_tim3 = 0x027F88A8,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530172 .read_idle_ctrl = 0x00050001,
Sricharan R92b04822013-05-30 03:19:39 +0000173 .zq_config = 0x0007190B,
174 .temp_alert_config = 0x00000000,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530175 .emif_ddr_phy_ctlr_1_init = 0x0E24400A,
176 .emif_ddr_phy_ctlr_1 = 0x0E24400A,
SRICHARAN R6c709352013-11-08 17:40:37 +0530177 .emif_ddr_ext_phy_ctrl_1 = 0x10040100,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530178 .emif_ddr_ext_phy_ctrl_2 = 0x00BB00BB,
179 .emif_ddr_ext_phy_ctrl_3 = 0x00BB00BB,
180 .emif_ddr_ext_phy_ctrl_4 = 0x00BB00BB,
181 .emif_ddr_ext_phy_ctrl_5 = 0x00BB00BB,
Sricharan R92b04822013-05-30 03:19:39 +0000182 .emif_rd_wr_lvl_rmp_win = 0x00000000,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530183 .emif_rd_wr_lvl_rmp_ctl = 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000184 .emif_rd_wr_lvl_ctl = 0x00000000,
185 .emif_rd_wr_exec_thresh = 0x00000305
186};
187
SRICHARAN Rf4010732012-03-12 02:25:37 +0000188const struct dmm_lisa_map_regs lisa_map_4G_x_2_x_2 = {
189 .dmm_lisa_map_0 = 0x0,
SRICHARAN R77efdeb2012-05-17 00:12:07 +0000190 .dmm_lisa_map_1 = 0x0,
191 .dmm_lisa_map_2 = 0x80740300,
Lokesh Vutla78314192013-02-12 21:29:07 +0000192 .dmm_lisa_map_3 = 0xFF020100,
193 .is_ma_present = 0x1
194};
195
Sricharan R92b04822013-05-30 03:19:39 +0000196/*
197 * DRA752 EVM board has 1.5 GB of memory
198 * EMIF1 --> 2Gb * 2 = 512MB
199 * EMIF2 --> 2Gb * 4 = 1GB
200 * so mapping 1GB interleaved and 512MB non-interleaved
201 */
202const struct dmm_lisa_map_regs lisa_map_2G_x_2_x_2_2G_x_1_x_2 = {
203 .dmm_lisa_map_0 = 0x0,
204 .dmm_lisa_map_1 = 0x80640300,
205 .dmm_lisa_map_2 = 0xC0500220,
206 .dmm_lisa_map_3 = 0xFF020100,
207 .is_ma_present = 0x1
208};
209
210/*
211 * DRA752 EVM EMIF1 ONLY CONFIGURATION
212 */
213const struct dmm_lisa_map_regs lisa_map_2G_x_1_x_2 = {
Lokesh Vutla78314192013-02-12 21:29:07 +0000214 .dmm_lisa_map_0 = 0x0,
215 .dmm_lisa_map_1 = 0x0,
Sricharan R92b04822013-05-30 03:19:39 +0000216 .dmm_lisa_map_2 = 0x80500100,
217 .dmm_lisa_map_3 = 0xFF020100,
218 .is_ma_present = 0x1
219};
220
221/*
222 * DRA752 EVM EMIF2 ONLY CONFIGURATION
223 */
224const struct dmm_lisa_map_regs lisa_map_2G_x_2_x_2 = {
225 .dmm_lisa_map_0 = 0x0,
226 .dmm_lisa_map_1 = 0x0,
227 .dmm_lisa_map_2 = 0x80600200,
228 .dmm_lisa_map_3 = 0xFF020100,
Lokesh Vutla78314192013-02-12 21:29:07 +0000229 .is_ma_present = 0x1
SRICHARAN Rf4010732012-03-12 02:25:37 +0000230};
231
Lokesh Vutla9fcf3d32014-05-15 11:08:41 +0530232/*
233 * DRA722 EVM EMIF1 CONFIGURATION
234 */
235const struct dmm_lisa_map_regs lisa_map_2G_x_2 = {
236 .dmm_lisa_map_0 = 0x0,
237 .dmm_lisa_map_1 = 0x0,
238 .dmm_lisa_map_2 = 0x80600100,
239 .dmm_lisa_map_3 = 0xFF020100,
240 .is_ma_present = 0x1
241};
242
Sricharanbb772a52011-11-15 09:50:00 -0500243static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)
244{
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000245 switch (omap_revision()) {
246 case OMAP5430_ES1_0:
Lokesh Vutla43037d72012-05-22 00:03:24 +0000247 *regs = &emif_regs_532_mhz_2cs;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000248 break;
249 case OMAP5432_ES1_0:
250 *regs = &emif_regs_ddr3_532_mhz_1cs;
251 break;
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000252 case OMAP5430_ES2_0:
253 *regs = &emif_regs_532_mhz_2cs_es2;
254 break;
255 case OMAP5432_ES2_0:
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000256 *regs = &emif_regs_ddr3_532_mhz_1cs_es2;
Sricharan R92b04822013-05-30 03:19:39 +0000257 break;
258 case DRA752_ES1_0:
Nishanth Menon3ac8c0b2014-01-14 10:54:42 -0600259 case DRA752_ES1_1:
Sricharan R92b04822013-05-30 03:19:39 +0000260 switch (emif_nr) {
261 case 1:
262 *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
263 break;
264 case 2:
265 *regs = &emif_2_regs_ddr3_532_mhz_1cs_dra_es1;
266 break;
267 }
268 break;
Lokesh Vutla9fcf3d32014-05-15 11:08:41 +0530269 case DRA722_ES1_0:
Sricharan R92b04822013-05-30 03:19:39 +0000270 default:
271 *regs = &emif_1_regs_ddr3_532_mhz_1cs_dra_es1;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000272 }
Sricharanbb772a52011-11-15 09:50:00 -0500273}
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000274
Sricharanbb772a52011-11-15 09:50:00 -0500275void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
276 __attribute__((weak, alias("emif_get_reg_dump_sdp")));
277
278static void emif_get_dmm_regs_sdp(const struct dmm_lisa_map_regs
279 **dmm_lisa_regs)
280{
Lokesh Vutla78314192013-02-12 21:29:07 +0000281 switch (omap_revision()) {
282 case OMAP5430_ES1_0:
283 case OMAP5430_ES2_0:
284 case OMAP5432_ES1_0:
285 case OMAP5432_ES2_0:
286 *dmm_lisa_regs = &lisa_map_4G_x_2_x_2;
287 break;
288 case DRA752_ES1_0:
Nishanth Menon3ac8c0b2014-01-14 10:54:42 -0600289 case DRA752_ES1_1:
Sricharan R92b04822013-05-30 03:19:39 +0000290 *dmm_lisa_regs = &lisa_map_2G_x_2_x_2_2G_x_1_x_2;
Lokesh Vutla9fcf3d32014-05-15 11:08:41 +0530291 break;
292 case DRA722_ES1_0:
293 default:
294 *dmm_lisa_regs = &lisa_map_2G_x_2;
Lokesh Vutla78314192013-02-12 21:29:07 +0000295 }
296
Sricharanbb772a52011-11-15 09:50:00 -0500297}
298
299void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
300 __attribute__((weak, alias("emif_get_dmm_regs_sdp")));
Sricharanbb772a52011-11-15 09:50:00 -0500301#else
302
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000303static const struct lpddr2_device_details dev_4G_S4_details = {
Sricharanbb772a52011-11-15 09:50:00 -0500304 .type = LPDDR2_TYPE_S4,
305 .density = LPDDR2_DENSITY_4Gb,
306 .io_width = LPDDR2_IO_WIDTH_32,
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000307 .manufacturer = LPDDR2_MANUFACTURER_SAMSUNG
Sricharanbb772a52011-11-15 09:50:00 -0500308};
309
310static void emif_get_device_details_sdp(u32 emif_nr,
311 struct lpddr2_device_details *cs0_device_details,
312 struct lpddr2_device_details *cs1_device_details)
313{
314 /* EMIF1 & EMIF2 have identical configuration */
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000315 *cs0_device_details = dev_4G_S4_details;
316 *cs1_device_details = dev_4G_S4_details;
Sricharanbb772a52011-11-15 09:50:00 -0500317}
318
319void emif_get_device_details(u32 emif_nr,
320 struct lpddr2_device_details *cs0_device_details,
321 struct lpddr2_device_details *cs1_device_details)
322 __attribute__((weak, alias("emif_get_device_details_sdp")));
323
324#endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
325
SRICHARAN R6c709352013-11-08 17:40:37 +0530326const u32 ext_phy_ctrl_const_base[] = {
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000327 0x01004010,
328 0x00001004,
329 0x04010040,
330 0x01004010,
331 0x00001004,
332 0x00000000,
333 0x00000000,
334 0x00000000,
335 0x80080080,
336 0x00800800,
337 0x08102040,
338 0x00000001,
339 0x540A8150,
340 0xA81502a0,
341 0x002A0540,
342 0x00000000,
343 0x00000000,
344 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000345 0x00000077,
346 0x0
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000347};
348
SRICHARAN R6c709352013-11-08 17:40:37 +0530349const u32 ddr3_ext_phy_ctrl_const_base_es1[] = {
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000350 0x01004010,
351 0x00001004,
352 0x04010040,
353 0x01004010,
354 0x00001004,
355 0x00000000,
356 0x00000000,
357 0x00000000,
358 0x80080080,
359 0x00800800,
360 0x08102040,
361 0x00000002,
362 0x0,
363 0x0,
364 0x0,
365 0x00000000,
366 0x00000000,
367 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000368 0x00000057,
369 0x0
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000370};
371
SRICHARAN R6c709352013-11-08 17:40:37 +0530372const u32 ddr3_ext_phy_ctrl_const_base_es2[] = {
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000373 0x50D4350D,
374 0x00000D43,
375 0x04010040,
376 0x01004010,
377 0x00001004,
378 0x00000000,
379 0x00000000,
380 0x00000000,
381 0x80080080,
382 0x00800800,
383 0x08102040,
384 0x00000002,
385 0x00000000,
386 0x00000000,
387 0x00000000,
388 0x00000000,
389 0x00000000,
390 0x00000000,
Sricharan R92b04822013-05-30 03:19:39 +0000391 0x00000057,
392 0x0
393};
394
395const u32
SRICHARAN R6c709352013-11-08 17:40:37 +0530396dra_ddr3_ext_phy_ctrl_const_base_es1_emif1[] = {
Sricharan Rf2a1b932014-07-31 12:05:50 +0530397 0x00BB00BB,
398 0x00440044,
399 0x00440044,
400 0x00440044,
401 0x00440044,
402 0x00440044,
403 0x007F007F,
404 0x007F007F,
405 0x007F007F,
406 0x007F007F,
407 0x007F007F,
SRICHARAN R6c709352013-11-08 17:40:37 +0530408 0x00600060,
409 0x00600060,
410 0x00600060,
411 0x00600060,
412 0x00600060,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530413 0x00000000,
414 0x00600020,
Sricharan R92b04822013-05-30 03:19:39 +0000415 0x40010080,
SRICHARAN R6c709352013-11-08 17:40:37 +0530416 0x08102040,
417 0x0,
418 0x0,
419 0x0,
420 0x0,
421 0x0
Sricharan R92b04822013-05-30 03:19:39 +0000422};
423
424const u32
SRICHARAN R6c709352013-11-08 17:40:37 +0530425dra_ddr3_ext_phy_ctrl_const_base_es1_emif2[] = {
426 0x00BB00BB,
427 0x00440044,
428 0x00440044,
429 0x00440044,
430 0x00440044,
431 0x00440044,
432 0x007F007F,
433 0x007F007F,
434 0x007F007F,
435 0x007F007F,
436 0x007F007F,
437 0x00600060,
438 0x00600060,
439 0x00600060,
440 0x00600060,
441 0x00600060,
Sricharan Rf2a1b932014-07-31 12:05:50 +0530442 0x00000000,
SRICHARAN R6c709352013-11-08 17:40:37 +0530443 0x00600020,
Sricharan R92b04822013-05-30 03:19:39 +0000444 0x40010080,
SRICHARAN R6c709352013-11-08 17:40:37 +0530445 0x08102040,
446 0x0,
447 0x0,
448 0x0,
449 0x0,
450 0x0
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000451};
452
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000453const struct lpddr2_mr_regs mr_regs = {
454 .mr1 = MR1_BL_8_BT_SEQ_WRAP_EN_NWR_8,
455 .mr2 = 0x6,
456 .mr3 = 0x1,
457 .mr10 = MR10_ZQ_ZQINIT,
458 .mr16 = MR16_REF_FULL_ARRAY
459};
460
SRICHARAN R6c709352013-11-08 17:40:37 +0530461static void emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
462 const u32 **regs,
463 u32 *size)
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000464{
465 switch (omap_revision()) {
466 case OMAP5430_ES1_0:
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000467 case OMAP5430_ES2_0:
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000468 *regs = ext_phy_ctrl_const_base;
SRICHARAN R6c709352013-11-08 17:40:37 +0530469 *size = ARRAY_SIZE(ext_phy_ctrl_const_base);
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000470 break;
471 case OMAP5432_ES1_0:
472 *regs = ddr3_ext_phy_ctrl_const_base_es1;
SRICHARAN R6c709352013-11-08 17:40:37 +0530473 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es1);
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000474 break;
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000475 case OMAP5432_ES2_0:
Sricharan R92b04822013-05-30 03:19:39 +0000476 *regs = ddr3_ext_phy_ctrl_const_base_es2;
SRICHARAN R6c709352013-11-08 17:40:37 +0530477 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
Sricharan R92b04822013-05-30 03:19:39 +0000478 break;
Lokesh Vutla78314192013-02-12 21:29:07 +0000479 case DRA752_ES1_0:
Nishanth Menon3ac8c0b2014-01-14 10:54:42 -0600480 case DRA752_ES1_1:
Lokesh Vutla9fcf3d32014-05-15 11:08:41 +0530481 case DRA722_ES1_0:
SRICHARAN R6c709352013-11-08 17:40:37 +0530482 if (emif_nr == 1) {
Sricharan R92b04822013-05-30 03:19:39 +0000483 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif1;
SRICHARAN R6c709352013-11-08 17:40:37 +0530484 *size =
485 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif1);
486 } else {
Sricharan R92b04822013-05-30 03:19:39 +0000487 *regs = dra_ddr3_ext_phy_ctrl_const_base_es1_emif2;
SRICHARAN R6c709352013-11-08 17:40:37 +0530488 *size =
489 ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_es1_emif2);
490 }
Sricharan R92b04822013-05-30 03:19:39 +0000491 break;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000492 default:
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000493 *regs = ddr3_ext_phy_ctrl_const_base_es2;
SRICHARAN R6c709352013-11-08 17:40:37 +0530494 *size = ARRAY_SIZE(ddr3_ext_phy_ctrl_const_base_es2);
Lokesh Vutla9100ede2013-02-12 01:33:44 +0000495
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000496 }
497}
498
499void get_lpddr2_mr_regs(const struct lpddr2_mr_regs **regs)
500{
501 *regs = &mr_regs;
502}
503
SRICHARAN R25476382012-06-04 03:40:23 +0000504void do_ext_phy_settings(u32 base, const struct emif_regs *regs)
505{
506 u32 *ext_phy_ctrl_base = 0;
507 u32 *emif_ext_phy_ctrl_base = 0;
Sricharan R92b04822013-05-30 03:19:39 +0000508 u32 emif_nr;
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000509 const u32 *ext_phy_ctrl_const_regs;
SRICHARAN R25476382012-06-04 03:40:23 +0000510 u32 i = 0;
SRICHARAN R6c709352013-11-08 17:40:37 +0530511 u32 size;
SRICHARAN R25476382012-06-04 03:40:23 +0000512
Sricharan R92b04822013-05-30 03:19:39 +0000513 emif_nr = (base == EMIF1_BASE) ? 1 : 2;
514
SRICHARAN R25476382012-06-04 03:40:23 +0000515 struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
516
517 ext_phy_ctrl_base = (u32 *) &(regs->emif_ddr_ext_phy_ctrl_1);
518 emif_ext_phy_ctrl_base = (u32 *) &(emif->emif_ddr_ext_phy_ctrl_1);
519
520 /* Configure external phy control timing registers */
521 for (i = 0; i < EMIF_EXT_PHY_CTRL_TIMING_REG; i++) {
522 writel(*ext_phy_ctrl_base, emif_ext_phy_ctrl_base++);
523 /* Update shadow registers */
524 writel(*ext_phy_ctrl_base++, emif_ext_phy_ctrl_base++);
525 }
526
527 /*
528 * external phy 6-24 registers do not change with
529 * ddr frequency
530 */
SRICHARAN R6c709352013-11-08 17:40:37 +0530531 emif_get_ext_phy_ctrl_const_regs(emif_nr,
532 &ext_phy_ctrl_const_regs, &size);
533
534 for (i = 0; i < size; i++) {
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 /* Update shadow registers */
Lokesh Vutlae05a4f12013-02-04 04:22:03 +0000538 writel(ext_phy_ctrl_const_regs[i],
539 emif_ext_phy_ctrl_base++);
SRICHARAN R25476382012-06-04 03:40:23 +0000540 }
541}
542
Sricharanbb772a52011-11-15 09:50:00 -0500543#ifndef CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS
544static const struct lpddr2_ac_timings timings_jedec_532_mhz = {
545 .max_freq = 532000000,
546 .RL = 8,
547 .tRPab = 21,
548 .tRCD = 18,
549 .tWR = 15,
550 .tRASmin = 42,
551 .tRRD = 10,
552 .tWTRx2 = 15,
553 .tXSR = 140,
554 .tXPx2 = 15,
555 .tRFCab = 130,
556 .tRTPx2 = 15,
557 .tCKE = 3,
558 .tCKESR = 15,
559 .tZQCS = 90,
560 .tZQCL = 360,
561 .tZQINIT = 1000,
562 .tDQSCKMAXx2 = 11,
563 .tRASmax = 70,
564 .tFAW = 50
565};
566
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000567static const struct lpddr2_min_tck min_tck = {
Sricharanbb772a52011-11-15 09:50:00 -0500568 .tRL = 3,
569 .tRP_AB = 3,
570 .tRCD = 3,
571 .tWR = 3,
572 .tRAS_MIN = 3,
573 .tRRD = 2,
574 .tWTR = 2,
575 .tXP = 2,
576 .tRTP = 2,
577 .tCKE = 3,
578 .tCKESR = 3,
579 .tFAW = 8
580};
581
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000582static const struct lpddr2_ac_timings *ac_timings[MAX_NUM_SPEEDBINS] = {
Sricharanbb772a52011-11-15 09:50:00 -0500583 &timings_jedec_532_mhz
584};
585
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000586static const struct lpddr2_device_timings dev_4G_S4_timings = {
587 .ac_timings = ac_timings,
588 .min_tck = &min_tck,
Sricharanbb772a52011-11-15 09:50:00 -0500589};
590
SRICHARAN R54d022e2013-11-08 17:40:38 +0530591/*
592 * List of status registers to be controlled back to control registers
593 * after initial leveling
594 * readreg, writereg
595 */
596const struct read_write_regs omap5_bug_00339_regs[] = {
597 { 8, 5 },
598 { 9, 6 },
599 { 10, 7 },
600 { 14, 8 },
601 { 15, 9 },
602 { 16, 10 },
603 { 11, 2 },
604 { 12, 3 },
605 { 13, 4 },
606 { 17, 11 },
607 { 18, 12 },
608 { 19, 13 },
609};
610
611const struct read_write_regs dra_bug_00339_regs[] = {
612 { 7, 7 },
613 { 8, 8 },
614 { 9, 9 },
615 { 10, 10 },
616 { 11, 11 },
617 { 12, 2 },
618 { 13, 3 },
619 { 14, 4 },
620 { 15, 5 },
621 { 16, 6 },
622 { 17, 12 },
623 { 18, 13 },
624 { 19, 14 },
625 { 20, 15 },
626 { 21, 16 },
627 { 22, 17 },
628 { 23, 18 },
629 { 24, 19 },
630 { 25, 20 },
631 { 26, 21}
632};
633
634const struct read_write_regs *get_bug_regs(u32 *iterations)
635{
636 const struct read_write_regs *bug_00339_regs_ptr = NULL;
637
638 switch (omap_revision()) {
639 case OMAP5430_ES1_0:
640 case OMAP5430_ES2_0:
641 case OMAP5432_ES1_0:
642 case OMAP5432_ES2_0:
643 bug_00339_regs_ptr = omap5_bug_00339_regs;
644 *iterations = sizeof(omap5_bug_00339_regs)/
645 sizeof(omap5_bug_00339_regs[0]);
646 break;
647 case DRA752_ES1_0:
Nishanth Menon3ac8c0b2014-01-14 10:54:42 -0600648 case DRA752_ES1_1:
Lokesh Vutla9fcf3d32014-05-15 11:08:41 +0530649 case DRA722_ES1_0:
SRICHARAN R54d022e2013-11-08 17:40:38 +0530650 bug_00339_regs_ptr = dra_bug_00339_regs;
651 *iterations = sizeof(dra_bug_00339_regs)/
652 sizeof(dra_bug_00339_regs[0]);
653 break;
654 default:
655 printf("\n Error: UnKnown SOC");
656 }
657
658 return bug_00339_regs_ptr;
659}
660
Sricharanbb772a52011-11-15 09:50:00 -0500661void emif_get_device_timings_sdp(u32 emif_nr,
662 const struct lpddr2_device_timings **cs0_device_timings,
663 const struct lpddr2_device_timings **cs1_device_timings)
664{
665 /* Identical devices on EMIF1 & EMIF2 */
SRICHARAN R971f2ba2012-03-12 02:25:45 +0000666 *cs0_device_timings = &dev_4G_S4_timings;
667 *cs1_device_timings = &dev_4G_S4_timings;
Sricharanbb772a52011-11-15 09:50:00 -0500668}
669
670void emif_get_device_timings(u32 emif_nr,
671 const struct lpddr2_device_timings **cs0_device_timings,
672 const struct lpddr2_device_timings **cs1_device_timings)
673 __attribute__((weak, alias("emif_get_device_timings_sdp")));
674
675#endif /* CONFIG_SYS_DEFAULT_LPDDR2_TIMINGS */