blob: d3a4c2cb9f2f662f5348175baa2a03995c66835d [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)
Russell King46097c72008-08-10 18:10:19 +01009
Russell Kingc0e95872008-09-25 15:35:28 +010010extern unsigned int cacheid;
Russell King46097c72008-08-10 18:10:19 +010011
Russell Kingc0e95872008-09-25 15:35:28 +010012#define cache_is_vivt() cacheid_is(CACHEID_VIVT)
13#define cache_is_vipt() cacheid_is(CACHEID_VIPT)
14#define cache_is_vipt_nonaliasing() cacheid_is(CACHEID_VIPT_NONALIASING)
15#define cache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_ALIASING)
16#define icache_is_vivt_asid_tagged() cacheid_is(CACHEID_ASID_TAGGED)
Russell King46097c72008-08-10 18:10:19 +010017
Russell King46097c72008-08-10 18:10:19 +010018/*
Russell Kingc0e95872008-09-25 15:35:28 +010019 * __LINUX_ARM_ARCH__ is the minimum supported CPU architecture
20 * Mask out support which will never be present on newer CPUs.
21 * - v6+ is never VIVT
22 * - v7+ VIPT never aliases
Russell King46097c72008-08-10 18:10:19 +010023 */
Russell Kingc0e95872008-09-25 15:35:28 +010024#if __LINUX_ARM_ARCH__ >= 7
25#define __CACHEID_ARCH_MIN (CACHEID_VIPT_NONALIASING | CACHEID_ASID_TAGGED)
26#elif __LINUX_ARM_ARCH__ >= 6
27#define __CACHEID_ARCH_MIN (~CACHEID_VIVT)
Russell King46097c72008-08-10 18:10:19 +010028#else
Russell Kingc0e95872008-09-25 15:35:28 +010029#define __CACHEID_ARCH_MIN (~0)
Russell King46097c72008-08-10 18:10:19 +010030#endif
31
Russell Kingc0e95872008-09-25 15:35:28 +010032/*
33 * Mask out support which isn't configured
34 */
35#if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
36#define __CACHEID_ALWAYS (CACHEID_VIVT)
37#define __CACHEID_NEVER (~CACHEID_VIVT)
38#elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
39#define __CACHEID_ALWAYS (0)
40#define __CACHEID_NEVER (CACHEID_VIVT)
41#else
42#define __CACHEID_ALWAYS (0)
43#define __CACHEID_NEVER (0)
44#endif
45
46static inline unsigned int __attribute__((pure)) cacheid_is(unsigned int mask)
47{
48 return (__CACHEID_ALWAYS & mask) |
49 (~__CACHEID_NEVER & __CACHEID_ARCH_MIN & mask & cacheid);
50}
51
Russell King46097c72008-08-10 18:10:19 +010052#endif