xref: /OK3568_Linux_fs/u-boot/arch/arm/include/asm/arch-mx6/mx6-ddr.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2013 Boundary Devices Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #ifndef __ASM_ARCH_MX6_DDR_H__
7*4882a593Smuzhiyun #define __ASM_ARCH_MX6_DDR_H__
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef CONFIG_SPL_BUILD
10*4882a593Smuzhiyun #ifdef CONFIG_MX6Q
11*4882a593Smuzhiyun #include "mx6q-ddr.h"
12*4882a593Smuzhiyun #else
13*4882a593Smuzhiyun #if defined(CONFIG_MX6DL) || defined(CONFIG_MX6S)
14*4882a593Smuzhiyun #include "mx6dl-ddr.h"
15*4882a593Smuzhiyun #else
16*4882a593Smuzhiyun #ifdef CONFIG_MX6SX
17*4882a593Smuzhiyun #include "mx6sx-ddr.h"
18*4882a593Smuzhiyun #else
19*4882a593Smuzhiyun #ifdef CONFIG_MX6UL
20*4882a593Smuzhiyun #include "mx6ul-ddr.h"
21*4882a593Smuzhiyun #else
22*4882a593Smuzhiyun #ifdef CONFIG_MX6SL
23*4882a593Smuzhiyun #include "mx6sl-ddr.h"
24*4882a593Smuzhiyun #else
25*4882a593Smuzhiyun #error "Please select cpu"
26*4882a593Smuzhiyun #endif	/* CONFIG_MX6SL */
27*4882a593Smuzhiyun #endif	/* CONFIG_MX6UL */
28*4882a593Smuzhiyun #endif	/* CONFIG_MX6SX */
29*4882a593Smuzhiyun #endif	/* CONFIG_MX6DL or CONFIG_MX6S */
30*4882a593Smuzhiyun #endif	/* CONFIG_MX6Q */
31*4882a593Smuzhiyun #else
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun enum {
34*4882a593Smuzhiyun 	DDR_TYPE_DDR3,
35*4882a593Smuzhiyun 	DDR_TYPE_LPDDR2,
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* MMDC P0/P1 Registers */
39*4882a593Smuzhiyun struct mmdc_p_regs {
40*4882a593Smuzhiyun 	u32 mdctl;
41*4882a593Smuzhiyun 	u32 mdpdc;
42*4882a593Smuzhiyun 	u32 mdotc;
43*4882a593Smuzhiyun 	u32 mdcfg0;
44*4882a593Smuzhiyun 	u32 mdcfg1;
45*4882a593Smuzhiyun 	u32 mdcfg2;
46*4882a593Smuzhiyun 	u32 mdmisc;
47*4882a593Smuzhiyun 	u32 mdscr;
48*4882a593Smuzhiyun 	u32 mdref;
49*4882a593Smuzhiyun 	u32 res1[2];
50*4882a593Smuzhiyun 	u32 mdrwd;
51*4882a593Smuzhiyun 	u32 mdor;
52*4882a593Smuzhiyun 	u32 mdmrr;
53*4882a593Smuzhiyun 	u32 mdcfg3lp;
54*4882a593Smuzhiyun 	u32 mdmr4;
55*4882a593Smuzhiyun 	u32 mdasp;
56*4882a593Smuzhiyun 	u32 res2[239];
57*4882a593Smuzhiyun 	u32 maarcr;
58*4882a593Smuzhiyun 	u32 mapsr;
59*4882a593Smuzhiyun 	u32 maexidr0;
60*4882a593Smuzhiyun 	u32 maexidr1;
61*4882a593Smuzhiyun 	u32 madpcr0;
62*4882a593Smuzhiyun 	u32 madpcr1;
63*4882a593Smuzhiyun 	u32 madpsr0;
64*4882a593Smuzhiyun 	u32 madpsr1;
65*4882a593Smuzhiyun 	u32 madpsr2;
66*4882a593Smuzhiyun 	u32 madpsr3;
67*4882a593Smuzhiyun 	u32 madpsr4;
68*4882a593Smuzhiyun 	u32 madpsr5;
69*4882a593Smuzhiyun 	u32 masbs0;
70*4882a593Smuzhiyun 	u32 masbs1;
71*4882a593Smuzhiyun 	u32 res3[2];
72*4882a593Smuzhiyun 	u32 magenp;
73*4882a593Smuzhiyun 	u32 res4[239];
74*4882a593Smuzhiyun 	u32 mpzqhwctrl;
75*4882a593Smuzhiyun 	u32 mpzqswctrl;
76*4882a593Smuzhiyun 	u32 mpwlgcr;
77*4882a593Smuzhiyun 	u32 mpwldectrl0;
78*4882a593Smuzhiyun 	u32 mpwldectrl1;
79*4882a593Smuzhiyun 	u32 mpwldlst;
80*4882a593Smuzhiyun 	u32 mpodtctrl;
81*4882a593Smuzhiyun 	u32 mprddqby0dl;
82*4882a593Smuzhiyun 	u32 mprddqby1dl;
83*4882a593Smuzhiyun 	u32 mprddqby2dl;
84*4882a593Smuzhiyun 	u32 mprddqby3dl;
85*4882a593Smuzhiyun 	u32 mpwrdqby0dl;
86*4882a593Smuzhiyun 	u32 mpwrdqby1dl;
87*4882a593Smuzhiyun 	u32 mpwrdqby2dl;
88*4882a593Smuzhiyun 	u32 mpwrdqby3dl;
89*4882a593Smuzhiyun 	u32 mpdgctrl0;
90*4882a593Smuzhiyun 	u32 mpdgctrl1;
91*4882a593Smuzhiyun 	u32 mpdgdlst0;
92*4882a593Smuzhiyun 	u32 mprddlctl;
93*4882a593Smuzhiyun 	u32 mprddlst;
94*4882a593Smuzhiyun 	u32 mpwrdlctl;
95*4882a593Smuzhiyun 	u32 mpwrdlst;
96*4882a593Smuzhiyun 	u32 mpsdctrl;
97*4882a593Smuzhiyun 	u32 mpzqlp2ctl;
98*4882a593Smuzhiyun 	u32 mprddlhwctl;
99*4882a593Smuzhiyun 	u32 mpwrdlhwctl;
100*4882a593Smuzhiyun 	u32 mprddlhwst0;
101*4882a593Smuzhiyun 	u32 mprddlhwst1;
102*4882a593Smuzhiyun 	u32 mpwrdlhwst0;
103*4882a593Smuzhiyun 	u32 mpwrdlhwst1;
104*4882a593Smuzhiyun 	u32 mpwlhwerr;
105*4882a593Smuzhiyun 	u32 mpdghwst0;
106*4882a593Smuzhiyun 	u32 mpdghwst1;
107*4882a593Smuzhiyun 	u32 mpdghwst2;
108*4882a593Smuzhiyun 	u32 mpdghwst3;
109*4882a593Smuzhiyun 	u32 mppdcmpr1;
110*4882a593Smuzhiyun 	u32 mppdcmpr2;
111*4882a593Smuzhiyun 	u32 mpswdar0;
112*4882a593Smuzhiyun 	u32 mpswdrdr0;
113*4882a593Smuzhiyun 	u32 mpswdrdr1;
114*4882a593Smuzhiyun 	u32 mpswdrdr2;
115*4882a593Smuzhiyun 	u32 mpswdrdr3;
116*4882a593Smuzhiyun 	u32 mpswdrdr4;
117*4882a593Smuzhiyun 	u32 mpswdrdr5;
118*4882a593Smuzhiyun 	u32 mpswdrdr6;
119*4882a593Smuzhiyun 	u32 mpswdrdr7;
120*4882a593Smuzhiyun 	u32 mpmur0;
121*4882a593Smuzhiyun 	u32 mpwrcadl;
122*4882a593Smuzhiyun 	u32 mpdccr;
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define MX6SL_IOM_DDR_BASE     0x020e0300
126*4882a593Smuzhiyun struct mx6sl_iomux_ddr_regs {
127*4882a593Smuzhiyun 	u32 dram_cas;
128*4882a593Smuzhiyun 	u32 dram_cs0_b;
129*4882a593Smuzhiyun 	u32 dram_cs1_b;
130*4882a593Smuzhiyun 	u32 dram_dqm0;
131*4882a593Smuzhiyun 	u32 dram_dqm1;
132*4882a593Smuzhiyun 	u32 dram_dqm2;
133*4882a593Smuzhiyun 	u32 dram_dqm3;
134*4882a593Smuzhiyun 	u32 dram_ras;
135*4882a593Smuzhiyun 	u32 dram_reset;
136*4882a593Smuzhiyun 	u32 dram_sdba0;
137*4882a593Smuzhiyun 	u32 dram_sdba1;
138*4882a593Smuzhiyun 	u32 dram_sdba2;
139*4882a593Smuzhiyun 	u32 dram_sdcke0;
140*4882a593Smuzhiyun 	u32 dram_sdcke1;
141*4882a593Smuzhiyun 	u32 dram_sdclk_0;
142*4882a593Smuzhiyun 	u32 dram_odt0;
143*4882a593Smuzhiyun 	u32 dram_odt1;
144*4882a593Smuzhiyun 	u32 dram_sdqs0;
145*4882a593Smuzhiyun 	u32 dram_sdqs1;
146*4882a593Smuzhiyun 	u32 dram_sdqs2;
147*4882a593Smuzhiyun 	u32 dram_sdqs3;
148*4882a593Smuzhiyun 	u32 dram_sdwe_b;
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define MX6SL_IOM_GRP_BASE     0x020e0500
152*4882a593Smuzhiyun struct mx6sl_iomux_grp_regs {
153*4882a593Smuzhiyun 	u32 res1[43];
154*4882a593Smuzhiyun 	u32 grp_addds;
155*4882a593Smuzhiyun 	u32 grp_ddrmode_ctl;
156*4882a593Smuzhiyun 	u32 grp_ddrpke;
157*4882a593Smuzhiyun 	u32 grp_ddrpk;
158*4882a593Smuzhiyun 	u32 grp_ddrhys;
159*4882a593Smuzhiyun 	u32 grp_ddrmode;
160*4882a593Smuzhiyun 	u32 grp_b0ds;
161*4882a593Smuzhiyun 	u32 grp_ctlds;
162*4882a593Smuzhiyun 	u32 grp_b1ds;
163*4882a593Smuzhiyun 	u32 grp_ddr_type;
164*4882a593Smuzhiyun 	u32 grp_b2ds;
165*4882a593Smuzhiyun 	u32 grp_b3ds;
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define MX6UL_IOM_DDR_BASE	0x020e0200
169*4882a593Smuzhiyun struct mx6ul_iomux_ddr_regs {
170*4882a593Smuzhiyun 	u32 res1[17];
171*4882a593Smuzhiyun 	u32 dram_dqm0;
172*4882a593Smuzhiyun 	u32 dram_dqm1;
173*4882a593Smuzhiyun 	u32 dram_ras;
174*4882a593Smuzhiyun 	u32 dram_cas;
175*4882a593Smuzhiyun 	u32 dram_cs0;
176*4882a593Smuzhiyun 	u32 dram_cs1;
177*4882a593Smuzhiyun 	u32 dram_sdwe_b;
178*4882a593Smuzhiyun 	u32 dram_odt0;
179*4882a593Smuzhiyun 	u32 dram_odt1;
180*4882a593Smuzhiyun 	u32 dram_sdba0;
181*4882a593Smuzhiyun 	u32 dram_sdba1;
182*4882a593Smuzhiyun 	u32 dram_sdba2;
183*4882a593Smuzhiyun 	u32 dram_sdcke0;
184*4882a593Smuzhiyun 	u32 dram_sdcke1;
185*4882a593Smuzhiyun 	u32 dram_sdclk_0;
186*4882a593Smuzhiyun 	u32 dram_sdqs0;
187*4882a593Smuzhiyun 	u32 dram_sdqs1;
188*4882a593Smuzhiyun 	u32 dram_reset;
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun #define MX6UL_IOM_GRP_BASE	0x020e0400
192*4882a593Smuzhiyun struct mx6ul_iomux_grp_regs {
193*4882a593Smuzhiyun 	u32 res1[36];
194*4882a593Smuzhiyun 	u32 grp_addds;
195*4882a593Smuzhiyun 	u32 grp_ddrmode_ctl;
196*4882a593Smuzhiyun 	u32 grp_b0ds;
197*4882a593Smuzhiyun 	u32 grp_ddrpk;
198*4882a593Smuzhiyun 	u32 grp_ctlds;
199*4882a593Smuzhiyun 	u32 grp_b1ds;
200*4882a593Smuzhiyun 	u32 grp_ddrhys;
201*4882a593Smuzhiyun 	u32 grp_ddrpke;
202*4882a593Smuzhiyun 	u32 grp_ddrmode;
203*4882a593Smuzhiyun 	u32 grp_ddr_type;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun #define MX6SX_IOM_DDR_BASE	0x020e0200
207*4882a593Smuzhiyun struct mx6sx_iomux_ddr_regs {
208*4882a593Smuzhiyun 	u32 res1[59];
209*4882a593Smuzhiyun 	u32 dram_dqm0;
210*4882a593Smuzhiyun 	u32 dram_dqm1;
211*4882a593Smuzhiyun 	u32 dram_dqm2;
212*4882a593Smuzhiyun 	u32 dram_dqm3;
213*4882a593Smuzhiyun 	u32 dram_ras;
214*4882a593Smuzhiyun 	u32 dram_cas;
215*4882a593Smuzhiyun 	u32 res2[2];
216*4882a593Smuzhiyun 	u32 dram_sdwe_b;
217*4882a593Smuzhiyun 	u32 dram_odt0;
218*4882a593Smuzhiyun 	u32 dram_odt1;
219*4882a593Smuzhiyun 	u32 dram_sdba0;
220*4882a593Smuzhiyun 	u32 dram_sdba1;
221*4882a593Smuzhiyun 	u32 dram_sdba2;
222*4882a593Smuzhiyun 	u32 dram_sdcke0;
223*4882a593Smuzhiyun 	u32 dram_sdcke1;
224*4882a593Smuzhiyun 	u32 dram_sdclk_0;
225*4882a593Smuzhiyun 	u32 dram_sdqs0;
226*4882a593Smuzhiyun 	u32 dram_sdqs1;
227*4882a593Smuzhiyun 	u32 dram_sdqs2;
228*4882a593Smuzhiyun 	u32 dram_sdqs3;
229*4882a593Smuzhiyun 	u32 dram_reset;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun #define MX6SX_IOM_GRP_BASE	0x020e0500
233*4882a593Smuzhiyun struct mx6sx_iomux_grp_regs {
234*4882a593Smuzhiyun 	u32 res1[61];
235*4882a593Smuzhiyun 	u32 grp_addds;
236*4882a593Smuzhiyun 	u32 grp_ddrmode_ctl;
237*4882a593Smuzhiyun 	u32 grp_ddrpke;
238*4882a593Smuzhiyun 	u32 grp_ddrpk;
239*4882a593Smuzhiyun 	u32 grp_ddrhys;
240*4882a593Smuzhiyun 	u32 grp_ddrmode;
241*4882a593Smuzhiyun 	u32 grp_b0ds;
242*4882a593Smuzhiyun 	u32 grp_b1ds;
243*4882a593Smuzhiyun 	u32 grp_ctlds;
244*4882a593Smuzhiyun 	u32 grp_ddr_type;
245*4882a593Smuzhiyun 	u32 grp_b2ds;
246*4882a593Smuzhiyun 	u32 grp_b3ds;
247*4882a593Smuzhiyun };
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /*
250*4882a593Smuzhiyun  * MMDC iomux registers (pinctl/padctl) - (different for IMX6DQ vs IMX6SDL)
251*4882a593Smuzhiyun  */
252*4882a593Smuzhiyun #define MX6DQ_IOM_DDR_BASE      0x020e0500
253*4882a593Smuzhiyun struct mx6dq_iomux_ddr_regs {
254*4882a593Smuzhiyun 	u32 res1[3];
255*4882a593Smuzhiyun 	u32 dram_sdqs5;
256*4882a593Smuzhiyun 	u32 dram_dqm5;
257*4882a593Smuzhiyun 	u32 dram_dqm4;
258*4882a593Smuzhiyun 	u32 dram_sdqs4;
259*4882a593Smuzhiyun 	u32 dram_sdqs3;
260*4882a593Smuzhiyun 	u32 dram_dqm3;
261*4882a593Smuzhiyun 	u32 dram_sdqs2;
262*4882a593Smuzhiyun 	u32 dram_dqm2;
263*4882a593Smuzhiyun 	u32 res2[16];
264*4882a593Smuzhiyun 	u32 dram_cas;
265*4882a593Smuzhiyun 	u32 res3[2];
266*4882a593Smuzhiyun 	u32 dram_ras;
267*4882a593Smuzhiyun 	u32 dram_reset;
268*4882a593Smuzhiyun 	u32 res4[2];
269*4882a593Smuzhiyun 	u32 dram_sdclk_0;
270*4882a593Smuzhiyun 	u32 dram_sdba2;
271*4882a593Smuzhiyun 	u32 dram_sdcke0;
272*4882a593Smuzhiyun 	u32 dram_sdclk_1;
273*4882a593Smuzhiyun 	u32 dram_sdcke1;
274*4882a593Smuzhiyun 	u32 dram_sdodt0;
275*4882a593Smuzhiyun 	u32 dram_sdodt1;
276*4882a593Smuzhiyun 	u32 res5;
277*4882a593Smuzhiyun 	u32 dram_sdqs0;
278*4882a593Smuzhiyun 	u32 dram_dqm0;
279*4882a593Smuzhiyun 	u32 dram_sdqs1;
280*4882a593Smuzhiyun 	u32 dram_dqm1;
281*4882a593Smuzhiyun 	u32 dram_sdqs6;
282*4882a593Smuzhiyun 	u32 dram_dqm6;
283*4882a593Smuzhiyun 	u32 dram_sdqs7;
284*4882a593Smuzhiyun 	u32 dram_dqm7;
285*4882a593Smuzhiyun };
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun #define MX6DQ_IOM_GRP_BASE      0x020e0700
288*4882a593Smuzhiyun struct mx6dq_iomux_grp_regs {
289*4882a593Smuzhiyun 	u32 res1[18];
290*4882a593Smuzhiyun 	u32 grp_b7ds;
291*4882a593Smuzhiyun 	u32 grp_addds;
292*4882a593Smuzhiyun 	u32 grp_ddrmode_ctl;
293*4882a593Smuzhiyun 	u32 res2;
294*4882a593Smuzhiyun 	u32 grp_ddrpke;
295*4882a593Smuzhiyun 	u32 res3[6];
296*4882a593Smuzhiyun 	u32 grp_ddrmode;
297*4882a593Smuzhiyun 	u32 res4[3];
298*4882a593Smuzhiyun 	u32 grp_b0ds;
299*4882a593Smuzhiyun 	u32 grp_b1ds;
300*4882a593Smuzhiyun 	u32 grp_ctlds;
301*4882a593Smuzhiyun 	u32 res5;
302*4882a593Smuzhiyun 	u32 grp_b2ds;
303*4882a593Smuzhiyun 	u32 grp_ddr_type;
304*4882a593Smuzhiyun 	u32 grp_b3ds;
305*4882a593Smuzhiyun 	u32 grp_b4ds;
306*4882a593Smuzhiyun 	u32 grp_b5ds;
307*4882a593Smuzhiyun 	u32 grp_b6ds;
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #define MX6SDL_IOM_DDR_BASE     0x020e0400
311*4882a593Smuzhiyun struct mx6sdl_iomux_ddr_regs {
312*4882a593Smuzhiyun 	u32 res1[25];
313*4882a593Smuzhiyun 	u32 dram_cas;
314*4882a593Smuzhiyun 	u32 res2[2];
315*4882a593Smuzhiyun 	u32 dram_dqm0;
316*4882a593Smuzhiyun 	u32 dram_dqm1;
317*4882a593Smuzhiyun 	u32 dram_dqm2;
318*4882a593Smuzhiyun 	u32 dram_dqm3;
319*4882a593Smuzhiyun 	u32 dram_dqm4;
320*4882a593Smuzhiyun 	u32 dram_dqm5;
321*4882a593Smuzhiyun 	u32 dram_dqm6;
322*4882a593Smuzhiyun 	u32 dram_dqm7;
323*4882a593Smuzhiyun 	u32 dram_ras;
324*4882a593Smuzhiyun 	u32 dram_reset;
325*4882a593Smuzhiyun 	u32 res3[2];
326*4882a593Smuzhiyun 	u32 dram_sdba2;
327*4882a593Smuzhiyun 	u32 dram_sdcke0;
328*4882a593Smuzhiyun 	u32 dram_sdcke1;
329*4882a593Smuzhiyun 	u32 dram_sdclk_0;
330*4882a593Smuzhiyun 	u32 dram_sdclk_1;
331*4882a593Smuzhiyun 	u32 dram_sdodt0;
332*4882a593Smuzhiyun 	u32 dram_sdodt1;
333*4882a593Smuzhiyun 	u32 dram_sdqs0;
334*4882a593Smuzhiyun 	u32 dram_sdqs1;
335*4882a593Smuzhiyun 	u32 dram_sdqs2;
336*4882a593Smuzhiyun 	u32 dram_sdqs3;
337*4882a593Smuzhiyun 	u32 dram_sdqs4;
338*4882a593Smuzhiyun 	u32 dram_sdqs5;
339*4882a593Smuzhiyun 	u32 dram_sdqs6;
340*4882a593Smuzhiyun 	u32 dram_sdqs7;
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun #define MX6SDL_IOM_GRP_BASE     0x020e0700
344*4882a593Smuzhiyun struct mx6sdl_iomux_grp_regs {
345*4882a593Smuzhiyun 	u32 res1[18];
346*4882a593Smuzhiyun 	u32 grp_b7ds;
347*4882a593Smuzhiyun 	u32 grp_addds;
348*4882a593Smuzhiyun 	u32 grp_ddrmode_ctl;
349*4882a593Smuzhiyun 	u32 grp_ddrpke;
350*4882a593Smuzhiyun 	u32 res2[2];
351*4882a593Smuzhiyun 	u32 grp_ddrmode;
352*4882a593Smuzhiyun 	u32 grp_b0ds;
353*4882a593Smuzhiyun 	u32 res3;
354*4882a593Smuzhiyun 	u32 grp_ctlds;
355*4882a593Smuzhiyun 	u32 grp_b1ds;
356*4882a593Smuzhiyun 	u32 grp_ddr_type;
357*4882a593Smuzhiyun 	u32 grp_b2ds;
358*4882a593Smuzhiyun 	u32 grp_b3ds;
359*4882a593Smuzhiyun 	u32 grp_b4ds;
360*4882a593Smuzhiyun 	u32 grp_b5ds;
361*4882a593Smuzhiyun 	u32 res4;
362*4882a593Smuzhiyun 	u32 grp_b6ds;
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun /* Device Information: Varies per DDR3 part number and speed grade */
366*4882a593Smuzhiyun struct mx6_ddr3_cfg {
367*4882a593Smuzhiyun 	u16 mem_speed;	/* ie 1600 for DDR3-1600 (800,1066,1333,1600) */
368*4882a593Smuzhiyun 	u8 density;	/* chip density (Gb) (1,2,4,8) */
369*4882a593Smuzhiyun 	u8 width;	/* bus width (bits) (4,8,16) */
370*4882a593Smuzhiyun 	u8 banks;	/* number of banks */
371*4882a593Smuzhiyun 	u8 rowaddr;	/* row address bits (11-16)*/
372*4882a593Smuzhiyun 	u8 coladdr;	/* col address bits (9-12) */
373*4882a593Smuzhiyun 	u8 pagesz;	/* page size (K) (1-2) */
374*4882a593Smuzhiyun 	u16 trcd;	/* tRCD=tRP=CL (ns*100) */
375*4882a593Smuzhiyun 	u16 trcmin;	/* tRC min (ns*100) */
376*4882a593Smuzhiyun 	u16 trasmin;	/* tRAS min (ns*100) */
377*4882a593Smuzhiyun 	u8 SRT;		/* self-refresh temperature: 0=normal, 1=extended */
378*4882a593Smuzhiyun };
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun /* Device Information: Varies per LPDDR2 part number and speed grade */
381*4882a593Smuzhiyun struct mx6_lpddr2_cfg {
382*4882a593Smuzhiyun 	u16 mem_speed;	/* ie 800 for LPDDR2-800 */
383*4882a593Smuzhiyun 	u8 density;	/* chip density (Gb) (1,2,4,8) */
384*4882a593Smuzhiyun 	u8 width;	/* bus width (bits) (4,8,16) */
385*4882a593Smuzhiyun 	u8 banks;	/* number of banks */
386*4882a593Smuzhiyun 	u8 rowaddr;	/* row address bits (11-16)*/
387*4882a593Smuzhiyun 	u8 coladdr;	/* col address bits (9-12) */
388*4882a593Smuzhiyun 	u16 trcd_lp;
389*4882a593Smuzhiyun 	u16 trppb_lp;
390*4882a593Smuzhiyun 	u16 trpab_lp;
391*4882a593Smuzhiyun 	u16 trcmin;	/* tRC min (ns*100) */
392*4882a593Smuzhiyun 	u16 trasmin;	/* tRAS min (ns*100) */
393*4882a593Smuzhiyun };
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun /* System Information: Varies per board design, layout, and term choices */
396*4882a593Smuzhiyun struct mx6_ddr_sysinfo {
397*4882a593Smuzhiyun 	u8 dsize;	/* size of bus (in dwords: 0=16bit,1=32bit,2=64bit) */
398*4882a593Smuzhiyun 	u8 cs_density;	/* density per chip select (Gb) */
399*4882a593Smuzhiyun 	u8 ncs;		/* number chip selects used (1|2) */
400*4882a593Smuzhiyun 	char cs1_mirror;/* enable address mirror (0|1) */
401*4882a593Smuzhiyun 	char bi_on;	/* Bank interleaving enable */
402*4882a593Smuzhiyun 	u8 rtt_nom;	/* Rtt_Nom (DDR3_RTT_*) */
403*4882a593Smuzhiyun 	u8 rtt_wr;	/* Rtt_Wr (DDR3_RTT_*) */
404*4882a593Smuzhiyun 	u8 ralat;	/* Read Additional Latency (0-7) */
405*4882a593Smuzhiyun 	u8 walat;	/* Write Additional Latency (0-3) */
406*4882a593Smuzhiyun 	u8 mif3_mode;	/* Command prediction working mode */
407*4882a593Smuzhiyun 	u8 rst_to_cke;	/* Time from SDE enable to CKE rise */
408*4882a593Smuzhiyun 	u8 sde_to_rst;	/* Time from SDE enable until DDR reset# is high */
409*4882a593Smuzhiyun 	u8 pd_fast_exit;/* enable precharge powerdown fast-exit */
410*4882a593Smuzhiyun 	u8 ddr_type;	/* DDR type: DDR3(0) or LPDDR2(1) */
411*4882a593Smuzhiyun 	u8 refsel;	/* REF_SEL field of register MDREF */
412*4882a593Smuzhiyun 	u8 refr;	/* REFR field of register MDREF */
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun /*
416*4882a593Smuzhiyun  * Board specific calibration:
417*4882a593Smuzhiyun  *   This includes write leveling calibration values as well as DQS gating
418*4882a593Smuzhiyun  *   and read/write delays. These values are board/layout/device specific.
419*4882a593Smuzhiyun  *   Freescale recommends using the i.MX6 DDR Stress Test Tool V1.0.2
420*4882a593Smuzhiyun  *   (DOC-96412) to determine these values over a range of boards and
421*4882a593Smuzhiyun  *   temperatures.
422*4882a593Smuzhiyun  */
423*4882a593Smuzhiyun struct mx6_mmdc_calibration {
424*4882a593Smuzhiyun 	/* write leveling calibration */
425*4882a593Smuzhiyun 	u32 p0_mpwldectrl0;
426*4882a593Smuzhiyun 	u32 p0_mpwldectrl1;
427*4882a593Smuzhiyun 	u32 p1_mpwldectrl0;
428*4882a593Smuzhiyun 	u32 p1_mpwldectrl1;
429*4882a593Smuzhiyun 	/* read DQS gating */
430*4882a593Smuzhiyun 	u32 p0_mpdgctrl0;
431*4882a593Smuzhiyun 	u32 p0_mpdgctrl1;
432*4882a593Smuzhiyun 	u32 p1_mpdgctrl0;
433*4882a593Smuzhiyun 	u32 p1_mpdgctrl1;
434*4882a593Smuzhiyun 	/* read delay */
435*4882a593Smuzhiyun 	u32 p0_mprddlctl;
436*4882a593Smuzhiyun 	u32 p1_mprddlctl;
437*4882a593Smuzhiyun 	/* write delay */
438*4882a593Smuzhiyun 	u32 p0_mpwrdlctl;
439*4882a593Smuzhiyun 	u32 p1_mpwrdlctl;
440*4882a593Smuzhiyun 	/* lpddr2 zq hw calibration */
441*4882a593Smuzhiyun 	u32 mpzqlp2ctl;
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /* configure iomux (pinctl/padctl) */
445*4882a593Smuzhiyun void mx6dq_dram_iocfg(unsigned width,
446*4882a593Smuzhiyun 		      const struct mx6dq_iomux_ddr_regs *,
447*4882a593Smuzhiyun 		      const struct mx6dq_iomux_grp_regs *);
448*4882a593Smuzhiyun void mx6sdl_dram_iocfg(unsigned width,
449*4882a593Smuzhiyun 		       const struct mx6sdl_iomux_ddr_regs *,
450*4882a593Smuzhiyun 		       const struct mx6sdl_iomux_grp_regs *);
451*4882a593Smuzhiyun void mx6sx_dram_iocfg(unsigned width,
452*4882a593Smuzhiyun 		      const struct mx6sx_iomux_ddr_regs *,
453*4882a593Smuzhiyun 		      const struct mx6sx_iomux_grp_regs *);
454*4882a593Smuzhiyun void mx6ul_dram_iocfg(unsigned width,
455*4882a593Smuzhiyun 		      const struct mx6ul_iomux_ddr_regs *,
456*4882a593Smuzhiyun 		      const struct mx6ul_iomux_grp_regs *);
457*4882a593Smuzhiyun void mx6sl_dram_iocfg(unsigned width,
458*4882a593Smuzhiyun 		      const struct mx6sl_iomux_ddr_regs *,
459*4882a593Smuzhiyun 		      const struct mx6sl_iomux_grp_regs *);
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun #if defined(CONFIG_MX6_DDRCAL)
462*4882a593Smuzhiyun int mmdc_do_write_level_calibration(struct mx6_ddr_sysinfo const *sysinfo);
463*4882a593Smuzhiyun int mmdc_do_dqs_calibration(struct mx6_ddr_sysinfo const *sysinfo);
464*4882a593Smuzhiyun void mmdc_read_calibration(struct mx6_ddr_sysinfo const *sysinfo,
465*4882a593Smuzhiyun                            struct mx6_mmdc_calibration *calib);
466*4882a593Smuzhiyun #endif
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun /* configure mx6 mmdc registers */
469*4882a593Smuzhiyun void mx6_dram_cfg(const struct mx6_ddr_sysinfo *,
470*4882a593Smuzhiyun 		  const struct mx6_mmdc_calibration *,
471*4882a593Smuzhiyun 		  const void *);
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun #endif /* CONFIG_SPL_BUILD */
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun #define MX6_MMDC_P0_MDCTL	0x021b0000
476*4882a593Smuzhiyun #define MX6_MMDC_P0_MDPDC	0x021b0004
477*4882a593Smuzhiyun #define MX6_MMDC_P0_MDOTC	0x021b0008
478*4882a593Smuzhiyun #define MX6_MMDC_P0_MDCFG0	0x021b000c
479*4882a593Smuzhiyun #define MX6_MMDC_P0_MDCFG1	0x021b0010
480*4882a593Smuzhiyun #define MX6_MMDC_P0_MDCFG2	0x021b0014
481*4882a593Smuzhiyun #define MX6_MMDC_P0_MDMISC	0x021b0018
482*4882a593Smuzhiyun #define MX6_MMDC_P0_MDSCR	0x021b001c
483*4882a593Smuzhiyun #define MX6_MMDC_P0_MDREF	0x021b0020
484*4882a593Smuzhiyun #define MX6_MMDC_P0_MDRWD	0x021b002c
485*4882a593Smuzhiyun #define MX6_MMDC_P0_MDOR	0x021b0030
486*4882a593Smuzhiyun #define MX6_MMDC_P0_MDASP	0x021b0040
487*4882a593Smuzhiyun #define MX6_MMDC_P0_MAPSR	0x021b0404
488*4882a593Smuzhiyun #define MX6_MMDC_P0_MPZQHWCTRL	0x021b0800
489*4882a593Smuzhiyun #define MX6_MMDC_P0_MPWLDECTRL0	0x021b080c
490*4882a593Smuzhiyun #define MX6_MMDC_P0_MPWLDECTRL1	0x021b0810
491*4882a593Smuzhiyun #define MX6_MMDC_P0_MPODTCTRL	0x021b0818
492*4882a593Smuzhiyun #define MX6_MMDC_P0_MPRDDQBY0DL	0x021b081c
493*4882a593Smuzhiyun #define MX6_MMDC_P0_MPRDDQBY1DL	0x021b0820
494*4882a593Smuzhiyun #define MX6_MMDC_P0_MPRDDQBY2DL	0x021b0824
495*4882a593Smuzhiyun #define MX6_MMDC_P0_MPRDDQBY3DL	0x021b0828
496*4882a593Smuzhiyun #define MX6_MMDC_P0_MPDGCTRL0	0x021b083c
497*4882a593Smuzhiyun #define MX6_MMDC_P0_MPDGCTRL1	0x021b0840
498*4882a593Smuzhiyun #define MX6_MMDC_P0_MPRDDLCTL	0x021b0848
499*4882a593Smuzhiyun #define MX6_MMDC_P0_MPWRDLCTL	0x021b0850
500*4882a593Smuzhiyun #define MX6_MMDC_P0_MPZQLP2CTL	0x021b085C
501*4882a593Smuzhiyun #define MX6_MMDC_P0_MPMUR0	0x021b08b8
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun #define MX6_MMDC_P1_MDCTL	0x021b4000
504*4882a593Smuzhiyun #define MX6_MMDC_P1_MDPDC	0x021b4004
505*4882a593Smuzhiyun #define MX6_MMDC_P1_MDOTC	0x021b4008
506*4882a593Smuzhiyun #define MX6_MMDC_P1_MDCFG0	0x021b400c
507*4882a593Smuzhiyun #define MX6_MMDC_P1_MDCFG1	0x021b4010
508*4882a593Smuzhiyun #define MX6_MMDC_P1_MDCFG2	0x021b4014
509*4882a593Smuzhiyun #define MX6_MMDC_P1_MDMISC	0x021b4018
510*4882a593Smuzhiyun #define MX6_MMDC_P1_MDSCR	0x021b401c
511*4882a593Smuzhiyun #define MX6_MMDC_P1_MDREF	0x021b4020
512*4882a593Smuzhiyun #define MX6_MMDC_P1_MDRWD	0x021b402c
513*4882a593Smuzhiyun #define MX6_MMDC_P1_MDOR	0x021b4030
514*4882a593Smuzhiyun #define MX6_MMDC_P1_MDASP	0x021b4040
515*4882a593Smuzhiyun #define MX6_MMDC_P1_MAPSR	0x021b4404
516*4882a593Smuzhiyun #define MX6_MMDC_P1_MPZQHWCTRL	0x021b4800
517*4882a593Smuzhiyun #define MX6_MMDC_P1_MPWLDECTRL0	0x021b480c
518*4882a593Smuzhiyun #define MX6_MMDC_P1_MPWLDECTRL1	0x021b4810
519*4882a593Smuzhiyun #define MX6_MMDC_P1_MPODTCTRL	0x021b4818
520*4882a593Smuzhiyun #define MX6_MMDC_P1_MPRDDQBY0DL	0x021b481c
521*4882a593Smuzhiyun #define MX6_MMDC_P1_MPRDDQBY1DL	0x021b4820
522*4882a593Smuzhiyun #define MX6_MMDC_P1_MPRDDQBY2DL	0x021b4824
523*4882a593Smuzhiyun #define MX6_MMDC_P1_MPRDDQBY3DL	0x021b4828
524*4882a593Smuzhiyun #define MX6_MMDC_P1_MPDGCTRL0	0x021b483c
525*4882a593Smuzhiyun #define MX6_MMDC_P1_MPDGCTRL1	0x021b4840
526*4882a593Smuzhiyun #define MX6_MMDC_P1_MPRDDLCTL	0x021b4848
527*4882a593Smuzhiyun #define MX6_MMDC_P1_MPWRDLCTL	0x021b4850
528*4882a593Smuzhiyun #define MX6_MMDC_P1_MPZQLP2CTL	0x021b485C
529*4882a593Smuzhiyun #define MX6_MMDC_P1_MPMUR0	0x021b48b8
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun #endif	/*__ASM_ARCH_MX6_DDR_H__ */
532