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