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