m68k: add TLB flush support for the ColdFire V4e MMU hardware
authorGreg Ungerer <gerg@uclinux.org>
Mon, 17 Oct 2011 05:09:44 +0000 (15:09 +1000)
committerGreg Ungerer <gerg@uclinux.org>
Fri, 30 Dec 2011 00:20:30 +0000 (10:20 +1000)
The ColdFire V4e MMU is unlike any of the other m68k MMU hardware.
It needs its own TLB flush support code.

Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Matt Waddel <mwaddel@yahoo.com>
Acked-by: Kurt Mahan <kmahan@xmission.com>
arch/m68k/include/asm/tlbflush.h

index a6b4ed4..965ea35 100644 (file)
@@ -5,10 +5,13 @@
 #ifndef CONFIG_SUN3
 
 #include <asm/current.h>
+#include <asm/mcfmmu.h>
 
 static inline void flush_tlb_kernel_page(void *addr)
 {
-       if (CPU_IS_040_OR_060) {
+       if (CPU_IS_COLDFIRE) {
+               mmu_write(MMUOR, MMUOR_CNL);
+       } else if (CPU_IS_040_OR_060) {
                mm_segment_t old_fs = get_fs();
                set_fs(KERNEL_DS);
                __asm__ __volatile__(".chip 68040\n\t"
@@ -25,12 +28,15 @@ static inline void flush_tlb_kernel_page(void *addr)
  */
 static inline void __flush_tlb(void)
 {
-       if (CPU_IS_040_OR_060)
+       if (CPU_IS_COLDFIRE) {
+               mmu_write(MMUOR, MMUOR_CNL);
+       } else if (CPU_IS_040_OR_060) {
                __asm__ __volatile__(".chip 68040\n\t"
                                     "pflushan\n\t"
                                     ".chip 68k");
-       else if (CPU_IS_020_OR_030)
+       } else if (CPU_IS_020_OR_030) {
                __asm__ __volatile__("pflush #0,#4");
+       }
 }
 
 static inline void __flush_tlb040_one(unsigned long addr)
@@ -43,7 +49,9 @@ static inline void __flush_tlb040_one(unsigned long addr)
 
 static inline void __flush_tlb_one(unsigned long addr)
 {
-       if (CPU_IS_040_OR_060)
+       if (CPU_IS_COLDFIRE)
+               mmu_write(MMUOR, MMUOR_CNL);
+       else if (CPU_IS_040_OR_060)
                __flush_tlb040_one(addr);
        else if (CPU_IS_020_OR_030)
                __asm__ __volatile__("pflush #0,#4,(%0)" : : "a" (addr));
@@ -56,12 +64,15 @@ static inline void __flush_tlb_one(unsigned long addr)
  */
 static inline void flush_tlb_all(void)
 {
-       if (CPU_IS_040_OR_060)
+       if (CPU_IS_COLDFIRE) {
+               mmu_write(MMUOR, MMUOR_CNL);
+       } else if (CPU_IS_040_OR_060) {
                __asm__ __volatile__(".chip 68040\n\t"
                                     "pflusha\n\t"
                                     ".chip 68k");
-       else if (CPU_IS_020_OR_030)
+       } else if (CPU_IS_020_OR_030) {
                __asm__ __volatile__("pflusha");
+       }
 }
 
 static inline void flush_tlb_mm(struct mm_struct *mm)