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