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 36ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 37ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(CONFIG_SYS_CACHE_ACR2)); 38ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(CONFIG_SYS_CACHE_ACR3)); 39ea0364f1SPeter Tyser #elif 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)); 42ea0364f1SPeter Tyser #else 43ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0)); 44ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1)); 45ea0364f1SPeter Tyser #endif 46ea0364f1SPeter Tyser 47ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_ICACR)); 48ea0364f1SPeter Tyser } 49ea0364f1SPeter Tyser 50ea0364f1SPeter Tyser void icache_disable(void) 51ea0364f1SPeter Tyser { 52ea0364f1SPeter Tyser u32 temp = 0; 53ea0364f1SPeter Tyser 54ea0364f1SPeter Tyser *cf_icache_status = 0; 55ea0364f1SPeter Tyser icache_invalid(); 56ea0364f1SPeter Tyser 57ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 58ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(temp)); 59ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(temp)); 60ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 61ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr6"::"r"(temp)); 62ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr7"::"r"(temp)); 63ea0364f1SPeter Tyser #else 64ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp)); 65ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp)); 66ea0364f1SPeter Tyser 67ea0364f1SPeter Tyser #endif 68ea0364f1SPeter Tyser } 69ea0364f1SPeter Tyser 70ea0364f1SPeter Tyser void icache_invalid(void) 71ea0364f1SPeter Tyser { 72ea0364f1SPeter Tyser u32 temp; 73ea0364f1SPeter Tyser 74ea0364f1SPeter Tyser temp = CONFIG_SYS_ICACHE_INV; 75ea0364f1SPeter Tyser if (*cf_icache_status) 76ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR; 77ea0364f1SPeter Tyser 78ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 79ea0364f1SPeter Tyser } 80ea0364f1SPeter Tyser 81ea0364f1SPeter Tyser /* 82ea0364f1SPeter Tyser * data cache only for ColdFire V4 such as MCF547x_8x, MCF5445x 83ea0364f1SPeter Tyser * the dcache will be dummy in ColdFire V2 and V3 84ea0364f1SPeter Tyser */ 85ea0364f1SPeter Tyser void dcache_enable(void) 86ea0364f1SPeter Tyser { 87ea0364f1SPeter Tyser dcache_invalid(); 88ea0364f1SPeter Tyser *cf_dcache_status = 1; 89ea0364f1SPeter Tyser 90ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 91ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0)); 92ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1)); 93ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 94ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(CONFIG_SYS_CACHE_ACR4)); 95ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(CONFIG_SYS_CACHE_ACR5)); 96ea0364f1SPeter Tyser 97ea0364f1SPeter Tyser #endif 98ea0364f1SPeter Tyser 99ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_DCACR)); 100ea0364f1SPeter Tyser } 101ea0364f1SPeter Tyser 102ea0364f1SPeter Tyser void dcache_disable(void) 103ea0364f1SPeter Tyser { 104ea0364f1SPeter Tyser u32 temp = 0; 105ea0364f1SPeter Tyser 106ea0364f1SPeter Tyser *cf_dcache_status = 0; 107ea0364f1SPeter Tyser dcache_invalid(); 108ea0364f1SPeter Tyser 109ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 110ea0364f1SPeter Tyser 111ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 112ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp)); 113ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp)); 114ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 115ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(temp)); 116ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(temp)); 117ea0364f1SPeter Tyser 118ea0364f1SPeter Tyser #endif 119ea0364f1SPeter Tyser } 120ea0364f1SPeter Tyser 121ea0364f1SPeter Tyser void dcache_invalid(void) 122ea0364f1SPeter Tyser { 123ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 124ea0364f1SPeter Tyser u32 temp; 125ea0364f1SPeter Tyser 126ea0364f1SPeter Tyser temp = CONFIG_SYS_DCACHE_INV; 127ea0364f1SPeter Tyser if (*cf_dcache_status) 128ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_DCACR; 129ea0364f1SPeter Tyser if (*cf_icache_status) 130ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR; 131ea0364f1SPeter Tyser 132ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 133ea0364f1SPeter Tyser #endif 134ea0364f1SPeter Tyser } 135*4dbe4b16SWu, Josh 136*4dbe4b16SWu, Josh __weak void invalidate_dcache_range(unsigned long start, unsigned long stop) 137*4dbe4b16SWu, Josh { 138*4dbe4b16SWu, Josh /* An empty stub, real implementation should be in platform code */ 139*4dbe4b16SWu, Josh } 140*4dbe4b16SWu, Josh __weak void flush_dcache_range(unsigned long start, unsigned long stop) 141*4dbe4b16SWu, Josh { 142*4dbe4b16SWu, Josh /* An empty stub, real implementation should be in platform code */ 143*4dbe4b16SWu, Josh } 144