1 /* 2 * arch/arm/include/asm/tlb.h 3 * 4 * Copyright (C) 2002 Russell King 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * Experimentation shows that on a StrongARM, it appears to be faster 11 * to use the "invalidate whole tlb" rather than "invalidate single 12 * tlb" for this. 13 * 14 * This appears true for both the process fork+exit case, as well as 15 * the munmap-large-area case. 16 */ 17 #ifndef __ASMARM_TLB_H 18 #define __ASMARM_TLB_H 19 20 #include <asm/cacheflush.h> 21 22 #ifndef CONFIG_MMU 23 24 #include <linux/pagemap.h> 25 26 #define tlb_flush(tlb) ((void) tlb) 27 28 #include <asm-generic/tlb.h> 29 30 #else /* !CONFIG_MMU */ 31 32 #include <linux/swap.h> 33 #include <asm/pgalloc.h> 34 #include <asm/tlbflush.h> 35 36 static inline void __tlb_remove_table(void *_table) 37 { 38 free_page_and_swap_cache((struct page *)_table); 39 } 40 41 #include <asm-generic/tlb.h> 42 43 #ifndef CONFIG_HAVE_RCU_TABLE_FREE 44 #define tlb_remove_table(tlb, entry) tlb_remove_page(tlb, entry) 45 #endif 46 47 static inline void 48 __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, unsigned long addr) 49 { 50 pgtable_page_dtor(pte); 51 52 #ifndef CONFIG_ARM_LPAE 53 /* 54 * With the classic ARM MMU, a pte page has two corresponding pmd 55 * entries, each covering 1MB. 56 */ 57 addr = (addr & PMD_MASK) + SZ_1M; 58 __tlb_adjust_range(tlb, addr - PAGE_SIZE, 2 * PAGE_SIZE); 59 #endif 60 61 tlb_remove_table(tlb, pte); 62 } 63 64 static inline void 65 __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, unsigned long addr) 66 { 67 #ifdef CONFIG_ARM_LPAE 68 struct page *page = virt_to_page(pmdp); 69 70 tlb_remove_table(tlb, page); 71 #endif 72 } 73 74 #endif /* CONFIG_MMU */ 75 #endif 76