diff options
Diffstat (limited to 'arch/arc/mm/cache.c')
| -rw-r--r-- | arch/arc/mm/cache.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c index f2701c13a66b..cf9619d4efb4 100644 --- a/arch/arc/mm/cache.c +++ b/arch/arc/mm/cache.c @@ -1145,6 +1145,20 @@ noinline void __init arc_ioc_setup(void)  	unsigned int ioc_base, mem_sz;  	/* +	 * If IOC was already enabled (due to bootloader) it technically needs to +	 * be reconfigured with aperture base,size corresponding to Linux memory map +	 * which will certainly be different than uboot's. But disabling and +	 * reenabling IOC when DMA might be potentially active is tricky business. +	 * To avoid random memory issues later, just panic here and ask user to +	 * upgrade bootloader to one which doesn't enable IOC +	 */ +	if (read_aux_reg(ARC_REG_IO_COH_ENABLE) & ARC_IO_COH_ENABLE_BIT) +		panic("IOC already enabled, please upgrade bootloader!\n"); + +	if (!ioc_enable) +		return; + +	/*  	 * As for today we don't support both IOC and ZONE_HIGHMEM enabled  	 * simultaneously. This happens because as of today IOC aperture covers  	 * only ZONE_NORMAL (low mem) and any dma transactions outside this @@ -1187,8 +1201,8 @@ noinline void __init arc_ioc_setup(void)  		panic("IOC Aperture start must be aligned to the size of the aperture");  	write_aux_reg(ARC_REG_IO_COH_AP0_BASE, ioc_base >> 12); -	write_aux_reg(ARC_REG_IO_COH_PARTIAL, 1); -	write_aux_reg(ARC_REG_IO_COH_ENABLE, 1); +	write_aux_reg(ARC_REG_IO_COH_PARTIAL, ARC_IO_COH_PARTIAL_BIT); +	write_aux_reg(ARC_REG_IO_COH_ENABLE, ARC_IO_COH_ENABLE_BIT);  	/* Re-enable L1 dcache */  	__dc_enable(); @@ -1265,7 +1279,7 @@ void __init arc_cache_init_master(void)  	if (is_isa_arcv2() && l2_line_sz && !slc_enable)  		arc_slc_disable(); -	if (is_isa_arcv2() && ioc_enable) +	if (is_isa_arcv2() && ioc_exists)  		arc_ioc_setup();  	if (is_isa_arcv2() && l2_line_sz && slc_enable) {  |