diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c index 8233f1f..efcfe84 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; diff --git a/common/image.c b/common/image.c index aacae5a..77ca6e4 100644 --- a/common/image.c +++ b/common/image.c @@ -1104,6 +1104,14 @@ int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, memmove_wd((void *)*initrd_start, (void *)rd_data, rd_len, CHUNKSZ); +#ifdef CONFIG_MP + /* + * Ensure the image is flushed to memory to handle + * AMP boot scenarios in which we might not be + * HW cache coherent + */ + flush_cache((unsigned long)*initrd_start, rd_len); +#endif puts("OK\n"); } } else {