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
12extern 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
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
59#endif
60