xref: /rk3399_rockchip-uboot/arch/m68k/lib/cache.c (revision ea0364f1bbfed1e3ea711147420875cf338fe77a)
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