Merge branch 'viafb-next' of git://github.com/schandinat/linux-2.6
[pandora-kernel.git] / arch / arm / include / asm / cachetype.h
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
11 extern 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
50 static 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