1
2#ifndef __ASM_ARM_CACHETYPE_H
3#define __ASM_ARM_CACHETYPE_H
4
5#define CACHEID_VIVT (1 << 0)
6#define CACHEID_VIPT_NONALIASING (1 << 1)
7#define CACHEID_VIPT_ALIASING (1 << 2)
8#define CACHEID_VIPT (CACHEID_VIPT_ALIASING|CACHEID_VIPT_NONALIASING)
9#define CACHEID_ASID_TAGGED (1 << 3)
10#define CACHEID_VIPT_I_ALIASING (1 << 4)
11#define CACHEID_PIPT (1 << 5)
12
13extern unsigned int cacheid;
14
15#define cache_is_vivt() cacheid_is(CACHEID_VIVT)
16#define cache_is_vipt() cacheid_is(CACHEID_VIPT)
17#define cache_is_vipt_nonaliasing() cacheid_is(CACHEID_VIPT_NONALIASING)
18#define cache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_ALIASING)
19#define icache_is_vivt_asid_tagged() cacheid_is(CACHEID_ASID_TAGGED)
20#define icache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_I_ALIASING)
21#define icache_is_pipt() cacheid_is(CACHEID_PIPT)
22
23
24
25
26
27
28
29#if __LINUX_ARM_ARCH__ >= 7
30#define __CACHEID_ARCH_MIN (CACHEID_VIPT_NONALIASING |\
31 CACHEID_ASID_TAGGED |\
32 CACHEID_VIPT_I_ALIASING |\
33 CACHEID_PIPT)
34#elif __LINUX_ARM_ARCH__ >= 6
35#define __CACHEID_ARCH_MIN (~CACHEID_VIVT)
36#else
37#define __CACHEID_ARCH_MIN (~0)
38#endif
39
40
41
42
43#if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
44#define __CACHEID_ALWAYS (CACHEID_VIVT)
45#define __CACHEID_NEVER (~CACHEID_VIVT)
46#elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
47#define __CACHEID_ALWAYS (0)
48#define __CACHEID_NEVER (CACHEID_VIVT)
49#else
50#define __CACHEID_ALWAYS (0)
51#define __CACHEID_NEVER (0)
52#endif
53
54static inline unsigned int __attribute__((pure)) cacheid_is(unsigned int mask)
55{
56 return (__CACHEID_ALWAYS & mask) |
57 (~__CACHEID_NEVER & __CACHEID_ARCH_MIN & mask & cacheid);
58}
59
60#define CSSELR_ICACHE 1
61#define CSSELR_DCACHE 0
62
63#define CSSELR_L1 (0 << 1)
64#define CSSELR_L2 (1 << 1)
65#define CSSELR_L3 (2 << 1)
66#define CSSELR_L4 (3 << 1)
67#define CSSELR_L5 (4 << 1)
68#define CSSELR_L6 (5 << 1)
69#define CSSELR_L7 (6 << 1)
70
71#ifndef CONFIG_CPU_V7M
72static inline void set_csselr(unsigned int cache_selector)
73{
74 asm volatile("mcr p15, 2, %0, c0, c0, 0" : : "r" (cache_selector));
75}
76
77static inline unsigned int read_ccsidr(void)
78{
79 unsigned int val;
80
81 asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (val));
82 return val;
83}
84#else
85#include <linux/io.h>
86#include "asm/v7m.h"
87
88static inline void set_csselr(unsigned int cache_selector)
89{
90 writel(cache_selector, BASEADDR_V7M_SCB + V7M_SCB_CTR);
91}
92
93static inline unsigned int read_ccsidr(void)
94{
95 return readl(BASEADDR_V7M_SCB + V7M_SCB_CCSIDR);
96}
97#endif
98
99#endif
100