* [PATCH] m68k: fix ColdFire clear cache operation
@ 2012-07-10 6:41 gerg
2012-07-10 7:12 ` Andreas Schwab
0 siblings, 1 reply; 3+ messages in thread
From: gerg @ 2012-07-10 6:41 UTC (permalink / raw)
To: linux-m68k; +Cc: Greg Ungerer
From: Greg Ungerer <gerg@uclinux.org>
The code for clearing (invalidating) the ColdFire cache is actually performing
a push operation. Add functions to clear the cache, and fix cache_clear() to
call the appropriate clear cache function.
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
---
arch/m68k/include/asm/cacheflush_mm.h | 41 +++++++++++++++++++++++++++++++++
arch/m68k/mm/memory.c | 2 +-
2 files changed, 42 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/include/asm/cacheflush_mm.h b/arch/m68k/include/asm/cacheflush_mm.h
index 8104bd8..a32ffc9 100644
--- a/arch/m68k/include/asm/cacheflush_mm.h
+++ b/arch/m68k/include/asm/cacheflush_mm.h
@@ -17,6 +17,47 @@
#define DCACHE_SETMASK 0
#endif
+/*
+ * ColdFire architecture has no way to clear individual cache lines, so we
+ * are stuck invalidating all the cache entries when we want a clear operation.
+ */
+static inline void clear_cf_icache(unsigned long start, unsigned long end)
+{
+ __asm__ __volatile__ (
+ "movel %0,%%d0\n\t"
+ "movec %%d0,%%cacr\n\t"
+ "nop\n\t"
+ :
+ : "i" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA)
+ : "d0");
+}
+
+static inline void clear_cf_dcache(unsigned long start, unsigned long end)
+{
+ __asm__ __volatile__ (
+ "movel %0,%%d0\n\t"
+ "movec %%d0,%%cacr\n\t"
+ "nop\n\t"
+ :
+ : "i" (CACHE_MODE | CACR_DCINVA)
+ : "d0");
+}
+
+static inline void clear_cf_bcache(unsigned long start, unsigned long end)
+{
+ __asm__ __volatile__ (
+ "movel %0,%%d0\n\t"
+ "movec %%d0,%%cacr\n\t"
+ "nop\n\t"
+ :
+ : "i" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA | CACR_DCINVA)
+ : "d0");
+}
+
+/*
+ * Use the ColdFire cpushl instruction to push (and invalidate) cache lines.
+ * The start and end addresses are cache line numbers not memory addresses.
+ */
static inline void flush_cf_icache(unsigned long start, unsigned long end)
{
unsigned long set;
diff --git a/arch/m68k/mm/memory.c b/arch/m68k/mm/memory.c
index 250b8b7..51bc9d2 100644
--- a/arch/m68k/mm/memory.c
+++ b/arch/m68k/mm/memory.c
@@ -203,7 +203,7 @@ static inline void pushcl040(unsigned long paddr)
void cache_clear (unsigned long paddr, int len)
{
if (CPU_IS_COLDFIRE) {
- flush_cf_bcache(0, DCACHE_MAX_ADDR);
+ clear_cf_bcache(0, DCACHE_MAX_ADDR);
} else if (CPU_IS_040_OR_060) {
int tmp;
--
1.7.0.4
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] m68k: fix ColdFire clear cache operation
2012-07-10 6:41 [PATCH] m68k: fix ColdFire clear cache operation gerg
@ 2012-07-10 7:12 ` Andreas Schwab
2012-07-10 12:50 ` Greg Ungerer
0 siblings, 1 reply; 3+ messages in thread
From: Andreas Schwab @ 2012-07-10 7:12 UTC (permalink / raw)
To: gerg; +Cc: linux-m68k, Greg Ungerer
<gerg@snapgear.com> writes:
> +static inline void clear_cf_icache(unsigned long start, unsigned long end)
> +{
> + __asm__ __volatile__ (
> + "movel %0,%%d0\n\t"
> + "movec %%d0,%%cacr\n\t"
> + "nop\n\t"
> + :
> + : "i" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA)
Why not "r"?
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] m68k: fix ColdFire clear cache operation
2012-07-10 7:12 ` Andreas Schwab
@ 2012-07-10 12:50 ` Greg Ungerer
0 siblings, 0 replies; 3+ messages in thread
From: Greg Ungerer @ 2012-07-10 12:50 UTC (permalink / raw)
To: Andreas Schwab; +Cc: linux-m68k, Greg Ungerer
Hi Andreas,
On 07/10/2012 05:12 PM, Andreas Schwab wrote:
> <gerg@snapgear.com> writes:
>
>> +static inline void clear_cf_icache(unsigned long start, unsigned long end)
>> +{
>> + __asm__ __volatile__ (
>> + "movel %0,%%d0\n\t"
>> + "movec %%d0,%%cacr\n\t"
>> + "nop\n\t"
>> + :
>> + : "i" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA)
>
> Why not "r"?
Yes, that is better. I will revise and repost.
Thanks
Greg
------------------------------------------------------------------------
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com
SnapGear Group, McAfee PHONE: +61 7 3435 2888
8 Gardner Close, FAX: +61 7 3891 3630
Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2012-07-10 12:53 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-10 6:41 [PATCH] m68k: fix ColdFire clear cache operation gerg
2012-07-10 7:12 ` Andreas Schwab
2012-07-10 12:50 ` Greg Ungerer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).