| #ifndef __ASM_METAG_TLBFLUSH_H |
| #define __ASM_METAG_TLBFLUSH_H |
| |
| #include <linux/io.h> |
| #include <linux/sched.h> |
| #include <asm/metag_mem.h> |
| #include <asm/pgalloc.h> |
| |
| /* |
| * TLB flushing: |
| * |
| * - flush_tlb() flushes the current mm struct TLBs |
| * - flush_tlb_all() flushes all processes TLBs |
| * - flush_tlb_mm(mm) flushes the specified mm context TLB's |
| * - flush_tlb_page(vma, vmaddr) flushes one page |
| * - flush_tlb_range(mm, start, end) flushes a range of pages |
| * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages |
| * - flush_tlb_pgtables(mm, start, end) flushes a range of page tables |
| * |
| * FIXME: Meta 2 can flush single TLB entries. |
| * |
| */ |
| |
| #if defined(CONFIG_METAG_META21) && !defined(CONFIG_SMP) |
| static inline void __flush_tlb(void) |
| { |
| /* flush TLB entries for just the current hardware thread */ |
| int thread = hard_processor_id(); |
| metag_out32(0, (LINSYSCFLUSH_TxMMCU_BASE + |
| LINSYSCFLUSH_TxMMCU_STRIDE * thread)); |
| } |
| #else |
| static inline void __flush_tlb(void) |
| { |
| /* flush TLB entries for all hardware threads */ |
| metag_out32(0, LINSYSCFLUSH_MMCU); |
| } |
| #endif /* defined(CONFIG_METAG_META21) && !defined(CONFIG_SMP) */ |
| |
| #define flush_tlb() __flush_tlb() |
| |
| #define flush_tlb_all() __flush_tlb() |
| |
| #define local_flush_tlb_all() __flush_tlb() |
| |
| static inline void flush_tlb_mm(struct mm_struct *mm) |
| { |
| if (mm == current->active_mm) |
| __flush_tlb(); |
| } |
| |
| static inline void flush_tlb_page(struct vm_area_struct *vma, |
| unsigned long addr) |
| { |
| flush_tlb_mm(vma->vm_mm); |
| } |
| |
| static inline void flush_tlb_range(struct vm_area_struct *vma, |
| unsigned long start, unsigned long end) |
| { |
| flush_tlb_mm(vma->vm_mm); |
| } |
| |
| static inline void flush_tlb_pgtables(struct mm_struct *mm, |
| unsigned long start, unsigned long end) |
| { |
| flush_tlb_mm(mm); |
| } |
| |
| static inline void flush_tlb_kernel_range(unsigned long start, |
| unsigned long end) |
| { |
| flush_tlb_all(); |
| } |
| |
| #endif /* __ASM_METAG_TLBFLUSH_H */ |
| |