blob: 7ea78144ae22ec61ae7623b07c9d22f08ef69e87 [file] [log] [blame]
Russell King46097c72008-08-10 18:10:19 +01001#ifndef __ASM_ARM_CACHETYPE_H
2#define __ASM_ARM_CACHETYPE_H
3
Russell Kingc0e95872008-09-25 15:35:28 +01004#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 Deacon8925ec42010-09-13 16:18:30 +01009#define CACHEID_VIPT_I_ALIASING (1 << 4)
Will Deacon7f94e9c2011-08-23 22:22:11 +010010#define CACHEID_PIPT (1 << 5)
Russell King46097c72008-08-10 18:10:19 +010011
Russell Kingc0e95872008-09-25 15:35:28 +010012extern unsigned int cacheid;
Russell King46097c72008-08-10 18:10:19 +010013
Russell Kingc0e95872008-09-25 15:35:28 +010014#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 Deacon8925ec42010-09-13 16:18:30 +010019#define icache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_I_ALIASING)
Will Deacon7f94e9c2011-08-23 22:22:11 +010020#define icache_is_pipt() cacheid_is(CACHEID_PIPT)
Russell King46097c72008-08-10 18:10:19 +010021
Russell King46097c72008-08-10 18:10:19 +010022/*
Russell Kingc0e95872008-09-25 15:35:28 +010023 * __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 Deacon8925ec42010-09-13 16:18:30 +010026 * - v7+ VIPT never aliases on D-side
Russell King46097c72008-08-10 18:10:19 +010027 */
Russell Kingc0e95872008-09-25 15:35:28 +010028#if __LINUX_ARM_ARCH__ >= 7
Will Deacon8925ec42010-09-13 16:18:30 +010029#define __CACHEID_ARCH_MIN (CACHEID_VIPT_NONALIASING |\
30 CACHEID_ASID_TAGGED |\
Will Deacon7f94e9c2011-08-23 22:22:11 +010031 CACHEID_VIPT_I_ALIASING |\
32 CACHEID_PIPT)
Russell Kingc0e95872008-09-25 15:35:28 +010033#elif __LINUX_ARM_ARCH__ >= 6
34#define __CACHEID_ARCH_MIN (~CACHEID_VIVT)
Russell King46097c72008-08-10 18:10:19 +010035#else
Russell Kingc0e95872008-09-25 15:35:28 +010036#define __CACHEID_ARCH_MIN (~0)
Russell King46097c72008-08-10 18:10:19 +010037#endif
38
Russell Kingc0e95872008-09-25 15:35:28 +010039/*
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
53static 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 King46097c72008-08-10 18:10:19 +010059#endif