ARM: nommu: define dummy TLB operations for nommu configurations
authorWill Deacon <will.deacon@arm.com>
Tue, 28 Feb 2012 12:56:06 +0000 (12:56 +0000)
committerJonathan Austin <jonathan.austin@arm.com>
Fri, 7 Jun 2013 16:02:42 +0000 (17:02 +0100)
nommu platforms do not perform address translation and therefore clearly
don't have TLBs. However, some SMP code assumes the presence of the TLB
flushing routines and will therefore fail to compile for a nommu system.

This patch defines dummy local_* TLB operations and #defines
tlb_ops_need_broadcast() as 0, therefore causing the usual ARM SMP TLB
operations to call the local variants instead.

Signed-off-by: Will Deacon <will.deacon@arm.com>
CC: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
CC: Nicolas Pitre <nico@linaro.org>
arch/arm/include/asm/smp_plat.h
arch/arm/include/asm/tlbflush.h

index aaa61b6f50fff28e77ded32b66698feb0b72db6e..1c7b6f8101ae3d68977cb908a8d9624bc154ff26 100644 (file)
@@ -26,6 +26,9 @@ static inline bool is_smp(void)
 }
 
 /* all SMP configurations have the extended CPUID registers */
+#ifndef CONFIG_MMU
+#define tlb_ops_need_broadcast()       0
+#else
 static inline int tlb_ops_need_broadcast(void)
 {
        if (!is_smp())
@@ -33,6 +36,7 @@ static inline int tlb_ops_need_broadcast(void)
 
        return ((read_cpuid_ext(CPUID_EXT_MMFR3) >> 12) & 0xf) < 2;
 }
+#endif
 
 #if !defined(CONFIG_SMP) || __LINUX_ARM_ARCH__ >= 7
 #define cache_ops_need_broadcast()     0
index a3625d141c1d417389e14a176d175ce359ebf081..cc8517e0f1325159a578d7532fb4a28a2eec8194 100644 (file)
@@ -537,6 +537,27 @@ static inline void update_mmu_cache(struct vm_area_struct *vma,
 
 #endif
 
-#endif /* CONFIG_MMU */
+#elif defined(CONFIG_SMP)      /* !CONFIG_MMU */
+
+#ifndef __ASSEMBLY__
+
+#include <linux/mm_types.h>
+
+static inline void local_flush_tlb_all(void)                                                                   { }
+static inline void local_flush_tlb_mm(struct mm_struct *mm)                                                    { }
+static inline void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)                       { }
+static inline void local_flush_tlb_kernel_page(unsigned long kaddr)                                            { }
+static inline void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)   { }
+static inline void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)                                { }
+
+extern void flush_tlb_all(void);
+extern void flush_tlb_mm(struct mm_struct *mm);
+extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr);
+extern void flush_tlb_kernel_page(unsigned long kaddr);
+extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
+extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
+#endif /* __ASSEMBLY__ */
+
+#endif
 
 #endif