xref: /openbmc/linux/arch/arm/include/asm/cachetype.h (revision b2441318)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
246097c7dSRussell King #ifndef __ASM_ARM_CACHETYPE_H
346097c7dSRussell King #define __ASM_ARM_CACHETYPE_H
446097c7dSRussell King 
5c0e95878SRussell King #define CACHEID_VIVT			(1 << 0)
6c0e95878SRussell King #define CACHEID_VIPT_NONALIASING	(1 << 1)
7c0e95878SRussell King #define CACHEID_VIPT_ALIASING		(1 << 2)
8c0e95878SRussell King #define CACHEID_VIPT			(CACHEID_VIPT_ALIASING|CACHEID_VIPT_NONALIASING)
9c0e95878SRussell King #define CACHEID_ASID_TAGGED		(1 << 3)
108925ec4cSWill Deacon #define CACHEID_VIPT_I_ALIASING		(1 << 4)
117f94e9ccSWill Deacon #define CACHEID_PIPT			(1 << 5)
1246097c7dSRussell King 
13c0e95878SRussell King extern unsigned int cacheid;
1446097c7dSRussell King 
15c0e95878SRussell King #define cache_is_vivt()			cacheid_is(CACHEID_VIVT)
16c0e95878SRussell King #define cache_is_vipt()			cacheid_is(CACHEID_VIPT)
17c0e95878SRussell King #define cache_is_vipt_nonaliasing()	cacheid_is(CACHEID_VIPT_NONALIASING)
18c0e95878SRussell King #define cache_is_vipt_aliasing()	cacheid_is(CACHEID_VIPT_ALIASING)
19c0e95878SRussell King #define icache_is_vivt_asid_tagged()	cacheid_is(CACHEID_ASID_TAGGED)
208925ec4cSWill Deacon #define icache_is_vipt_aliasing()	cacheid_is(CACHEID_VIPT_I_ALIASING)
217f94e9ccSWill Deacon #define icache_is_pipt()		cacheid_is(CACHEID_PIPT)
2246097c7dSRussell King 
2346097c7dSRussell King /*
24c0e95878SRussell King  * __LINUX_ARM_ARCH__ is the minimum supported CPU architecture
25c0e95878SRussell King  * Mask out support which will never be present on newer CPUs.
26c0e95878SRussell King  * - v6+ is never VIVT
278925ec4cSWill Deacon  * - v7+ VIPT never aliases on D-side
2846097c7dSRussell King  */
29c0e95878SRussell King #if __LINUX_ARM_ARCH__ >= 7
308925ec4cSWill Deacon #define __CACHEID_ARCH_MIN	(CACHEID_VIPT_NONALIASING |\
318925ec4cSWill Deacon 				 CACHEID_ASID_TAGGED |\
327f94e9ccSWill Deacon 				 CACHEID_VIPT_I_ALIASING |\
337f94e9ccSWill Deacon 				 CACHEID_PIPT)
34c0e95878SRussell King #elif __LINUX_ARM_ARCH__ >= 6
35c0e95878SRussell King #define	__CACHEID_ARCH_MIN	(~CACHEID_VIVT)
3646097c7dSRussell King #else
37c0e95878SRussell King #define __CACHEID_ARCH_MIN	(~0)
3846097c7dSRussell King #endif
3946097c7dSRussell King 
40c0e95878SRussell King /*
41c0e95878SRussell King  * Mask out support which isn't configured
42c0e95878SRussell King  */
43c0e95878SRussell King #if defined(CONFIG_CPU_CACHE_VIVT) && !defined(CONFIG_CPU_CACHE_VIPT)
44c0e95878SRussell King #define __CACHEID_ALWAYS	(CACHEID_VIVT)
45c0e95878SRussell King #define __CACHEID_NEVER		(~CACHEID_VIVT)
46c0e95878SRussell King #elif !defined(CONFIG_CPU_CACHE_VIVT) && defined(CONFIG_CPU_CACHE_VIPT)
47c0e95878SRussell King #define __CACHEID_ALWAYS	(0)
48c0e95878SRussell King #define __CACHEID_NEVER		(CACHEID_VIVT)
49c0e95878SRussell King #else
50c0e95878SRussell King #define __CACHEID_ALWAYS	(0)
51c0e95878SRussell King #define __CACHEID_NEVER		(0)
52c0e95878SRussell King #endif
53c0e95878SRussell King 
cacheid_is(unsigned int mask)54c0e95878SRussell King static inline unsigned int __attribute__((pure)) cacheid_is(unsigned int mask)
55c0e95878SRussell King {
56c0e95878SRussell King 	return (__CACHEID_ALWAYS & mask) |
57c0e95878SRussell King 	       (~__CACHEID_NEVER & __CACHEID_ARCH_MIN & mask & cacheid);
58c0e95878SRussell King }
59c0e95878SRussell King 
6026150aa9SJonathan Austin #define CSSELR_ICACHE	1
6126150aa9SJonathan Austin #define CSSELR_DCACHE	0
6226150aa9SJonathan Austin 
6326150aa9SJonathan Austin #define CSSELR_L1	(0 << 1)
6426150aa9SJonathan Austin #define CSSELR_L2	(1 << 1)
6526150aa9SJonathan Austin #define CSSELR_L3	(2 << 1)
6626150aa9SJonathan Austin #define CSSELR_L4	(3 << 1)
6726150aa9SJonathan Austin #define CSSELR_L5	(4 << 1)
6826150aa9SJonathan Austin #define CSSELR_L6	(5 << 1)
6926150aa9SJonathan Austin #define CSSELR_L7	(6 << 1)
7026150aa9SJonathan Austin 
71f5a5c89eSJonathan Austin #ifndef CONFIG_CPU_V7M
set_csselr(unsigned int cache_selector)7226150aa9SJonathan Austin static inline void set_csselr(unsigned int cache_selector)
7326150aa9SJonathan Austin {
7426150aa9SJonathan Austin 	asm volatile("mcr p15, 2, %0, c0, c0, 0" : : "r" (cache_selector));
7526150aa9SJonathan Austin }
7626150aa9SJonathan Austin 
read_ccsidr(void)7726150aa9SJonathan Austin static inline unsigned int read_ccsidr(void)
7826150aa9SJonathan Austin {
7926150aa9SJonathan Austin 	unsigned int val;
8026150aa9SJonathan Austin 
8126150aa9SJonathan Austin 	asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (val));
8226150aa9SJonathan Austin 	return val;
8326150aa9SJonathan Austin }
84f5a5c89eSJonathan Austin #else /* CONFIG_CPU_V7M */
85f5a5c89eSJonathan Austin #include <linux/io.h>
86f5a5c89eSJonathan Austin #include "asm/v7m.h"
87f5a5c89eSJonathan Austin 
set_csselr(unsigned int cache_selector)88f5a5c89eSJonathan Austin static inline void set_csselr(unsigned int cache_selector)
89f5a5c89eSJonathan Austin {
90f5a5c89eSJonathan Austin 	writel(cache_selector, BASEADDR_V7M_SCB + V7M_SCB_CTR);
91f5a5c89eSJonathan Austin }
92f5a5c89eSJonathan Austin 
read_ccsidr(void)93f5a5c89eSJonathan Austin static inline unsigned int read_ccsidr(void)
94f5a5c89eSJonathan Austin {
95f5a5c89eSJonathan Austin 	return readl(BASEADDR_V7M_SCB + V7M_SCB_CCSIDR);
96f5a5c89eSJonathan Austin }
97f5a5c89eSJonathan Austin #endif
9826150aa9SJonathan Austin 
9946097c7dSRussell King #endif
100