]>
Commit | Line | Data |
---|---|---|
0cc11dea TH |
1 | /* |
2 | * Copyright (C) 2014 Gateworks Corporation | |
3 | * Author: Tim Harvey <tharvey@gateworks.com> | |
4 | * | |
5 | * SPDX-License-Identifier: GPL-2.0+ | |
6 | */ | |
7 | ||
8 | #include <common.h> | |
0cc11dea | 9 | #include <asm/io.h> |
e25fbe3f | 10 | #include <asm/arch/crm_regs.h> |
0cc11dea TH |
11 | #include <asm/arch/mx6-ddr.h> |
12 | #include <asm/arch/mx6-pins.h> | |
13 | #include <asm/arch/sys_proto.h> | |
14 | #include <asm/imx-common/boot_mode.h> | |
15 | #include <asm/imx-common/iomux-v3.h> | |
16 | #include <asm/imx-common/mxc_i2c.h> | |
53940a50 | 17 | #include <environment.h> |
3c0fd17f | 18 | #include <i2c.h> |
0cc11dea TH |
19 | #include <spl.h> |
20 | ||
2089b7be TH |
21 | #include "gsc.h" |
22 | #include "common.h" | |
0cc11dea TH |
23 | |
24 | DECLARE_GLOBAL_DATA_PTR; | |
25 | ||
26 | #define RTT_NOM_120OHM /* use 120ohm Rtt_nom vs 60ohm (lower power) */ | |
0cc11dea TH |
27 | #define GSC_EEPROM_DDR_SIZE 0x2B /* enum (512,1024,2048) MB */ |
28 | #define GSC_EEPROM_DDR_WIDTH 0x2D /* enum (32,64) bit */ | |
0cc11dea TH |
29 | |
30 | /* configure MX6Q/DUAL mmdc DDR io registers */ | |
31 | struct mx6dq_iomux_ddr_regs mx6dq_ddr_ioregs = { | |
32 | /* SDCLK[0:1], CAS, RAS, Reset: Differential input, 40ohm */ | |
33 | .dram_sdclk_0 = 0x00020030, | |
34 | .dram_sdclk_1 = 0x00020030, | |
35 | .dram_cas = 0x00020030, | |
36 | .dram_ras = 0x00020030, | |
37 | .dram_reset = 0x00020030, | |
38 | /* SDCKE[0:1]: 100k pull-up */ | |
39 | .dram_sdcke0 = 0x00003000, | |
40 | .dram_sdcke1 = 0x00003000, | |
41 | /* SDBA2: pull-up disabled */ | |
42 | .dram_sdba2 = 0x00000000, | |
43 | /* SDODT[0:1]: 100k pull-up, 40 ohm */ | |
44 | .dram_sdodt0 = 0x00003030, | |
45 | .dram_sdodt1 = 0x00003030, | |
46 | /* SDQS[0:7]: Differential input, 40 ohm */ | |
47 | .dram_sdqs0 = 0x00000030, | |
48 | .dram_sdqs1 = 0x00000030, | |
49 | .dram_sdqs2 = 0x00000030, | |
50 | .dram_sdqs3 = 0x00000030, | |
51 | .dram_sdqs4 = 0x00000030, | |
52 | .dram_sdqs5 = 0x00000030, | |
53 | .dram_sdqs6 = 0x00000030, | |
54 | .dram_sdqs7 = 0x00000030, | |
55 | ||
56 | /* DQM[0:7]: Differential input, 40 ohm */ | |
57 | .dram_dqm0 = 0x00020030, | |
58 | .dram_dqm1 = 0x00020030, | |
59 | .dram_dqm2 = 0x00020030, | |
60 | .dram_dqm3 = 0x00020030, | |
61 | .dram_dqm4 = 0x00020030, | |
62 | .dram_dqm5 = 0x00020030, | |
63 | .dram_dqm6 = 0x00020030, | |
64 | .dram_dqm7 = 0x00020030, | |
65 | }; | |
66 | ||
67 | /* configure MX6Q/DUAL mmdc GRP io registers */ | |
68 | struct mx6dq_iomux_grp_regs mx6dq_grp_ioregs = { | |
69 | /* DDR3 */ | |
70 | .grp_ddr_type = 0x000c0000, | |
71 | .grp_ddrmode_ctl = 0x00020000, | |
72 | /* disable DDR pullups */ | |
73 | .grp_ddrpke = 0x00000000, | |
74 | /* ADDR[00:16], SDBA[0:1]: 40 ohm */ | |
75 | .grp_addds = 0x00000030, | |
76 | /* CS0/CS1/SDBA2/CKE0/CKE1/SDWE: 40 ohm */ | |
77 | .grp_ctlds = 0x00000030, | |
78 | /* DATA[00:63]: Differential input, 40 ohm */ | |
79 | .grp_ddrmode = 0x00020000, | |
80 | .grp_b0ds = 0x00000030, | |
81 | .grp_b1ds = 0x00000030, | |
82 | .grp_b2ds = 0x00000030, | |
83 | .grp_b3ds = 0x00000030, | |
84 | .grp_b4ds = 0x00000030, | |
85 | .grp_b5ds = 0x00000030, | |
86 | .grp_b6ds = 0x00000030, | |
87 | .grp_b7ds = 0x00000030, | |
88 | }; | |
89 | ||
90 | /* configure MX6SOLO/DUALLITE mmdc DDR io registers */ | |
91 | struct mx6sdl_iomux_ddr_regs mx6sdl_ddr_ioregs = { | |
92 | /* SDCLK[0:1], CAS, RAS, Reset: Differential input, 40ohm */ | |
93 | .dram_sdclk_0 = 0x00020030, | |
94 | .dram_sdclk_1 = 0x00020030, | |
95 | .dram_cas = 0x00020030, | |
96 | .dram_ras = 0x00020030, | |
97 | .dram_reset = 0x00020030, | |
98 | /* SDCKE[0:1]: 100k pull-up */ | |
99 | .dram_sdcke0 = 0x00003000, | |
100 | .dram_sdcke1 = 0x00003000, | |
101 | /* SDBA2: pull-up disabled */ | |
102 | .dram_sdba2 = 0x00000000, | |
103 | /* SDODT[0:1]: 100k pull-up, 40 ohm */ | |
104 | .dram_sdodt0 = 0x00003030, | |
105 | .dram_sdodt1 = 0x00003030, | |
106 | /* SDQS[0:7]: Differential input, 40 ohm */ | |
107 | .dram_sdqs0 = 0x00000030, | |
108 | .dram_sdqs1 = 0x00000030, | |
109 | .dram_sdqs2 = 0x00000030, | |
110 | .dram_sdqs3 = 0x00000030, | |
111 | .dram_sdqs4 = 0x00000030, | |
112 | .dram_sdqs5 = 0x00000030, | |
113 | .dram_sdqs6 = 0x00000030, | |
114 | .dram_sdqs7 = 0x00000030, | |
115 | ||
116 | /* DQM[0:7]: Differential input, 40 ohm */ | |
117 | .dram_dqm0 = 0x00020030, | |
118 | .dram_dqm1 = 0x00020030, | |
119 | .dram_dqm2 = 0x00020030, | |
120 | .dram_dqm3 = 0x00020030, | |
121 | .dram_dqm4 = 0x00020030, | |
122 | .dram_dqm5 = 0x00020030, | |
123 | .dram_dqm6 = 0x00020030, | |
124 | .dram_dqm7 = 0x00020030, | |
125 | }; | |
126 | ||
127 | /* configure MX6SOLO/DUALLITE mmdc GRP io registers */ | |
128 | struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = { | |
129 | /* DDR3 */ | |
130 | .grp_ddr_type = 0x000c0000, | |
131 | /* SDQS[0:7]: Differential input, 40 ohm */ | |
132 | .grp_ddrmode_ctl = 0x00020000, | |
133 | /* disable DDR pullups */ | |
134 | .grp_ddrpke = 0x00000000, | |
135 | /* ADDR[00:16], SDBA[0:1]: 40 ohm */ | |
136 | .grp_addds = 0x00000030, | |
137 | /* CS0/CS1/SDBA2/CKE0/CKE1/SDWE: 40 ohm */ | |
138 | .grp_ctlds = 0x00000030, | |
139 | /* DATA[00:63]: Differential input, 40 ohm */ | |
140 | .grp_ddrmode = 0x00020000, | |
141 | .grp_b0ds = 0x00000030, | |
142 | .grp_b1ds = 0x00000030, | |
143 | .grp_b2ds = 0x00000030, | |
144 | .grp_b3ds = 0x00000030, | |
145 | .grp_b4ds = 0x00000030, | |
146 | .grp_b5ds = 0x00000030, | |
147 | .grp_b6ds = 0x00000030, | |
148 | .grp_b7ds = 0x00000030, | |
149 | }; | |
150 | ||
767d88b0 PS |
151 | /* MT41K64M16JT-125 (1Gb density) */ |
152 | static struct mx6_ddr3_cfg mt41k64m16jt_125 = { | |
153 | .mem_speed = 1600, | |
154 | .density = 1, | |
155 | .width = 16, | |
156 | .banks = 8, | |
157 | .rowaddr = 13, | |
158 | .coladdr = 10, | |
159 | .pagesz = 2, | |
160 | .trcd = 1375, | |
161 | .trcmin = 4875, | |
162 | .trasmin = 3500, | |
163 | }; | |
164 | ||
b0b83347 | 165 | /* MT41K128M16JT-125 (2Gb density) */ |
0cc11dea TH |
166 | static struct mx6_ddr3_cfg mt41k128m16jt_125 = { |
167 | .mem_speed = 1600, | |
168 | .density = 2, | |
169 | .width = 16, | |
170 | .banks = 8, | |
171 | .rowaddr = 14, | |
172 | .coladdr = 10, | |
173 | .pagesz = 2, | |
174 | .trcd = 1375, | |
175 | .trcmin = 4875, | |
176 | .trasmin = 3500, | |
177 | }; | |
178 | ||
b0b83347 | 179 | /* MT41K256M16HA-125 (4Gb density) */ |
c91e4b8b TH |
180 | static struct mx6_ddr3_cfg mt41k256m16ha_125 = { |
181 | .mem_speed = 1600, | |
182 | .density = 4, | |
183 | .width = 16, | |
184 | .banks = 8, | |
185 | .rowaddr = 15, | |
186 | .coladdr = 10, | |
187 | .pagesz = 2, | |
188 | .trcd = 1375, | |
189 | .trcmin = 4875, | |
190 | .trasmin = 3500, | |
191 | }; | |
192 | ||
6052b1c6 TH |
193 | /* MT41K512M16HA-125 (8Gb density) */ |
194 | static struct mx6_ddr3_cfg mt41k512m16ha_125 = { | |
195 | .mem_speed = 1600, | |
196 | .density = 8, | |
197 | .width = 16, | |
198 | .banks = 8, | |
199 | .rowaddr = 16, | |
200 | .coladdr = 10, | |
201 | .pagesz = 2, | |
202 | .trcd = 1375, | |
203 | .trcmin = 4875, | |
204 | .trasmin = 3500, | |
205 | }; | |
206 | ||
c91e4b8b TH |
207 | /* |
208 | * calibration - these are the various CPU/DDR3 combinations we support | |
209 | */ | |
767d88b0 PS |
210 | static struct mx6_mmdc_calibration mx6sdl_64x16_mmdc_calib = { |
211 | /* write leveling calibration determine */ | |
212 | .p0_mpwldectrl0 = 0x004C004E, | |
213 | .p0_mpwldectrl1 = 0x00440044, | |
214 | /* Read DQS Gating calibration */ | |
215 | .p0_mpdgctrl0 = 0x42440247, | |
216 | .p0_mpdgctrl1 = 0x02310232, | |
217 | /* Read Calibration: DQS delay relative to DQ read access */ | |
218 | .p0_mprddlctl = 0x45424746, | |
219 | /* Write Calibration: DQ/DM delay relative to DQS write access */ | |
220 | .p0_mpwrdlctl = 0x33382C31, | |
221 | }; | |
c91e4b8b | 222 | |
75f21e31 TH |
223 | static struct mx6_mmdc_calibration mx6dq_256x16_mmdc_calib = { |
224 | /* write leveling calibration determine */ | |
06edcb9d TH |
225 | .p0_mpwldectrl0 = 0x001B0016, |
226 | .p0_mpwldectrl1 = 0x000C000E, | |
75f21e31 | 227 | /* Read DQS Gating calibration */ |
06edcb9d TH |
228 | .p0_mpdgctrl0 = 0x4324033A, |
229 | .p0_mpdgctrl1 = 0x00000000, | |
75f21e31 | 230 | /* Read Calibration: DQS delay relative to DQ read access */ |
06edcb9d | 231 | .p0_mprddlctl = 0x40403438, |
75f21e31 | 232 | /* Write Calibration: DQ/DM delay relative to DQS write access */ |
06edcb9d | 233 | .p0_mpwrdlctl = 0x40403D36, |
75f21e31 TH |
234 | }; |
235 | ||
75f21e31 TH |
236 | static struct mx6_mmdc_calibration mx6sdl_256x16_mmdc_calib = { |
237 | /* write leveling calibration determine */ | |
06edcb9d TH |
238 | .p0_mpwldectrl0 = 0x00420043, |
239 | .p0_mpwldectrl1 = 0x0016001A, | |
75f21e31 | 240 | /* Read DQS Gating calibration */ |
06edcb9d TH |
241 | .p0_mpdgctrl0 = 0x4238023B, |
242 | .p0_mpdgctrl1 = 0x00000000, | |
75f21e31 | 243 | /* Read Calibration: DQS delay relative to DQ read access */ |
06edcb9d | 244 | .p0_mprddlctl = 0x40404849, |
75f21e31 | 245 | /* Write Calibration: DQ/DM delay relative to DQS write access */ |
06edcb9d | 246 | .p0_mpwrdlctl = 0x40402E2F, |
75f21e31 TH |
247 | }; |
248 | ||
c91e4b8b | 249 | static struct mx6_mmdc_calibration mx6dq_128x32_mmdc_calib = { |
0cc11dea | 250 | /* write leveling calibration determine */ |
c91e4b8b TH |
251 | .p0_mpwldectrl0 = 0x00190017, |
252 | .p0_mpwldectrl1 = 0x00140026, | |
0cc11dea | 253 | /* Read DQS Gating calibration */ |
c91e4b8b TH |
254 | .p0_mpdgctrl0 = 0x43380347, |
255 | .p0_mpdgctrl1 = 0x433C034D, | |
0cc11dea TH |
256 | /* Read Calibration: DQS delay relative to DQ read access */ |
257 | .p0_mprddlctl = 0x3C313539, | |
0cc11dea | 258 | /* Write Calibration: DQ/DM delay relative to DQS write access */ |
c91e4b8b TH |
259 | .p0_mpwrdlctl = 0x36393C39, |
260 | }; | |
261 | ||
262 | static struct mx6_mmdc_calibration mx6sdl_128x32_mmdc_calib = { | |
263 | /* write leveling calibration determine */ | |
264 | .p0_mpwldectrl0 = 0x003C003C, | |
265 | .p0_mpwldectrl1 = 0x001F002A, | |
266 | /* Read DQS Gating calibration */ | |
267 | .p0_mpdgctrl0 = 0x42410244, | |
268 | .p0_mpdgctrl1 = 0x4234023A, | |
269 | /* Read Calibration: DQS delay relative to DQ read access */ | |
270 | .p0_mprddlctl = 0x484A4C4B, | |
271 | /* Write Calibration: DQ/DM delay relative to DQS write access */ | |
272 | .p0_mpwrdlctl = 0x33342B32, | |
0cc11dea TH |
273 | }; |
274 | ||
c91e4b8b | 275 | static struct mx6_mmdc_calibration mx6dq_128x64_mmdc_calib = { |
0cc11dea | 276 | /* write leveling calibration determine */ |
c91e4b8b TH |
277 | .p0_mpwldectrl0 = 0x00190017, |
278 | .p0_mpwldectrl1 = 0x00140026, | |
279 | .p1_mpwldectrl0 = 0x0021001C, | |
280 | .p1_mpwldectrl1 = 0x0011001D, | |
0cc11dea | 281 | /* Read DQS Gating calibration */ |
c91e4b8b TH |
282 | .p0_mpdgctrl0 = 0x43380347, |
283 | .p0_mpdgctrl1 = 0x433C034D, | |
284 | .p1_mpdgctrl0 = 0x032C0324, | |
285 | .p1_mpdgctrl1 = 0x03310232, | |
0cc11dea | 286 | /* Read Calibration: DQS delay relative to DQ read access */ |
c91e4b8b TH |
287 | .p0_mprddlctl = 0x3C313539, |
288 | .p1_mprddlctl = 0x37343141, | |
0cc11dea | 289 | /* Write Calibration: DQ/DM delay relative to DQS write access */ |
c91e4b8b TH |
290 | .p0_mpwrdlctl = 0x36393C39, |
291 | .p1_mpwrdlctl = 0x42344438, | |
0cc11dea | 292 | }; |
c91e4b8b TH |
293 | |
294 | static struct mx6_mmdc_calibration mx6sdl_128x64_mmdc_calib = { | |
0cc11dea TH |
295 | /* write leveling calibration determine */ |
296 | .p0_mpwldectrl0 = 0x003C003C, | |
c91e4b8b TH |
297 | .p0_mpwldectrl1 = 0x001F002A, |
298 | .p1_mpwldectrl0 = 0x00330038, | |
0cc11dea TH |
299 | .p1_mpwldectrl1 = 0x0022003F, |
300 | /* Read DQS Gating calibration */ | |
301 | .p0_mpdgctrl0 = 0x42410244, | |
c91e4b8b TH |
302 | .p0_mpdgctrl1 = 0x4234023A, |
303 | .p1_mpdgctrl0 = 0x022D022D, | |
0cc11dea TH |
304 | .p1_mpdgctrl1 = 0x021C0228, |
305 | /* Read Calibration: DQS delay relative to DQ read access */ | |
306 | .p0_mprddlctl = 0x484A4C4B, | |
307 | .p1_mprddlctl = 0x4B4D4E4B, | |
308 | /* Write Calibration: DQ/DM delay relative to DQS write access */ | |
309 | .p0_mpwrdlctl = 0x33342B32, | |
310 | .p1_mpwrdlctl = 0x3933332B, | |
311 | }; | |
312 | ||
c91e4b8b | 313 | static struct mx6_mmdc_calibration mx6dq_256x32_mmdc_calib = { |
0cc11dea | 314 | /* write leveling calibration determine */ |
c91e4b8b TH |
315 | .p0_mpwldectrl0 = 0x001E001A, |
316 | .p0_mpwldectrl1 = 0x0026001F, | |
0cc11dea | 317 | /* Read DQS Gating calibration */ |
c91e4b8b TH |
318 | .p0_mpdgctrl0 = 0x43370349, |
319 | .p0_mpdgctrl1 = 0x032D0327, | |
0cc11dea | 320 | /* Read Calibration: DQS delay relative to DQ read access */ |
c91e4b8b | 321 | .p0_mprddlctl = 0x3D303639, |
0cc11dea | 322 | /* Write Calibration: DQ/DM delay relative to DQS write access */ |
c91e4b8b | 323 | .p0_mpwrdlctl = 0x32363934, |
0cc11dea TH |
324 | }; |
325 | ||
b0b83347 TH |
326 | static struct mx6_mmdc_calibration mx6sdl_256x32_mmdc_calib = { |
327 | /* write leveling calibration determine */ | |
328 | .p0_mpwldectrl0 = 0X00480047, | |
329 | .p0_mpwldectrl1 = 0X003D003F, | |
330 | /* Read DQS Gating calibration */ | |
331 | .p0_mpdgctrl0 = 0X423E0241, | |
332 | .p0_mpdgctrl1 = 0X022B022C, | |
333 | /* Read Calibration: DQS delay relative to DQ read access */ | |
334 | .p0_mprddlctl = 0X49454A4A, | |
335 | /* Write Calibration: DQ/DM delay relative to DQS write access */ | |
336 | .p0_mpwrdlctl = 0X2E372C32, | |
337 | }; | |
338 | ||
c91e4b8b | 339 | static struct mx6_mmdc_calibration mx6dq_256x64_mmdc_calib = { |
0cc11dea | 340 | /* write leveling calibration determine */ |
c91e4b8b TH |
341 | .p0_mpwldectrl0 = 0X00220021, |
342 | .p0_mpwldectrl1 = 0X00200030, | |
343 | .p1_mpwldectrl0 = 0X002D0027, | |
344 | .p1_mpwldectrl1 = 0X00150026, | |
0cc11dea | 345 | /* Read DQS Gating calibration */ |
c91e4b8b TH |
346 | .p0_mpdgctrl0 = 0x43330342, |
347 | .p0_mpdgctrl1 = 0x0339034A, | |
348 | .p1_mpdgctrl0 = 0x032F0325, | |
349 | .p1_mpdgctrl1 = 0x032F022E, | |
0cc11dea | 350 | /* Read Calibration: DQS delay relative to DQ read access */ |
c91e4b8b TH |
351 | .p0_mprddlctl = 0X3A2E3437, |
352 | .p1_mprddlctl = 0X35312F3F, | |
0cc11dea | 353 | /* Write Calibration: DQ/DM delay relative to DQS write access */ |
c91e4b8b TH |
354 | .p0_mpwrdlctl = 0X33363B37, |
355 | .p1_mpwrdlctl = 0X40304239, | |
0cc11dea TH |
356 | }; |
357 | ||
6052b1c6 TH |
358 | static struct mx6_mmdc_calibration mx6dq_512x32_mmdc_calib = { |
359 | /* write leveling calibration determine */ | |
360 | .p0_mpwldectrl0 = 0x002A0025, | |
361 | .p0_mpwldectrl1 = 0x003A002A, | |
362 | /* Read DQS Gating calibration */ | |
363 | .p0_mpdgctrl0 = 0x43430356, | |
364 | .p0_mpdgctrl1 = 0x033C0335, | |
365 | /* Read Calibration: DQS delay relative to DQ read access */ | |
366 | .p0_mprddlctl = 0x4B373F42, | |
367 | /* Write Calibration: DQ/DM delay relative to DQS write access */ | |
368 | .p0_mpwrdlctl = 0x303E3C36, | |
369 | }; | |
370 | ||
c91e4b8b | 371 | static void spl_dram_init(int width, int size_mb, int board_model) |
0cc11dea | 372 | { |
c91e4b8b TH |
373 | struct mx6_ddr3_cfg *mem = NULL; |
374 | struct mx6_mmdc_calibration *calib = NULL; | |
0cc11dea TH |
375 | struct mx6_ddr_sysinfo sysinfo = { |
376 | /* width of data bus:0=16,1=32,2=64 */ | |
377 | .dsize = width/32, | |
378 | /* config for full 4GB range so that get_mem_size() works */ | |
379 | .cs_density = 32, /* 32Gb per CS */ | |
380 | /* single chip select */ | |
381 | .ncs = 1, | |
382 | .cs1_mirror = 0, | |
383 | .rtt_wr = 1 /*DDR3_RTT_60_OHM*/, /* RTT_Wr = RZQ/4 */ | |
384 | #ifdef RTT_NOM_120OHM | |
385 | .rtt_nom = 2 /*DDR3_RTT_120_OHM*/, /* RTT_Nom = RZQ/2 */ | |
386 | #else | |
387 | .rtt_nom = 1 /*DDR3_RTT_60_OHM*/, /* RTT_Nom = RZQ/4 */ | |
388 | #endif | |
389 | .walat = 1, /* Write additional latency */ | |
390 | .ralat = 5, /* Read additional latency */ | |
391 | .mif3_mode = 3, /* Command prediction working mode */ | |
392 | .bi_on = 1, /* Bank interleaving enabled */ | |
393 | .sde_to_rst = 0x10, /* 14 cycles, 200us (JEDEC default) */ | |
394 | .rst_to_cke = 0x23, /* 33 cycles, 500us (JEDEC default) */ | |
29f0d6b1 | 395 | .pd_fast_exit = 1, /* enable precharge power-down fast exit */ |
f2ff8343 | 396 | .ddr_type = DDR_TYPE_DDR3, |
edf00937 FE |
397 | .refsel = 1, /* Refresh cycles at 32KHz */ |
398 | .refr = 7, /* 8 refresh commands per refresh cycle */ | |
0cc11dea TH |
399 | }; |
400 | ||
401 | /* | |
402 | * MMDC Calibration requires the following data: | |
403 | * mx6_mmdc_calibration - board-specific calibration (routing delays) | |
c91e4b8b | 404 | * these calibration values depend on board routing, SoC, and DDR |
0cc11dea TH |
405 | * mx6_ddr_sysinfo - board-specific memory architecture (width/cs/etc) |
406 | * mx6_ddr_cfg - chip specific timing/layout details | |
407 | */ | |
767d88b0 PS |
408 | if (width == 16 && size_mb == 128) { |
409 | mem = &mt41k64m16jt_125; | |
410 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
411 | ; | |
412 | else | |
413 | calib = &mx6sdl_64x16_mmdc_calib; | |
414 | debug("1gB density\n"); | |
415 | } else if (width == 16 && size_mb == 256) { | |
7f14c31b | 416 | /* 1x 2Gb density chip - same calib as 2x 2Gb */ |
75f21e31 TH |
417 | mem = &mt41k128m16jt_125; |
418 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
7f14c31b | 419 | calib = &mx6dq_128x32_mmdc_calib; |
75f21e31 | 420 | else |
7f14c31b | 421 | calib = &mx6sdl_128x32_mmdc_calib; |
75f21e31 TH |
422 | debug("2gB density\n"); |
423 | } else if (width == 16 && size_mb == 512) { | |
424 | mem = &mt41k256m16ha_125; | |
425 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
426 | calib = &mx6dq_256x16_mmdc_calib; | |
427 | else | |
428 | calib = &mx6sdl_256x16_mmdc_calib; | |
429 | debug("4gB density\n"); | |
767d88b0 PS |
430 | } else if (width == 32 && size_mb == 256) { |
431 | /* Same calib as width==16, size==128 */ | |
432 | mem = &mt41k64m16jt_125; | |
433 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
434 | ; | |
435 | else | |
436 | calib = &mx6sdl_64x16_mmdc_calib; | |
437 | debug("1gB density\n"); | |
75f21e31 | 438 | } else if (width == 32 && size_mb == 512) { |
c91e4b8b | 439 | mem = &mt41k128m16jt_125; |
0cc11dea | 440 | if (is_cpu_type(MXC_CPU_MX6Q)) |
c91e4b8b | 441 | calib = &mx6dq_128x32_mmdc_calib; |
0cc11dea | 442 | else |
c91e4b8b TH |
443 | calib = &mx6sdl_128x32_mmdc_calib; |
444 | debug("2gB density\n"); | |
767d88b0 PS |
445 | } else if (width == 32 && size_mb == 1024) { |
446 | mem = &mt41k256m16ha_125; | |
447 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
448 | calib = &mx6dq_256x32_mmdc_calib; | |
449 | else | |
450 | calib = &mx6sdl_256x32_mmdc_calib; | |
451 | debug("4gB density\n"); | |
6052b1c6 TH |
452 | } else if (width == 32 && size_mb == 2048) { |
453 | mem = &mt41k512m16ha_125; | |
454 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
455 | calib = &mx6dq_512x32_mmdc_calib; | |
456 | debug("8gB density\n"); | |
767d88b0 PS |
457 | } else if (width == 64 && size_mb == 512) { |
458 | mem = &mt41k64m16jt_125; | |
459 | debug("1gB density\n"); | |
c91e4b8b TH |
460 | } else if (width == 64 && size_mb == 1024) { |
461 | mem = &mt41k128m16jt_125; | |
0cc11dea | 462 | if (is_cpu_type(MXC_CPU_MX6Q)) |
c91e4b8b | 463 | calib = &mx6dq_128x64_mmdc_calib; |
0cc11dea | 464 | else |
c91e4b8b TH |
465 | calib = &mx6sdl_128x64_mmdc_calib; |
466 | debug("2gB density\n"); | |
c91e4b8b TH |
467 | } else if (width == 64 && size_mb == 2048) { |
468 | mem = &mt41k256m16ha_125; | |
469 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
470 | calib = &mx6dq_256x64_mmdc_calib; | |
471 | debug("4gB density\n"); | |
472 | } | |
473 | ||
9e2b0c2d PS |
474 | if (!(mem && calib)) { |
475 | puts("Error: Invalid Calibration/Board Configuration\n"); | |
476 | printf("MEM : %s\n", mem ? "OKAY" : "NULL"); | |
477 | printf("CALIB : %s\n", calib ? "OKAY" : "NULL"); | |
478 | printf("CPUTYPE: %s\n", | |
479 | is_cpu_type(MXC_CPU_MX6Q) ? "IMX6Q" : "IMX6DL"); | |
480 | printf("SIZE_MB: %d\n", size_mb); | |
481 | printf("WIDTH : %d\n", width); | |
c91e4b8b | 482 | hang(); |
0cc11dea TH |
483 | } |
484 | ||
485 | if (is_cpu_type(MXC_CPU_MX6Q)) | |
486 | mx6dq_dram_iocfg(width, &mx6dq_ddr_ioregs, | |
487 | &mx6dq_grp_ioregs); | |
488 | else | |
489 | mx6sdl_dram_iocfg(width, &mx6sdl_ddr_ioregs, | |
490 | &mx6sdl_grp_ioregs); | |
491 | mx6_dram_cfg(&sysinfo, calib, mem); | |
492 | } | |
493 | ||
e25fbe3f FE |
494 | static void ccgr_init(void) |
495 | { | |
496 | struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR; | |
497 | ||
498 | writel(0x00C03F3F, &ccm->CCGR0); | |
499 | writel(0x0030FC03, &ccm->CCGR1); | |
500 | writel(0x0FFFC000, &ccm->CCGR2); | |
501 | writel(0x3FF00000, &ccm->CCGR3); | |
576cd6b3 | 502 | writel(0xFFFFF300, &ccm->CCGR4); /* enable NAND/GPMI/BCH clks */ |
e25fbe3f FE |
503 | writel(0x0F0000C3, &ccm->CCGR5); |
504 | writel(0x000003FF, &ccm->CCGR6); | |
505 | } | |
506 | ||
507 | static void gpr_init(void) | |
508 | { | |
509 | struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR; | |
510 | ||
511 | /* enable AXI cache for VDOA/VPU/IPU */ | |
512 | writel(0xF00000CF, &iomux->gpr[4]); | |
513 | /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */ | |
514 | writel(0x007F007F, &iomux->gpr[6]); | |
515 | writel(0x007F007F, &iomux->gpr[7]); | |
516 | } | |
517 | ||
0cc11dea TH |
518 | /* |
519 | * called from C runtime startup code (arch/arm/lib/crt0.S:_main) | |
520 | * - we have a stack and a place to store GD, both in SRAM | |
521 | * - no variable global data is available | |
522 | */ | |
523 | void board_init_f(ulong dummy) | |
524 | { | |
525 | struct ventana_board_info ventana_info; | |
526 | int board_model; | |
527 | ||
d783c274 TH |
528 | /* setup clock gating */ |
529 | ccgr_init(); | |
530 | ||
0cc11dea TH |
531 | /* setup AIPS and disable watchdog */ |
532 | arch_cpu_init(); | |
533 | ||
d783c274 | 534 | /* setup AXI */ |
e25fbe3f FE |
535 | gpr_init(); |
536 | ||
0cc11dea | 537 | /* iomux and setup of i2c */ |
2089b7be TH |
538 | setup_iomux_uart(); |
539 | setup_ventana_i2c(); | |
0cc11dea TH |
540 | |
541 | /* setup GP timer */ | |
542 | timer_init(); | |
543 | ||
544 | /* UART clocks enabled and gd valid - init serial console */ | |
545 | preloader_console_init(); | |
546 | ||
547 | /* read/validate EEPROM info to determine board model and SDRAM cfg */ | |
2089b7be | 548 | board_model = read_eeprom(CONFIG_I2C_GSC, &ventana_info); |
0cc11dea | 549 | |
c4b44d76 TH |
550 | /* configure model-specific gpio */ |
551 | setup_iomux_gpio(board_model, &ventana_info); | |
552 | ||
0cc11dea | 553 | /* provide some some default: 32bit 128MB */ |
fdead4be TH |
554 | if (GW_UNKNOWN == board_model) |
555 | hang(); | |
0cc11dea TH |
556 | |
557 | /* configure MMDC for SDRAM width/size and per-model calibration */ | |
558 | spl_dram_init(8 << ventana_info.sdram_width, | |
559 | 16 << ventana_info.sdram_size, | |
560 | board_model); | |
561 | ||
562 | /* Clear the BSS. */ | |
563 | memset(__bss_start, 0, __bss_end - __bss_start); | |
0cc11dea TH |
564 | } |
565 | ||
06c3564d TH |
566 | /* called from board_init_r after gd setup if CONFIG_SPL_BOARD_INIT defined */ |
567 | /* its our chance to print info about boot device */ | |
568 | void spl_board_init(void) | |
569 | { | |
570 | /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 */ | |
571 | u32 boot_device = spl_boot_device(); | |
572 | ||
573 | switch (boot_device) { | |
574 | case BOOT_DEVICE_MMC1: | |
575 | puts("Booting from MMC\n"); | |
576 | break; | |
577 | case BOOT_DEVICE_NAND: | |
578 | puts("Booting from NAND\n"); | |
579 | break; | |
580 | case BOOT_DEVICE_SATA: | |
581 | puts("Booting from SATA\n"); | |
582 | break; | |
583 | default: | |
584 | puts("Unknown boot device\n"); | |
585 | } | |
e06a0362 TH |
586 | |
587 | /* PMIC init */ | |
588 | setup_pmic(); | |
06c3564d TH |
589 | } |
590 | ||
53940a50 TH |
591 | #ifdef CONFIG_SPL_OS_BOOT |
592 | /* return 1 if we wish to boot to uboot vs os (falcon mode) */ | |
593 | int spl_start_uboot(void) | |
594 | { | |
3c0fd17f | 595 | unsigned char ret = 1; |
53940a50 TH |
596 | |
597 | debug("%s\n", __func__); | |
598 | #ifdef CONFIG_SPL_ENV_SUPPORT | |
599 | env_init(); | |
600 | env_relocate_spec(); | |
601 | debug("boot_os=%s\n", getenv("boot_os")); | |
602 | if (getenv_yesno("boot_os") == 1) | |
603 | ret = 0; | |
3c0fd17f TH |
604 | #else |
605 | /* use i2c-0:0x50:0x00 for falcon boot mode (0=linux, else uboot) */ | |
606 | i2c_set_bus_num(0); | |
607 | gsc_i2c_read(0x50, 0x0, 1, &ret, 1); | |
53940a50 | 608 | #endif |
1b99103f TH |
609 | if (!ret) |
610 | gsc_boot_wd_disable(); | |
611 | ||
53940a50 TH |
612 | debug("%s booting %s\n", __func__, ret ? "uboot" : "linux"); |
613 | return ret; | |
614 | } | |
615 | #endif |