xref: /rk3399_rockchip-uboot/arch/arm/mach-omap2/omap5/sdram.c (revision 2d221489df021393654805536be7effcb9d39702)
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