[U-Boot] RFC: Move when we call cpu_init_r on PPC

Kumar Gala galak at kernel.crashing.org
Sat Nov 13 18:00:46 CET 2010


Wolfgang, Stefan, Kim, (other PPC arch maintainers)

I'd like to move cpu_init_r to after env_relocate().  This is desirable on 85xx based systems to deal with an issue when we boot from NAND (and probably SPI or SDHC/MMC) in which we use the L2 cache in SRAM mode to load the u-boot image from the storage device (NAND, SPI, SDHC/MMC, etc.).  In these cases we have an ordering issue between freeing up the L2 cache and when the environment is relocated.

If we move cpu_init_r() after env_relocate() that addresses the issue.  I did an audit of all the other PPC chips and I dont believe it impacts any of them if we move cpu_init_r after spi_init_{f,r}, nand_init, mmc_initialize, & env_relocate.

Please let me know if this is acceptable solution to my problem.  I've provided both the 'audit' details and example diff.

- k

----

My audit of what we do in cpu_init_r on all PPCs:

74xx_7xx/cpu_init.c:int cpu_init_r (void)
        Does nothing
mpc512x/cpu_init.c:int cpu_init_r (void)
        Does nothing
mpc5xx/cpu_init.c:int cpu_init_r (void)
        Does nothing
mpc5xxx/cpu_init.c:int cpu_init_r (void)
        Mask interrupts, loadtask/microcode
mpc8220/cpu_init.c:int cpu_init_r (void)
        Mask interrupts, loadtask/microcode
mpc824x/cpu_init.c:int cpu_init_r (void)
        init EUMMBAR on MPC10x
mpc8260/cpu_init.c:int cpu_init_r (void)
        init RISC Controller Cfg Register (most boards either 0 or modify TIMEP)
mpc83xx/cpu_init.c:int cpu_init_r (void)
        init QE
mpc85xx/cpu_init.c:int cpu_init_r(void)
        init L2/L3 caches
        init QE
        init SERDES
        setup secondary cores (MP)
        set LCRR
mpc86xx/cpu_init.c:int cpu_init_r(void)
        setup secondary cores (MP)
mpc8xx/cpu_init.c:int cpu_init_r (void)
        setup RTCSC
        setup RMDS
ppc4xx/cpu_init.c:int cpu_init_r (void)
        sets edge conditioning circuitry on PPC405GPr

----
diff --git a/arch/powerpc/lib/board.c b/arch/powerpc/lib/board.c
index 2e0749d..aaa5d1e 100644
--- a/arch/powerpc/lib/board.c
+++ b/arch/powerpc/lib/board.c
@@ -754,11 +754,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
 
        WATCHDOG_RESET ();
 
-       /* initialize higher level parts of CPU like time base and timers */
-       cpu_init_r ();
-
-       WATCHDOG_RESET ();
-
 #ifdef CONFIG_SPI
 # if !defined(CONFIG_ENV_IS_IN_EEPROM)
        spi_init_f ();
@@ -786,6 +781,11 @@ void board_init_r (gd_t *id, ulong dest_addr)
        /* relocate environment function pointers etc. */
        env_relocate ();
 
+       /* initialize higher level parts of CPU like time base and timers */
+       cpu_init_r ();
+
+       WATCHDOG_RESET ();
+
        /*
         * Fill in missing fields of bd_info.
         * We do this here, where we have "normal" access to the



More information about the U-Boot mailing list