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
flush_cache(ulong start_addr,ulong size)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
icache_status(void)20ea0364f1SPeter Tyser int icache_status(void)
21ea0364f1SPeter Tyser {
22ea0364f1SPeter Tyser return *cf_icache_status;
23ea0364f1SPeter Tyser }
24ea0364f1SPeter Tyser
dcache_status(void)25ea0364f1SPeter Tyser int dcache_status(void)
26ea0364f1SPeter Tyser {
27ea0364f1SPeter Tyser return *cf_dcache_status;
28ea0364f1SPeter Tyser }
29ea0364f1SPeter Tyser
icache_enable(void)30ea0364f1SPeter Tyser void icache_enable(void)
31ea0364f1SPeter Tyser {
32ea0364f1SPeter Tyser icache_invalid();
33ea0364f1SPeter Tyser
34ea0364f1SPeter Tyser *cf_icache_status = 1;
35ea0364f1SPeter Tyser
36*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
37ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(CONFIG_SYS_CACHE_ACR2));
38ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(CONFIG_SYS_CACHE_ACR3));
39*c533cfcdSAngelo Dureghello #if 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));
42*c533cfcdSAngelo Dureghello #endif
43ea0364f1SPeter Tyser #else
44ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0));
45ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1));
46ea0364f1SPeter Tyser #endif
47ea0364f1SPeter Tyser
48ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_ICACR));
49ea0364f1SPeter Tyser }
50ea0364f1SPeter Tyser
icache_disable(void)51ea0364f1SPeter Tyser void icache_disable(void)
52ea0364f1SPeter Tyser {
53ea0364f1SPeter Tyser u32 temp = 0;
54ea0364f1SPeter Tyser
55ea0364f1SPeter Tyser *cf_icache_status = 0;
56ea0364f1SPeter Tyser icache_invalid();
57ea0364f1SPeter Tyser
58*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
59ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr2"::"r"(temp));
60ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr3"::"r"(temp));
61*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E)
62ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr6"::"r"(temp));
63ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr7"::"r"(temp));
64*c533cfcdSAngelo Dureghello #endif
65ea0364f1SPeter Tyser #else
66ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp));
67ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp));
68ea0364f1SPeter Tyser #endif
69ea0364f1SPeter Tyser }
70ea0364f1SPeter Tyser
icache_invalid(void)71ea0364f1SPeter Tyser void icache_invalid(void)
72ea0364f1SPeter Tyser {
73ea0364f1SPeter Tyser u32 temp;
74ea0364f1SPeter Tyser
75ea0364f1SPeter Tyser temp = CONFIG_SYS_ICACHE_INV;
76ea0364f1SPeter Tyser if (*cf_icache_status)
77ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR;
78ea0364f1SPeter Tyser
79ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp));
80ea0364f1SPeter Tyser }
81ea0364f1SPeter Tyser
82ea0364f1SPeter Tyser /*
83ea0364f1SPeter Tyser * data cache only for ColdFire V4 such as MCF547x_8x, MCF5445x
84ea0364f1SPeter Tyser * the dcache will be dummy in ColdFire V2 and V3
85ea0364f1SPeter Tyser */
dcache_enable(void)86ea0364f1SPeter Tyser void dcache_enable(void)
87ea0364f1SPeter Tyser {
88ea0364f1SPeter Tyser dcache_invalid();
89ea0364f1SPeter Tyser *cf_dcache_status = 1;
90ea0364f1SPeter Tyser
91*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
92ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(CONFIG_SYS_CACHE_ACR0));
93ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(CONFIG_SYS_CACHE_ACR1));
94*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E)
95ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(CONFIG_SYS_CACHE_ACR4));
96ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(CONFIG_SYS_CACHE_ACR5));
97*c533cfcdSAngelo Dureghello #endif
98ea0364f1SPeter Tyser #endif
99ea0364f1SPeter Tyser
100ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(CONFIG_SYS_CACHE_DCACR));
101ea0364f1SPeter Tyser }
102ea0364f1SPeter Tyser
dcache_disable(void)103ea0364f1SPeter Tyser void dcache_disable(void)
104ea0364f1SPeter Tyser {
105ea0364f1SPeter Tyser u32 temp = 0;
106ea0364f1SPeter Tyser
107ea0364f1SPeter Tyser *cf_dcache_status = 0;
108ea0364f1SPeter Tyser dcache_invalid();
109ea0364f1SPeter Tyser
110ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp));
111ea0364f1SPeter Tyser
112*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
113ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr0"::"r"(temp));
114ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr1"::"r"(temp));
115*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4E)
116ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr4"::"r"(temp));
117ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%acr5"::"r"(temp));
118*c533cfcdSAngelo Dureghello #endif
119ea0364f1SPeter Tyser #endif
120ea0364f1SPeter Tyser }
121ea0364f1SPeter Tyser
dcache_invalid(void)122ea0364f1SPeter Tyser void dcache_invalid(void)
123ea0364f1SPeter Tyser {
124*c533cfcdSAngelo Dureghello #if defined(CONFIG_CF_V4) || defined(CONFIG_CF_V4E)
125ea0364f1SPeter Tyser u32 temp;
126ea0364f1SPeter Tyser
127ea0364f1SPeter Tyser temp = CONFIG_SYS_DCACHE_INV;
128ea0364f1SPeter Tyser if (*cf_dcache_status)
129ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_DCACR;
130ea0364f1SPeter Tyser if (*cf_icache_status)
131ea0364f1SPeter Tyser temp |= CONFIG_SYS_CACHE_ICACR;
132ea0364f1SPeter Tyser
133ea0364f1SPeter Tyser __asm__ __volatile__("movec %0, %%cacr"::"r"(temp));
134ea0364f1SPeter Tyser #endif
135ea0364f1SPeter Tyser }
1364dbe4b16SWu, Josh
invalidate_dcache_range(unsigned long start,unsigned long stop)1374dbe4b16SWu, Josh __weak void invalidate_dcache_range(unsigned long start, unsigned long stop)
1384dbe4b16SWu, Josh {
1394dbe4b16SWu, Josh /* An empty stub, real implementation should be in platform code */
1404dbe4b16SWu, Josh }
flush_dcache_range(unsigned long start,unsigned long stop)1414dbe4b16SWu, Josh __weak void flush_dcache_range(unsigned long start, unsigned long stop)
1424dbe4b16SWu, Josh {
1434dbe4b16SWu, Josh /* An empty stub, real implementation should be in platform code */
1444dbe4b16SWu, Josh }
145