diff options
| -rw-r--r-- | arch/powerpc/lib/bootm.c | 22 | ||||
| -rw-r--r-- | common/image.c | 8 | 
2 files changed, 24 insertions, 6 deletions
| diff --git a/arch/powerpc/lib/bootm.c b/arch/powerpc/lib/bootm.c index 8233f1fd7..efcfe84ad 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 aacae5ac5..77ca6e470 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 { |