xref: /openbmc/u-boot/arch/arm/cpu/arm926ejs/cache.c (revision 93b283d49f933f95f3a6f40762936f454ac655a8)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22f3427ccSIlya Yanok /*
32f3427ccSIlya Yanok  * (C) Copyright 2011
42f3427ccSIlya Yanok  * Ilya Yanok, EmCraft Systems
52f3427ccSIlya Yanok  */
62f3427ccSIlya Yanok #include <linux/types.h>
72f3427ccSIlya Yanok #include <common.h>
82f3427ccSIlya Yanok 
92f3427ccSIlya Yanok #ifndef CONFIG_SYS_DCACHE_OFF
invalidate_dcache_all(void)102f3427ccSIlya Yanok void invalidate_dcache_all(void)
112f3427ccSIlya Yanok {
12a4aaad70SMarek Vasut 	asm volatile("mcr p15, 0, %0, c7, c6, 0\n" : : "r"(0));
13a4aaad70SMarek Vasut }
14a4aaad70SMarek Vasut 
flush_dcache_all(void)15a4aaad70SMarek Vasut void flush_dcache_all(void)
16a4aaad70SMarek Vasut {
17a4aaad70SMarek Vasut 	asm volatile(
18a4aaad70SMarek Vasut 		"0:"
19a4aaad70SMarek Vasut 		"mrc p15, 0, r15, c7, c14, 3\n"
20a4aaad70SMarek Vasut 		"bne 0b\n"
21a4aaad70SMarek Vasut 		"mcr p15, 0, %0, c7, c10, 4\n"
22a4aaad70SMarek Vasut 		 : : "r"(0) : "memory"
23a4aaad70SMarek Vasut 	);
24a4aaad70SMarek Vasut }
25a4aaad70SMarek Vasut 
invalidate_dcache_range(unsigned long start,unsigned long stop)262f3427ccSIlya Yanok void invalidate_dcache_range(unsigned long start, unsigned long stop)
272f3427ccSIlya Yanok {
28a4aaad70SMarek Vasut 	if (!check_cache_range(start, stop))
29a4aaad70SMarek Vasut 		return;
30a4aaad70SMarek Vasut 
31a4aaad70SMarek Vasut 	while (start < stop) {
32a4aaad70SMarek Vasut 		asm volatile("mcr p15, 0, %0, c7, c6, 1\n" : : "r"(start));
33a4aaad70SMarek Vasut 		start += CONFIG_SYS_CACHELINE_SIZE;
34a4aaad70SMarek Vasut 	}
352f3427ccSIlya Yanok }
362f3427ccSIlya Yanok 
flush_dcache_range(unsigned long start,unsigned long stop)372f3427ccSIlya Yanok void flush_dcache_range(unsigned long start, unsigned long stop)
382f3427ccSIlya Yanok {
39a4aaad70SMarek Vasut 	if (!check_cache_range(start, stop))
40a4aaad70SMarek Vasut 		return;
41a4aaad70SMarek Vasut 
42a4aaad70SMarek Vasut 	while (start < stop) {
43a4aaad70SMarek Vasut 		asm volatile("mcr p15, 0, %0, c7, c14, 1\n" : : "r"(start));
44a4aaad70SMarek Vasut 		start += CONFIG_SYS_CACHELINE_SIZE;
45a4aaad70SMarek Vasut 	}
46a4aaad70SMarek Vasut 
47c6201553SMarek Vasut 	asm volatile("mcr p15, 0, %0, c7, c10, 4\n" : : "r"(0));
48a4aaad70SMarek Vasut }
492f3427ccSIlya Yanok #else /* #ifndef CONFIG_SYS_DCACHE_OFF */
invalidate_dcache_all(void)502f3427ccSIlya Yanok void invalidate_dcache_all(void)
512f3427ccSIlya Yanok {
522f3427ccSIlya Yanok }
532f3427ccSIlya Yanok 
flush_dcache_all(void)542f3427ccSIlya Yanok void flush_dcache_all(void)
552f3427ccSIlya Yanok {
562f3427ccSIlya Yanok }
572f3427ccSIlya Yanok #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
5867953027SMichael Walle 
5967953027SMichael Walle /*
6067953027SMichael Walle  * Stub implementations for l2 cache operations
6167953027SMichael Walle  */
6262e92077SAlbert ARIBAUD 
l2_cache_disable(void)6309e6e0b7SJeroen Hofstee __weak void l2_cache_disable(void) {}
6462e92077SAlbert ARIBAUD 
653a649407STom Rini #if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)
invalidate_l2_cache(void)6662e92077SAlbert ARIBAUD __weak void invalidate_l2_cache(void) {}
6762e92077SAlbert ARIBAUD #endif
68*93b283d4SAdam Ford 
69*93b283d4SAdam Ford #ifndef CONFIG_SYS_ICACHE_OFF
70*93b283d4SAdam Ford /* Invalidate entire I-cache and branch predictor array */
invalidate_icache_all(void)71*93b283d4SAdam Ford void invalidate_icache_all(void)
72*93b283d4SAdam Ford {
73*93b283d4SAdam Ford 	unsigned long i = 0;
74*93b283d4SAdam Ford 
75*93b283d4SAdam Ford 	asm ("mcr p15, 0, %0, c7, c5, 0" : : "r" (i));
76*93b283d4SAdam Ford }
77*93b283d4SAdam Ford #else
invalidate_icache_all(void)78*93b283d4SAdam Ford void invalidate_icache_all(void) {}
79*93b283d4SAdam Ford #endif
80*93b283d4SAdam Ford 
enable_caches(void)81*93b283d4SAdam Ford void enable_caches(void)
82*93b283d4SAdam Ford {
83*93b283d4SAdam Ford #ifndef CONFIG_SYS_ICACHE_OFF
84*93b283d4SAdam Ford 	icache_enable();
85*93b283d4SAdam Ford #endif
86*93b283d4SAdam Ford #ifndef CONFIG_SYS_DCACHE_OFF
87*93b283d4SAdam Ford 	dcache_enable();
88*93b283d4SAdam Ford #endif
89*93b283d4SAdam Ford }
90*93b283d4SAdam Ford 
91