diff options
Diffstat (limited to 'arch/arm/kernel/setup.c')
| -rw-r--r-- | arch/arm/kernel/setup.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 93e39a3d2c1..3fe93f75b55 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -265,6 +265,10 @@ static int cpu_has_aliasing_icache(unsigned int arch)  	int aliasing_icache;  	unsigned int id_reg, num_sets, line_size; +	/* PIPT caches never alias. */ +	if (icache_is_pipt()) +		return 0; +  	/* arch specifies the register format */  	switch (arch) {  	case CPU_ARCH_ARMv7: @@ -299,8 +303,14 @@ static void __init cacheid_init(void)  			/* ARMv7 register format */  			arch = CPU_ARCH_ARMv7;  			cacheid = CACHEID_VIPT_NONALIASING; -			if ((cachetype & (3 << 14)) == 1 << 14) +			switch (cachetype & (3 << 14)) { +			case (1 << 14):  				cacheid |= CACHEID_ASID_TAGGED; +				break; +			case (3 << 14): +				cacheid |= CACHEID_PIPT; +				break; +			}  		} else {  			arch = CPU_ARCH_ARMv6;  			if (cachetype & (1 << 23)) @@ -317,10 +327,11 @@ static void __init cacheid_init(void)  	printk("CPU: %s data cache, %s instruction cache\n",  		cache_is_vivt() ? "VIVT" :  		cache_is_vipt_aliasing() ? "VIPT aliasing" : -		cache_is_vipt_nonaliasing() ? "VIPT nonaliasing" : "unknown", +		cache_is_vipt_nonaliasing() ? "PIPT / VIPT nonaliasing" : "unknown",  		cache_is_vivt() ? "VIVT" :  		icache_is_vivt_asid_tagged() ? "VIVT ASID tagged" :  		icache_is_vipt_aliasing() ? "VIPT aliasing" : +		icache_is_pipt() ? "PIPT" :  		cache_is_vipt_nonaliasing() ? "VIPT nonaliasing" : "unknown");  }  |