1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <common.h>
28#include <watchdog.h>
29#include <command.h>
30#include <malloc.h>
31#include <stdio_dev.h>
32
33#include <asm/immap.h>
34
35#if defined(CONFIG_CMD_IDE)
36#include <ide.h>
37#endif
38#if defined(CONFIG_CMD_SCSI)
39#include <scsi.h>
40#endif
41#if defined(CONFIG_CMD_KGDB)
42#include <kgdb.h>
43#endif
44#ifdef CONFIG_STATUS_LED
45#include <status_led.h>
46#endif
47#include <net.h>
48#include <serial.h>
49#if defined(CONFIG_CMD_BEDBUG)
50#include <cmd_bedbug.h>
51#endif
52#ifdef CONFIG_SYS_ALLOC_DPRAM
53#include <commproc.h>
54#endif
55#include <version.h>
56
57#if defined(CONFIG_HARD_I2C) || \
58 defined(CONFIG_SOFT_I2C)
59#include <i2c.h>
60#endif
61
62#ifdef CONFIG_CMD_SPI
63#include <spi.h>
64#endif
65
66#ifdef CONFIG_BITBANGMII
67#include <miiphy.h>
68#endif
69
70#include <nand.h>
71
72DECLARE_GLOBAL_DATA_PTR;
73
74static char *failed = "*** failed ***\n";
75
76#ifdef CONFIG_PCU_E
77extern flash_info_t flash_info[];
78#endif
79
80#include <environment.h>
81
82#if ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
83 (CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \
84 defined(CONFIG_ENV_IS_IN_NVRAM)
85#define TOTAL_MALLOC_LEN (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
86#else
87#define TOTAL_MALLOC_LEN CONFIG_SYS_MALLOC_LEN
88#endif
89
90extern ulong __init_end;
91extern ulong _end;
92
93extern void timer_init(void);
94
95#if defined(CONFIG_WATCHDOG)
96# define INIT_FUNC_WATCHDOG_INIT watchdog_init,
97# define WATCHDOG_DISABLE watchdog_disable
98
99extern int watchdog_init(void);
100extern int watchdog_disable(void);
101#else
102# define INIT_FUNC_WATCHDOG_INIT
103# define WATCHDOG_DISABLE
104#endif
105
106ulong monitor_flash_len;
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125typedef int (init_fnc_t) (void);
126
127
128
129
130
131
132
133
134static int init_baudrate (void)
135{
136 char tmp[64];
137 int i = getenv_f("baudrate", tmp, sizeof (tmp));
138
139 gd->baudrate = (i > 0)
140 ? (int) simple_strtoul (tmp, NULL, 10)
141 : CONFIG_BAUDRATE;
142 return (0);
143}
144
145
146
147static int init_func_ram (void)
148{
149 int board_type = 0;
150 puts ("DRAM: ");
151
152 if ((gd->ram_size = initdram (board_type)) > 0) {
153 print_size (gd->ram_size, "\n");
154 return (0);
155 }
156 puts (failed);
157 return (1);
158}
159
160
161
162#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
163static int init_func_i2c (void)
164{
165 puts ("I2C: ");
166 i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
167 puts ("ready\n");
168 return (0);
169}
170#endif
171
172#if defined(CONFIG_HARD_SPI)
173static int init_func_spi (void)
174{
175 puts ("SPI: ");
176 spi_init ();
177 puts ("ready\n");
178 return (0);
179}
180#endif
181
182
183
184
185
186
187
188
189init_fnc_t *init_sequence[] = {
190 get_clocks,
191 env_init,
192 init_baudrate,
193 serial_init,
194 console_init_f,
195 display_options,
196 checkcpu,
197 checkboard,
198#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
199 init_func_i2c,
200#endif
201#if defined(CONFIG_HARD_SPI)
202 init_func_spi,
203#endif
204 init_func_ram,
205#if defined(CONFIG_SYS_DRAM_TEST)
206 testdram,
207#endif
208 INIT_FUNC_WATCHDOG_INIT
209 NULL,
210};
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229void
230board_init_f (ulong bootflag)
231{
232 bd_t *bd;
233 ulong len, addr, addr_sp;
234 ulong *paddr;
235 gd_t *id;
236 init_fnc_t **init_fnc_ptr;
237#ifdef CONFIG_PRAM
238 int i;
239 ulong reg;
240 char tmp[64];
241#endif
242
243
244 gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
245
246 __asm__ __volatile__("": : :"memory");
247
248
249 memset ((void *) gd, 0, sizeof (gd_t));
250
251 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
252 if ((*init_fnc_ptr)() != 0) {
253 hang ();
254 }
255 }
256
257
258
259
260
261
262
263
264
265
266
267 len = (ulong)&_end - CONFIG_SYS_MONITOR_BASE;
268
269 addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size;
270
271#ifdef CONFIG_LOGBUFFER
272
273 addr -= (LOGBUFF_RESERVE);
274 debug ("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
275#endif
276
277#ifdef CONFIG_PRAM
278
279
280
281 i = getenv_f("pram", tmp, sizeof (tmp));
282 reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
283 addr -= (reg << 10);
284 debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
285#endif
286
287
288 addr &= ~(4096 - 1);
289 debug ("Top of RAM usable for U-Boot at: %08lx\n", addr);
290
291#ifdef CONFIG_LCD
292
293 addr = lcd_setmem (addr);
294 gd->fb_base = addr;
295#endif
296
297
298
299
300
301 addr -= len;
302 addr &= ~(4096 - 1);
303
304 debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
305
306
307
308
309 addr_sp = addr - TOTAL_MALLOC_LEN;
310 debug ("Reserving %dk for malloc() at: %08lx\n",
311 TOTAL_MALLOC_LEN >> 10, addr_sp);
312
313
314
315
316
317 addr_sp -= sizeof (bd_t);
318 bd = (bd_t *) addr_sp;
319 gd->bd = bd;
320 debug ("Reserving %zu Bytes for Board Info at: %08lx\n",
321 sizeof (bd_t), addr_sp);
322 addr_sp -= sizeof (gd_t);
323 id = (gd_t *) addr_sp;
324 debug ("Reserving %zu Bytes for Global Data at: %08lx\n",
325 sizeof (gd_t), addr_sp);
326
327
328 addr_sp -= CONFIG_SYS_BOOTPARAMS_LEN;
329 bd->bi_boot_params = addr_sp;
330 debug ("Reserving %dk for boot parameters at: %08lx\n",
331 CONFIG_SYS_BOOTPARAMS_LEN >> 10, addr_sp);
332
333
334
335
336
337
338
339 addr_sp -= 16;
340 addr_sp &= ~0xF;
341
342 paddr = (ulong *)addr_sp;
343 *paddr-- = 0;
344 *paddr-- = 0;
345 addr_sp = (ulong)paddr;
346
347 debug ("Stack Pointer at: %08lx\n", addr_sp);
348
349
350
351
352 bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
353 bd->bi_memsize = gd->ram_size;
354#ifdef CONFIG_SYS_INIT_RAM_ADDR
355 bd->bi_sramstart = CONFIG_SYS_INIT_RAM_ADDR;
356 bd->bi_sramsize = CONFIG_SYS_INIT_RAM_END;
357#endif
358 bd->bi_mbar_base = CONFIG_SYS_MBAR;
359
360 bd->bi_bootflags = bootflag;
361
362 WATCHDOG_RESET ();
363 bd->bi_intfreq = gd->cpu_clk;
364 bd->bi_busfreq = gd->bus_clk;
365#ifdef CONFIG_PCI
366 bd->bi_pcifreq = gd->pci_clk;
367#endif
368#ifdef CONFIG_EXTRA_CLOCK
369 bd->bi_inpfreq = gd->inp_clk;
370 bd->bi_vcofreq = gd->vco_clk;
371 bd->bi_flbfreq = gd->flb_clk;
372#endif
373 bd->bi_baudrate = gd->baudrate;
374
375#ifdef CONFIG_SYS_EXTBDINFO
376 strncpy (bd->bi_s_version, "1.2", sizeof (bd->bi_s_version));
377 strncpy (bd->bi_r_version, U_BOOT_VERSION, sizeof (bd->bi_r_version));
378#endif
379
380 WATCHDOG_RESET ();
381
382#ifdef CONFIG_POST
383 post_bootmode_init();
384 post_run (NULL, POST_ROM | post_bootmode_get(0));
385#endif
386
387 WATCHDOG_RESET();
388
389 memcpy (id, (void *)gd, sizeof (gd_t));
390
391 debug ("Start relocate of code from %08x to %08lx\n", CONFIG_SYS_MONITOR_BASE, addr);
392 relocate_code (addr_sp, id, addr);
393
394
395}
396
397
398
399
400
401
402
403
404
405
406void board_init_r (gd_t *id, ulong dest_addr)
407{
408 cmd_tbl_t *cmdtp;
409 char *s;
410 bd_t *bd;
411 extern void malloc_bin_reloc (void);
412
413#ifndef CONFIG_ENV_IS_NOWHERE
414 extern char * env_name_spec;
415#endif
416#ifndef CONFIG_SYS_NO_FLASH
417 ulong flash_size;
418#endif
419 gd = id;
420 bd = gd->bd;
421
422 gd->flags |= GD_FLG_RELOC;
423
424#ifdef CONFIG_SERIAL_MULTI
425 serial_initialize();
426#endif
427
428 debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
429
430 WATCHDOG_RESET ();
431
432 gd->reloc_off = dest_addr - CONFIG_SYS_MONITOR_BASE;
433
434 monitor_flash_len = (ulong)&__init_end - dest_addr;
435
436
437
438
439 for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
440 ulong addr;
441 addr = (ulong) (cmdtp->cmd) + gd->reloc_off;
442#if 0
443 printf ("Command \"%s\": 0x%08lx => 0x%08lx\n",
444 cmdtp->name, (ulong) (cmdtp->cmd), addr);
445#endif
446 cmdtp->cmd =
447 (int (*)(struct cmd_tbl_s *, int, int, char *[]))addr;
448
449 addr = (ulong)(cmdtp->name) + gd->reloc_off;
450 cmdtp->name = (char *)addr;
451
452 if (cmdtp->usage) {
453 addr = (ulong)(cmdtp->usage) + gd->reloc_off;
454 cmdtp->usage = (char *)addr;
455 }
456#ifdef CONFIG_SYS_LONGHELP
457 if (cmdtp->help) {
458 addr = (ulong)(cmdtp->help) + gd->reloc_off;
459 cmdtp->help = (char *)addr;
460 }
461#endif
462 }
463
464#ifndef CONFIG_ENV_IS_NOWHERE
465 env_name_spec += gd->reloc_off;
466#endif
467
468 WATCHDOG_RESET ();
469
470#ifdef CONFIG_LOGBUFFER
471 logbuff_init_ptrs ();
472#endif
473#ifdef CONFIG_POST
474 post_output_backlog ();
475 post_reloc ();
476#endif
477 WATCHDOG_RESET();
478
479#if 0
480
481 icache_enable ();
482#endif
483
484
485
486
487 trap_init (CONFIG_SYS_SDRAM_BASE);
488
489
490 mem_malloc_init (CONFIG_SYS_MONITOR_BASE + gd->reloc_off -
491 TOTAL_MALLOC_LEN, TOTAL_MALLOC_LEN);
492 malloc_bin_reloc ();
493
494#if !defined(CONFIG_SYS_NO_FLASH)
495 puts ("FLASH: ");
496
497 if ((flash_size = flash_init ()) > 0) {
498# ifdef CONFIG_SYS_FLASH_CHECKSUM
499 print_size (flash_size, "");
500
501
502
503
504
505 s = getenv ("flashchecksum");
506 if (s && (*s == 'y')) {
507 printf (" CRC: %08X",
508 crc32 (0,
509 (const unsigned char *) CONFIG_SYS_FLASH_BASE,
510 flash_size)
511 );
512 }
513 putc ('\n');
514# else
515 print_size (flash_size, "\n");
516# endif
517 } else {
518 puts (failed);
519 hang ();
520 }
521
522 bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
523 bd->bi_flashsize = flash_size;
524 bd->bi_flashoffset = 0;
525#else
526 bd->bi_flashsize = 0;
527 bd->bi_flashstart = 0;
528 bd->bi_flashoffset = 0;
529#endif
530
531 WATCHDOG_RESET ();
532
533
534 cpu_init_r ();
535
536 WATCHDOG_RESET ();
537
538#ifdef CONFIG_SPI
539# if !defined(CONFIG_ENV_IS_IN_EEPROM)
540 spi_init_f ();
541# endif
542 spi_init_r ();
543#endif
544
545
546 env_relocate ();
547
548
549
550
551
552
553
554
555 bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
556
557 WATCHDOG_RESET ();
558
559#if defined(CONFIG_PCI)
560
561
562
563 pci_init ();
564#endif
565
566
567
568 stdio_init ();
569
570
571 jumptable_init ();
572
573
574 console_init_r ();
575
576#if defined(CONFIG_MISC_INIT_R)
577
578 misc_init_r ();
579#endif
580
581#if defined(CONFIG_CMD_KGDB)
582 WATCHDOG_RESET ();
583 puts ("KGDB: ");
584 kgdb_init ();
585#endif
586
587 debug ("U-Boot relocated to %08lx\n", dest_addr);
588
589
590
591
592 interrupt_init ();
593
594
595
596
597 timer_init();
598
599#ifdef CONFIG_SERIAL_SOFTWARE_FIFO
600 serial_buffered_init();
601#endif
602
603#ifdef CONFIG_STATUS_LED
604 status_led_set (STATUS_LED_BOOT, STATUS_LED_BLINKING);
605#endif
606
607 udelay (20);
608
609 set_timer (0);
610
611
612
613
614 if ((s = getenv ("loadaddr")) != NULL) {
615 load_addr = simple_strtoul (s, NULL, 16);
616 }
617#if defined(CONFIG_CMD_NET)
618 if ((s = getenv ("bootfile")) != NULL) {
619 copy_filename (BootFile, s, sizeof (BootFile));
620 }
621#endif
622
623 WATCHDOG_RESET ();
624
625#if defined(CONFIG_CMD_DOC)
626 WATCHDOG_RESET ();
627 puts ("DOC: ");
628 doc_init ();
629#endif
630
631#if defined(CONFIG_CMD_NAND)
632 WATCHDOG_RESET ();
633 puts ("NAND: ");
634 nand_init();
635#endif
636
637#ifdef CONFIG_BITBANGMII
638 bb_miiphy_init();
639#endif
640#if defined(CONFIG_CMD_NET)
641 WATCHDOG_RESET();
642#if defined(FEC_ENET)
643 eth_init(bd);
644#endif
645#if defined(CONFIG_NET_MULTI)
646 puts ("Net: ");
647 eth_initialize (bd);
648#endif
649#endif
650
651#ifdef CONFIG_POST
652 post_run (NULL, POST_RAM | post_bootmode_get(0));
653#endif
654
655#if defined(CONFIG_CMD_PCMCIA) \
656 && !defined(CONFIG_CMD_IDE)
657 WATCHDOG_RESET ();
658 puts ("PCMCIA:");
659 pcmcia_init ();
660#endif
661
662#if defined(CONFIG_CMD_IDE)
663 WATCHDOG_RESET ();
664 puts ("IDE: ");
665 ide_init ();
666#endif
667
668#ifdef CONFIG_LAST_STAGE_INIT
669 WATCHDOG_RESET ();
670
671
672
673
674
675 last_stage_init ();
676#endif
677
678#if defined(CONFIG_CMD_BEDBUG)
679 WATCHDOG_RESET ();
680 bedbug_init ();
681#endif
682
683#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
684
685
686
687
688 {
689 ulong pram;
690 char memsz[32];
691#ifdef CONFIG_PRAM
692 char *s;
693
694 if ((s = getenv ("pram")) != NULL) {
695 pram = simple_strtoul (s, NULL, 10);
696 } else {
697 pram = CONFIG_PRAM;
698 }
699#else
700 pram=0;
701#endif
702#ifdef CONFIG_LOGBUFFER
703
704 pram += (LOGBUFF_LEN+LOGBUFF_OVERHEAD)/1024;
705#endif
706 sprintf (memsz, "%ldk", (bd->bi_memsize / 1024) - pram);
707 setenv ("mem", memsz);
708 }
709#endif
710
711#ifdef CONFIG_MODEM_SUPPORT
712 {
713 extern int do_mdm_init;
714 do_mdm_init = gd->do_mdm_init;
715 }
716#endif
717
718#ifdef CONFIG_WATCHDOG
719
720 if ((s = getenv ("watchdog")) != NULL) {
721 if (strncmp (s, "off", 3) == 0) {
722 WATCHDOG_DISABLE ();
723 }
724 }
725#endif
726
727
728
729
730
731 for (;;) {
732 WATCHDOG_RESET ();
733 main_loop ();
734 }
735
736
737}
738
739
740void hang(void)
741{
742 puts ("### ERROR ### Please RESET the board ###\n");
743 for (;;);
744}
745