xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm926ejs/cache.c (revision 3a649407a49b041ceb826d55b5919dc8297f8965)
12f3427ccSIlya Yanok /*
22f3427ccSIlya Yanok  * (C) Copyright 2011
32f3427ccSIlya Yanok  * Ilya Yanok, EmCraft Systems
42f3427ccSIlya Yanok  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
62f3427ccSIlya Yanok  */
72f3427ccSIlya Yanok #include <linux/types.h>
82f3427ccSIlya Yanok #include <common.h>
92f3427ccSIlya Yanok 
102f3427ccSIlya Yanok #ifndef CONFIG_SYS_DCACHE_OFF
invalidate_dcache_all(void)112f3427ccSIlya Yanok void invalidate_dcache_all(void)
122f3427ccSIlya Yanok {
13a4aaad70SMarek Vasut 	asm volatile("mcr p15, 0, %0, c7, c6, 0\n" : : "r"(0));
14a4aaad70SMarek Vasut }
15a4aaad70SMarek Vasut 
flush_dcache_all(void)16a4aaad70SMarek Vasut void flush_dcache_all(void)
17a4aaad70SMarek Vasut {
18a4aaad70SMarek Vasut 	asm volatile(
19a4aaad70SMarek Vasut 		"0:"
20a4aaad70SMarek Vasut 		"mrc p15, 0, r15, c7, c14, 3\n"
21a4aaad70SMarek Vasut 		"bne 0b\n"
22a4aaad70SMarek Vasut 		"mcr p15, 0, %0, c7, c10, 4\n"
23a4aaad70SMarek Vasut 		 : : "r"(0) : "memory"
24a4aaad70SMarek Vasut 	);
25a4aaad70SMarek Vasut }
26a4aaad70SMarek Vasut 
invalidate_dcache_range(unsigned long start,unsigned long stop)272f3427ccSIlya Yanok void invalidate_dcache_range(unsigned long start, unsigned long stop)
282f3427ccSIlya Yanok {
29a4aaad70SMarek Vasut 	if (!check_cache_range(start, stop))
30a4aaad70SMarek Vasut 		return;
31a4aaad70SMarek Vasut 
32a4aaad70SMarek Vasut 	while (start < stop) {
33a4aaad70SMarek Vasut 		asm volatile("mcr p15, 0, %0, c7, c6, 1\n" : : "r"(start));
34a4aaad70SMarek Vasut 		start += CONFIG_SYS_CACHELINE_SIZE;
35a4aaad70SMarek Vasut 	}
362f3427ccSIlya Yanok }
372f3427ccSIlya Yanok 
flush_dcache_range(unsigned long start,unsigned long stop)382f3427ccSIlya Yanok void flush_dcache_range(unsigned long start, unsigned long stop)
392f3427ccSIlya Yanok {
40a4aaad70SMarek Vasut 	if (!check_cache_range(start, stop))
41a4aaad70SMarek Vasut 		return;
42a4aaad70SMarek Vasut 
43a4aaad70SMarek Vasut 	while (start < stop) {
44a4aaad70SMarek Vasut 		asm volatile("mcr p15, 0, %0, c7, c14, 1\n" : : "r"(start));
45a4aaad70SMarek Vasut 		start += CONFIG_SYS_CACHELINE_SIZE;
46a4aaad70SMarek Vasut 	}
47a4aaad70SMarek Vasut 
48c6201553SMarek Vasut 	asm volatile("mcr p15, 0, %0, c7, c10, 4\n" : : "r"(0));
49a4aaad70SMarek Vasut }
502f3427ccSIlya Yanok #else /* #ifndef CONFIG_SYS_DCACHE_OFF */
invalidate_dcache_all(void)512f3427ccSIlya Yanok void invalidate_dcache_all(void)
522f3427ccSIlya Yanok {
532f3427ccSIlya Yanok }
542f3427ccSIlya Yanok 
flush_dcache_all(void)552f3427ccSIlya Yanok void flush_dcache_all(void)
562f3427ccSIlya Yanok {
572f3427ccSIlya Yanok }
582f3427ccSIlya Yanok #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
5967953027SMichael Walle 
6067953027SMichael Walle /*
6167953027SMichael Walle  * Stub implementations for l2 cache operations
6267953027SMichael Walle  */
6362e92077SAlbert ARIBAUD 
l2_cache_disable(void)6409e6e0b7SJeroen Hofstee __weak void l2_cache_disable(void) {}
6562e92077SAlbert ARIBAUD 
66*3a649407STom Rini #if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)
invalidate_l2_cache(void)6762e92077SAlbert ARIBAUD __weak void invalidate_l2_cache(void) {}
6862e92077SAlbert ARIBAUD #endif
69