1*ea0364f1SPeter Tyser /* 2*ea0364f1SPeter Tyser * (C) Copyright 2002 3*ea0364f1SPeter Tyser * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4*ea0364f1SPeter Tyser * 5*ea0364f1SPeter Tyser * See file CREDITS for list of people who contributed to this 6*ea0364f1SPeter Tyser * project. 7*ea0364f1SPeter Tyser * 8*ea0364f1SPeter Tyser * This program is free software; you can redistribute it and/or 9*ea0364f1SPeter Tyser * modify it under the terms of the GNU General Public License as 10*ea0364f1SPeter Tyser * published by the Free Software Foundation; either version 2 of 11*ea0364f1SPeter Tyser * the License, or (at your option) any later version. 12*ea0364f1SPeter Tyser * 13*ea0364f1SPeter Tyser * This program is distributed in the hope that it will be useful, 14*ea0364f1SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*ea0364f1SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*ea0364f1SPeter Tyser * GNU General Public License for more details. 17*ea0364f1SPeter Tyser * 18*ea0364f1SPeter Tyser * You should have received a copy of the GNU General Public License 19*ea0364f1SPeter Tyser * along with this program; if not, write to the Free Software 20*ea0364f1SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*ea0364f1SPeter Tyser * MA 02111-1307 USA 22*ea0364f1SPeter Tyser */ 23*ea0364f1SPeter Tyser 24*ea0364f1SPeter Tyser #include <common.h> 25*ea0364f1SPeter Tyser #include <asm/immap.h> 26*ea0364f1SPeter Tyser #include <asm/cache.h> 27*ea0364f1SPeter Tyser 28*ea0364f1SPeter Tyser volatile int *cf_icache_status = (int *)ICACHE_STATUS; 29*ea0364f1SPeter Tyser volatile int *cf_dcache_status = (int *)DCACHE_STATUS; 30*ea0364f1SPeter Tyser 31*ea0364f1SPeter Tyser void flush_cache(ulong start_addr, ulong size) 32*ea0364f1SPeter Tyser { 33*ea0364f1SPeter Tyser /* Must be implemented for all M68k processors with copy-back data cache */ 34*ea0364f1SPeter Tyser } 35*ea0364f1SPeter Tyser 36*ea0364f1SPeter Tyser int icache_status(void) 37*ea0364f1SPeter Tyser { 38*ea0364f1SPeter Tyser return *cf_icache_status; 39*ea0364f1SPeter Tyser } 40*ea0364f1SPeter Tyser 41*ea0364f1SPeter Tyser int dcache_status(void) 42*ea0364f1SPeter Tyser { 43*ea0364f1SPeter Tyser return *cf_dcache_status; 44*ea0364f1SPeter Tyser } 45*ea0364f1SPeter Tyser 46*ea0364f1SPeter Tyser void icache_enable(void) 47*ea0364f1SPeter Tyser { 48*ea0364f1SPeter Tyser icache_invalid(); 49*ea0364f1SPeter Tyser 50*ea0364f1SPeter Tyser *cf_icache_status = 1; 51*ea0364f1SPeter Tyser 52*ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 53*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(CONFIG_SYS_CACHE_ACR2)); 54*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(CONFIG_SYS_CACHE_ACR3)); 55*ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 56*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr6"::"r"(CONFIG_SYS_CACHE_ACR6)); 57*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr7"::"r"(CONFIG_SYS_CACHE_ACR7)); 58*ea0364f1SPeter Tyser #else 59*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0)); 60*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1)); 61*ea0364f1SPeter Tyser #endif 62*ea0364f1SPeter Tyser 63*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_ICACR)); 64*ea0364f1SPeter Tyser } 65*ea0364f1SPeter Tyser 66*ea0364f1SPeter Tyser void icache_disable(void) 67*ea0364f1SPeter Tyser { 68*ea0364f1SPeter Tyser u32 temp = 0; 69*ea0364f1SPeter Tyser 70*ea0364f1SPeter Tyser *cf_icache_status = 0; 71*ea0364f1SPeter Tyser icache_invalid(); 72*ea0364f1SPeter Tyser 73*ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 74*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(temp)); 75*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(temp)); 76*ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 77*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr6"::"r"(temp)); 78*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr7"::"r"(temp)); 79*ea0364f1SPeter Tyser #else 80*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp)); 81*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp)); 82*ea0364f1SPeter Tyser 83*ea0364f1SPeter Tyser #endif 84*ea0364f1SPeter Tyser } 85*ea0364f1SPeter Tyser 86*ea0364f1SPeter Tyser void icache_invalid(void) 87*ea0364f1SPeter Tyser { 88*ea0364f1SPeter Tyser u32 temp; 89*ea0364f1SPeter Tyser 90*ea0364f1SPeter Tyser temp = CONFIG_SYS_ICACHE_INV; 91*ea0364f1SPeter Tyser if (*cf_icache_status) 92*ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR; 93*ea0364f1SPeter Tyser 94*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 95*ea0364f1SPeter Tyser } 96*ea0364f1SPeter Tyser 97*ea0364f1SPeter Tyser /* 98*ea0364f1SPeter Tyser * data cache only for ColdFire V4 such as MCF547x_8x, MCF5445x 99*ea0364f1SPeter Tyser * the dcache will be dummy in ColdFire V2 and V3 100*ea0364f1SPeter Tyser */ 101*ea0364f1SPeter Tyser void dcache_enable(void) 102*ea0364f1SPeter Tyser { 103*ea0364f1SPeter Tyser dcache_invalid(); 104*ea0364f1SPeter Tyser *cf_dcache_status = 1; 105*ea0364f1SPeter Tyser 106*ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 107*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0)); 108*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1)); 109*ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 110*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(CONFIG_SYS_CACHE_ACR4)); 111*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(CONFIG_SYS_CACHE_ACR5)); 112*ea0364f1SPeter Tyser 113*ea0364f1SPeter Tyser #endif 114*ea0364f1SPeter Tyser 115*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_DCACR)); 116*ea0364f1SPeter Tyser } 117*ea0364f1SPeter Tyser 118*ea0364f1SPeter Tyser void dcache_disable(void) 119*ea0364f1SPeter Tyser { 120*ea0364f1SPeter Tyser u32 temp = 0; 121*ea0364f1SPeter Tyser 122*ea0364f1SPeter Tyser *cf_dcache_status = 0; 123*ea0364f1SPeter Tyser dcache_invalid(); 124*ea0364f1SPeter Tyser 125*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 126*ea0364f1SPeter Tyser 127*ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 128*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp)); 129*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp)); 130*ea0364f1SPeter Tyser #elif defined(CONFIG_CF_V4e) 131*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(temp)); 132*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(temp)); 133*ea0364f1SPeter Tyser 134*ea0364f1SPeter Tyser #endif 135*ea0364f1SPeter Tyser } 136*ea0364f1SPeter Tyser 137*ea0364f1SPeter Tyser void dcache_invalid(void) 138*ea0364f1SPeter Tyser { 139*ea0364f1SPeter Tyser #ifdef CONFIG_CF_V4 140*ea0364f1SPeter Tyser u32 temp; 141*ea0364f1SPeter Tyser 142*ea0364f1SPeter Tyser temp = CONFIG_SYS_DCACHE_INV; 143*ea0364f1SPeter Tyser if (*cf_dcache_status) 144*ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_DCACR; 145*ea0364f1SPeter Tyser if (*cf_icache_status) 146*ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR; 147*ea0364f1SPeter Tyser 148*ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp)); 149*ea0364f1SPeter Tyser #endif 150*ea0364f1SPeter Tyser } 151