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