]>
Commit | Line | Data |
---|---|---|
aba19604 LJ |
1 | /* |
2 | * cpu/ppc4xx/denali_spd_ddr2.c | |
3 | * This SPD SDRAM detection code supports AMCC PPC44x CPUs with a Denali-core | |
4 | * DDR2 controller, specifically the 440EPx/GRx. | |
5 | * | |
6 | * (C) Copyright 2007 | |
7 | * Larry Johnson, [email protected]. | |
8 | * | |
9 | * Based primarily on cpu/ppc4xx/4xx_spd_ddr2.c, which is... | |
10 | * | |
11 | * (C) Copyright 2007 | |
12 | * Stefan Roese, DENX Software Engineering, [email protected]. | |
13 | * | |
14 | * COPYRIGHT AMCC CORPORATION 2004 | |
15 | * | |
16 | * See file CREDITS for list of people who contributed to this | |
17 | * project. | |
18 | * | |
19 | * This program is free software; you can redistribute it and/or | |
20 | * modify it under the terms of the GNU General Public License as | |
21 | * published by the Free Software Foundation; either version 2 of | |
22 | * the License, or (at your option) any later version. | |
23 | * | |
24 | * This program is distributed in the hope that it will be useful, | |
25 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
27 | * GNU General Public License for more details. | |
28 | * | |
29 | * You should have received a copy of the GNU General Public License | |
30 | * along with this program; if not, write to the Free Software | |
31 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
32 | * MA 02111-1307 USA | |
33 | * | |
34 | */ | |
35 | ||
36 | /* define DEBUG for debugging output (obviously ;-)) */ | |
37 | #if 0 | |
38 | #define DEBUG | |
39 | #endif | |
40 | ||
41 | #include <common.h> | |
42 | #include <command.h> | |
43 | #include <ppc4xx.h> | |
44 | #include <i2c.h> | |
45 | #include <asm/io.h> | |
46 | #include <asm/processor.h> | |
47 | #include <asm/mmu.h> | |
48 | ||
49 | #if defined(CONFIG_SPD_EEPROM) && \ | |
50 | (defined(CONFIG_440EPX) || defined(CONFIG_440GRX)) | |
51 | ||
52 | /*-----------------------------------------------------------------------------+ | |
53 | * Defines | |
54 | *-----------------------------------------------------------------------------*/ | |
55 | #ifndef TRUE | |
56 | #define TRUE 1 | |
57 | #endif | |
58 | #ifndef FALSE | |
59 | #define FALSE 0 | |
60 | #endif | |
61 | ||
62 | #define MAXDIMMS 2 | |
63 | #define MAXRANKS 2 | |
64 | ||
65 | #define ONE_BILLION 1000000000 | |
66 | ||
67 | #define MULDIV64(m1, m2, d) (u32)(((u64)(m1) * (u64)(m2)) / (u64)(d)) | |
68 | ||
69 | #define DLL_DQS_DELAY 0x19 | |
70 | #define DLL_DQS_BYPASS 0x0B | |
71 | #define DQS_OUT_SHIFT 0x7F | |
72 | ||
73 | /* | |
74 | * This DDR2 setup code can dynamically setup the TLB entries for the DDR2 memory | |
75 | * region. Right now the cache should still be disabled in U-Boot because of the | |
76 | * EMAC driver, that need it's buffer descriptor to be located in non cached | |
77 | * memory. | |
78 | * | |
79 | * If at some time this restriction doesn't apply anymore, just define | |
80 | * CFG_ENABLE_SDRAM_CACHE in the board config file and this code should setup | |
81 | * everything correctly. | |
82 | */ | |
83 | #if defined(CFG_ENABLE_SDRAM_CACHE) | |
84 | #define MY_TLB_WORD2_I_ENABLE 0 /* enable caching on SDRAM */ | |
85 | #else | |
86 | #define MY_TLB_WORD2_I_ENABLE TLB_WORD2_I_ENABLE /* disable caching on SDRAM */ | |
87 | #endif | |
88 | ||
89 | /*-----------------------------------------------------------------------------+ | |
90 | * Prototypes | |
91 | *-----------------------------------------------------------------------------*/ | |
92 | extern int denali_wait_for_dlllock(void); | |
93 | extern void denali_core_search_data_eye(void); | |
94 | extern void dcbz_area(u32 start_address, u32 num_bytes); | |
95 | extern void dflush(void); | |
96 | ||
97 | /* | |
98 | * Board-specific Platform code can reimplement spd_ddr_init_hang () if needed | |
99 | */ | |
100 | void __spd_ddr_init_hang(void) | |
101 | { | |
102 | hang(); | |
103 | } | |
104 | void spd_ddr_init_hang(void) | |
105 | __attribute__ ((weak, alias("__spd_ddr_init_hang"))); | |
106 | ||
107 | #if defined(DEBUG) | |
108 | static void print_mcsr(void) | |
109 | { | |
110 | printf("MCSR = 0x%08X\n", mfspr(SPRN_MCSR)); | |
111 | } | |
112 | ||
113 | static void denali_sdram_register_dump(void) | |
114 | { | |
115 | unsigned int sdram_data; | |
116 | ||
117 | printf("\n Register Dump:\n"); | |
118 | mfsdram(DDR0_00, sdram_data); | |
119 | printf(" DDR0_00 = 0x%08X", sdram_data); | |
120 | mfsdram(DDR0_01, sdram_data); | |
121 | printf(" DDR0_01 = 0x%08X\n", sdram_data); | |
122 | mfsdram(DDR0_02, sdram_data); | |
123 | printf(" DDR0_02 = 0x%08X", sdram_data); | |
124 | mfsdram(DDR0_03, sdram_data); | |
125 | printf(" DDR0_03 = 0x%08X\n", sdram_data); | |
126 | mfsdram(DDR0_04, sdram_data); | |
127 | printf(" DDR0_04 = 0x%08X", sdram_data); | |
128 | mfsdram(DDR0_05, sdram_data); | |
129 | printf(" DDR0_05 = 0x%08X\n", sdram_data); | |
130 | mfsdram(DDR0_06, sdram_data); | |
131 | printf(" DDR0_06 = 0x%08X", sdram_data); | |
132 | mfsdram(DDR0_07, sdram_data); | |
133 | printf(" DDR0_07 = 0x%08X\n", sdram_data); | |
134 | mfsdram(DDR0_08, sdram_data); | |
135 | printf(" DDR0_08 = 0x%08X", sdram_data); | |
136 | mfsdram(DDR0_09, sdram_data); | |
137 | printf(" DDR0_09 = 0x%08X\n", sdram_data); | |
138 | mfsdram(DDR0_10, sdram_data); | |
139 | printf(" DDR0_10 = 0x%08X", sdram_data); | |
140 | mfsdram(DDR0_11, sdram_data); | |
141 | printf(" DDR0_11 = 0x%08X\n", sdram_data); | |
142 | mfsdram(DDR0_12, sdram_data); | |
143 | printf(" DDR0_12 = 0x%08X", sdram_data); | |
144 | mfsdram(DDR0_14, sdram_data); | |
145 | printf(" DDR0_14 = 0x%08X\n", sdram_data); | |
146 | mfsdram(DDR0_17, sdram_data); | |
147 | printf(" DDR0_17 = 0x%08X", sdram_data); | |
148 | mfsdram(DDR0_18, sdram_data); | |
149 | printf(" DDR0_18 = 0x%08X\n", sdram_data); | |
150 | mfsdram(DDR0_19, sdram_data); | |
151 | printf(" DDR0_19 = 0x%08X", sdram_data); | |
152 | mfsdram(DDR0_20, sdram_data); | |
153 | printf(" DDR0_20 = 0x%08X\n", sdram_data); | |
154 | mfsdram(DDR0_21, sdram_data); | |
155 | printf(" DDR0_21 = 0x%08X", sdram_data); | |
156 | mfsdram(DDR0_22, sdram_data); | |
157 | printf(" DDR0_22 = 0x%08X\n", sdram_data); | |
158 | mfsdram(DDR0_23, sdram_data); | |
159 | printf(" DDR0_23 = 0x%08X", sdram_data); | |
160 | mfsdram(DDR0_24, sdram_data); | |
161 | printf(" DDR0_24 = 0x%08X\n", sdram_data); | |
162 | mfsdram(DDR0_25, sdram_data); | |
163 | printf(" DDR0_25 = 0x%08X", sdram_data); | |
164 | mfsdram(DDR0_26, sdram_data); | |
165 | printf(" DDR0_26 = 0x%08X\n", sdram_data); | |
166 | mfsdram(DDR0_27, sdram_data); | |
167 | printf(" DDR0_27 = 0x%08X", sdram_data); | |
168 | mfsdram(DDR0_28, sdram_data); | |
169 | printf(" DDR0_28 = 0x%08X\n", sdram_data); | |
170 | mfsdram(DDR0_31, sdram_data); | |
171 | printf(" DDR0_31 = 0x%08X", sdram_data); | |
172 | mfsdram(DDR0_32, sdram_data); | |
173 | printf(" DDR0_32 = 0x%08X\n", sdram_data); | |
174 | mfsdram(DDR0_33, sdram_data); | |
175 | printf(" DDR0_33 = 0x%08X", sdram_data); | |
176 | mfsdram(DDR0_34, sdram_data); | |
177 | printf(" DDR0_34 = 0x%08X\n", sdram_data); | |
178 | mfsdram(DDR0_35, sdram_data); | |
179 | printf(" DDR0_35 = 0x%08X", sdram_data); | |
180 | mfsdram(DDR0_36, sdram_data); | |
181 | printf(" DDR0_36 = 0x%08X\n", sdram_data); | |
182 | mfsdram(DDR0_37, sdram_data); | |
183 | printf(" DDR0_37 = 0x%08X", sdram_data); | |
184 | mfsdram(DDR0_38, sdram_data); | |
185 | printf(" DDR0_38 = 0x%08X\n", sdram_data); | |
186 | mfsdram(DDR0_39, sdram_data); | |
187 | printf(" DDR0_39 = 0x%08X", sdram_data); | |
188 | mfsdram(DDR0_40, sdram_data); | |
189 | printf(" DDR0_40 = 0x%08X\n", sdram_data); | |
190 | mfsdram(DDR0_41, sdram_data); | |
191 | printf(" DDR0_41 = 0x%08X", sdram_data); | |
192 | mfsdram(DDR0_42, sdram_data); | |
193 | printf(" DDR0_42 = 0x%08X\n", sdram_data); | |
194 | mfsdram(DDR0_43, sdram_data); | |
195 | printf(" DDR0_43 = 0x%08X", sdram_data); | |
196 | mfsdram(DDR0_44, sdram_data); | |
197 | printf(" DDR0_44 = 0x%08X\n", sdram_data); | |
198 | } | |
199 | #else | |
200 | static inline void denali_sdram_register_dump(void) | |
201 | { | |
202 | } | |
203 | ||
204 | inline static void print_mcsr(void) | |
205 | { | |
206 | } | |
207 | #endif /* defined(DEBUG) */ | |
208 | ||
209 | static int is_ecc_enabled(void) | |
210 | { | |
211 | u32 val; | |
212 | ||
213 | mfsdram(DDR0_22, val); | |
214 | return 0x3 == DDR0_22_CTRL_RAW_DECODE(val); | |
215 | } | |
216 | ||
217 | static unsigned char spd_read(u8 chip, unsigned int addr) | |
218 | { | |
219 | u8 data[2]; | |
220 | ||
221 | if (0 != i2c_probe(chip) || 0 != i2c_read(chip, addr, 1, data, 1)) { | |
222 | debug("spd_read(0x%02X, 0x%02X) failed\n", chip, addr); | |
223 | return 0; | |
224 | } | |
225 | debug("spd_read(0x%02X, 0x%02X) returned 0x%02X\n", | |
226 | chip, addr, data[0]); | |
227 | return data[0]; | |
228 | } | |
229 | ||
230 | static unsigned long get_tcyc(unsigned char reg) | |
231 | { | |
232 | /* | |
233 | * Byte 9, et al: Cycle time for CAS Latency=X, is split into two | |
234 | * nibbles: the higher order nibble (bits 4-7) designates the cycle time | |
235 | * to a granularity of 1ns; the value presented by the lower order | |
236 | * nibble (bits 0-3) has a granularity of .1ns and is added to the value | |
237 | * designated by the higher nibble. In addition, four lines of the lower | |
238 | * order nibble are assigned to support +.25, +.33, +.66, and +.75. | |
239 | */ | |
240 | ||
241 | unsigned char subfield_b = reg & 0x0F; | |
242 | ||
243 | switch (subfield_b & 0x0F) { | |
244 | case 0x0: | |
245 | case 0x1: | |
246 | case 0x2: | |
247 | case 0x3: | |
248 | case 0x4: | |
249 | case 0x5: | |
250 | case 0x6: | |
251 | case 0x7: | |
252 | case 0x8: | |
253 | case 0x9: | |
254 | return 1000 * (reg >> 4) + 100 * subfield_b; | |
255 | case 0xA: | |
256 | return 1000 * (reg >> 4) + 250; | |
257 | case 0xB: | |
258 | return 1000 * (reg >> 4) + 333; | |
259 | case 0xC: | |
260 | return 1000 * (reg >> 4) + 667; | |
261 | case 0xD: | |
262 | return 1000 * (reg >> 4) + 750; | |
263 | } | |
264 | return 0; | |
265 | } | |
266 | ||
267 | /*------------------------------------------------------------------ | |
268 | * Find the installed DIMMs, make sure that the are DDR2, and fill | |
269 | * in the dimm_ranks array. Then dimm_ranks[dimm_num] > 0 iff the | |
270 | * DIMM and dimm_num is present. | |
271 | * Note: Because there are only two chip-select lines, it is assumed | |
272 | * that a board with a single socket can support two ranks on that | |
273 | * socket, while a board with two sockets can support only one rank | |
274 | * on each socket. | |
275 | *-----------------------------------------------------------------*/ | |
276 | static void get_spd_info(unsigned long dimm_ranks[], | |
277 | unsigned long *ranks, | |
278 | unsigned char const iic0_dimm_addr[], | |
279 | unsigned long num_dimm_banks) | |
280 | { | |
281 | unsigned long dimm_num; | |
282 | unsigned long dimm_found = FALSE; | |
283 | unsigned long const max_ranks_per_dimm = (1 == num_dimm_banks) ? 2 : 1; | |
284 | unsigned char num_of_bytes; | |
285 | unsigned char total_size; | |
286 | ||
287 | *ranks = 0; | |
288 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
289 | num_of_bytes = 0; | |
290 | total_size = 0; | |
291 | ||
292 | num_of_bytes = spd_read(iic0_dimm_addr[dimm_num], 0); | |
293 | total_size = spd_read(iic0_dimm_addr[dimm_num], 1); | |
294 | if ((num_of_bytes != 0) && (total_size != 0)) { | |
295 | unsigned char const dimm_type = | |
296 | spd_read(iic0_dimm_addr[dimm_num], 2); | |
297 | ||
298 | unsigned long ranks_on_dimm = | |
299 | (spd_read(iic0_dimm_addr[dimm_num], 5) & 0x07) + 1; | |
300 | ||
301 | if (8 != dimm_type) { | |
302 | switch (dimm_type) { | |
303 | case 1: | |
304 | printf("ERROR: Standard Fast Page Mode " | |
305 | "DRAM DIMM"); | |
306 | break; | |
307 | case 2: | |
308 | printf("ERROR: EDO DIMM"); | |
309 | break; | |
310 | case 3: | |
311 | printf("ERROR: Pipelined Nibble DIMM"); | |
312 | break; | |
313 | case 4: | |
314 | printf("ERROR: SDRAM DIMM"); | |
315 | break; | |
316 | case 5: | |
317 | printf("ERROR: Multiplexed ROM DIMM"); | |
318 | break; | |
319 | case 6: | |
320 | printf("ERROR: SGRAM DIMM"); | |
321 | break; | |
322 | case 7: | |
323 | printf("ERROR: DDR1 DIMM"); | |
324 | break; | |
325 | default: | |
326 | printf("ERROR: Unknown DIMM (type %d)", | |
327 | (unsigned int)dimm_type); | |
328 | break; | |
329 | } | |
330 | printf(" detected in slot %lu.\n", dimm_num); | |
331 | printf("Only DDR2 SDRAM DIMMs are supported." | |
332 | "\n"); | |
333 | printf("Replace the module with a DDR2 DIMM." | |
334 | "\n\n"); | |
335 | spd_ddr_init_hang(); | |
336 | } | |
337 | dimm_found = TRUE; | |
338 | debug("DIMM slot %lu: populated with %lu-rank DDR2 DIMM" | |
339 | "\n", dimm_num, ranks_on_dimm); | |
340 | if (ranks_on_dimm > max_ranks_per_dimm) { | |
341 | printf("WARNING: DRAM DIMM in slot %lu has %lu " | |
342 | "ranks.\n"); | |
343 | if (1 == max_ranks_per_dimm) { | |
344 | printf("Only one rank will be used.\n"); | |
345 | } else { | |
346 | printf | |
347 | ("Only two ranks will be used.\n"); | |
348 | } | |
349 | ranks_on_dimm = max_ranks_per_dimm; | |
350 | } | |
351 | dimm_ranks[dimm_num] = ranks_on_dimm; | |
352 | *ranks += ranks_on_dimm; | |
353 | } else { | |
354 | dimm_ranks[dimm_num] = 0; | |
355 | debug("DIMM slot %lu: Not populated\n", dimm_num); | |
356 | } | |
357 | } | |
358 | if (dimm_found == FALSE) { | |
359 | printf("ERROR: No memory installed.\n"); | |
360 | printf("Install at least one DDR2 DIMM.\n\n"); | |
361 | spd_ddr_init_hang(); | |
362 | } | |
363 | debug("Total number of ranks = %d\n", *ranks); | |
364 | } | |
365 | ||
366 | /*------------------------------------------------------------------ | |
367 | * For the memory DIMMs installed, this routine verifies that | |
368 | * frequency previously calculated is supported. | |
369 | *-----------------------------------------------------------------*/ | |
370 | static void check_frequency(unsigned long *dimm_ranks, | |
371 | unsigned char const iic0_dimm_addr[], | |
372 | unsigned long num_dimm_banks, | |
373 | unsigned long sdram_freq) | |
374 | { | |
375 | unsigned long dimm_num; | |
376 | unsigned long cycle_time; | |
377 | unsigned long calc_cycle_time; | |
378 | ||
379 | /* | |
380 | * calc_cycle_time is calculated from DDR frequency set by board/chip | |
381 | * and is expressed in picoseconds to match the way DIMM cycle time is | |
382 | * calculated below. | |
383 | */ | |
384 | calc_cycle_time = MULDIV64(ONE_BILLION, 1000, sdram_freq); | |
385 | ||
386 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
387 | if (dimm_ranks[dimm_num]) { | |
388 | cycle_time = | |
389 | get_tcyc(spd_read(iic0_dimm_addr[dimm_num], 9)); | |
390 | debug("cycle_time=%d ps\n", cycle_time); | |
391 | ||
392 | if (cycle_time > (calc_cycle_time + 10)) { | |
393 | /* | |
394 | * the provided sdram cycle_time is too small | |
395 | * for the available DIMM cycle_time. The | |
396 | * additionnal 10ps is here to accept a small | |
397 | * incertainty. | |
398 | */ | |
399 | printf | |
400 | ("ERROR: DRAM DIMM detected with cycle_time %d ps in " | |
401 | "slot %d \n while calculated cycle time is %d ps.\n", | |
402 | (unsigned int)cycle_time, | |
403 | (unsigned int)dimm_num, | |
404 | (unsigned int)calc_cycle_time); | |
405 | printf | |
406 | ("Replace the DIMM, or change DDR frequency via " | |
407 | "strapping bits.\n\n"); | |
408 | spd_ddr_init_hang(); | |
409 | } | |
410 | } | |
411 | } | |
412 | } | |
413 | ||
414 | /*------------------------------------------------------------------ | |
415 | * This routine gets size information for the installed memory | |
416 | * DIMMs. | |
417 | *-----------------------------------------------------------------*/ | |
418 | static void get_dimm_size(unsigned long dimm_ranks[], | |
419 | unsigned char const iic0_dimm_addr[], | |
420 | unsigned long num_dimm_banks, | |
421 | unsigned long *const rows, | |
422 | unsigned long *const banks, | |
423 | unsigned long *const cols, unsigned long *const width) | |
424 | { | |
425 | unsigned long dimm_num; | |
426 | ||
427 | *rows = 0; | |
428 | *banks = 0; | |
429 | *cols = 0; | |
430 | *width = 0; | |
431 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
432 | if (dimm_ranks[dimm_num]) { | |
433 | unsigned long t; | |
434 | ||
435 | /* Rows */ | |
436 | t = spd_read(iic0_dimm_addr[dimm_num], 3); | |
437 | if (0 == *rows) { | |
438 | *rows = t; | |
439 | } else if (t != *rows) { | |
440 | printf("ERROR: DRAM DIMM modules do not all " | |
441 | "have the same number of rows.\n\n"); | |
442 | spd_ddr_init_hang(); | |
443 | } | |
444 | /* Banks */ | |
445 | t = spd_read(iic0_dimm_addr[dimm_num], 17); | |
446 | if (0 == *banks) { | |
447 | *banks = t; | |
448 | } else if (t != *banks) { | |
449 | printf("ERROR: DRAM DIMM modules do not all " | |
450 | "have the same number of banks.\n\n"); | |
451 | spd_ddr_init_hang(); | |
452 | } | |
453 | /* Columns */ | |
454 | t = spd_read(iic0_dimm_addr[dimm_num], 4); | |
455 | if (0 == *cols) { | |
456 | *cols = t; | |
457 | } else if (t != *cols) { | |
458 | printf("ERROR: DRAM DIMM modules do not all " | |
459 | "have the same number of columns.\n\n"); | |
460 | spd_ddr_init_hang(); | |
461 | } | |
462 | /* Data width */ | |
463 | t = spd_read(iic0_dimm_addr[dimm_num], 6); | |
464 | if (0 == *width) { | |
465 | *width = t; | |
466 | } else if (t != *width) { | |
467 | printf("ERROR: DRAM DIMM modules do not all " | |
468 | "have the same data width.\n\n"); | |
469 | spd_ddr_init_hang(); | |
470 | } | |
471 | } | |
472 | } | |
473 | debug("Number of rows = %d\n", *rows); | |
474 | debug("Number of columns = %d\n", *cols); | |
475 | debug("Number of banks = %d\n", *banks); | |
476 | debug("Data width = %d\n", *width); | |
477 | if (*rows > 14) { | |
478 | printf("ERROR: DRAM DIMM modules have %lu address rows.\n", | |
479 | *rows); | |
480 | printf("Only modules with 14 or fewer rows are supported.\n\n"); | |
481 | spd_ddr_init_hang(); | |
482 | } | |
483 | if (4 != *banks && 8 != *banks) { | |
484 | printf("ERROR: DRAM DIMM modules have %lu banks.\n", *banks); | |
485 | printf("Only modules with 4 or 8 banks are supported.\n\n"); | |
486 | spd_ddr_init_hang(); | |
487 | } | |
488 | if (*cols > 12) { | |
489 | printf("ERROR: DRAM DIMM modules have %lu address columns.\n", | |
490 | *cols); | |
491 | printf("Only modules with 12 or fewer columns are " | |
492 | "supported.\n\n"); | |
493 | spd_ddr_init_hang(); | |
494 | } | |
495 | if (32 != *width && 40 != *width && 64 != *width && 72 != *width) { | |
496 | printf("ERROR: DRAM DIMM modules have a width of %lu bit.\n", | |
497 | *width); | |
498 | printf("Only modules with widths of 32, 40, 64, and 72 bits " | |
499 | "are supported.\n\n"); | |
500 | spd_ddr_init_hang(); | |
501 | } | |
502 | } | |
503 | ||
504 | /*------------------------------------------------------------------ | |
505 | * Only 1.8V modules are supported. This routine verifies this. | |
506 | *-----------------------------------------------------------------*/ | |
507 | static void check_voltage_type(unsigned long dimm_ranks[], | |
508 | unsigned char const iic0_dimm_addr[], | |
509 | unsigned long num_dimm_banks) | |
510 | { | |
511 | unsigned long dimm_num; | |
512 | unsigned long voltage_type; | |
513 | ||
514 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
515 | if (dimm_ranks[dimm_num]) { | |
516 | voltage_type = spd_read(iic0_dimm_addr[dimm_num], 8); | |
517 | if (0x05 != voltage_type) { /* 1.8V for DDR2 */ | |
518 | printf("ERROR: Slot %lu provides 1.8V for DDR2 " | |
519 | "DIMMs.\n", dimm_num); | |
520 | switch (voltage_type) { | |
521 | case 0x00: | |
522 | printf("This DIMM is 5.0 Volt/TTL.\n"); | |
523 | break; | |
524 | case 0x01: | |
525 | printf("This DIMM is LVTTL.\n"); | |
526 | break; | |
527 | case 0x02: | |
528 | printf("This DIMM is 1.5 Volt.\n"); | |
529 | break; | |
530 | case 0x03: | |
531 | printf("This DIMM is 3.3 Volt/TTL.\n"); | |
532 | break; | |
533 | case 0x04: | |
534 | printf("This DIMM is 2.5 Volt.\n"); | |
535 | break; | |
536 | default: | |
537 | printf("This DIMM is an unknown " | |
538 | "voltage.\n"); | |
539 | break; | |
540 | } | |
541 | printf("Replace it with a 1.8V DDR2 DIMM.\n\n"); | |
542 | spd_ddr_init_hang(); | |
543 | } | |
544 | } | |
545 | } | |
546 | } | |
547 | ||
548 | static void program_ddr0_03(unsigned long dimm_ranks[], | |
549 | unsigned char const iic0_dimm_addr[], | |
550 | unsigned long num_dimm_banks, | |
551 | unsigned long sdram_freq, | |
552 | unsigned long rows, unsigned long *cas_latency) | |
553 | { | |
554 | unsigned long dimm_num; | |
555 | unsigned long cas_index; | |
556 | unsigned long cycle_2_0_clk; | |
557 | unsigned long cycle_3_0_clk; | |
558 | unsigned long cycle_4_0_clk; | |
559 | unsigned long cycle_5_0_clk; | |
560 | unsigned long max_2_0_tcyc_ps = 100; | |
561 | unsigned long max_3_0_tcyc_ps = 100; | |
562 | unsigned long max_4_0_tcyc_ps = 100; | |
563 | unsigned long max_5_0_tcyc_ps = 100; | |
564 | unsigned char cas_available = 0x3C; /* value for DDR2 */ | |
565 | u32 ddr0_03 = DDR0_03_BSTLEN_ENCODE(0x2) | DDR0_03_INITAREF_ENCODE(0x2); | |
566 | unsigned int const tcyc_addr[3] = { 9, 23, 25 }; | |
567 | ||
568 | /*------------------------------------------------------------------ | |
569 | * Get the board configuration info. | |
570 | *-----------------------------------------------------------------*/ | |
571 | debug("sdram_freq = %d\n", sdram_freq); | |
572 | ||
573 | /*------------------------------------------------------------------ | |
574 | * Handle the timing. We need to find the worst case timing of all | |
575 | * the dimm modules installed. | |
576 | *-----------------------------------------------------------------*/ | |
577 | /* loop through all the DIMM slots on the board */ | |
578 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
579 | /* If a dimm is installed in a particular slot ... */ | |
580 | if (dimm_ranks[dimm_num]) { | |
581 | unsigned char const cas_bit = | |
582 | spd_read(iic0_dimm_addr[dimm_num], 18); | |
583 | unsigned char cas_mask; | |
584 | ||
585 | cas_available &= cas_bit; | |
586 | for (cas_mask = 0x80; cas_mask; cas_mask >>= 1) { | |
587 | if (cas_bit & cas_mask) | |
588 | break; | |
589 | } | |
590 | debug("cas_bit (SPD byte 18) = %02X, cas_mask = %02X\n", | |
591 | cas_bit, cas_mask); | |
592 | ||
593 | for (cas_index = 0; cas_index < 3; | |
594 | cas_mask >>= 1, cas_index++) { | |
595 | unsigned long cycle_time_ps; | |
596 | ||
597 | if (!(cas_available & cas_mask)) { | |
598 | continue; | |
599 | } | |
600 | cycle_time_ps = | |
601 | get_tcyc(spd_read(iic0_dimm_addr[dimm_num], | |
602 | tcyc_addr[cas_index])); | |
603 | ||
604 | debug("cas_index = %d: cycle_time_ps = %d\n", | |
605 | cas_index, cycle_time_ps); | |
606 | /* | |
607 | * DDR2 devices use the following bitmask for CAS latency: | |
608 | * Bit 7 6 5 4 3 2 1 0 | |
609 | * TBD 6.0 5.0 4.0 3.0 2.0 TBD TBD | |
610 | */ | |
611 | switch (cas_mask) { | |
612 | case 0x20: | |
613 | max_5_0_tcyc_ps = | |
614 | max(max_5_0_tcyc_ps, cycle_time_ps); | |
615 | break; | |
616 | case 0x10: | |
617 | max_4_0_tcyc_ps = | |
618 | max(max_4_0_tcyc_ps, cycle_time_ps); | |
619 | break; | |
620 | case 0x08: | |
621 | max_3_0_tcyc_ps = | |
622 | max(max_3_0_tcyc_ps, cycle_time_ps); | |
623 | break; | |
624 | case 0x04: | |
625 | max_2_0_tcyc_ps = | |
626 | max(max_2_0_tcyc_ps, cycle_time_ps); | |
627 | break; | |
628 | } | |
629 | } | |
630 | } | |
631 | } | |
632 | debug("cas_available (bit map) = 0x%02X\n", cas_available); | |
633 | ||
634 | /*------------------------------------------------------------------ | |
635 | * Set the SDRAM mode, SDRAM_MMODE | |
636 | *-----------------------------------------------------------------*/ | |
637 | ||
638 | /* add 10 here because of rounding problems */ | |
639 | cycle_2_0_clk = MULDIV64(ONE_BILLION, 1000, max_2_0_tcyc_ps) + 10; | |
640 | cycle_3_0_clk = MULDIV64(ONE_BILLION, 1000, max_3_0_tcyc_ps) + 10; | |
641 | cycle_4_0_clk = MULDIV64(ONE_BILLION, 1000, max_4_0_tcyc_ps) + 10; | |
642 | cycle_5_0_clk = MULDIV64(ONE_BILLION, 1000, max_5_0_tcyc_ps) + 10; | |
643 | debug("cycle_2_0_clk = %d\n", cycle_2_0_clk); | |
644 | debug("cycle_3_0_clk = %d\n", cycle_3_0_clk); | |
645 | debug("cycle_4_0_clk = %d\n", cycle_4_0_clk); | |
646 | debug("cycle_5_0_clk = %d\n", cycle_5_0_clk); | |
647 | ||
648 | if ((cas_available & 0x04) && (sdram_freq <= cycle_2_0_clk)) { | |
649 | *cas_latency = 2; | |
650 | ddr0_03 |= DDR0_03_CASLAT_ENCODE(0x2) | | |
651 | DDR0_03_CASLAT_LIN_ENCODE(0x4); | |
652 | } else if ((cas_available & 0x08) && (sdram_freq <= cycle_3_0_clk)) { | |
653 | *cas_latency = 3; | |
654 | ddr0_03 |= DDR0_03_CASLAT_ENCODE(0x3) | | |
655 | DDR0_03_CASLAT_LIN_ENCODE(0x6); | |
656 | } else if ((cas_available & 0x10) && (sdram_freq <= cycle_4_0_clk)) { | |
657 | *cas_latency = 4; | |
658 | ddr0_03 |= DDR0_03_CASLAT_ENCODE(0x4) | | |
659 | DDR0_03_CASLAT_LIN_ENCODE(0x8); | |
660 | } else if ((cas_available & 0x20) && (sdram_freq <= cycle_5_0_clk)) { | |
661 | *cas_latency = 5; | |
662 | ddr0_03 |= DDR0_03_CASLAT_ENCODE(0x5) | | |
663 | DDR0_03_CASLAT_LIN_ENCODE(0xA); | |
664 | } else { | |
665 | printf("ERROR: Cannot find a supported CAS latency with the " | |
666 | "installed DIMMs.\n"); | |
667 | printf("Only DDR2 DIMMs with CAS latencies of 2.0, 3.0, 4.0, " | |
668 | "and 5.0 are supported.\n"); | |
669 | printf("Make sure the PLB speed is within the supported range " | |
670 | "of the DIMMs.\n"); | |
671 | printf("sdram_freq=%d cycle2=%d cycle3=%d cycle4=%d " | |
672 | "cycle5=%d\n\n", sdram_freq, cycle_2_0_clk, | |
673 | cycle_3_0_clk, cycle_4_0_clk, cycle_5_0_clk); | |
674 | spd_ddr_init_hang(); | |
675 | } | |
676 | debug("CAS latency = %d\n", *cas_latency); | |
677 | mtsdram(DDR0_03, ddr0_03); | |
678 | } | |
679 | ||
680 | static void program_ddr0_04(unsigned long dimm_ranks[], | |
681 | unsigned char const iic0_dimm_addr[], | |
682 | unsigned long num_dimm_banks, | |
683 | unsigned long sdram_freq) | |
684 | { | |
685 | unsigned long dimm_num; | |
686 | unsigned long t_rc_ps = 0; | |
687 | unsigned long t_rrd_ps = 0; | |
688 | unsigned long t_rtp_ps = 0; | |
689 | unsigned long t_rc_clk; | |
690 | unsigned long t_rrd_clk; | |
691 | unsigned long t_rtp_clk; | |
692 | ||
693 | /*------------------------------------------------------------------ | |
694 | * Handle the timing. We need to find the worst case timing of all | |
695 | * the dimm modules installed. | |
696 | *-----------------------------------------------------------------*/ | |
697 | /* loop through all the DIMM slots on the board */ | |
698 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
699 | /* If a dimm is installed in a particular slot ... */ | |
700 | if (dimm_ranks[dimm_num]) { | |
701 | unsigned long ps; | |
702 | ||
703 | /* tRC */ | |
704 | ps = 1000 * spd_read(iic0_dimm_addr[dimm_num], 41); | |
705 | switch (spd_read(iic0_dimm_addr[dimm_num], 40) >> 4) { | |
706 | case 0x1: | |
707 | ps += 250; | |
708 | break; | |
709 | case 0x2: | |
710 | ps += 333; | |
711 | break; | |
712 | case 0x3: | |
713 | ps += 500; | |
714 | break; | |
715 | case 0x4: | |
716 | ps += 667; | |
717 | break; | |
718 | case 0x5: | |
719 | ps += 750; | |
720 | break; | |
721 | } | |
722 | t_rc_ps = max(t_rc_ps, ps); | |
723 | /* tRRD */ | |
724 | ps = 250 * spd_read(iic0_dimm_addr[dimm_num], 28); | |
725 | t_rrd_ps = max(t_rrd_ps, ps); | |
726 | /* tRTP */ | |
727 | ps = 250 * spd_read(iic0_dimm_addr[dimm_num], 38); | |
728 | t_rtp_ps = max(t_rtp_ps, ps); | |
729 | } | |
730 | } | |
731 | debug("t_rc_ps = %d\n", t_rc_ps); | |
732 | t_rc_clk = (MULDIV64(sdram_freq, t_rc_ps, ONE_BILLION) + 999) / 1000; | |
733 | debug("t_rrd_ps = %d\n", t_rrd_ps); | |
734 | t_rrd_clk = (MULDIV64(sdram_freq, t_rrd_ps, ONE_BILLION) + 999) / 1000; | |
735 | debug("t_rtp_ps = %d\n", t_rtp_ps); | |
736 | t_rtp_clk = (MULDIV64(sdram_freq, t_rtp_ps, ONE_BILLION) + 999) / 1000; | |
737 | mtsdram(DDR0_04, DDR0_04_TRC_ENCODE(t_rc_clk) | | |
738 | DDR0_04_TRRD_ENCODE(t_rrd_clk) | | |
739 | DDR0_04_TRTP_ENCODE(t_rtp_clk)); | |
740 | } | |
741 | ||
742 | static void program_ddr0_05(unsigned long dimm_ranks[], | |
743 | unsigned char const iic0_dimm_addr[], | |
744 | unsigned long num_dimm_banks, | |
745 | unsigned long sdram_freq) | |
746 | { | |
747 | unsigned long dimm_num; | |
748 | unsigned long t_rp_ps = 0; | |
749 | unsigned long t_ras_ps = 0; | |
750 | unsigned long t_rp_clk; | |
751 | unsigned long t_ras_clk; | |
752 | u32 ddr0_05 = DDR0_05_TMRD_ENCODE(0x2) | DDR0_05_TEMRS_ENCODE(0x2); | |
753 | ||
754 | /*------------------------------------------------------------------ | |
755 | * Handle the timing. We need to find the worst case timing of all | |
756 | * the dimm modules installed. | |
757 | *-----------------------------------------------------------------*/ | |
758 | /* loop through all the DIMM slots on the board */ | |
759 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
760 | /* If a dimm is installed in a particular slot ... */ | |
761 | if (dimm_ranks[dimm_num]) { | |
762 | unsigned long ps; | |
763 | ||
764 | /* tRP */ | |
765 | ps = 250 * spd_read(iic0_dimm_addr[dimm_num], 27); | |
766 | t_rp_ps = max(t_rp_ps, ps); | |
767 | /* tRAS */ | |
768 | ps = 1000 * spd_read(iic0_dimm_addr[dimm_num], 30); | |
769 | t_ras_ps = max(t_ras_ps, ps); | |
770 | } | |
771 | } | |
772 | debug("t_rp_ps = %d\n", t_rp_ps); | |
773 | t_rp_clk = (MULDIV64(sdram_freq, t_rp_ps, ONE_BILLION) + 999) / 1000; | |
774 | debug("t_ras_ps = %d\n", t_ras_ps); | |
775 | t_ras_clk = (MULDIV64(sdram_freq, t_ras_ps, ONE_BILLION) + 999) / 1000; | |
776 | mtsdram(DDR0_05, ddr0_05 | DDR0_05_TRP_ENCODE(t_rp_clk) | | |
777 | DDR0_05_TRAS_MIN_ENCODE(t_ras_clk)); | |
778 | } | |
779 | ||
780 | static void program_ddr0_06(unsigned long dimm_ranks[], | |
781 | unsigned char const iic0_dimm_addr[], | |
782 | unsigned long num_dimm_banks, | |
783 | unsigned long sdram_freq) | |
784 | { | |
785 | unsigned long dimm_num; | |
786 | unsigned char spd_40; | |
787 | unsigned long t_wtr_ps = 0; | |
788 | unsigned long t_rfc_ps = 0; | |
789 | unsigned long t_wtr_clk; | |
790 | unsigned long t_rfc_clk; | |
791 | u32 ddr0_06 = | |
792 | DDR0_06_WRITEINTERP_ENCODE(0x1) | DDR0_06_TDLL_ENCODE(200); | |
793 | ||
794 | /*------------------------------------------------------------------ | |
795 | * Handle the timing. We need to find the worst case timing of all | |
796 | * the dimm modules installed. | |
797 | *-----------------------------------------------------------------*/ | |
798 | /* loop through all the DIMM slots on the board */ | |
799 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
800 | /* If a dimm is installed in a particular slot ... */ | |
801 | if (dimm_ranks[dimm_num]) { | |
802 | unsigned long ps; | |
803 | ||
804 | /* tWTR */ | |
805 | ps = 250 * spd_read(iic0_dimm_addr[dimm_num], 37); | |
806 | t_wtr_ps = max(t_wtr_ps, ps); | |
807 | /* tRFC */ | |
808 | ps = 1000 * spd_read(iic0_dimm_addr[dimm_num], 42); | |
809 | spd_40 = spd_read(iic0_dimm_addr[dimm_num], 40); | |
810 | ps += 256000 * (spd_40 & 0x01); | |
811 | switch ((spd_40 & 0x0E) >> 1) { | |
812 | case 0x1: | |
813 | ps += 250; | |
814 | break; | |
815 | case 0x2: | |
816 | ps += 333; | |
817 | break; | |
818 | case 0x3: | |
819 | ps += 500; | |
820 | break; | |
821 | case 0x4: | |
822 | ps += 667; | |
823 | break; | |
824 | case 0x5: | |
825 | ps += 750; | |
826 | break; | |
827 | } | |
828 | t_rfc_ps = max(t_rfc_ps, ps); | |
829 | } | |
830 | } | |
831 | debug("t_wtr_ps = %d\n", t_wtr_ps); | |
832 | t_wtr_clk = (MULDIV64(sdram_freq, t_wtr_ps, ONE_BILLION) + 999) / 1000; | |
833 | debug("t_rfc_ps = %d\n", t_rfc_ps); | |
834 | t_rfc_clk = (MULDIV64(sdram_freq, t_rfc_ps, ONE_BILLION) + 999) / 1000; | |
835 | mtsdram(DDR0_06, ddr0_06 | DDR0_06_TWTR_ENCODE(t_wtr_clk) | | |
836 | DDR0_06_TRFC_ENCODE(t_rfc_clk)); | |
837 | } | |
838 | ||
839 | static void program_ddr0_10(unsigned long dimm_ranks[], unsigned long ranks) | |
840 | { | |
841 | unsigned long csmap; | |
842 | ||
843 | if (2 == ranks) { | |
844 | /* Both chip selects in use */ | |
845 | csmap = 0x03; | |
846 | } else { | |
847 | /* One chip select in use */ | |
848 | csmap = (1 == dimm_ranks[0]) ? 0x1 : 0x2; | |
849 | } | |
850 | mtsdram(DDR0_10, DDR0_10_WRITE_MODEREG_ENCODE(0x0) | | |
851 | DDR0_10_CS_MAP_ENCODE(csmap) | | |
852 | DDR0_10_OCD_ADJUST_PUP_CS_0_ENCODE(0)); | |
853 | } | |
854 | ||
855 | static void program_ddr0_11(unsigned long sdram_freq) | |
856 | { | |
857 | unsigned long const t_xsnr_ps = 200000; /* 200 ns */ | |
858 | unsigned long t_xsnr_clk; | |
859 | ||
860 | debug("t_xsnr_ps = %d\n", t_xsnr_ps); | |
861 | t_xsnr_clk = | |
862 | (MULDIV64(sdram_freq, t_xsnr_ps, ONE_BILLION) + 999) / 1000; | |
863 | mtsdram(DDR0_11, DDR0_11_SREFRESH_ENCODE(0) | | |
864 | DDR0_11_TXSNR_ENCODE(t_xsnr_clk) | DDR0_11_TXSR_ENCODE(200)); | |
865 | } | |
866 | ||
867 | static void program_ddr0_22(unsigned long dimm_ranks[], | |
868 | unsigned char const iic0_dimm_addr[], | |
869 | unsigned long num_dimm_banks, unsigned long width) | |
870 | { | |
871 | #if defined(CONFIG_DDR_ECC) | |
872 | unsigned long dimm_num; | |
873 | unsigned long ecc_available = width >= 64; | |
874 | u32 ddr0_22 = DDR0_22_DQS_OUT_SHIFT_BYPASS_ENCODE(0x26) | | |
875 | DDR0_22_DQS_OUT_SHIFT_ENCODE(DQS_OUT_SHIFT) | | |
876 | DDR0_22_DLL_DQS_BYPASS_8_ENCODE(DLL_DQS_BYPASS); | |
877 | ||
878 | /* loop through all the DIMM slots on the board */ | |
879 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
880 | /* If a dimm is installed in a particular slot ... */ | |
881 | if (dimm_ranks[dimm_num]) { | |
882 | /* Check for ECC */ | |
883 | if (0 == (spd_read(iic0_dimm_addr[dimm_num], 11) & | |
884 | 0x02)) { | |
885 | ecc_available = FALSE; | |
886 | } | |
887 | } | |
888 | } | |
889 | if (ecc_available) { | |
890 | debug("ECC found on all DIMMs present\n"); | |
891 | mtsdram(DDR0_22, ddr0_22 | DDR0_22_CTRL_RAW_ENCODE(0x3)); | |
892 | } else { | |
893 | debug("ECC not found on some or all DIMMs present\n"); | |
894 | mtsdram(DDR0_22, ddr0_22 | DDR0_22_CTRL_RAW_ENCODE(0x0)); | |
895 | } | |
896 | #else | |
897 | mtsdram(DDR0_22, DDR0_22_CTRL_RAW_ENCODE(0x0) | | |
898 | DDR0_22_DQS_OUT_SHIFT_BYPASS_ENCODE(0x26) | | |
899 | DDR0_22_DQS_OUT_SHIFT_ENCODE(DQS_OUT_SHIFT) | | |
900 | DDR0_22_DLL_DQS_BYPASS_8_ENCODE(DLL_DQS_BYPASS)); | |
901 | #endif /* defined(CONFIG_DDR_ECC) */ | |
902 | } | |
903 | ||
904 | static void program_ddr0_24(unsigned long ranks) | |
905 | { | |
906 | u32 ddr0_24 = DDR0_24_RTT_PAD_TERMINATION_ENCODE(0x1) | /* 75 ohm */ | |
907 | DDR0_24_ODT_RD_MAP_CS1_ENCODE(0x0); | |
908 | ||
909 | if (2 == ranks) { | |
910 | /* Both chip selects in use */ | |
911 | ddr0_24 |= DDR0_24_ODT_WR_MAP_CS1_ENCODE(0x1) | | |
912 | DDR0_24_ODT_WR_MAP_CS0_ENCODE(0x2); | |
913 | } else { | |
914 | /* One chip select in use */ | |
915 | /* One of the two fields added to ddr0_24 is a "don't care" */ | |
916 | ddr0_24 |= DDR0_24_ODT_WR_MAP_CS1_ENCODE(0x2) | | |
917 | DDR0_24_ODT_WR_MAP_CS0_ENCODE(0x1); | |
918 | } | |
919 | mtsdram(DDR0_24, ddr0_24); | |
920 | } | |
921 | ||
922 | static void program_ddr0_26(unsigned long sdram_freq) | |
923 | { | |
924 | unsigned long const t_ref_ps = 7800000; /* 7.8 us. refresh */ | |
925 | /* TODO: check definition of tRAS_MAX */ | |
926 | unsigned long const t_ras_max_ps = 9 * t_ref_ps; | |
927 | unsigned long t_ras_max_clk; | |
928 | unsigned long t_ref_clk; | |
929 | ||
930 | /* Round down t_ras_max_clk and t_ref_clk */ | |
931 | debug("t_ras_max_ps = %d\n", t_ras_max_ps); | |
932 | t_ras_max_clk = MULDIV64(sdram_freq, t_ras_max_ps, ONE_BILLION) / 1000; | |
933 | debug("t_ref_ps = %d\n", t_ref_ps); | |
934 | t_ref_clk = MULDIV64(sdram_freq, t_ref_ps, ONE_BILLION) / 1000; | |
935 | mtsdram(DDR0_26, DDR0_26_TRAS_MAX_ENCODE(t_ras_max_clk) | | |
936 | DDR0_26_TREF_ENCODE(t_ref_clk)); | |
937 | } | |
938 | ||
939 | static void program_ddr0_27(unsigned long sdram_freq) | |
940 | { | |
941 | unsigned long const t_init_ps = 200000000; /* 200 us. init */ | |
942 | unsigned long t_init_clk; | |
943 | ||
944 | debug("t_init_ps = %d\n", t_init_ps); | |
945 | t_init_clk = | |
946 | (MULDIV64(sdram_freq, t_init_ps, ONE_BILLION) + 999) / 1000; | |
947 | mtsdram(DDR0_27, DDR0_27_EMRS_DATA_ENCODE(0x0000) | | |
948 | DDR0_27_TINIT_ENCODE(t_init_clk)); | |
949 | } | |
950 | ||
951 | static void program_ddr0_43(unsigned long dimm_ranks[], | |
952 | unsigned char const iic0_dimm_addr[], | |
953 | unsigned long num_dimm_banks, | |
954 | unsigned long sdram_freq, | |
955 | unsigned long cols, unsigned long banks) | |
956 | { | |
957 | unsigned long dimm_num; | |
958 | unsigned long t_wr_ps = 0; | |
959 | unsigned long t_wr_clk; | |
960 | u32 ddr0_43 = DDR0_43_APREBIT_ENCODE(10) | | |
961 | DDR0_43_COLUMN_SIZE_ENCODE(12 - cols) | | |
962 | DDR0_43_EIGHT_BANK_MODE_ENCODE(8 == banks ? 1 : 0); | |
963 | ||
964 | /*------------------------------------------------------------------ | |
965 | * Handle the timing. We need to find the worst case timing of all | |
966 | * the dimm modules installed. | |
967 | *-----------------------------------------------------------------*/ | |
968 | /* loop through all the DIMM slots on the board */ | |
969 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
970 | /* If a dimm is installed in a particular slot ... */ | |
971 | if (dimm_ranks[dimm_num]) { | |
972 | unsigned long ps; | |
973 | ||
974 | ps = 250 * spd_read(iic0_dimm_addr[dimm_num], 36); | |
975 | t_wr_ps = max(t_wr_ps, ps); | |
976 | } | |
977 | } | |
978 | debug("t_wr_ps = %d\n", t_wr_ps); | |
979 | t_wr_clk = (MULDIV64(sdram_freq, t_wr_ps, ONE_BILLION) + 999) / 1000; | |
980 | mtsdram(DDR0_43, ddr0_43 | DDR0_43_TWR_ENCODE(t_wr_clk)); | |
981 | } | |
982 | ||
983 | static void program_ddr0_44(unsigned long dimm_ranks[], | |
984 | unsigned char const iic0_dimm_addr[], | |
985 | unsigned long num_dimm_banks, | |
986 | unsigned long sdram_freq) | |
987 | { | |
988 | unsigned long dimm_num; | |
989 | unsigned long t_rcd_ps = 0; | |
990 | unsigned long t_rcd_clk; | |
991 | ||
992 | /*------------------------------------------------------------------ | |
993 | * Handle the timing. We need to find the worst case timing of all | |
994 | * the dimm modules installed. | |
995 | *-----------------------------------------------------------------*/ | |
996 | /* loop through all the DIMM slots on the board */ | |
997 | for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) { | |
998 | /* If a dimm is installed in a particular slot ... */ | |
999 | if (dimm_ranks[dimm_num]) { | |
1000 | unsigned long ps; | |
1001 | ||
1002 | ps = 250 * spd_read(iic0_dimm_addr[dimm_num], 29); | |
1003 | t_rcd_ps = max(t_rcd_ps, ps); | |
1004 | } | |
1005 | } | |
1006 | debug("t_rcd_ps = %d\n", t_rcd_ps); | |
1007 | t_rcd_clk = (MULDIV64(sdram_freq, t_rcd_ps, ONE_BILLION) + 999) / 1000; | |
1008 | mtsdram(DDR0_44, DDR0_44_TRCD_ENCODE(t_rcd_clk)); | |
1009 | } | |
1010 | ||
1011 | /*-----------------------------------------------------------------------------+ | |
1012 | * initdram. Initializes the 440EPx/GPx DDR SDRAM controller. | |
1013 | * Note: This routine runs from flash with a stack set up in the chip's | |
1014 | * sram space. It is important that the routine does not require .sbss, .bss or | |
1015 | * .data sections. It also cannot call routines that require these sections. | |
1016 | *-----------------------------------------------------------------------------*/ | |
1017 | /*----------------------------------------------------------------------------- | |
1018 | * Function: initdram | |
1019 | * Description: Configures SDRAM memory banks for DDR operation. | |
1020 | * Auto Memory Configuration option reads the DDR SDRAM EEPROMs | |
1021 | * via the IIC bus and then configures the DDR SDRAM memory | |
1022 | * banks appropriately. If Auto Memory Configuration is | |
1023 | * not used, it is assumed that no DIMM is plugged | |
1024 | *-----------------------------------------------------------------------------*/ | |
1025 | long int initdram(int board_type) | |
1026 | { | |
1027 | unsigned char const iic0_dimm_addr[] = SPD_EEPROM_ADDRESS; | |
1028 | unsigned long dimm_ranks[MAXDIMMS]; | |
1029 | unsigned long ranks; | |
1030 | unsigned long rows; | |
1031 | unsigned long banks; | |
1032 | unsigned long cols; | |
1033 | unsigned long width; | |
1034 | unsigned long const sdram_freq = get_bus_freq(0); | |
1035 | unsigned long const num_dimm_banks = sizeof(iic0_dimm_addr); /* on board dimm banks */ | |
1036 | unsigned long cas_latency = 0; /* to quiet initialization warning */ | |
1037 | unsigned long dram_size; | |
1038 | ||
1039 | debug("\nEntering initdram()\n"); | |
1040 | ||
1041 | /*------------------------------------------------------------------ | |
1042 | * Stop the DDR-SDRAM controller. | |
1043 | *-----------------------------------------------------------------*/ | |
1044 | mtsdram(DDR0_02, DDR0_02_START_ENCODE(0)); | |
1045 | ||
1046 | /* | |
1047 | * Make sure I2C controller is initialized | |
1048 | * before continuing. | |
1049 | */ | |
1050 | /* switch to correct I2C bus */ | |
1051 | I2C_SET_BUS(CFG_SPD_BUS_NUM); | |
1052 | i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE); | |
1053 | ||
1054 | /*------------------------------------------------------------------ | |
1055 | * Clear out the serial presence detect buffers. | |
1056 | * Perform IIC reads from the dimm. Fill in the spds. | |
1057 | * Check to see if the dimm slots are populated | |
1058 | *-----------------------------------------------------------------*/ | |
1059 | get_spd_info(dimm_ranks, &ranks, iic0_dimm_addr, num_dimm_banks); | |
1060 | ||
1061 | /*------------------------------------------------------------------ | |
1062 | * Check the frequency supported for the dimms plugged. | |
1063 | *-----------------------------------------------------------------*/ | |
1064 | check_frequency(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq); | |
1065 | ||
1066 | /*------------------------------------------------------------------ | |
1067 | * Check and get size information. | |
1068 | *-----------------------------------------------------------------*/ | |
1069 | get_dimm_size(dimm_ranks, iic0_dimm_addr, num_dimm_banks, &rows, &banks, | |
1070 | &cols, &width); | |
1071 | ||
1072 | /*------------------------------------------------------------------ | |
1073 | * Check the voltage type for the dimms plugged. | |
1074 | *-----------------------------------------------------------------*/ | |
1075 | check_voltage_type(dimm_ranks, iic0_dimm_addr, num_dimm_banks); | |
1076 | ||
1077 | /*------------------------------------------------------------------ | |
1078 | * Program registers for SDRAM controller. | |
1079 | *-----------------------------------------------------------------*/ | |
1080 | mtsdram(DDR0_00, DDR0_00_DLL_INCREMENT_ENCODE(0x19) | | |
1081 | DDR0_00_DLL_START_POINT_DECODE(0x0A)); | |
1082 | ||
1083 | mtsdram(DDR0_01, DDR0_01_PLB0_DB_CS_LOWER_ENCODE(0x01) | | |
1084 | DDR0_01_PLB0_DB_CS_UPPER_ENCODE(0x00) | | |
1085 | DDR0_01_INT_MASK_ENCODE(0xFF)); | |
1086 | ||
1087 | program_ddr0_03(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq, | |
1088 | rows, &cas_latency); | |
1089 | ||
1090 | program_ddr0_04(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq); | |
1091 | ||
1092 | program_ddr0_05(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq); | |
1093 | ||
1094 | program_ddr0_06(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq); | |
1095 | ||
1096 | /*------------------------------------------------------------------ | |
1097 | * TODO: tFAW not found in SPD. Value of 13 taken from Sequoia | |
1098 | * board SDRAM, but may be overly concervate. | |
1099 | *-----------------------------------------------------------------*/ | |
1100 | mtsdram(DDR0_07, DDR0_07_NO_CMD_INIT_ENCODE(0) | | |
1101 | DDR0_07_TFAW_ENCODE(13) | | |
1102 | DDR0_07_AUTO_REFRESH_MODE_ENCODE(1) | | |
1103 | DDR0_07_AREFRESH_ENCODE(0)); | |
1104 | ||
1105 | mtsdram(DDR0_08, DDR0_08_WRLAT_ENCODE(cas_latency - 1) | | |
1106 | DDR0_08_TCPD_ENCODE(200) | DDR0_08_DQS_N_EN_ENCODE(0) | | |
1107 | DDR0_08_DDRII_ENCODE(1)); | |
1108 | ||
1109 | mtsdram(DDR0_09, DDR0_09_OCD_ADJUST_PDN_CS_0_ENCODE(0x00) | | |
1110 | DDR0_09_RTT_0_ENCODE(0x1) | | |
1111 | DDR0_09_WR_DQS_SHIFT_BYPASS_ENCODE(0x1D) | | |
1112 | DDR0_09_WR_DQS_SHIFT_ENCODE(DQS_OUT_SHIFT - 0x20)); | |
1113 | ||
1114 | program_ddr0_10(dimm_ranks, ranks); | |
1115 | ||
1116 | program_ddr0_11(sdram_freq); | |
1117 | ||
1118 | mtsdram(DDR0_12, DDR0_12_TCKE_ENCODE(3)); | |
1119 | ||
1120 | mtsdram(DDR0_14, DDR0_14_DLL_BYPASS_MODE_ENCODE(0) | | |
1121 | DDR0_14_REDUC_ENCODE(width <= 40 ? 1 : 0) | | |
1122 | DDR0_14_REG_DIMM_ENABLE_ENCODE(0)); | |
1123 | ||
1124 | mtsdram(DDR0_17, DDR0_17_DLL_DQS_DELAY_0_ENCODE(DLL_DQS_DELAY)); | |
1125 | ||
1126 | mtsdram(DDR0_18, DDR0_18_DLL_DQS_DELAY_4_ENCODE(DLL_DQS_DELAY) | | |
1127 | DDR0_18_DLL_DQS_DELAY_3_ENCODE(DLL_DQS_DELAY) | | |
1128 | DDR0_18_DLL_DQS_DELAY_2_ENCODE(DLL_DQS_DELAY) | | |
1129 | DDR0_18_DLL_DQS_DELAY_1_ENCODE(DLL_DQS_DELAY)); | |
1130 | ||
1131 | mtsdram(DDR0_19, DDR0_19_DLL_DQS_DELAY_8_ENCODE(DLL_DQS_DELAY) | | |
1132 | DDR0_19_DLL_DQS_DELAY_7_ENCODE(DLL_DQS_DELAY) | | |
1133 | DDR0_19_DLL_DQS_DELAY_6_ENCODE(DLL_DQS_DELAY) | | |
1134 | DDR0_19_DLL_DQS_DELAY_5_ENCODE(DLL_DQS_DELAY)); | |
1135 | ||
1136 | mtsdram(DDR0_20, DDR0_20_DLL_DQS_BYPASS_3_ENCODE(DLL_DQS_BYPASS) | | |
1137 | DDR0_20_DLL_DQS_BYPASS_2_ENCODE(DLL_DQS_BYPASS) | | |
1138 | DDR0_20_DLL_DQS_BYPASS_1_ENCODE(DLL_DQS_BYPASS) | | |
1139 | DDR0_20_DLL_DQS_BYPASS_0_ENCODE(DLL_DQS_BYPASS)); | |
1140 | ||
1141 | mtsdram(DDR0_21, DDR0_21_DLL_DQS_BYPASS_7_ENCODE(DLL_DQS_BYPASS) | | |
1142 | DDR0_21_DLL_DQS_BYPASS_6_ENCODE(DLL_DQS_BYPASS) | | |
1143 | DDR0_21_DLL_DQS_BYPASS_5_ENCODE(DLL_DQS_BYPASS) | | |
1144 | DDR0_21_DLL_DQS_BYPASS_4_ENCODE(DLL_DQS_BYPASS)); | |
1145 | ||
1146 | program_ddr0_22(dimm_ranks, iic0_dimm_addr, num_dimm_banks, width); | |
1147 | ||
1148 | mtsdram(DDR0_23, DDR0_23_ODT_RD_MAP_CS0_ENCODE(0x0) | | |
1149 | DDR0_23_FWC_ENCODE(0)); | |
1150 | ||
1151 | program_ddr0_24(ranks); | |
1152 | ||
1153 | program_ddr0_26(sdram_freq); | |
1154 | ||
1155 | program_ddr0_27(sdram_freq); | |
1156 | ||
1157 | mtsdram(DDR0_28, DDR0_28_EMRS3_DATA_ENCODE(0x0000) | | |
1158 | DDR0_28_EMRS2_DATA_ENCODE(0x0000)); | |
1159 | ||
1160 | mtsdram(DDR0_31, DDR0_31_XOR_CHECK_BITS_ENCODE(0x0000)); | |
1161 | ||
1162 | mtsdram(DDR0_42, DDR0_42_ADDR_PINS_DECODE(14 - rows) | | |
1163 | DDR0_42_CASLAT_LIN_GATE_ENCODE(2 * cas_latency)); | |
1164 | ||
1165 | program_ddr0_43(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq, | |
1166 | cols, banks); | |
1167 | ||
1168 | program_ddr0_44(dimm_ranks, iic0_dimm_addr, num_dimm_banks, sdram_freq); | |
1169 | ||
1170 | denali_sdram_register_dump(); | |
1171 | ||
1172 | dram_size = (width >= 64) ? 8 : 4; | |
1173 | dram_size *= 1 << cols; | |
1174 | dram_size *= banks; | |
1175 | dram_size *= 1 << rows; | |
1176 | dram_size *= ranks; | |
1177 | debug("dram_size = %lu\n", dram_size); | |
1178 | ||
1179 | /* Start the SDRAM controler */ | |
1180 | mtsdram(DDR0_02, DDR0_02_START_ENCODE(1)); | |
1181 | denali_wait_for_dlllock(); | |
1182 | ||
1183 | #if defined(CONFIG_DDR_DATA_EYE) | |
1184 | /* -----------------------------------------------------------+ | |
1185 | * Perform data eye search if requested. | |
1186 | * ----------------------------------------------------------*/ | |
1187 | program_tlb(0, CFG_SDRAM_BASE, dram_size, TLB_WORD2_I_ENABLE); | |
1188 | denali_core_search_data_eye(); | |
1189 | denali_sdram_register_dump(); | |
1190 | remove_tlb(CFG_SDRAM_BASE, dram_size); | |
1191 | #endif | |
1192 | ||
1193 | #if defined(CONFIG_ZERO_SDRAM) || defined(CONFIG_DDR_ECC) | |
1194 | program_tlb(0, CFG_SDRAM_BASE, dram_size, 0); | |
1195 | sync(); | |
1196 | eieio(); | |
1197 | /* Zero the memory */ | |
1198 | debug("Zeroing SDRAM..."); | |
1199 | dcbz_area(CFG_SDRAM_BASE, dram_size); | |
1200 | dflush(); | |
1201 | debug("Completed\n"); | |
1202 | sync(); | |
1203 | eieio(); | |
1204 | remove_tlb(CFG_SDRAM_BASE, dram_size); | |
1205 | ||
1206 | #if defined(CONFIG_DDR_ECC) | |
1207 | /* | |
1208 | * If ECC is enabled, clear and enable interrupts | |
1209 | */ | |
1210 | if (is_ecc_enabled()) { | |
1211 | u32 val; | |
1212 | ||
1213 | sync(); | |
1214 | eieio(); | |
1215 | /* Clear error status */ | |
1216 | mfsdram(DDR0_00, val); | |
1217 | mtsdram(DDR0_00, val | DDR0_00_INT_ACK_ALL); | |
1218 | /* Set 'int_mask' parameter to functionnal value */ | |
1219 | mfsdram(DDR0_01, val); | |
1220 | mtsdram(DDR0_01, (val & ~DDR0_01_INT_MASK_MASK) | | |
1221 | DDR0_01_INT_MASK_ALL_OFF); | |
1222 | #if defined(CONFIG_DDR_DATA_EYE) | |
1223 | /* | |
1224 | * Running denali_core_search_data_eye() when ECC is enabled | |
1225 | * causes non-ECC machine checks. This clears them. | |
1226 | */ | |
1227 | print_mcsr(); | |
1228 | mtspr(SPRN_MCSR, mfspr(SPRN_MCSR)); | |
1229 | print_mcsr(); | |
1230 | #endif | |
1231 | sync(); | |
1232 | eieio(); | |
1233 | } | |
1234 | #endif /* defined(CONFIG_DDR_ECC) */ | |
1235 | #endif /* defined(CONFIG_ZERO_SDRAM) || defined(CONFIG_DDR_ECC) */ | |
1236 | ||
1237 | program_tlb(0, CFG_SDRAM_BASE, dram_size, MY_TLB_WORD2_I_ENABLE); | |
1238 | return dram_size; | |
1239 | } | |
1240 | ||
1241 | void board_add_ram_info(int use_default) | |
1242 | { | |
1243 | u32 val; | |
1244 | ||
1245 | printf(" (ECC"); | |
1246 | if (!is_ecc_enabled()) { | |
1247 | printf(" not"); | |
1248 | } | |
1249 | printf(" enabled, %d MHz", (2 * get_bus_freq(0)) / 1000000); | |
1250 | ||
1251 | mfsdram(DDR0_03, val); | |
1252 | printf(", CL%d)", DDR0_03_CASLAT_LIN_DECODE(val) >> 1); | |
1253 | } | |
1254 | #endif /* CONFIG_SPD_EEPROM */ |