1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <common.h>
25#include <ioports.h>
26#include <mpc8260.h>
27
28#include <command.h>
29#include <netdev.h>
30#ifdef CONFIG_PCI
31#include <pci.h>
32#include <asm/m8260_pci.h>
33#endif
34#include "tqm8272.h"
35
36#if 0
37#define deb_printf(fmt,arg...) \
38 printf ("TQM8272 %s %s: " fmt,__FILE__, __FUNCTION__, ##arg)
39#else
40#define deb_printf(fmt,arg...) \
41 do { } while (0)
42#endif
43
44#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
45unsigned long board_get_cpu_clk_f (void);
46#endif
47
48
49
50
51
52
53
54
55const iop_conf_t iop_conf_tab[4][32] = {
56
57
58 {
59 { 0, 0, 0, 1, 0, 0 },
60 { 0, 0, 0, 1, 0, 0 },
61 { 0, 0, 0, 1, 0, 0 },
62 { 0, 0, 0, 1, 0, 0 },
63 { 0, 0, 0, 1, 0, 0 },
64 { 0, 0, 0, 1, 0, 0 },
65 { 0, 0, 0, 1, 0, 0 },
66 { 0, 0, 0, 1, 0, 0 },
67 { 0, 0, 0, 1, 0, 0 },
68 { 0, 0, 0, 1, 0, 0 },
69 { 0, 0, 0, 1, 0, 0 },
70 { 0, 0, 0, 1, 0, 0 },
71 { 0, 0, 0, 1, 0, 0 },
72 { 0, 0, 0, 1, 0, 0 },
73 { 0, 0, 0, 1, 0, 0 },
74 { 0, 0, 0, 1, 0, 0 },
75 { 0, 0, 0, 1, 0, 0 },
76 { 0, 0, 0, 1, 0, 0 },
77 { 0, 0, 0, 1, 0, 0 },
78 { 0, 0, 0, 1, 0, 0 },
79 { 0, 0, 0, 1, 0, 0 },
80 { 0, 0, 0, 1, 0, 0 },
81 { 1, 1, 0, 1, 0, 0 },
82 { 1, 1, 0, 0, 0, 0 },
83 { 0, 0, 0, 1, 0, 0 },
84 { 0, 0, 0, 1, 0, 0 },
85 { 0, 0, 0, 1, 0, 0 },
86 { 0, 0, 0, 1, 0, 0 },
87 { 0, 0, 0, 1, 0, 0 },
88 { 0, 0, 0, 1, 0, 0 },
89 { 0, 0, 0, 1, 0, 0 },
90 { 0, 0, 0, 1, 0, 0 }
91 },
92
93
94 {
95 { 1, 1, 0, 1, 0, 0 },
96 { 1, 1, 0, 0, 0, 0 },
97 { 1, 1, 1, 1, 0, 0 },
98 { 1, 1, 0, 0, 0, 0 },
99 { 1, 1, 0, 0, 0, 0 },
100 { 1, 1, 0, 0, 0, 0 },
101 { 1, 1, 0, 1, 0, 0 },
102 { 1, 1, 0, 1, 0, 0 },
103 { 1, 1, 0, 1, 0, 0 },
104 { 1, 1, 0, 1, 0, 0 },
105 { 1, 1, 0, 0, 0, 0 },
106 { 1, 1, 0, 0, 0, 0 },
107 { 1, 1, 0, 0, 0, 0 },
108 { 1, 1, 0, 0, 0, 0 },
109 { 0, 0, 0, 0, 0, 0 },
110 { 0, 0, 0, 0, 0, 0 },
111 { 0, 0, 0, 0, 0, 0 },
112 { 0, 0, 0, 0, 0, 0 },
113 { 0, 0, 0, 0, 0, 0 },
114 { 0, 0, 0, 0, 0, 0 },
115 { 0, 0, 0, 0, 0, 0 },
116 { 0, 0, 0, 0, 0, 0 },
117 { 0, 0, 0, 0, 0, 0 },
118 { 0, 0, 0, 0, 0, 0 },
119 { 0, 0, 0, 0, 0, 0 },
120 { 0, 0, 0, 0, 0, 0 },
121 { 0, 0, 0, 0, 0, 0 },
122 { 0, 0, 0, 0, 0, 0 },
123 { 0, 0, 0, 0, 0, 0 },
124 { 0, 0, 0, 0, 0, 0 },
125 { 0, 0, 0, 0, 0, 0 },
126 { 0, 0, 0, 0, 0, 0 }
127 },
128
129
130 {
131 { 0, 0, 0, 1, 0, 0 },
132 { 0, 0, 0, 0, 0, 0 },
133 { 1, 1, 1, 0, 0, 0 },
134 { 0, 0, 0, 1, 0, 0 },
135 { 0, 0, 0, 1, 0, 0 },
136 { 0, 0, 0, 1, 0, 0 },
137 { 0, 0, 0, 1, 0, 0 },
138 { 0, 0, 0, 1, 0, 0 },
139 { 0, 1, 0, 1, 0, 0 },
140 { 0, 1, 0, 0, 0, 0 },
141 { 1, 1, 0, 0, 0, 0 },
142 { 1, 1, 0, 0, 0, 0 },
143 { 1, 1, 0, 0, 0, 0 },
144 { 1, 1, 0, 0, 0, 0 },
145 { 1, 0, 0, 1, 0, 0 },
146 { 1, 0, 0, 0, 0, 0 },
147 { 0, 0, 0, 1, 0, 0 },
148 { 1, 1, 0, 0, 0, 0 },
149 { 0, 0, 0, 1, 0, 0 },
150 { 0, 0, 0, 1, 0, 0 },
151 { 0, 0, 0, 1, 0, 0 },
152 { 0, 0, 0, 1, 0, 0 },
153 { 0, 0, 0, 1, 0, 0 },
154 { 0, 0, 0, 1, 0, 0 },
155 { 0, 0, 0, 1, 0, 0 },
156 { 0, 0, 0, 1, 0, 0 },
157 { 1, 1, 0, 1, 0, 0 },
158 { 1, 1, 0, 0, 0, 0 },
159 { 0, 0, 0, 1, 0, 0 },
160 { 0, 0, 0, 1, 0, 1 },
161 { 0, 0, 0, 1, 0, 0 },
162 { 0, 0, 0, 1, 0, 0 },
163 },
164
165
166 {
167 { 1, 1, 0, 0, 0, 0 },
168 { 1, 1, 1, 1, 0, 0 },
169 { 1, 1, 0, 1, 0, 0 },
170 { 0, 0, 0, 1, 0, 0 },
171 { 0, 0, 0, 1, 0, 0 },
172 { 0, 0, 0, 1, 0, 0 },
173 { 0, 0, 0, 1, 0, 0 },
174 { 0, 0, 0, 1, 0, 0 },
175 { 0, 0, 0, 1, 0, 0 },
176 { 0, 0, 0, 1, 0, 0 },
177 { 0, 0, 0, 1, 0, 0 },
178 { 0, 0, 0, 1, 0, 0 },
179 { 0, 0, 0, 1, 0, 0 },
180 { 0, 0, 0, 1, 0, 0 },
181 { 0, 1, 0, 0, 0, 0 },
182 { 0, 1, 0, 1, 0, 0 },
183#if defined(CONFIG_SOFT_I2C)
184 { 1, 0, 0, 1, 1, 1 },
185 { 1, 0, 0, 1, 1, 1 },
186#else
187#if defined(CONFIG_HARD_I2C)
188 { 1, 1, 1, 0, 1, 0 },
189 { 1, 1, 1, 0, 1, 0 },
190#else
191 { 0, 1, 1, 0, 1, 0 },
192 { 0, 1, 1, 0, 1, 0 },
193#endif
194#endif
195 { 0, 0, 0, 0, 0, 0 },
196 { 0, 0, 0, 0, 0, 0 },
197 { 0, 0, 0, 0, 0, 0 },
198 { 0, 0, 0, 0, 0, 0 },
199 { 1, 1, 0, 1, 0, 0 },
200 { 1, 1, 0, 0, 0, 0 },
201 { 0, 0, 0, 1, 0, 1 },
202 { 0, 0, 0, 1, 0, 1 },
203 { 0, 0, 0, 1, 0, 0 },
204 { 0, 0, 0, 1, 0, 1 },
205 { 0, 0, 0, 0, 0, 0 },
206 { 0, 0, 0, 0, 0, 0 },
207 { 0, 0, 0, 0, 0, 0 },
208 { 0, 0, 0, 0, 0, 0 }
209 }
210};
211
212
213static const uint upmTableSlow[] =
214{
215
216 0xffffee00, 0x00ffcc80, 0x00ffcf00, 0x00ffdc00,
217 0x00ffce80, 0x00ffcc00, 0x00ffee00, 0x3fffcc07,
218
219
220 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
221 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
222
223
224 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
225 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
226
227
228 0xffffee00, 0x00ffec80, 0x00ffef00, 0x00fffc80,
229 0x00fffe00, 0x00ffec00, 0x0fffef00, 0x3fffec05,
230
231
232 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
233 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
234 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
235 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
236
237
238 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
239 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
240 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
241
242
243 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
244};
245
246
247static const uint upmTableFast[] =
248{
249
250 0xffffee00, 0x00ffcc80, 0x00ffcd80, 0x00ffdc00,
251 0x00ffdc00, 0x00ffcf00, 0x00ffec00, 0x3fffcc07,
252
253
254 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
255 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
256
257
258 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
259 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
260
261
262 0xffffee00, 0x00ffec80, 0x00ffee80, 0x00fffc00,
263 0x00fffc00, 0x00ffec00, 0x0fffef00, 0x3fffec05,
264
265
266 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
267 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
268 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
269 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
270
271
272 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
273 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00,
274 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
275
276
277 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01,
278};
279
280
281
282
283
284
285int checkboard (void)
286{
287 char *p = (char *) HWIB_INFO_START_ADDR;
288
289 puts ("Board: ");
290 if (*((unsigned long *)p) == (unsigned long)CONFIG_SYS_HWINFO_MAGIC) {
291 puts (p);
292 } else {
293 puts ("No HWIB assuming TQM8272");
294 }
295 putc ('\n');
296
297 return 0;
298}
299
300
301#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
302static int get_cas_latency (void)
303{
304
305
306 int ret = 3;
307 int pos = 0;
308 char *p = (char *) CIB_INFO_START_ADDR;
309
310 while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
311 if (*p < ' ' || *p > '~') {
312 return ret;
313 }
314 if (*p == '-') {
315 if ((p[1] == 't') && (p[2] == 's')) {
316 return (p[4] - '0');
317 }
318 }
319 p++;
320 pos++;
321 }
322 return ret;
323}
324#endif
325
326static ulong set_sdram_timing (volatile uint *sdmr_ptr, ulong sdmr, int col)
327{
328#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
329 int clk = board_get_cpu_clk_f ();
330 volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
331 int busmode = (immr->im_siu_conf.sc_bcr & BCR_EBM ? 1 : 0);
332 int cas;
333
334 sdmr = sdmr & ~(PSDMR_RFRC_MSK | PSDMR_PRETOACT_MSK | PSDMR_WRC_MSK | \
335 PSDMR_BUFCMD);
336 if (busmode) {
337 switch (clk) {
338 case 66666666:
339 sdmr |= (PSDMR_RFRC_66MHZ_60X | \
340 PSDMR_PRETOACT_66MHZ_60X | \
341 PSDMR_WRC_66MHZ_60X | \
342 PSDMR_BUFCMD_66MHZ_60X);
343 break;
344 case 100000000:
345 sdmr |= (PSDMR_RFRC_100MHZ_60X | \
346 PSDMR_PRETOACT_100MHZ_60X | \
347 PSDMR_WRC_100MHZ_60X | \
348 PSDMR_BUFCMD_100MHZ_60X);
349 break;
350
351 }
352 } else {
353 switch (clk) {
354 case 66666666:
355 sdmr |= (PSDMR_RFRC_66MHZ_SINGLE | \
356 PSDMR_PRETOACT_66MHZ_SINGLE | \
357 PSDMR_WRC_66MHZ_SINGLE | \
358 PSDMR_BUFCMD_66MHZ_SINGLE);
359 break;
360 case 100000000:
361 sdmr |= (PSDMR_RFRC_100MHZ_SINGLE | \
362 PSDMR_PRETOACT_100MHZ_SINGLE | \
363 PSDMR_WRC_100MHZ_SINGLE | \
364 PSDMR_BUFCMD_100MHZ_SINGLE);
365 break;
366 case 133333333:
367 sdmr |= (PSDMR_RFRC_133MHZ_SINGLE | \
368 PSDMR_PRETOACT_133MHZ_SINGLE | \
369 PSDMR_WRC_133MHZ_SINGLE | \
370 PSDMR_BUFCMD_133MHZ_SINGLE);
371 break;
372 }
373 }
374 cas = get_cas_latency();
375 sdmr &=~ (PSDMR_CL_MSK | PSDMR_LDOTOPRE_MSK);
376 sdmr |= cas;
377 sdmr |= ((cas - 1) << 6);
378 return sdmr;
379#else
380 return sdmr;
381#endif
382}
383
384
385
386
387
388
389
390
391static long int try_init (volatile memctl8260_t * memctl, ulong sdmr,
392 ulong orx, volatile uchar * base, int col)
393{
394 volatile uchar c = 0xff;
395 volatile uint *sdmr_ptr;
396 volatile uint *orx_ptr;
397 ulong maxsize, size;
398 int i;
399
400
401
402
403
404
405 maxsize = (1 + (~orx | 0x7fff)) / 2;
406
407
408
409
410 sdmr_ptr = base ? &memctl->memc_lsdmr : &memctl->memc_psdmr;
411 orx_ptr = base ? &memctl->memc_or2 : &memctl->memc_or1;
412
413 *orx_ptr = orx;
414 sdmr = set_sdram_timing (sdmr_ptr, sdmr, col);
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435 *sdmr_ptr = sdmr | PSDMR_OP_PREA;
436 *base = c;
437
438 *sdmr_ptr = sdmr | PSDMR_OP_CBRR;
439 for (i = 0; i < 8; i++)
440 *base = c;
441
442 *sdmr_ptr = sdmr | PSDMR_OP_MRW;
443 *(base + CONFIG_SYS_MRS_OFFS) = c;
444
445 *sdmr_ptr = sdmr | PSDMR_OP_NORM | PSDMR_RFEN;
446 *base = c;
447
448 size = get_ram_size((long *)base, maxsize);
449 *orx_ptr = orx | ~(size - 1);
450
451 return (size);
452}
453
454phys_size_t initdram (int board_type)
455{
456 volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
457 volatile memctl8260_t *memctl = &immap->im_memctl;
458
459#ifndef CONFIG_SYS_RAMBOOT
460 long size8, size9;
461#endif
462 long psize, lsize;
463
464 psize = 16 * 1024 * 1024;
465 lsize = 0;
466
467 memctl->memc_psrt = CONFIG_SYS_PSRT;
468 memctl->memc_mptpr = CONFIG_SYS_MPTPR;
469
470#ifndef CONFIG_SYS_RAMBOOT
471
472
473 size8 = try_init (memctl, CONFIG_SYS_PSDMR_8COL, CONFIG_SYS_OR1_8COL,
474 (uchar *) CONFIG_SYS_SDRAM_BASE, 8);
475 size9 = try_init (memctl, CONFIG_SYS_PSDMR_9COL, CONFIG_SYS_OR1_9COL,
476 (uchar *) CONFIG_SYS_SDRAM_BASE, 9);
477
478 if (size8 < size9) {
479 psize = size9;
480 printf ("(60x:9COL - %ld MB, ", psize >> 20);
481 } else {
482 psize = try_init (memctl, CONFIG_SYS_PSDMR_8COL, CONFIG_SYS_OR1_8COL,
483 (uchar *) CONFIG_SYS_SDRAM_BASE, 8);
484 printf ("(60x:8COL - %ld MB, ", psize >> 20);
485 }
486
487#endif
488
489 icache_enable ();
490
491 return (psize);
492}
493
494
495static inline int scanChar (char *p, int len, unsigned long *number)
496{
497 int akt = 0;
498
499 *number = 0;
500 while (akt < len) {
501 if ((*p >= '0') && (*p <= '9')) {
502 *number *= 10;
503 *number += *p - '0';
504 p += 1;
505 } else {
506 if (*p == '-') return akt;
507 return -1;
508 }
509 akt ++;
510 }
511 return akt;
512}
513
514static int dump_hwib(void)
515{
516 HWIB_INFO *hw = &hwinf;
517 volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
518 char *s = getenv("serial#");
519
520 if (hw->OK) {
521 printf ("HWIB on %x\n", HWIB_INFO_START_ADDR);
522 printf ("serial : %s\n", s);
523 printf ("ethaddr: %s\n", hw->ethaddr);
524 printf ("FLASH : %x nr:%d\n", hw->flash, hw->flash_nr);
525 printf ("RAM : %x cs:%d\n", hw->ram, hw->ram_cs);
526 printf ("CPU : %lu\n", hw->cpunr);
527 printf ("CAN : %d\n", hw->can);
528 if (hw->eeprom) printf ("EEprom : %x\n", hw->eeprom);
529 else printf ("No EEprom\n");
530 if (hw->nand) {
531 printf ("NAND : %x\n", hw->nand);
532 printf ("NAND CS: %d\n", hw->nand_cs);
533 } else { printf ("No NAND\n");}
534 printf ("Bus %s mode.\n", (hw->Bus ? "60x" : "Single PQII"));
535 printf (" real : %s\n", (immr->im_siu_conf.sc_bcr & BCR_EBM ? \
536 "60x" : "Single PQII"));
537 printf ("Option : %lx\n", hw->option);
538 printf ("%s Security Engine\n", (hw->SecEng ? "with" : "no"));
539 printf ("CPM Clk: %d\n", hw->cpmcl);
540 printf ("CPU Clk: %d\n", hw->cpucl);
541 printf ("Bus Clk: %d\n", hw->buscl);
542 if (hw->busclk_real_ok) {
543 printf (" real Clk: %d\n", hw->busclk_real);
544 }
545 printf ("CAS : %d\n", get_cas_latency());
546 } else {
547 printf("HWIB @%x not OK\n", HWIB_INFO_START_ADDR);
548 }
549 return 0;
550}
551
552static inline int search_real_busclk (int *clk)
553{
554 int part = 0, pos = 0;
555 char *p = (char *) CIB_INFO_START_ADDR;
556 int ok = 0;
557
558 while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
559 if (*p < ' ' || *p > '~') {
560 return 0;
561 }
562 switch (part) {
563 default:
564 if (*p == '-') {
565 ++part;
566 }
567 break;
568 case 3:
569 if (*p == '-') {
570 ++part;
571 break;
572 }
573 if (*p == 'b') {
574 ok = 1;
575 p++;
576 break;
577 }
578 if (ok) {
579 switch (*p) {
580 case '6':
581 *clk = 66666666;
582 return 1;
583 break;
584 case '1':
585 if (p[1] == '3') {
586 *clk = 133333333;
587 } else {
588 *clk = 100000000;
589 }
590 return 1;
591 break;
592 }
593 }
594 break;
595 }
596 p++;
597 }
598 return 0;
599}
600
601int analyse_hwib (void)
602{
603 char *p = (char *) HWIB_INFO_START_ADDR;
604 int anz;
605 int part = 1, i = 0, pos = 0;
606 HWIB_INFO *hw = &hwinf;
607
608 deb_printf(" %s pointer: %p\n", __FUNCTION__, p);
609
610 if (*((unsigned long *)p) != (unsigned long)CONFIG_SYS_HWINFO_MAGIC) {
611 deb_printf("No HWIB\n");
612 return -1;
613 }
614 p += 3;
615 if (scanChar (p, 4, &hw->cpunr) < 0) {
616 deb_printf("No CPU\n");
617 return -2;
618 }
619 p +=4;
620
621 hw->flash = 0x200000 << (*p - 'A');
622 p++;
623 hw->flash_nr = *p - '0';
624 p++;
625
626 hw->ram = 0x2000000 << (*p - 'A');
627 p++;
628 if (*p == '2') {
629 hw->ram_cs = 2;
630 p++;
631 }
632
633 if (*p == 'A') hw->can = 1;
634 if (*p == 'B') hw->can = 2;
635 p +=1;
636 p +=1;
637 if (*p != '0') {
638 hw->eeprom = 0x1000 << (*p - 'A');
639 }
640 p++;
641
642 if ((*p < '0') || (*p > '9')) {
643
644 hw->nand = 0x8000000 << (*p - 'A');
645 p++;
646 hw->nand_cs = *p - '0';
647 p += 2;
648 }
649
650 anz = scanChar (p, 4, &hw->option);
651 if (anz < 0) {
652 deb_printf("No option\n");
653 return -3;
654 }
655 if (hw->option & 0x8) hw->Bus = 1;
656 p += anz;
657 if (*p != '-') {
658 deb_printf("No -\n");
659 return -4;
660 }
661 p++;
662
663 if (*p == 'E') {
664 hw->SecEng = 1;
665 p++;
666 }
667 switch (*p) {
668 case 'M': hw->cpucl = 266666666;
669 break;
670 case 'P': hw->cpucl = 300000000;
671 break;
672 case 'T': hw->cpucl = 400000000;
673 break;
674 default:
675 deb_printf("No CPU Clk: %c\n", *p);
676 return -5;
677 break;
678 }
679 p++;
680 switch (*p) {
681 case 'I': hw->cpmcl = 200000000;
682 break;
683 case 'M': hw->cpmcl = 300000000;
684 break;
685 default:
686 deb_printf("No CPM Clk\n");
687 return -6;
688 break;
689 }
690 p++;
691 switch (*p) {
692 case 'B': hw->buscl = 66666666;
693 break;
694 case 'E': hw->buscl = 100000000;
695 break;
696 case 'F': hw->buscl = 133333333;
697 break;
698 default:
699 deb_printf("No BUS Clk\n");
700 return -7;
701 break;
702 }
703 p++;
704
705 hw->OK = 1;
706
707 while ((*p != '\0') && (pos < CONFIG_SYS_HWINFO_SIZE)) {
708 if (*p < ' ' || *p > '~') {
709 return 0;
710 }
711 switch (part) {
712 default:
713 if (*p == ' ') {
714 ++part;
715 i = 0;
716 }
717 break;
718 case 3:
719 if (*p == ' ') {
720 ++part;
721 i = 0;
722 break;
723 }
724 hw->ethaddr[i++] = *p;
725 if ((i % 3) == 2)
726 hw->ethaddr[i++] = ':';
727 break;
728
729 }
730 p++;
731 }
732
733 hw->busclk_real_ok = search_real_busclk (&hw->busclk_real);
734 return 0;
735}
736
737#if defined(CONFIG_GET_CPU_STR_F)
738
739char get_cpu_str_f (char *buf)
740{
741 char *p = (char *) HWIB_INFO_START_ADDR;
742 int i = 0;
743
744 buf[i++] = 'M';
745 buf[i++] = 'P';
746 buf[i++] = 'C';
747 if (*((unsigned long *)p) == (unsigned long)CONFIG_SYS_HWINFO_MAGIC) {
748 buf[i++] = *&p[3];
749 buf[i++] = *&p[4];
750 buf[i++] = *&p[5];
751 buf[i++] = *&p[6];
752 } else {
753 buf[i++] = '8';
754 buf[i++] = '2';
755 buf[i++] = '7';
756 buf[i++] = 'x';
757 }
758 buf[i++] = 0;
759 return 0;
760}
761#endif
762
763#if defined(CONFIG_BOARD_GET_CPU_CLK_F)
764
765unsigned long board_get_cpu_clk_f (void)
766{
767 char *p = (char *) HWIB_INFO_START_ADDR;
768 int i = 0;
769
770 if (*((unsigned long *)p) == (unsigned long)CONFIG_SYS_HWINFO_MAGIC) {
771 if (search_real_busclk (&i))
772 return i;
773 }
774 return CONFIG_8260_CLKIN;
775}
776#endif
777
778#if CONFIG_BOARD_EARLY_INIT_R
779
780static int can_test (unsigned long off)
781{
782 volatile unsigned char *base = (unsigned char *) (CONFIG_SYS_CAN_BASE + off);
783
784 *(base + 0x17) = 'T';
785 *(base + 0x18) = 'Q';
786 *(base + 0x19) = 'M';
787 if ((*(base + 0x17) != 'T') ||
788 (*(base + 0x18) != 'Q') ||
789 (*(base + 0x19) != 'M')) {
790 return 0;
791 }
792 return 1;
793}
794
795static int can_config_one (unsigned long off)
796{
797 volatile unsigned char *ctrl = (unsigned char *) (CONFIG_SYS_CAN_BASE + off);
798 volatile unsigned char *cpu_if = (unsigned char *) (CONFIG_SYS_CAN_BASE + off + 0x02);
799 volatile unsigned char *clkout = (unsigned char *) (CONFIG_SYS_CAN_BASE + off + 0x1f);
800 unsigned char temp;
801
802 *cpu_if = 0x45;
803 temp = *ctrl;
804 temp |= 0x40;
805 *ctrl = temp;
806 *clkout = 0x20;
807 temp = *ctrl;
808 temp &= ~0x40;
809 *ctrl = temp;
810 return 0;
811}
812
813static int can_config (void)
814{
815 int ret = 0;
816 can_config_one (0);
817 if (hwinf.can == 2) {
818 can_config_one (0x100);
819 }
820
821 ret += can_test (0);
822 ret += can_test (0x100);
823 return ret;
824}
825
826static int init_can (void)
827{
828 volatile immap_t * immr = (immap_t *)CONFIG_SYS_IMMR;
829 volatile memctl8260_t *memctl = &immr->im_memctl;
830 int count = 0;
831
832 if ((hwinf.OK) && (hwinf.can)) {
833 memctl->memc_or4 = CONFIG_SYS_CAN_OR;
834 memctl->memc_br4 = CONFIG_SYS_CAN_BR;
835
836 upmconfig (UPMC, (uint *) upmTableFast,
837 sizeof (upmTableFast) / sizeof (uint));
838 memctl->memc_mcmr = (MxMR_DSx_3_CYCL |
839 MxMR_GPL_x4DIS |
840 MxMR_RLFx_2X |
841 MxMR_WLFx_2X |
842 MxMR_OP_NORM);
843
844 count = can_config ();
845 printf ("CAN: %d @ %x\n", count, CONFIG_SYS_CAN_BASE);
846 if (hwinf.can != count) printf("!!! difference to HWIB\n");
847 } else {
848 printf ("CAN: No\n");
849 }
850 return 0;
851}
852
853int board_early_init_r(void)
854{
855 analyse_hwib ();
856 init_can ();
857 return 0;
858}
859#endif
860
861int do_hwib_dump (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
862{
863 dump_hwib ();
864 return 0;
865}
866
867U_BOOT_CMD(
868 hwib, 1, 1, do_hwib_dump,
869 "dump HWIB'",
870 ""
871);
872
873#ifdef CONFIG_SYS_UPDATE_FLASH_SIZE
874static int get_flash_timing (void)
875{
876
877
878 int ret = 0x00000c84;
879 int pos = 0;
880 int nr = 0;
881 char *p = (char *) CIB_INFO_START_ADDR;
882
883 while ((*p != '\0') && (pos < CIB_INFO_LEN)) {
884 if (*p < ' ' || *p > '~') {
885 return ret;
886 }
887 if (*p == '-') {
888 if ((p[1] == 't') && (p[2] == 'f')) {
889 p += 6;
890 ret = 0;
891 while (nr < 8) {
892 if ((*p >= '0') && (*p <= '9')) {
893 ret *= 0x10;
894 ret += *p - '0';
895 p += 1;
896 nr ++;
897 } else if ((*p >= 'A') && (*p <= 'F')) {
898 ret *= 10;
899 ret += *p - '7';
900 p += 1;
901 nr ++;
902 } else {
903 if (nr < 8) return 0x00000c84;
904 return ret;
905 }
906 }
907 }
908 }
909 p++;
910 pos++;
911 }
912 return ret;
913}
914
915
916int update_flash_size (int flash_size)
917{
918 volatile immap_t * immr = (immap_t *)CONFIG_SYS_IMMR;
919 volatile memctl8260_t *memctl = &immr->im_memctl;
920 unsigned long reg;
921 unsigned long tim;
922
923
924 reg = memctl->memc_or0;
925 reg &= ~ORxU_AM_MSK;
926 reg |= MEG_TO_AM(flash_size >> 20);
927 tim = get_flash_timing ();
928 reg &= ~0xfff;
929 reg |= (tim & 0xfff);
930 memctl->memc_or0 = reg;
931 return 0;
932}
933#endif
934
935#ifdef CONFIG_PCI
936struct pci_controller hose;
937
938int board_early_init_f (void)
939{
940 volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
941
942 immap->im_clkrst.car_sccr |= M826X_SCCR_PCI_MODE_EN;
943 return 0;
944}
945
946extern void pci_mpc8250_init(struct pci_controller *);
947
948void pci_init_board(void)
949{
950 pci_mpc8250_init(&hose);
951}
952#endif
953
954int board_eth_init(bd_t *bis)
955{
956 return pci_eth_init(bis);
957}
958