Branch data Line data Source code
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 : : #define CACHEID_PIPT (1 << 5)
11 : :
12 : : extern unsigned int cacheid;
13 : :
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)
19 : : #define icache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_I_ALIASING)
20 : : #define icache_is_pipt() cacheid_is(CACHEID_PIPT)
21 : :
22 : : /*
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
26 : : * - v7+ VIPT never aliases on D-side
27 : : */
28 : : #if __LINUX_ARM_ARCH__ >= 7
29 : : #define __CACHEID_ARCH_MIN (CACHEID_VIPT_NONALIASING |\
30 : : CACHEID_ASID_TAGGED |\
31 : : CACHEID_VIPT_I_ALIASING |\
32 : : CACHEID_PIPT)
33 : : #elif __LINUX_ARM_ARCH__ >= 6
34 : : #define __CACHEID_ARCH_MIN (~CACHEID_VIVT)
35 : : #else
36 : : #define __CACHEID_ARCH_MIN (~0)
37 : : #endif
38 : :
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 : 275312 : return (__CACHEID_ALWAYS & mask) |
56 : 275312 : (~__CACHEID_NEVER & __CACHEID_ARCH_MIN & mask & cacheid);
57 : : }
58 : :
59 : : #endif
|