xref: /openbmc/u-boot/arch/m68k/lib/cache.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2ea0364f1SPeter Tyser /*
3ea0364f1SPeter Tyser  * (C) Copyright 2002
4ea0364f1SPeter Tyser  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5ea0364f1SPeter Tyser  */
6ea0364f1SPeter Tyser 
7ea0364f1SPeter Tyser #include <common.h>
8ea0364f1SPeter Tyser #include <asm/immap.h>
9ea0364f1SPeter Tyser #include <asm/cache.h>
10ea0364f1SPeter Tyser 
11ea0364f1SPeter Tyser volatile int *cf_icache_status = (int *)ICACHE_STATUS;
12ea0364f1SPeter Tyser volatile int *cf_dcache_status = (int *)DCACHE_STATUS;
13ea0364f1SPeter Tyser 
flush_cache(ulong start_addr,ulong size)14ea0364f1SPeter Tyser void flush_cache(ulong start_addr, ulong size)
15ea0364f1SPeter Tyser {
16ea0364f1SPeter Tyser 	/* Must be implemented for all M68k processors with copy-back data cache */
17ea0364f1SPeter Tyser }
18ea0364f1SPeter Tyser 
icache_status(void)19ea0364f1SPeter Tyser int icache_status(void)
20ea0364f1SPeter Tyser {
21ea0364f1SPeter Tyser 	return *cf_icache_status;
22ea0364f1SPeter Tyser }
23ea0364f1SPeter Tyser 
dcache_status(void)24ea0364f1SPeter Tyser int dcache_status(void)
25ea0364f1SPeter Tyser {
26ea0364f1SPeter Tyser 	return *cf_dcache_status;
27ea0364f1SPeter Tyser }
28ea0364f1SPeter Tyser 
icache_enable(void)29ea0364f1SPeter Tyser void icache_enable(void)
30ea0364f1SPeter Tyser {
31ea0364f1SPeter Tyser 	icache_invalid();
32ea0364f1SPeter Tyser 
33ea0364f1SPeter Tyser 	*cf_icache_status = 1;
34ea0364f1SPeter Tyser 
35c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
36ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr2"::"r"(CONFIG_SYS_CACHE_ACR2));
37ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr3"::"r"(CONFIG_SYS_CACHE_ACR3));
38c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E)
39ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr6"::"r"(CONFIG_SYS_CACHE_ACR6));
40ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr7"::"r"(CONFIG_SYS_CACHE_ACR7));
41c533cfcdSAngelo Dureghello #endif
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 
icache_disable(void)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 
57c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
58ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr2"::"r"(temp));
59ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr3"::"r"(temp));
60c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E)
61ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr6"::"r"(temp));
62ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr7"::"r"(temp));
63c533cfcdSAngelo Dureghello #endif
64ea0364f1SPeter Tyser #else
65ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr0"::"r"(temp));
66ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr1"::"r"(temp));
67ea0364f1SPeter Tyser #endif
68ea0364f1SPeter Tyser }
69ea0364f1SPeter Tyser 
icache_invalid(void)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  */
dcache_enable(void)85ea0364f1SPeter Tyser void dcache_enable(void)
86ea0364f1SPeter Tyser {
87ea0364f1SPeter Tyser 	dcache_invalid();
88ea0364f1SPeter Tyser 	*cf_dcache_status = 1;
89ea0364f1SPeter Tyser 
90c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
91ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0));
92ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1));
93c533cfcdSAngelo Dureghello #if 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));
96c533cfcdSAngelo Dureghello #endif
97ea0364f1SPeter Tyser #endif
98ea0364f1SPeter Tyser 
99ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_DCACR));
100ea0364f1SPeter Tyser }
101ea0364f1SPeter Tyser 
dcache_disable(void)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 
111c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
112ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr0"::"r"(temp));
113ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr1"::"r"(temp));
114c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E)
115ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr4"::"r"(temp));
116ea0364f1SPeter Tyser 	__asm__ __volatile__("movec %0, %%acr5"::"r"(temp));
117c533cfcdSAngelo Dureghello #endif
118ea0364f1SPeter Tyser #endif
119ea0364f1SPeter Tyser }
120ea0364f1SPeter Tyser 
dcache_invalid(void)121ea0364f1SPeter Tyser void dcache_invalid(void)
122ea0364f1SPeter Tyser {
123c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
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 }
1354dbe4b16SWu, Josh 
invalidate_dcache_range(unsigned long start,unsigned long stop)1364dbe4b16SWu, Josh __weak void invalidate_dcache_range(unsigned long start, unsigned long stop)
1374dbe4b16SWu, Josh {
1384dbe4b16SWu, Josh 	/* An empty stub, real implementation should be in platform code */
1394dbe4b16SWu, Josh }
flush_dcache_range(unsigned long start,unsigned long stop)1404dbe4b16SWu, Josh __weak void flush_dcache_range(unsigned long start, unsigned long stop)
1414dbe4b16SWu, Josh {
1424dbe4b16SWu, Josh 	/* An empty stub, real implementation should be in platform code */
1434dbe4b16SWu, Josh }
144