Global variables are not ideal before relocation to RAM. --- I hope this still applies.
lib_ppc/board.c | 144 +++++++++++++++++++++++++----------------------------- 1 files changed, 67 insertions(+), 77 deletions(-) diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 8a18350..c64bbd5 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -288,124 +288,114 @@ static int init_func_watchdog_reset (void) ************************************************************************ */ -init_fnc_t *init_sequence[] = { +/************************************************************************ + * + * This is the first part of the initialization sequence that is + * implemented in C, but still running from ROM. + * + * The main purpose is to provide a (serial) console interface as + * soon as possible (so we can see any error messages), and to + * initialize the RAM so that we can relocate the monitor code to + * RAM. + * + * Be aware of the restrictions: global data is read-only, BSS is not + * initialized, and stack space is limited to a few kB. + * + ************************************************************************ + */ + +void board_init_f (ulong bootflag) +{ + bd_t *bd; + ulong len, addr, addr_sp; + ulong *s; + gd_t *id; + init_fnc_t **init_fnc_ptr; +#ifdef CONFIG_PRAM + int i; + ulong reg; + uchar tmp[64]; /* long enough for environment variables */ +#endif + + /* Pointer is writable since we allocated a register for it */ + gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET); + /* compiler optimization barrier needed for GCC >= 3.4 */ + __asm__ __volatile__("": : :"memory"); + +#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC83XX) + /* Clear initial global data */ + memset ((void *) gd, 0, sizeof (gd_t)); +#endif #if defined(CONFIG_BOARD_EARLY_INIT_F) - board_early_init_f, + board_early_init_f(); #endif #if !defined(CONFIG_8xx_CPUCLK_DEFAULT) - get_clocks, /* get CPU and bus clocks (etc.) */ + get_clocks(); /* get CPU and bus clocks (etc.) */ #if defined(CONFIG_TQM8xxL) && !defined(CONFIG_TQM866M) \ && !defined(CONFIG_TQM885D) - adjust_sdram_tbs_8xx, + adjust_sdram_tbs_8xx(); #endif - init_timebase, + init_timebase(); #endif #ifdef CFG_ALLOC_DPRAM #if !defined(CONFIG_CPM2) - dpram_init, + dpram_init(); #endif #endif #if defined(CONFIG_BOARD_POSTCLK_INIT) - board_postclk_init, + board_postclk_init(); #endif - env_init, + env_init(); #if defined(CONFIG_8xx_CPUCLK_DEFAULT) - get_clocks_866, /* get CPU and bus clocks according to the environment variable */ - sdram_adjust_866, /* adjust sdram refresh rate according to the new clock */ - init_timebase, -#endif - init_baudrate, - serial_init, - console_init_f, - display_options, + get_clocks_866(); /* get CPU and bus clocks according to the environment variable */ + sdram_adjust_866(); /* adjust sdram refresh rate according to the new clock */ + init_timebase(); +#endif + init_baudrate(); + serial_init(); + console_init_f(); + display_options(); #if defined(CONFIG_8260) - prt_8260_rsr, - prt_8260_clks, + prt_8260_rsr(); + prt_8260_clks(); #endif /* CONFIG_8260 */ #if defined(CONFIG_MPC83XX) - prt_83xx_rsr, + prt_83xx_rsr(); #endif - checkcpu, + checkcpu(); #if defined(CONFIG_MPC5xxx) - prt_mpc5xxx_clks, + prt_mpc5xxx_clks(); #endif /* CONFIG_MPC5xxx */ #if defined(CONFIG_MPC8220) - prt_mpc8220_clks, + prt_mpc8220_clks(); #endif - checkboard, + checkboard(); INIT_FUNC_WATCHDOG_INIT #if defined(CONFIG_MISC_INIT_F) - misc_init_f, + misc_init_f(); #endif INIT_FUNC_WATCHDOG_RESET #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) - init_func_i2c, + init_func_i2c(); #endif #if defined(CONFIG_HARD_SPI) - init_func_spi, + init_func_spi(); #endif #if defined(CONFIG_DTT) /* Digital Thermometers and Thermostats */ - dtt_init, + dtt_init(); #endif #ifdef CONFIG_POST - post_init_f, + post_init_f(); #endif INIT_FUNC_WATCHDOG_RESET - init_func_ram, + init_func_ram(); #if defined(CFG_DRAM_TEST) - testdram, + testdram(); #endif /* CFG_DRAM_TEST */ INIT_FUNC_WATCHDOG_RESET - NULL, /* Terminate this list */ -}; - -/************************************************************************ - * - * This is the first part of the initialization sequence that is - * implemented in C, but still running from ROM. - * - * The main purpose is to provide a (serial) console interface as - * soon as possible (so we can see any error messages), and to - * initialize the RAM so that we can relocate the monitor code to - * RAM. - * - * Be aware of the restrictions: global data is read-only, BSS is not - * initialized, and stack space is limited to a few kB. - * - ************************************************************************ - */ - -void board_init_f (ulong bootflag) -{ - bd_t *bd; - ulong len, addr, addr_sp; - ulong *s; - gd_t *id; - init_fnc_t **init_fnc_ptr; -#ifdef CONFIG_PRAM - int i; - ulong reg; - uchar tmp[64]; /* long enough for environment variables */ -#endif - - /* Pointer is writable since we allocated a register for it */ - gd = (gd_t *) (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET); - /* compiler optimization barrier needed for GCC >= 3.4 */ - __asm__ __volatile__("": : :"memory"); - -#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC83XX) - /* Clear initial global data */ - memset ((void *) gd, 0, sizeof (gd_t)); -#endif - - for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { - if ((*init_fnc_ptr) () != 0) { - hang (); - } - } /* * Now that we have DRAM mapped and working, we can -- 1.5.4.3 ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users