1#ifndef __ASM_ARM_CACHETYPE_H 2#define __ASM_ARM_CACHETYPE_H 3 4#define CACHEID_VIVT (1 << 0) 5#define CACHEID_VIPT_NONALIASING (1 << 1) 6#define CACHEID_VIPT_ALIASING (1 << 2) 7#define CACHEID_VIPT (CACHEID_VIPT_ALIASING|CACHEID_VIPT_NONALIASING) 8#define CACHEID_ASID_TAGGED (1 << 3) 9#define CACHEID_VIPT_I_ALIASING (1 << 4) 10 11extern unsigned int cacheid; 12 13#define cache_is_vivt() cacheid_is(CACHEID_VIVT) 14#define cache_is_vipt() cacheid_is(CACHEID_VIPT) 15#define cache_is_vipt_nonaliasing() cacheid_is(CACHEID_VIPT_NONALIASING) 16#define cache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_ALIASING) 17#define icache_is_vivt_asid_tagged() cacheid_is(CACHEID_ASID_TAGGED) 18#define icache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_I_ALIASING) 19 20/* 21 * __LINUX_ARM_ARCH__ is the minimum supported CPU architecture 22 * Mask out support which will never be present on newer CPUs. 23 * - v6+ is never VIVT 24 * - v7+ VIPT never aliases on D-side 25 */ 26#if __LINUX_ARM_ARCH__ >= 7 27#define __CACHEID_ARCH_MIN (CACHEID_VIPT_NONALIASING |\ 28 CACHEID_ASID_TAGGED |\ 29 CACHEID_VIPT_I_ALIASING) 30#elif __LINUX_ARM_ARCH__ >= 6 31#define __CACHEID_ARCH_MIN (~CACHEID_VIVT) 32#else 33#define __CACHEID_ARCH_MIN (~0) 34#endif 35 36/* 37 * Mask out support which isn't configured 38 */ 39#if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT) 40#define __CACHEID_ALWAYS (CACHEID_VIVT) 41#define __CACHEID_NEVER (~CACHEID_VIVT) 42#elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT) 43#define __CACHEID_ALWAYS (0) 44#define __CACHEID_NEVER (CACHEID_VIVT) 45#else 46#define __CACHEID_ALWAYS (0) 47#define __CACHEID_NEVER (0) 48#endif 49 50static inline unsigned int __attribute__((pure)) cacheid_is(unsigned int mask) 51{ 52 return (__CACHEID_ALWAYS & mask) | 53 (~__CACHEID_NEVER & __CACHEID_ARCH_MIN & mask & cacheid); 54} 55 56#endif 57