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