Flush cache after the OS image is loaded into the memory.
authorDiana CRACIUN <Diana.Craciun@freescale.com>
Wed, 31 Aug 2011 02:45:23 +0000 (02:45 +0000)
committerWolfgang Denk <wd@denx.de>
Mon, 5 Sep 2011 14:07:44 +0000 (16:07 +0200)
Since we are loading an executable image into memory we need flush it
out of the cache to possible maintain coherence on CPUs with split
instruction and data caches.  We do this for other executable image
loading command.

On PowerPC once we do this we no longer need to explicitly flush the
dcache on multi-core systems in the BOOTM_STATE_OS_PREP phase.  We now
treat the BOOTM_STATE_OS_PREP as a no-op to maintain backwards
compatibility with the bootm subcommand.

Signed-off-by: James Yang <James.Yang@freescale.com>
Signed-off-by: Diana CRACIUN <Diana.Craciun@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/lib/bootm.c
common/cmd_bootm.c

index 137547451b342a192424477a45faae802146f8d4..8233f1fd7b572e843d14e32e06bb001d8c3feafc 100644 (file)
@@ -174,16 +174,6 @@ void arch_lmb_reserve(struct lmb *lmb)
        return ;
 }
 
-static void boot_prep_linux(void)
-{
-#ifdef CONFIG_MP
-       /* if we are MP make sure to flush the dcache() to any changes are made
-        * visibile to all other cores */
-       flush_dcache();
-#endif
-       return ;
-}
-
 static int boot_cmdline_linux(bootm_headers_t *images)
 {
        ulong of_size = images->ft_len;
@@ -339,17 +329,19 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
                return 0;
        }
 
-       if (flag & BOOTM_STATE_OS_PREP) {
-               boot_prep_linux();
+       /*
+        * We do nothing & report success to retain compatiablity with older
+        * versions of u-boot in which this use to flush the dcache on MP
+        * systems
+        */
+       if (flag & BOOTM_STATE_OS_PREP)
                return 0;
-       }
 
        if (flag & BOOTM_STATE_OS_GO) {
                boot_jump_linux(images);
                return 0;
        }
 
-       boot_prep_linux();
        ret = boot_body_linux(images);
        if (ret)
                return ret;
index 272d879bebc2036a244794e6631da9cf3dc551cc..8909ee703d32db806ba677196788af623cde2bf4 100644 (file)
@@ -432,6 +432,9 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
                printf ("Unimplemented compression type %d\n", comp);
                return BOOTM_ERR_UNIMPLEMENTED;
        }
+
+       flush_cache(load, (*load_end - load) * sizeof(ulong));
+
        puts ("OK\n");
        debug ("   kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end);
        if (boot_progress)