* [PATCH v2] m68k: fix ColdFire clear cache operation
@ 2012-07-11 0:37 gerg
2012-07-11 15:51 ` Philippe De Muyter
2012-07-16 19:13 ` Geert Uytterhoeven
0 siblings, 2 replies; 5+ messages in thread
From: gerg @ 2012-07-11 0:37 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 | 35 +++++++++++++++++++++++++++++++++
arch/m68k/mm/memory.c | 2 +-
2 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/arch/m68k/include/asm/cacheflush_mm.h b/arch/m68k/include/asm/cacheflush_mm.h
index 8104bd8..b05990e 100644
--- a/arch/m68k/include/asm/cacheflush_mm.h
+++ b/arch/m68k/include/asm/cacheflush_mm.h
@@ -17,6 +17,41 @@
#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__ (
+ "movec %0,%%cacr\n\t"
+ "nop\n\t"
+ :
+ : "r" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA));
+}
+
+static inline void clear_cf_dcache(unsigned long start, unsigned long end)
+{
+ __asm__ __volatile__ (
+ "movec %0,%%cacr\n\t"
+ "nop\n\t"
+ :
+ : "r" (CACHE_MODE | CACR_DCINVA));
+}
+
+static inline void clear_cf_bcache(unsigned long start, unsigned long end)
+{
+ __asm__ __volatile__ (
+ "movec %0,%%cacr\n\t"
+ "nop\n\t"
+ :
+ : "r" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA | CACR_DCINVA));
+}
+
+/*
+ * 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] 5+ messages in thread
* Re: [PATCH v2] m68k: fix ColdFire clear cache operation
2012-07-11 0:37 [PATCH v2] m68k: fix ColdFire clear cache operation gerg
@ 2012-07-11 15:51 ` Philippe De Muyter
2012-07-12 1:50 ` Greg Ungerer
2012-07-16 19:13 ` Geert Uytterhoeven
1 sibling, 1 reply; 5+ messages in thread
From: Philippe De Muyter @ 2012-07-11 15:51 UTC (permalink / raw)
To: gerg; +Cc: linux-m68k, Greg Ungerer
On Wed, Jul 11, 2012 at 10:37:16AM +1000, gerg@snapgear.com wrote:
> + __asm__ __volatile__ (
> + "movec %0,%%cacr\n\t"
> + "nop\n\t"
This could be written as
"movec %0,%%cacr; nop"
i.e. :
final "\n\t" is useless
other "\n\t" may be replaced by ";"
Philippe
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] m68k: fix ColdFire clear cache operation
2012-07-11 15:51 ` Philippe De Muyter
@ 2012-07-12 1:50 ` Greg Ungerer
0 siblings, 0 replies; 5+ messages in thread
From: Greg Ungerer @ 2012-07-12 1:50 UTC (permalink / raw)
To: Philippe De Muyter; +Cc: linux-m68k, Greg Ungerer
Hi Philippe,
On 12/07/12 01:51, Philippe De Muyter wrote:
> On Wed, Jul 11, 2012 at 10:37:16AM +1000, gerg@snapgear.com wrote:
>
>> + __asm__ __volatile__ (
>> + "movec %0,%%cacr\n\t"
>> + "nop\n\t"
>
> This could be written as
>
> "movec %0,%%cacr; nop"
It could, but IMHO that is not as clear. One instruction per line
is easier to read.
> i.e. :
> final "\n\t" is useless
Yep, I will remove that.
Thanks
Greg
------------------------------------------------------------------------
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com
SnapGear Group, McAfee PHONE: +61 7 3435 2888
8 Gardner Close FAX: +61 7 3217 5323
Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] m68k: fix ColdFire clear cache operation
2012-07-11 0:37 [PATCH v2] m68k: fix ColdFire clear cache operation gerg
2012-07-11 15:51 ` Philippe De Muyter
@ 2012-07-16 19:13 ` Geert Uytterhoeven
2012-07-17 6:03 ` Greg Ungerer
1 sibling, 1 reply; 5+ messages in thread
From: Geert Uytterhoeven @ 2012-07-16 19:13 UTC (permalink / raw)
To: gerg; +Cc: linux-m68k, Greg Ungerer
On Wed, Jul 11, 2012 at 2:37 AM, <gerg@snapgear.com> wrote:
> --- a/arch/m68k/include/asm/cacheflush_mm.h
> +++ b/arch/m68k/include/asm/cacheflush_mm.h
> @@ -17,6 +17,41 @@
> #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__ (
> + "movec %0,%%cacr\n\t"
> + "nop\n\t"
> + :
> + : "r" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA));
These new functions should be moved inside the #ifdef CONFIG_COLDFIRE
at the top of the file:
arch/m68k/include/asm/cacheflush_mm.h:30:10: error: 'CACHE_MODE'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:30:23: error: 'CACR_ICINVA'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:30:37: error: 'CACR_BCINVA'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:39:10: error: 'CACHE_MODE'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:39:23: error: 'CACR_DCINVA'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:48:10: error: 'CACHE_MODE'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:48:23: error: 'CACR_ICINVA'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:48:37: error: 'CACR_BCINVA'
undeclared (first use in this function)
arch/m68k/include/asm/cacheflush_mm.h:48:51: error: 'CACR_DCINVA'
undeclared (first use in this function)
http://kisskb.ellerman.id.au/kisskb/buildresult/6720541/
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] m68k: fix ColdFire clear cache operation
2012-07-16 19:13 ` Geert Uytterhoeven
@ 2012-07-17 6:03 ` Greg Ungerer
0 siblings, 0 replies; 5+ messages in thread
From: Greg Ungerer @ 2012-07-17 6:03 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: linux-m68k, Greg Ungerer
Hi Geert,
On 17/07/12 05:13, Geert Uytterhoeven wrote:
> On Wed, Jul 11, 2012 at 2:37 AM, <gerg@snapgear.com> wrote:
>> --- a/arch/m68k/include/asm/cacheflush_mm.h
>> +++ b/arch/m68k/include/asm/cacheflush_mm.h
>> @@ -17,6 +17,41 @@
>> #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__ (
>> + "movec %0,%%cacr\n\t"
>> + "nop\n\t"
>> + :
>> + : "r" (CACHE_MODE | CACR_ICINVA | CACR_BCINVA));
>
> These new functions should be moved inside the #ifdef CONFIG_COLDFIRE
> at the top of the file:
>
> arch/m68k/include/asm/cacheflush_mm.h:30:10: error: 'CACHE_MODE'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:30:23: error: 'CACR_ICINVA'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:30:37: error: 'CACR_BCINVA'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:39:10: error: 'CACHE_MODE'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:39:23: error: 'CACR_DCINVA'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:48:10: error: 'CACHE_MODE'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:48:23: error: 'CACR_ICINVA'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:48:37: error: 'CACR_BCINVA'
> undeclared (first use in this function)
> arch/m68k/include/asm/cacheflush_mm.h:48:51: error: 'CACR_DCINVA'
> undeclared (first use in this function)
>
> http://kisskb.ellerman.id.au/kisskb/buildresult/6720541/
Ah yes. Just moving those functions into a CONFIG_COLDFIRE region
is not enough though. That will fail with:
CC arch/m68k/mm/memory.o
arch/m68k/mm/memory.c: In function ‘cache_clear’:
arch/m68k/mm/memory.c:206:2: error: implicit declaration of function ‘clear_cf_bcache’
I hit the same problem with the other ColdFire flush functions too.
To fix those I locally defined the required definitions if they are
not set. I can do the same here with:
#ifndef CACHE_MODE
#define CACHE_MODE 0
#define CACR_ICINVA 0
#define CACR_DCINVA 0
#define CACR_BCINVA 0
#endif
This pollutes the code less than littering the code with #ifdefs on
the use COFIG_COLDFIRE, and doesn't seem any worse than defining
empty cache clear and push functions when not CONFIG_COLDFIRE.
Regards
Greg
------------------------------------------------------------------------
Greg Ungerer -- Principal Engineer EMAIL: gerg@snapgear.com
SnapGear Group, McAfee PHONE: +61 7 3435 2888
8 Gardner Close FAX: +61 7 3217 5323
Milton, QLD, 4064, Australia WEB: http://www.SnapGear.com
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-07-17 6:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-11 0:37 [PATCH v2] m68k: fix ColdFire clear cache operation gerg
2012-07-11 15:51 ` Philippe De Muyter
2012-07-12 1:50 ` Greg Ungerer
2012-07-16 19:13 ` Geert Uytterhoeven
2012-07-17 6:03 ` 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).