blob: a21fe3279440b1a9251a91801f61d66f52b734a7 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
wdenkabf7a7c2003-12-08 01:34:36 +00002/*
wdenke65527f2004-02-12 00:47:09 +00003 * (C) Copyright 2002
wdenkabf7a7c2003-12-08 01:34:36 +00004 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
wdenkabf7a7c2003-12-08 01:34:36 +00005 */
6
Tom Rini3cb9c372023-10-12 19:03:56 -04007#include <config.h>
Simon Glass1d91ba72019-11-14 12:57:37 -07008#include <cpu_func.h>
TsiChung Liew0ee47d42010-03-11 22:12:53 -06009#include <asm/immap.h>
10#include <asm/cache.h>
Ilias Apalodimase9e18652025-02-20 15:54:42 +020011#include <linux/errno.h>
wdenkabf7a7c2003-12-08 01:34:36 +000012
TsiChung Liew0ee47d42010-03-11 22:12:53 -060013volatile int *cf_icache_status = (int *)ICACHE_STATUS;
14volatile int *cf_dcache_status = (int *)DCACHE_STATUS;
15
16void flush_cache(ulong start_addr, ulong size)
wdenkabf7a7c2003-12-08 01:34:36 +000017{
wdenke65527f2004-02-12 00:47:09 +000018 /* Must be implemented for all M68k processors with copy-back data cache */
wdenkabf7a7c2003-12-08 01:34:36 +000019}
TsiChung Liew0ee47d42010-03-11 22:12:53 -060020
21int icache_status(void)
22{
23 return *cf_icache_status;
24}
25
26int dcache_status(void)
27{
28 return *cf_dcache_status;
29}
30
31void icache_enable(void)
32{
Tom Rinif8628fa2024-06-19 15:27:54 -060033 invalidate_icache_all();
TsiChung Liew0ee47d42010-03-11 22:12:53 -060034
35 *cf_icache_status = 1;
36
Tom Rini364d0022023-01-10 11:19:45 -050037#if defined(CONFIG_CF_V4) || defined(CFG_CF_V4E)
Tom Rini6a5dccc2022-11-16 13:10:41 -050038 __asm__ __volatile__("movec %0, %%acr2"::"r"(CFG_SYS_CACHE_ACR2));
Tom Rini364d0022023-01-10 11:19:45 -050039 __asm__ __volatile__("movec %0, %%acr3"::"r"(CFG_SYS_CACHE_ACR3));
40#if defined(CFG_CF_V4E)
41 __asm__ __volatile__("movec %0, %%acr6"::"r"(CFG_SYS_CACHE_ACR6));
42 __asm__ __volatile__("movec %0, %%acr7"::"r"(CFG_SYS_CACHE_ACR7));
Angelo Dureghello8ddcf382017-05-31 21:32:48 +020043#endif
TsiChung Liew0ee47d42010-03-11 22:12:53 -060044#else
Tom Rini6a5dccc2022-11-16 13:10:41 -050045 __asm__ __volatile__("movec %0, %%acr0"::"r"(CFG_SYS_CACHE_ACR0));
46 __asm__ __volatile__("movec %0, %%acr1"::"r"(CFG_SYS_CACHE_ACR1));
TsiChung Liew0ee47d42010-03-11 22:12:53 -060047#endif
48
Tom Rini6a5dccc2022-11-16 13:10:41 -050049 __asm__ __volatile__("movec %0, %%cacr"::"r"(CFG_SYS_CACHE_ICACR));
TsiChung Liew0ee47d42010-03-11 22:12:53 -060050}
51
52void icache_disable(void)
53{
54 u32 temp = 0;
55
56 *cf_icache_status = 0;
Tom Rinif8628fa2024-06-19 15:27:54 -060057 invalidate_icache_all();
TsiChung Liew0ee47d42010-03-11 22:12:53 -060058
Tom Rini364d0022023-01-10 11:19:45 -050059#if defined(CONFIG_CF_V4) || defined(CFG_CF_V4E)
TsiChung Liew0ee47d42010-03-11 22:12:53 -060060 __asm__ __volatile__("movec %0, %%acr2"::"r"(temp));
61 __asm__ __volatile__("movec %0, %%acr3"::"r"(temp));
Tom Rini364d0022023-01-10 11:19:45 -050062#if defined(CFG_CF_V4E)
TsiChung Liew0ee47d42010-03-11 22:12:53 -060063 __asm__ __volatile__("movec %0, %%acr6"::"r"(temp));
64 __asm__ __volatile__("movec %0, %%acr7"::"r"(temp));
Angelo Dureghello8ddcf382017-05-31 21:32:48 +020065#endif
TsiChung Liew0ee47d42010-03-11 22:12:53 -060066#else
67 __asm__ __volatile__("movec %0, %%acr0"::"r"(temp));
68 __asm__ __volatile__("movec %0, %%acr1"::"r"(temp));
TsiChung Liew0ee47d42010-03-11 22:12:53 -060069#endif
70}
71
Tom Rinif8628fa2024-06-19 15:27:54 -060072void invalidate_icache_all(void)
TsiChung Liew0ee47d42010-03-11 22:12:53 -060073{
74 u32 temp;
75
Tom Rini6a5dccc2022-11-16 13:10:41 -050076 temp = CFG_SYS_ICACHE_INV;
TsiChung Liew0ee47d42010-03-11 22:12:53 -060077 if (*cf_icache_status)
Tom Rini6a5dccc2022-11-16 13:10:41 -050078 temp |= CFG_SYS_CACHE_ICACR;
TsiChung Liew0ee47d42010-03-11 22:12:53 -060079
80 __asm__ __volatile__("movec %0, %%cacr"::"r"(temp));
81}
82
83/*
Tom Rini7ab2f5f2021-05-14 21:34:10 -040084 * data cache only for ColdFire V4 such as MCF5445x
TsiChung Liew0ee47d42010-03-11 22:12:53 -060085 * the dcache will be dummy in ColdFire V2 and V3
86 */
87void dcache_enable(void)
88{
89 dcache_invalid();
90 *cf_dcache_status = 1;
91
Tom Rini364d0022023-01-10 11:19:45 -050092#if defined(CONFIG_CF_V4) || defined(CFG_CF_V4E)
Tom Rini6a5dccc2022-11-16 13:10:41 -050093 __asm__ __volatile__("movec %0, %%acr0"::"r"(CFG_SYS_CACHE_ACR0));
94 __asm__ __volatile__("movec %0, %%acr1"::"r"(CFG_SYS_CACHE_ACR1));
Tom Rini364d0022023-01-10 11:19:45 -050095#if defined(CFG_CF_V4E)
96 __asm__ __volatile__("movec %0, %%acr4"::"r"(CFG_SYS_CACHE_ACR4));
97 __asm__ __volatile__("movec %0, %%acr5"::"r"(CFG_SYS_CACHE_ACR5));
Angelo Dureghello8ddcf382017-05-31 21:32:48 +020098#endif
TsiChung Liew0ee47d42010-03-11 22:12:53 -060099#endif
100
Tom Rini6a5dccc2022-11-16 13:10:41 -0500101 __asm__ __volatile__("movec %0, %%cacr"::"r"(CFG_SYS_CACHE_DCACR));
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600102}
103
104void dcache_disable(void)
105{
106 u32 temp = 0;
107
108 *cf_dcache_status = 0;
109 dcache_invalid();
110
111 __asm__ __volatile__("movec %0, %%cacr"::"r"(temp));
112
Tom Rini364d0022023-01-10 11:19:45 -0500113#if defined(CONFIG_CF_V4) || defined(CFG_CF_V4E)
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600114 __asm__ __volatile__("movec %0, %%acr0"::"r"(temp));
115 __asm__ __volatile__("movec %0, %%acr1"::"r"(temp));
Tom Rini364d0022023-01-10 11:19:45 -0500116#if defined(CFG_CF_V4E)
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600117 __asm__ __volatile__("movec %0, %%acr4"::"r"(temp));
118 __asm__ __volatile__("movec %0, %%acr5"::"r"(temp));
Angelo Dureghello8ddcf382017-05-31 21:32:48 +0200119#endif
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600120#endif
121}
122
123void dcache_invalid(void)
124{
Tom Rini364d0022023-01-10 11:19:45 -0500125#if defined(CONFIG_CF_V4) || defined(CFG_CF_V4E)
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600126 u32 temp;
127
Tom Rini6a5dccc2022-11-16 13:10:41 -0500128 temp = CFG_SYS_DCACHE_INV;
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600129 if (*cf_dcache_status)
Tom Rini6a5dccc2022-11-16 13:10:41 -0500130 temp |= CFG_SYS_CACHE_DCACR;
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600131 if (*cf_icache_status)
Tom Rini6a5dccc2022-11-16 13:10:41 -0500132 temp |= CFG_SYS_CACHE_ICACR;
TsiChung Liew0ee47d42010-03-11 22:12:53 -0600133
134 __asm__ __volatile__("movec %0, %%cacr"::"r"(temp));
135#endif
136}
Wu, Josh22f483c2015-07-27 11:40:15 +0800137
Tom Rini8bcc53a2024-06-19 15:27:53 -0600138/*
139 * Default implementation:
140 * do a range flush for the entire range
141 */
142__weak void flush_dcache_all(void)
143{
144 flush_dcache_range(0, ~0);
145}
146
Wu, Josh22f483c2015-07-27 11:40:15 +0800147__weak void invalidate_dcache_range(unsigned long start, unsigned long stop)
148{
149 /* An empty stub, real implementation should be in platform code */
150}
151__weak void flush_dcache_range(unsigned long start, unsigned long stop)
152{
153 /* An empty stub, real implementation should be in platform code */
154}
Ilias Apalodimase9e18652025-02-20 15:54:42 +0200155
156int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
157{
158 return -ENOSYS;
159}