1ea0364f1SPeter Tyser /* 2ea0364f1SPeter Tyser * (C) Copyright 2002 3ea0364f1SPeter Tyser * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4ea0364f1SPeter Tyser * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6ea0364f1SPeter Tyser */ 7ea0364f1SPeter Tyser 8ea0364f1SPeter Tyser #include <common.h> 9ea0364f1SPeter Tyser #include <asm/immap.h> 10ea0364f1SPeter Tyser #include <asm/cache.h> 11ea0364f1SPeter Tyser 12ea0364f1SPeter Tyser volatile int *cf_icache_status = (int *)ICACHE_STATUS; 13ea0364f1SPeter Tyser volatile int *cf_dcache_status = (int *)DCACHE_STATUS; 14ea0364f1SPeter Tyser 15ea0364f1SPeter Tyser void flush_cache(ulong start_addr, ulong size) 16ea0364f1SPeter Tyser { 17ea0364f1SPeter Tyser /* Must be implemented for all M68k processors with copy-back data cache */ 18ea0364f1SPeter Tyser } 19ea0364f1SPeter Tyser 20ea0364f1SPeter Tyser int icache_status(void) 21ea0364f1SPeter Tyser { 22ea0364f1SPeter Tyser return *cf_icache_status; 23ea0364f1SPeter Tyser } 24ea0364f1SPeter Tyser 25ea0364f1SPeter Tyser int dcache_status(void) 26ea0364f1SPeter Tyser { 27ea0364f1SPeter Tyser return *cf_dcache_status; 28ea0364f1SPeter Tyser } 29ea0364f1SPeter Tyser 30ea0364f1SPeter Tyser void icache_enable(void) 31ea0364f1SPeter Tyser { 32ea0364f1SPeter Tyser icache_invalid(); 33ea0364f1SPeter Tyser 34ea0364f1SPeter Tyser *cf_icache_status = 1; 35ea0364f1SPeter Tyser 36*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E) 37ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(CONFIG_SYS_CACHE_ACR2)); 38ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(CONFIG_SYS_CACHE_ACR3)); 39*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E) 40ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr6"::"r"(CONFIG_SYS_CACHE_ACR6)); 41ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr7"::"r"(CONFIG_SYS_CACHE_ACR7)); 42*c533cfcdSAngelo Dureghello #endif 43ea0364f1SPeter Tyser #else 44ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0)); 45ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1)); 46ea0364f1SPeter Tyser #endif 47ea0364f1SPeter Tyser 48ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_ICACR)); 49ea0364f1SPeter Tyser } 50ea0364f1SPeter Tyser 51ea0364f1SPeter Tyser void icache_disable(void) 52ea0364f1SPeter Tyser { 53ea0364f1SPeter Tyser u32 temp = 0; 54ea0364f1SPeter Tyser 55ea0364f1SPeter Tyser *cf_icache_status = 0; 56ea0364f1SPeter Tyser icache_invalid(); 57ea0364f1SPeter Tyser 58*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E) 59ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(temp)); 60ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(temp)); 61*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E) 62ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr6"::"r"(temp)); 63ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr7"::"r"(temp)); 64*c533cfcdSAngelo Dureghello #endif 65ea0364f1SPeter Tyser #else 66ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp)); 67ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp)); 68ea0364f1SPeter Tyser #endif 69ea0364f1SPeter Tyser } 70ea0364f1SPeter Tyser 71ea0364f1SPeter Tyser void icache_invalid(void) 72ea0364f1SPeter Tyser { 73ea0364f1SPeter Tyser u32 temp; 74ea0364f1SPeter Tyser 75ea0364f1SPeter Tyser temp = CONFIG_SYS_ICACHE_INV; 76ea0364f1SPeter Tyser if (*cf_icache_status) 77ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR; 78ea0364f1SPeter Tyser 79ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 80ea0364f1SPeter Tyser } 81ea0364f1SPeter Tyser 82ea0364f1SPeter Tyser /* 83ea0364f1SPeter Tyser * data cache only for ColdFire V4 such as MCF547x_8x, MCF5445x 84ea0364f1SPeter Tyser * the dcache will be dummy in ColdFire V2 and V3 85ea0364f1SPeter Tyser */ 86ea0364f1SPeter Tyser void dcache_enable(void) 87ea0364f1SPeter Tyser { 88ea0364f1SPeter Tyser dcache_invalid(); 89ea0364f1SPeter Tyser *cf_dcache_status = 1; 90ea0364f1SPeter Tyser 91*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E) 92ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0)); 93ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1)); 94*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E) 95ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(CONFIG_SYS_CACHE_ACR4)); 96ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(CONFIG_SYS_CACHE_ACR5)); 97*c533cfcdSAngelo Dureghello #endif 98ea0364f1SPeter Tyser #endif 99ea0364f1SPeter Tyser 100ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_DCACR)); 101ea0364f1SPeter Tyser } 102ea0364f1SPeter Tyser 103ea0364f1SPeter Tyser void dcache_disable(void) 104ea0364f1SPeter Tyser { 105ea0364f1SPeter Tyser u32 temp = 0; 106ea0364f1SPeter Tyser 107ea0364f1SPeter Tyser *cf_dcache_status = 0; 108ea0364f1SPeter Tyser dcache_invalid(); 109ea0364f1SPeter Tyser 110ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 111ea0364f1SPeter Tyser 112*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E) 113ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp)); 114ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp)); 115*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E) 116ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(temp)); 117ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(temp)); 118*c533cfcdSAngelo Dureghello #endif 119ea0364f1SPeter Tyser #endif 120ea0364f1SPeter Tyser } 121ea0364f1SPeter Tyser 122ea0364f1SPeter Tyser void dcache_invalid(void) 123ea0364f1SPeter Tyser { 124*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E) 125ea0364f1SPeter Tyser u32 temp; 126ea0364f1SPeter Tyser 127ea0364f1SPeter Tyser temp = CONFIG_SYS_DCACHE_INV; 128ea0364f1SPeter Tyser if (*cf_dcache_status) 129ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_DCACR; 130ea0364f1SPeter Tyser if (*cf_icache_status) 131ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR; 132ea0364f1SPeter Tyser 133ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 134ea0364f1SPeter Tyser #endif 135ea0364f1SPeter Tyser } 1364dbe4b16SWu, Josh 1374dbe4b16SWu, Josh __weak void invalidate_dcache_range(unsigned long start, unsigned long stop) 1384dbe4b16SWu, Josh { 1394dbe4b16SWu, Josh /* An empty stub, real implementation should be in platform code */ 1404dbe4b16SWu, Josh } 1414dbe4b16SWu, Josh __weak void flush_dcache_range(unsigned long start, unsigned long stop) 1424dbe4b16SWu, Josh { 1434dbe4b16SWu, Josh /* An empty stub, real implementation should be in platform code */ 1444dbe4b16SWu, Josh } 145