xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm926ejs/cache.c (revision 09e6e0b7decf8c16bc59e5899fd91e4beac3e9fb)
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
11a4aaad70SMarek Vasut 
12a4aaad70SMarek Vasut #ifndef CONFIG_SYS_CACHELINE_SIZE
13a4aaad70SMarek Vasut #define CONFIG_SYS_CACHELINE_SIZE	32
14a4aaad70SMarek Vasut #endif
152f3427ccSIlya Yanok 
162f3427ccSIlya Yanok void invalidate_dcache_all(void)
172f3427ccSIlya Yanok {
18a4aaad70SMarek Vasut 	asm volatile("mcr p15, 0, %0, c7, c6, 0\n" : : "r"(0));
19a4aaad70SMarek Vasut }
20a4aaad70SMarek Vasut 
21a4aaad70SMarek Vasut void flush_dcache_all(void)
22a4aaad70SMarek Vasut {
23a4aaad70SMarek Vasut 	asm volatile(
24a4aaad70SMarek Vasut 		"0:"
25a4aaad70SMarek Vasut 		"mrc p15, 0, r15, c7, c14, 3\n"
26a4aaad70SMarek Vasut 		"bne 0b\n"
27a4aaad70SMarek Vasut 		"mcr p15, 0, %0, c7, c10, 4\n"
28a4aaad70SMarek Vasut 		 : : "r"(0) : "memory"
29a4aaad70SMarek Vasut 	);
30a4aaad70SMarek Vasut }
31a4aaad70SMarek Vasut 
32a4aaad70SMarek Vasut static int check_cache_range(unsigned long start, unsigned long stop)
33a4aaad70SMarek Vasut {
34a4aaad70SMarek Vasut 	int ok = 1;
35a4aaad70SMarek Vasut 
36a4aaad70SMarek Vasut 	if (start & (CONFIG_SYS_CACHELINE_SIZE - 1))
37a4aaad70SMarek Vasut 		ok = 0;
38a4aaad70SMarek Vasut 
39a4aaad70SMarek Vasut 	if (stop & (CONFIG_SYS_CACHELINE_SIZE - 1))
40a4aaad70SMarek Vasut 		ok = 0;
41a4aaad70SMarek Vasut 
42a4aaad70SMarek Vasut 	if (!ok)
43c8d9ceafSStefano Babic 		debug("CACHE: Misaligned operation at range [%08lx, %08lx]\n",
44a4aaad70SMarek Vasut 			start, stop);
45a4aaad70SMarek Vasut 
46a4aaad70SMarek Vasut 	return ok;
472f3427ccSIlya Yanok }
482f3427ccSIlya Yanok 
492f3427ccSIlya Yanok void invalidate_dcache_range(unsigned long start, unsigned long stop)
502f3427ccSIlya Yanok {
51a4aaad70SMarek Vasut 	if (!check_cache_range(start, stop))
52a4aaad70SMarek Vasut 		return;
53a4aaad70SMarek Vasut 
54a4aaad70SMarek Vasut 	while (start < stop) {
55a4aaad70SMarek Vasut 		asm volatile("mcr p15, 0, %0, c7, c6, 1\n" : : "r"(start));
56a4aaad70SMarek Vasut 		start += CONFIG_SYS_CACHELINE_SIZE;
57a4aaad70SMarek Vasut 	}
582f3427ccSIlya Yanok }
592f3427ccSIlya Yanok 
602f3427ccSIlya Yanok void flush_dcache_range(unsigned long start, unsigned long stop)
612f3427ccSIlya Yanok {
62a4aaad70SMarek Vasut 	if (!check_cache_range(start, stop))
63a4aaad70SMarek Vasut 		return;
64a4aaad70SMarek Vasut 
65a4aaad70SMarek Vasut 	while (start < stop) {
66a4aaad70SMarek Vasut 		asm volatile("mcr p15, 0, %0, c7, c14, 1\n" : : "r"(start));
67a4aaad70SMarek Vasut 		start += CONFIG_SYS_CACHELINE_SIZE;
68a4aaad70SMarek Vasut 	}
69a4aaad70SMarek Vasut 
70c6201553SMarek Vasut 	asm volatile("mcr p15, 0, %0, c7, c10, 4\n" : : "r"(0));
71a4aaad70SMarek Vasut }
72a4aaad70SMarek Vasut 
73a4aaad70SMarek Vasut void flush_cache(unsigned long start, unsigned long size)
74a4aaad70SMarek Vasut {
75a4aaad70SMarek Vasut 	flush_dcache_range(start, start + size);
762f3427ccSIlya Yanok }
772f3427ccSIlya Yanok #else /* #ifndef CONFIG_SYS_DCACHE_OFF */
782f3427ccSIlya Yanok void invalidate_dcache_all(void)
792f3427ccSIlya Yanok {
802f3427ccSIlya Yanok }
812f3427ccSIlya Yanok 
822f3427ccSIlya Yanok void flush_dcache_all(void)
832f3427ccSIlya Yanok {
842f3427ccSIlya Yanok }
852f3427ccSIlya Yanok 
862f3427ccSIlya Yanok void invalidate_dcache_range(unsigned long start, unsigned long stop)
872f3427ccSIlya Yanok {
882f3427ccSIlya Yanok }
892f3427ccSIlya Yanok 
902f3427ccSIlya Yanok void flush_dcache_range(unsigned long start, unsigned long stop)
912f3427ccSIlya Yanok {
922f3427ccSIlya Yanok }
932f3427ccSIlya Yanok 
942f3427ccSIlya Yanok void flush_cache(unsigned long start, unsigned long size)
952f3427ccSIlya Yanok {
962f3427ccSIlya Yanok }
972f3427ccSIlya Yanok #endif /* #ifndef CONFIG_SYS_DCACHE_OFF */
9867953027SMichael Walle 
9967953027SMichael Walle /*
10067953027SMichael Walle  * Stub implementations for l2 cache operations
10167953027SMichael Walle  */
102*09e6e0b7SJeroen Hofstee __weak void l2_cache_disable(void) {}
103