1 #ifndef __ASM_ARM_CACHETYPE_H
2 #define __ASM_ARM_CACHETYPE_H
4 #include <asm/cputype.h>
6 #define __cacheid_present(val) (val != read_cpuid_id())
7 #define __cacheid_type_v7(val) ((val & (7 << 29)) == (4 << 29))
9 #define __cacheid_vivt_prev7(val) ((val & (15 << 25)) != (14 << 25))
10 #define __cacheid_vipt_prev7(val) ((val & (15 << 25)) == (14 << 25))
11 #define __cacheid_vipt_nonaliasing_prev7(val) ((val & (15 << 25 | 1 << 23)) == (14 << 25))
12 #define __cacheid_vipt_aliasing_prev7(val) ((val & (15 << 25 | 1 << 23)) == (14 << 25 | 1 << 23))
14 #define __cacheid_vivt(val) (__cacheid_type_v7(val) ? 0 : __cacheid_vivt_prev7(val))
15 #define __cacheid_vipt(val) (__cacheid_type_v7(val) ? 1 : __cacheid_vipt_prev7(val))
16 #define __cacheid_vipt_nonaliasing(val) (__cacheid_type_v7(val) ? 1 : __cacheid_vipt_nonaliasing_prev7(val))
17 #define __cacheid_vipt_aliasing(val) (__cacheid_type_v7(val) ? 0 : __cacheid_vipt_aliasing_prev7(val))
18 #define __cacheid_vivt_asid_tagged_instr(val) (__cacheid_type_v7(val) ? ((val & (3 << 14)) == (1 << 14)) : 0)
20 #if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
24 #define cache_is_vivt() 1
25 #define cache_is_vipt() 0
26 #define cache_is_vipt_nonaliasing() 0
27 #define cache_is_vipt_aliasing() 0
28 #define icache_is_vivt_asid_tagged() 0
30 #elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
34 #define cache_is_vivt() 0
35 #define cache_is_vipt() 1
36 #define cache_is_vipt_nonaliasing() \
38 unsigned int __val = read_cpuid_cachetype(); \
39 __cacheid_vipt_nonaliasing(__val); \
42 #define cache_is_vipt_aliasing() \
44 unsigned int __val = read_cpuid_cachetype(); \
45 __cacheid_vipt_aliasing(__val); \
48 #define icache_is_vivt_asid_tagged() \
50 unsigned int __val = read_cpuid_cachetype(); \
51 __cacheid_vivt_asid_tagged_instr(__val); \
56 * VIVT or VIPT caches. Note that this is unreliable since ARM926
57 * and V6 CPUs satisfy the "(val & (15 << 25)) == (14 << 25)" test.
58 * There's no way to tell from the CacheType register what type (!)
61 #define cache_is_vivt() \
63 unsigned int __val = read_cpuid_cachetype(); \
64 (!__cacheid_present(__val)) || __cacheid_vivt(__val); \
67 #define cache_is_vipt() \
69 unsigned int __val = read_cpuid_cachetype(); \
70 __cacheid_present(__val) && __cacheid_vipt(__val); \
73 #define cache_is_vipt_nonaliasing() \
75 unsigned int __val = read_cpuid_cachetype(); \
76 __cacheid_present(__val) && \
77 __cacheid_vipt_nonaliasing(__val); \
80 #define cache_is_vipt_aliasing() \
82 unsigned int __val = read_cpuid_cachetype(); \
83 __cacheid_present(__val) && \
84 __cacheid_vipt_aliasing(__val); \
87 #define icache_is_vivt_asid_tagged() \
89 unsigned int __val = read_cpuid_cachetype(); \
90 __cacheid_present(__val) && \
91 __cacheid_vivt_asid_tagged_instr(__val); \