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