summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorKumar Gala <galak@kernel.crashing.org>2011-12-07 04:42:58 +0000
committerWolfgang Denk <wd@denx.de>2011-12-12 08:17:52 +0100
commit3b2001105fe4d0326f7aa1f83534accfdaec6a01 (patch)
tree070b0f5a1c50a063d4bcd2629891ae57ab92ee1b /arch
parent02ab0970b3ae7b2d535a1231ad259e3114d09772 (diff)
powerpc/bootm: Flush ramdisk and device tree image when booting on MP
We already flush the kernel image after we've loaded it to ensure visiblity to the other cores. We need to do the same thing for the ramdisk and device tree images. In AMP boot scenarios we might not be HW cache coherent with the secondary core that we are loading and setting the ramdisk and device tree up for. Thus we need to ensure we've flushed the regions of memory utilized by ramdisk and device tree so the loadding and any modifications (from decompression or fdt updates) are made visible to the secondary cores. Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/lib/bootm.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c
index 8233f1fd7b..efcfe84ad9 100644
--- a/arch/powerpc/lib/bootm.c
+++ b/arch/powerpc/lib/bootm.c
@@ -174,6 +174,18 @@ void arch_lmb_reserve(struct lmb *lmb)
return ;
}
+static void boot_prep_linux(bootm_headers_t *images)
+{
+#ifdef CONFIG_MP
+ /*
+ * if we are MP make sure to flush the device tree so any changes are
+ * made visibile to all other cores. In AMP boot scenarios the cores
+ * might not be HW cache coherent with each other.
+ */
+ flush_cache((unsigned long)images->ft_addr, images->ft_len);
+#endif
+}
+
static int boot_cmdline_linux(bootm_headers_t *images)
{
ulong of_size = images->ft_len;
@@ -329,19 +341,17 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
return 0;
}
- /*
- * 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)
+ if (flag & BOOTM_STATE_OS_PREP) {
+ boot_prep_linux(images);
return 0;
+ }
if (flag & BOOTM_STATE_OS_GO) {
boot_jump_linux(images);
return 0;
}
+ boot_prep_linux(images);
ret = boot_body_linux(images);
if (ret)
return ret;