blob: 34bbfca5544d8d5bde5bff3be5ebc64f275dddfa [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * (C) Copyright 2000-2011
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
9#include <watchdog.h>
10#include <command.h>
11#include <malloc.h>
12#include <stdio_dev.h>
13#ifdef CONFIG_8xx
14#include <mpc8xx.h>
15#endif
16#ifdef CONFIG_5xx
17#include <mpc5xx.h>
18#endif
19#ifdef CONFIG_MPC5xxx
20#include <mpc5xxx.h>
21#endif
22#if defined(CONFIG_CMD_IDE)
23#include <ide.h>
24#endif
25#if defined(CONFIG_CMD_SCSI)
26#include <scsi.h>
27#endif
28#if defined(CONFIG_CMD_KGDB)
29#include <kgdb.h>
30#endif
31#ifdef CONFIG_STATUS_LED
32#include <status_led.h>
33#endif
34#include <net.h>
35#ifdef CONFIG_GENERIC_MMC
36#include <mmc.h>
37#endif
38#include <serial.h>
39#ifdef CONFIG_SYS_ALLOC_DPRAM
40#if !defined(CONFIG_CPM2)
41#include <commproc.h>
42#endif
43#endif
44#include <version.h>
45#if defined(CONFIG_BAB7xx)
46#include <w83c553f.h>
47#endif
48#include <dtt.h>
49#if defined(CONFIG_POST)
50#include <post.h>
51#endif
52#if defined(CONFIG_LOGBUFFER)
53#include <logbuff.h>
54#endif
55#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
56#include <asm/cache.h>
57#endif
58#ifdef CONFIG_PS2KBD
59#include <keyboard.h>
60#endif
61
62#ifdef CONFIG_ADDR_MAP
63#include <asm/mmu.h>
64#endif
65
66#ifdef CONFIG_MP
67#include <asm/mp.h>
68#endif
69
70#ifdef CONFIG_BITBANGMII
71#include <miiphy.h>
72#endif
73
74#ifdef CONFIG_SYS_UPDATE_FLASH_SIZE
75extern int update_flash_size(int flash_size);
76#endif
77
78#if defined(CONFIG_SC3)
79extern void sc3_read_eeprom(void);
80#endif
81
82#if defined(CONFIG_CMD_DOC)
83void doc_init(void);
84#endif
85#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
86#include <i2c.h>
87#endif
88#include <spi.h>
89#include <nand.h>
90
91static char *failed = "*** failed ***\n";
92
93#if defined(CONFIG_OXC) || defined(CONFIG_RMU)
94extern flash_info_t flash_info[];
95#endif
96
97#if defined(CONFIG_START_IDE)
98extern int board_start_ide(void);
99#endif
100#include <environment.h>
101
102DECLARE_GLOBAL_DATA_PTR;
103
104#if !defined(CONFIG_SYS_MEM_TOP_HIDE)
105#define CONFIG_SYS_MEM_TOP_HIDE 0
106#endif
107
108extern ulong __init_end;
109extern ulong __bss_end;
110ulong monitor_flash_len;
111
112#if defined(CONFIG_CMD_BEDBUG)
113#include <bedbug/type.h>
114#endif
115
116/*
117 * Utilities
118 */
119
120/*
121 * All attempts to come up with a "common" initialization sequence
122 * that works for all boards and architectures failed: some of the
123 * requirements are just _too_ different. To get rid of the resulting
124 * mess of board dependend #ifdef'ed code we now make the whole
125 * initialization sequence configurable to the user.
126 *
127 * The requirements for any new initalization function is simple: it
128 * receives a pointer to the "global data" structure as it's only
129 * argument, and returns an integer return code, where 0 means
130 * "continue" and != 0 means "fatal error, hang the system".
131 */
132typedef int (init_fnc_t)(void);
133
134/*
135 * Init Utilities
136 *
137 * Some of this code should be moved into the core functions,
138 * but let's get it working (again) first...
139 */
140
141static int init_baudrate(void)
142{
143 gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
144 return 0;
145}
146
147/***********************************************************************/
148
149static void __board_add_ram_info(int use_default)
150{
151 /* please define platform specific board_add_ram_info() */
152}
153
154void board_add_ram_info(int)
155 __attribute__ ((weak, alias("__board_add_ram_info")));
156
157static int __board_flash_wp_on(void)
158{
159 /*
160 * Most flashes can't be detected when write protection is enabled,
161 * so provide a way to let U-Boot gracefully ignore write protected
162 * devices.
163 */
164 return 0;
165}
166
167int board_flash_wp_on(void)
168 __attribute__ ((weak, alias("__board_flash_wp_on")));
169
170static void __cpu_secondary_init_r(void)
171{
172}
173
174void cpu_secondary_init_r(void)
175 __attribute__ ((weak, alias("__cpu_secondary_init_r")));
176
177static int init_func_ram(void)
178{
179#ifdef CONFIG_BOARD_TYPES
180 int board_type = gd->board_type;
181#else
182 int board_type = 0; /* use dummy arg */
183#endif
184 puts("DRAM: ");
185
186 gd->ram_size = initdram(board_type);
187
188 if (gd->ram_size > 0) {
189 print_size(gd->ram_size, "");
190 board_add_ram_info(0);
191 putc('\n');
192 return 0;
193 }
194 puts(failed);
195 return 1;
196}
197
198/***********************************************************************/
199
200#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
201static int init_func_i2c(void)
202{
203 puts("I2C: ");
204#ifdef CONFIG_SYS_I2C
205 i2c_init_all();
206#else
207 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
208#endif
209 puts("ready\n");
210 return 0;
211}
212#endif
213
214#if defined(CONFIG_HARD_SPI)
215static int init_func_spi(void)
216{
217 puts("SPI: ");
218 spi_init();
219 puts("ready\n");
220 return 0;
221}
222#endif
223
224/***********************************************************************/
225
226#if defined(CONFIG_WATCHDOG)
227int init_func_watchdog_init(void)
228{
229 puts(" Watchdog enabled\n");
230 WATCHDOG_RESET();
231 return 0;
232}
233
234int init_func_watchdog_reset(void)
235{
236 WATCHDOG_RESET();
237 return 0;
238}
239#endif /* CONFIG_WATCHDOG */
240
241/*
242 * Initialization sequence
243 */
244
245static init_fnc_t *init_sequence[] = {
246#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
247 probecpu,
248#endif
249#if defined(CONFIG_BOARD_EARLY_INIT_F)
250 board_early_init_f,
251#endif
252#if !defined(CONFIG_8xx_CPUCLK_DEFAULT)
253 get_clocks, /* get CPU and bus clocks (etc.) */
254#if defined(CONFIG_TQM8xxL) && !defined(CONFIG_TQM866M) \
255 && !defined(CONFIG_TQM885D)
256 adjust_sdram_tbs_8xx,
257#endif
258 init_timebase,
259#endif
260#ifdef CONFIG_SYS_ALLOC_DPRAM
261#if !defined(CONFIG_CPM2)
262 dpram_init,
263#endif
264#endif
265#if defined(CONFIG_BOARD_POSTCLK_INIT)
266 board_postclk_init,
267#endif
268 env_init,
269#if defined(CONFIG_8xx_CPUCLK_DEFAULT)
270 /* get CPU and bus clocks according to the environment variable */
271 get_clocks_866,
272 /* adjust sdram refresh rate according to the new clock */
273 sdram_adjust_866,
274 init_timebase,
275#endif
276 init_baudrate,
277 serial_init,
278 console_init_f,
279 display_options,
280#if defined(CONFIG_8260)
281 prt_8260_rsr,
282 prt_8260_clks,
283#endif /* CONFIG_8260 */
284#if defined(CONFIG_MPC83xx)
285 prt_83xx_rsr,
286#endif
287 checkcpu,
288#if defined(CONFIG_MPC5xxx)
289 prt_mpc5xxx_clks,
290#endif /* CONFIG_MPC5xxx */
291 checkboard,
292 INIT_FUNC_WATCHDOG_INIT
293#if defined(CONFIG_MISC_INIT_F)
294 misc_init_f,
295#endif
296 INIT_FUNC_WATCHDOG_RESET
297#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
298 init_func_i2c,
299#endif
300#if defined(CONFIG_HARD_SPI)
301 init_func_spi,
302#endif
303#ifdef CONFIG_POST
304 post_init_f,
305#endif
306 INIT_FUNC_WATCHDOG_RESET
307 init_func_ram,
308#if defined(CONFIG_SYS_DRAM_TEST)
309 testdram,
310#endif /* CONFIG_SYS_DRAM_TEST */
311 INIT_FUNC_WATCHDOG_RESET
312 NULL, /* Terminate this list */
313};
314
315ulong get_effective_memsize(void)
316{
317#ifndef CONFIG_VERY_BIG_RAM
318 return gd->ram_size;
319#else
320 /* limit stack to what we can reasonable map */
321 return ((gd->ram_size > CONFIG_MAX_MEM_MAPPED) ?
322 CONFIG_MAX_MEM_MAPPED : gd->ram_size);
323#endif
324}
325
326static int __fixup_cpu(void)
327{
328 return 0;
329}
330
331int fixup_cpu(void) __attribute__((weak, alias("__fixup_cpu")));
332
333/*
334 * This is the first part of the initialization sequence that is
335 * implemented in C, but still running from ROM.
336 *
337 * The main purpose is to provide a (serial) console interface as
338 * soon as possible (so we can see any error messages), and to
339 * initialize the RAM so that we can relocate the monitor code to
340 * RAM.
341 *
342 * Be aware of the restrictions: global data is read-only, BSS is not
343 * initialized, and stack space is limited to a few kB.
344 */
345
346#ifdef CONFIG_LOGBUFFER
347unsigned long logbuffer_base(void)
348{
349 return CONFIG_SYS_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN;
350}
351#endif
352
353void board_init_f(ulong bootflag)
354{
355 bd_t *bd;
356 ulong len, addr, addr_sp;
357 ulong *s;
358 gd_t *id;
359 init_fnc_t **init_fnc_ptr;
360
361#ifdef CONFIG_PRAM
362 ulong reg;
363#endif
364
365 /* Pointer is writable since we allocated a register for it */
366 gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
367 /* compiler optimization barrier needed for GCC >= 3.4 */
368 __asm__ __volatile__("":::"memory");
369
370#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC512X) && \
371 !defined(CONFIG_MPC83xx) && !defined(CONFIG_MPC85xx) && \
372 !defined(CONFIG_MPC86xx)
373 /* Clear initial global data */
374 memset((void *) gd, 0, sizeof(gd_t));
375#endif
376
377 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
378 if ((*init_fnc_ptr) () != 0)
379 hang();
380
381#ifdef CONFIG_POST
382 post_bootmode_init();
383 post_run(NULL, POST_ROM | post_bootmode_get(NULL));
384#endif
385
386 WATCHDOG_RESET();
387
388 /*
389 * Now that we have DRAM mapped and working, we can
390 * relocate the code and continue running from DRAM.
391 *
392 * Reserve memory at end of RAM for (top down in that order):
393 * - area that won't get touched by U-Boot and Linux (optional)
394 * - kernel log buffer
395 * - protected RAM
396 * - LCD framebuffer
397 * - monitor code
398 * - board info struct
399 */
400 len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;
401
402 /*
403 * Subtract specified amount of memory to hide so that it won't
404 * get "touched" at all by U-Boot. By fixing up gd->ram_size
405 * the Linux kernel should now get passed the now "corrected"
406 * memory size and won't touch it either. This should work
407 * for arch/ppc and arch/powerpc. Only Linux board ports in
408 * arch/powerpc with bootwrapper support, that recalculate the
409 * memory size from the SDRAM controller setup will have to
410 * get fixed.
411 */
412 gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE;
413
414 addr = CONFIG_SYS_SDRAM_BASE + get_effective_memsize();
415
416#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
417 /*
418 * We need to make sure the location we intend to put secondary core
419 * boot code is reserved and not used by any part of u-boot
420 */
421 if (addr > determine_mp_bootpg(NULL)) {
422 addr = determine_mp_bootpg(NULL);
423 debug("Reserving MP boot page to %08lx\n", addr);
424 }
425#endif
426
427#ifdef CONFIG_LOGBUFFER
428#ifndef CONFIG_ALT_LB_ADDR
429 /* reserve kernel log buffer */
430 addr -= (LOGBUFF_RESERVE);
431 debug("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN,
432 addr);
433#endif
434#endif
435
436#ifdef CONFIG_PRAM
437 /*
438 * reserve protected RAM
439 */
440 reg = getenv_ulong("pram", 10, CONFIG_PRAM);
441 addr -= (reg << 10); /* size is in kB */
442 debug("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
443#endif /* CONFIG_PRAM */
444
445 /* round down to next 4 kB limit */
446 addr &= ~(4096 - 1);
447 debug("Top of RAM usable for U-Boot at: %08lx\n", addr);
448
449#ifdef CONFIG_LCD
450#ifdef CONFIG_FB_ADDR
451 gd->fb_base = CONFIG_FB_ADDR;
452#else
453 /* reserve memory for LCD display (always full pages) */
454 addr = lcd_setmem(addr);
455 gd->fb_base = addr;
456#endif /* CONFIG_FB_ADDR */
457#endif /* CONFIG_LCD */
458
459#if defined(CONFIG_VIDEO) && defined(CONFIG_8xx)
460 /* reserve memory for video display (always full pages) */
461 addr = video_setmem(addr);
462 gd->fb_base = addr;
463#endif /* CONFIG_VIDEO */
464
465 /*
466 * reserve memory for U-Boot code, data & bss
467 * round down to next 4 kB limit
468 */
469 addr -= len;
470 addr &= ~(4096 - 1);
471#ifdef CONFIG_E500
472 /* round down to next 64 kB limit so that IVPR stays aligned */
473 addr &= ~(65536 - 1);
474#endif
475
476 debug("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
477
478 /*
479 * reserve memory for malloc() arena
480 */
481 addr_sp = addr - TOTAL_MALLOC_LEN;
482 debug("Reserving %dk for malloc() at: %08lx\n",
483 TOTAL_MALLOC_LEN >> 10, addr_sp);
484
485 /*
486 * (permanently) allocate a Board Info struct
487 * and a permanent copy of the "global" data
488 */
489 addr_sp -= sizeof(bd_t);
490 bd = (bd_t *) addr_sp;
491 memset(bd, 0, sizeof(bd_t));
492 gd->bd = bd;
493 debug("Reserving %zu Bytes for Board Info at: %08lx\n",
494 sizeof(bd_t), addr_sp);
495 addr_sp -= sizeof(gd_t);
496 id = (gd_t *) addr_sp;
497 debug("Reserving %zu Bytes for Global Data at: %08lx\n",
498 sizeof(gd_t), addr_sp);
499
500 /*
501 * Finally, we set up a new (bigger) stack.
502 *
503 * Leave some safety gap for SP, force alignment on 16 byte boundary
504 * Clear initial stack frame
505 */
506 addr_sp -= 16;
507 addr_sp &= ~0xF;
508 s = (ulong *) addr_sp;
509 *s = 0; /* Terminate back chain */
510 *++s = 0; /* NULL return address */
511 debug("Stack Pointer at: %08lx\n", addr_sp);
512
513 /*
514 * Save local variables to board info struct
515 */
516
517 bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; /* start of memory */
518 bd->bi_memsize = gd->ram_size; /* size in bytes */
519
520#ifdef CONFIG_SYS_SRAM_BASE
521 bd->bi_sramstart = CONFIG_SYS_SRAM_BASE; /* start of SRAM */
522 bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE; /* size of SRAM */
523#endif
524
525#if defined(CONFIG_8xx) || defined(CONFIG_8260) || defined(CONFIG_5xx) || \
526 defined(CONFIG_E500) || defined(CONFIG_MPC86xx)
527 bd->bi_immr_base = CONFIG_SYS_IMMR; /* base of IMMR register */
528#endif
529#if defined(CONFIG_MPC5xxx)
530 bd->bi_mbar_base = CONFIG_SYS_MBAR; /* base of internal registers */
531#endif
532#if defined(CONFIG_MPC83xx)
533 bd->bi_immrbar = CONFIG_SYS_IMMR;
534#endif
535
536 WATCHDOG_RESET();
537 bd->bi_intfreq = gd->cpu_clk; /* Internal Freq, in Hz */
538 bd->bi_busfreq = gd->bus_clk; /* Bus Freq, in Hz */
539#if defined(CONFIG_CPM2)
540 bd->bi_cpmfreq = gd->arch.cpm_clk;
541 bd->bi_brgfreq = gd->arch.brg_clk;
542 bd->bi_sccfreq = gd->arch.scc_clk;
543 bd->bi_vco = gd->arch.vco_out;
544#endif /* CONFIG_CPM2 */
545#if defined(CONFIG_MPC512X)
546 bd->bi_ipsfreq = gd->arch.ips_clk;
547#endif /* CONFIG_MPC512X */
548#if defined(CONFIG_MPC5xxx)
549 bd->bi_ipbfreq = gd->arch.ipb_clk;
550 bd->bi_pcifreq = gd->pci_clk;
551#endif /* CONFIG_MPC5xxx */
552 bd->bi_baudrate = gd->baudrate; /* Console Baudrate */
553
554#ifdef CONFIG_SYS_EXTBDINFO
555 strncpy((char *) bd->bi_s_version, "1.2", sizeof(bd->bi_s_version));
556 strncpy((char *) bd->bi_r_version, U_BOOT_VERSION,
557 sizeof(bd->bi_r_version));
558
559 bd->bi_procfreq = gd->cpu_clk; /* Processor Speed, In Hz */
560 bd->bi_plb_busfreq = gd->bus_clk;
561#if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \
562 defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
563 defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
564 bd->bi_pci_busfreq = get_PCI_freq();
565 bd->bi_opbfreq = get_OPB_freq();
566#elif defined(CONFIG_XILINX_405)
567 bd->bi_pci_busfreq = get_PCI_freq();
568#endif
569#endif
570
571 debug("New Stack Pointer is: %08lx\n", addr_sp);
572
573 WATCHDOG_RESET();
574
575 gd->relocaddr = addr; /* Store relocation addr, useful for debug */
576
577 memcpy(id, (void *) gd, sizeof(gd_t));
578
579 relocate_code(addr_sp, id, addr);
580
581 /* NOTREACHED - relocate_code() does not return */
582}
583
584/*
585 * This is the next part if the initialization sequence: we are now
586 * running from RAM and have a "normal" C environment, i. e. global
587 * data can be written, BSS has been cleared, the stack size in not
588 * that critical any more, etc.
589 */
590void board_init_r(gd_t *id, ulong dest_addr)
591{
592 bd_t *bd;
593 ulong malloc_start;
594
595#ifndef CONFIG_SYS_NO_FLASH
596 ulong flash_size;
597#endif
598
599 gd = id; /* initialize RAM version of global data */
600 bd = gd->bd;
601
602 gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
603
604 /* The Malloc area is immediately below the monitor copy in DRAM */
605 malloc_start = dest_addr - TOTAL_MALLOC_LEN;
606
607#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
608 /*
609 * The gd->arch.cpu pointer is set to an address in flash before
610 * relocation. We need to update it to point to the same CPU entry
611 * in RAM.
612 */
613 gd->arch.cpu += dest_addr - CONFIG_SYS_MONITOR_BASE;
614
615 /*
616 * If we didn't know the cpu mask & # cores, we can save them of
617 * now rather than 'computing' them constantly
618 */
619 fixup_cpu();
620#endif
621
622#ifdef CONFIG_SYS_EXTRA_ENV_RELOC
623 /*
624 * Some systems need to relocate the env_addr pointer early because the
625 * location it points to will get invalidated before env_relocate is
626 * called. One example is on systems that might use a L2 or L3 cache
627 * in SRAM mode and initialize that cache from SRAM mode back to being
628 * a cache in cpu_init_r.
629 */
630 gd->env_addr += dest_addr - CONFIG_SYS_MONITOR_BASE;
631#endif
632
633 serial_initialize();
634
635 debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
636
637 WATCHDOG_RESET();
638
639 /*
640 * Setup trap handlers
641 */
642 trap_init(dest_addr);
643
644#ifdef CONFIG_ADDR_MAP
645 init_addr_map();
646#endif
647
648#if defined(CONFIG_BOARD_EARLY_INIT_R)
649 board_early_init_r();
650#endif
651
652 monitor_flash_len = (ulong)&__init_end - dest_addr;
653
654 WATCHDOG_RESET();
655
656#ifdef CONFIG_LOGBUFFER
657 logbuff_init_ptrs();
658#endif
659#ifdef CONFIG_POST
660 post_output_backlog();
661#endif
662
663 WATCHDOG_RESET();
664
665#if defined(CONFIG_SYS_DELAYED_ICACHE)
666 icache_enable(); /* it's time to enable the instruction cache */
667#endif
668
669#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
670 unlock_ram_in_cache(); /* it's time to unlock D-cache in e500 */
671#endif
672
673#if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT)
674 /*
675 * Do early PCI configuration _before_ the flash gets initialised,
676 * because PCU ressources are crucial for flash access on some boards.
677 */
678 pci_init();
679#endif
680#if defined(CONFIG_WINBOND_83C553)
681 /*
682 * Initialise the ISA bridge
683 */
684 initialise_w83c553f();
685#endif
686
687 asm("sync ; isync");
688
689 mem_malloc_init(malloc_start, TOTAL_MALLOC_LEN);
690
691#if !defined(CONFIG_SYS_NO_FLASH)
692 puts("Flash: ");
693
694 if (board_flash_wp_on()) {
695 printf("Uninitialized - Write Protect On\n");
696 /* Since WP is on, we can't find real size. Set to 0 */
697 flash_size = 0;
698 } else if ((flash_size = flash_init()) > 0) {
699#ifdef CONFIG_SYS_FLASH_CHECKSUM
700 print_size(flash_size, "");
701 /*
702 * Compute and print flash CRC if flashchecksum is set to 'y'
703 *
704 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
705 */
706 if (getenv_yesno("flashchecksum") == 1) {
707 printf(" CRC: %08X",
708 crc32(0,
709 (const unsigned char *)
710 CONFIG_SYS_FLASH_BASE, flash_size)
711 );
712 }
713 putc('\n');
714#else /* !CONFIG_SYS_FLASH_CHECKSUM */
715 print_size(flash_size, "\n");
716#endif /* CONFIG_SYS_FLASH_CHECKSUM */
717 } else {
718 puts(failed);
719 hang();
720 }
721
722 /* update start of FLASH memory */
723 bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
724 /* size of FLASH memory (final value) */
725 bd->bi_flashsize = flash_size;
726
727#if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)
728 /* Make a update of the Memctrl. */
729 update_flash_size(flash_size);
730#endif
731
732
733#if defined(CONFIG_OXC) || defined(CONFIG_RMU)
734 /* flash mapped at end of memory map */
735 bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size;
736#elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
737 bd->bi_flashoffset = monitor_flash_len; /* reserved area for monitor */
738#endif
739#endif /* !CONFIG_SYS_NO_FLASH */
740
741 WATCHDOG_RESET();
742
743 /* initialize higher level parts of CPU like time base and timers */
744 cpu_init_r();
745
746 WATCHDOG_RESET();
747
748#ifdef CONFIG_SPI
749#if !defined(CONFIG_ENV_IS_IN_EEPROM)
750 spi_init_f();
751#endif
752 spi_init_r();
753#endif
754
755#if defined(CONFIG_CMD_NAND)
756 WATCHDOG_RESET();
757 puts("NAND: ");
758 nand_init(); /* go init the NAND */
759#endif
760
761#ifdef CONFIG_GENERIC_MMC
762/*
763 * MMC initialization is called before relocating env.
764 * Thus It is required that operations like pin multiplexer
765 * be put in board_init.
766 */
767 WATCHDOG_RESET();
768 puts("MMC: ");
769 mmc_initialize(bd);
770#endif
771
772 /* relocate environment function pointers etc. */
773 env_relocate();
774
775 /*
776 * after non-volatile devices & environment is setup and cpu code have
777 * another round to deal with any initialization that might require
778 * full access to the environment or loading of some image (firmware)
779 * from a non-volatile device
780 */
781 cpu_secondary_init_r();
782
783 /*
784 * Fill in missing fields of bd_info.
785 * We do this here, where we have "normal" access to the
786 * environment; we used to do this still running from ROM,
787 * where had to use getenv_f(), which can be pretty slow when
788 * the environment is in EEPROM.
789 */
790
791#if defined(CONFIG_SYS_EXTBDINFO)
792#if defined(CONFIG_405GP) || defined(CONFIG_405EP)
793#if defined(CONFIG_I2CFAST)
794 /*
795 * set bi_iic_fast for linux taking environment variable
796 * "i2cfast" into account
797 */
798 {
799 if (getenv_yesno("i2cfast") == 1) {
800 bd->bi_iic_fast[0] = 1;
801 bd->bi_iic_fast[1] = 1;
802 }
803 }
804#endif /* CONFIG_I2CFAST */
805#endif /* CONFIG_405GP, CONFIG_405EP */
806#endif /* CONFIG_SYS_EXTBDINFO */
807
808#if defined(CONFIG_SC3)
809 sc3_read_eeprom();
810#endif
811
812#if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET)
813 mac_read_from_eeprom();
814#endif
815
816#ifdef CONFIG_HERMES
817 if ((gd->board_type >> 16) == 2)
818 bd->bi_ethspeed = gd->board_type & 0xFFFF;
819 else
820 bd->bi_ethspeed = 0xFFFF;
821#endif
822
823#ifdef CONFIG_CMD_NET
824 /* kept around for legacy kernels only ... ignore the next section */
825 eth_getenv_enetaddr("ethaddr", bd->bi_enetaddr);
826#ifdef CONFIG_HAS_ETH1
827 eth_getenv_enetaddr("eth1addr", bd->bi_enet1addr);
828#endif
829#ifdef CONFIG_HAS_ETH2
830 eth_getenv_enetaddr("eth2addr", bd->bi_enet2addr);
831#endif
832#ifdef CONFIG_HAS_ETH3
833 eth_getenv_enetaddr("eth3addr", bd->bi_enet3addr);
834#endif
835#ifdef CONFIG_HAS_ETH4
836 eth_getenv_enetaddr("eth4addr", bd->bi_enet4addr);
837#endif
838#ifdef CONFIG_HAS_ETH5
839 eth_getenv_enetaddr("eth5addr", bd->bi_enet5addr);
840#endif
841#endif /* CONFIG_CMD_NET */
842
843 WATCHDOG_RESET();
844
845#if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
846 /*
847 * Do pci configuration
848 */
849 pci_init();
850#endif
851
852/** leave this here (after malloc(), environment and PCI are working) **/
853 /* Initialize stdio devices */
854 stdio_init();
855
856 /* Initialize the jump table for applications */
857 jumptable_init();
858
859#if defined(CONFIG_API)
860 /* Initialize API */
861 api_init();
862#endif
863
864 /* Initialize the console (after the relocation and devices init) */
865 console_init_r();
866
867#if defined(CONFIG_MISC_INIT_R)
868 /* miscellaneous platform dependent initialisations */
869 misc_init_r();
870#endif
871
872#ifdef CONFIG_HERMES
873 if (bd->bi_ethspeed != 0xFFFF)
874 hermes_start_lxt980((int) bd->bi_ethspeed);
875#endif
876
877#if defined(CONFIG_CMD_KGDB)
878 WATCHDOG_RESET();
879 puts("KGDB: ");
880 kgdb_init();
881#endif
882
883 debug("U-Boot relocated to %08lx\n", dest_addr);
884
885 /*
886 * Enable Interrupts
887 */
888 interrupt_init();
889
890#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
891 status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
892#endif
893
894 udelay(20);
895
896 /* Initialize from environment */
897 load_addr = getenv_ulong("loadaddr", 16, load_addr);
898
899 WATCHDOG_RESET();
900
901#if defined(CONFIG_CMD_SCSI)
902 WATCHDOG_RESET();
903 puts("SCSI: ");
904 scsi_init();
905#endif
906
907#if defined(CONFIG_CMD_DOC)
908 WATCHDOG_RESET();
909 puts("DOC: ");
910 doc_init();
911#endif
912
913#ifdef CONFIG_BITBANGMII
914 bb_miiphy_init();
915#endif
916#if defined(CONFIG_CMD_NET)
917 WATCHDOG_RESET();
918 puts("Net: ");
919 eth_initialize(bd);
920#endif
921
922#if defined(CONFIG_CMD_NET) && defined(CONFIG_RESET_PHY_R)
923 WATCHDOG_RESET();
924 debug("Reset Ethernet PHY\n");
925 reset_phy();
926#endif
927
928#ifdef CONFIG_POST
929 post_run(NULL, POST_RAM | post_bootmode_get(0));
930#endif
931
932#if defined(CONFIG_CMD_PCMCIA) \
933 && !defined(CONFIG_CMD_IDE)
934 WATCHDOG_RESET();
935 puts("PCMCIA:");
936 pcmcia_init();
937#endif
938
939#if defined(CONFIG_CMD_IDE)
940 WATCHDOG_RESET();
941#ifdef CONFIG_IDE_8xx_PCCARD
942 puts("PCMCIA:");
943#else
944 puts("IDE: ");
945#endif
946#if defined(CONFIG_START_IDE)
947 if (board_start_ide())
948 ide_init();
949#else
950 ide_init();
951#endif
952#endif
953
954#ifdef CONFIG_LAST_STAGE_INIT
955 WATCHDOG_RESET();
956 /*
957 * Some parts can be only initialized if all others (like
958 * Interrupts) are up and running (i.e. the PC-style ISA
959 * keyboard).
960 */
961 last_stage_init();
962#endif
963
964#if defined(CONFIG_CMD_BEDBUG)
965 WATCHDOG_RESET();
966 bedbug_init();
967#endif
968
969#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
970 /*
971 * Export available size of memory for Linux,
972 * taking into account the protected RAM at top of memory
973 */
974 {
975 ulong pram = 0;
976 char memsz[32];
977
978#ifdef CONFIG_PRAM
979 pram = getenv_ulong("pram", 10, CONFIG_PRAM);
980#endif
981#ifdef CONFIG_LOGBUFFER
982#ifndef CONFIG_ALT_LB_ADDR
983 /* Also take the logbuffer into account (pram is in kB) */
984 pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024;
985#endif
986#endif
987 sprintf(memsz, "%ldk", (ulong) (bd->bi_memsize / 1024) - pram);
988 setenv("mem", memsz);
989 }
990#endif
991
992#ifdef CONFIG_PS2KBD
993 puts("PS/2: ");
994 kbd_init();
995#endif
996
997#ifdef CONFIG_MODEM_SUPPORT
998 {
999 extern int do_mdm_init;
1000
1001 do_mdm_init = gd->do_mdm_init;
1002 }
1003#endif
1004
1005 /* Initialization complete - start the monitor */
1006
1007 /* main_loop() can return to retry autoboot, if so just run it again. */
1008 for (;;) {
1009 WATCHDOG_RESET();
1010 main_loop();
1011 }
1012
1013 /* NOTREACHED - no way out of command loop except booting */
1014}
1015
1016#if 0 /* We could use plain global data, but the resulting code is bigger */
1017/*
1018 * Pointer to initial global data area
1019 *
1020 * Here we initialize it.
1021 */
1022#undef XTRN_DECLARE_GLOBAL_DATA_PTR
1023#define XTRN_DECLARE_GLOBAL_DATA_PTR /* empty = allocate here */
1024DECLARE_GLOBAL_DATA_PTR =
1025 (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
1026#endif /* 0 */
1027
1028/************************************************************************/