14baa9922SRussell King /* 24baa9922SRussell King * arch/arm/include/asm/tlb.h 34baa9922SRussell King * 44baa9922SRussell King * Copyright (C) 2002 Russell King 54baa9922SRussell King * 64baa9922SRussell King * This program is free software; you can redistribute it and/or modify 74baa9922SRussell King * it under the terms of the GNU General Public License version 2 as 84baa9922SRussell King * published by the Free Software Foundation. 94baa9922SRussell King * 104baa9922SRussell King * Experimentation shows that on a StrongARM, it appears to be faster 114baa9922SRussell King * to use the "invalidate whole tlb" rather than "invalidate single 124baa9922SRussell King * tlb" for this. 134baa9922SRussell King * 144baa9922SRussell King * This appears true for both the process fork+exit case, as well as 154baa9922SRussell King * the munmap-large-area case. 164baa9922SRussell King */ 174baa9922SRussell King #ifndef __ASMARM_TLB_H 184baa9922SRussell King #define __ASMARM_TLB_H 194baa9922SRussell King 204baa9922SRussell King #include <asm/cacheflush.h> 214baa9922SRussell King 224baa9922SRussell King #ifndef CONFIG_MMU 234baa9922SRussell King 244baa9922SRussell King #include <linux/pagemap.h> 2558e9c47fSRussell King 2658e9c47fSRussell King #define tlb_flush(tlb) ((void) tlb) 2758e9c47fSRussell King 284baa9922SRussell King #include <asm-generic/tlb.h> 294baa9922SRussell King 304baa9922SRussell King #else /* !CONFIG_MMU */ 314baa9922SRussell King 3206824ba8SRussell King #include <linux/swap.h> 334baa9922SRussell King #include <asm/pgalloc.h> 3406824ba8SRussell King #include <asm/tlbflush.h> 3506824ba8SRussell King 36a0ad5496SSteve Capper static inline void __tlb_remove_table(void *_table) 37a0ad5496SSteve Capper { 38a0ad5496SSteve Capper free_page_and_swap_cache((struct page *)_table); 39a0ad5496SSteve Capper } 40a0ad5496SSteve Capper 41*b78180b9SPeter Zijlstra #include <asm-generic/tlb.h> 42a0ad5496SSteve Capper 43*b78180b9SPeter Zijlstra #ifndef CONFIG_HAVE_RCU_TABLE_FREE 44*b78180b9SPeter Zijlstra #define tlb_remove_table(tlb, entry) tlb_remove_page(tlb, entry) 45a0ad5496SSteve Capper #endif 461cf35d47SLinus Torvalds 479e14f674SPeter Zijlstra static inline void 48*b78180b9SPeter Zijlstra __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, unsigned long addr) 4906824ba8SRussell King { 5006824ba8SRussell King pgtable_page_dtor(pte); 516d3ec1aeSCatalin Marinas 52*b78180b9SPeter Zijlstra #ifndef CONFIG_ARM_LPAE 536d3ec1aeSCatalin Marinas /* 546d3ec1aeSCatalin Marinas * With the classic ARM MMU, a pte page has two corresponding pmd 556d3ec1aeSCatalin Marinas * entries, each covering 1MB. 566d3ec1aeSCatalin Marinas */ 57*b78180b9SPeter Zijlstra addr = (addr & PMD_MASK) + SZ_1M; 58*b78180b9SPeter Zijlstra __tlb_adjust_range(tlb, addr - PAGE_SIZE, 2 * PAGE_SIZE); 59df547e08SWill Deacon #endif 606d3ec1aeSCatalin Marinas 61*b78180b9SPeter Zijlstra tlb_remove_table(tlb, pte); 62c9f27f10SCatalin Marinas } 63c9f27f10SCatalin Marinas 648d962507SCatalin Marinas static inline void 65*b78180b9SPeter Zijlstra __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, unsigned long addr) 668d962507SCatalin Marinas { 67*b78180b9SPeter Zijlstra #ifdef CONFIG_ARM_LPAE 68*b78180b9SPeter Zijlstra struct page *page = virt_to_page(pmdp); 698d962507SCatalin Marinas 70*b78180b9SPeter Zijlstra tlb_remove_table(tlb, page); 71*b78180b9SPeter Zijlstra #endif 72063daa81SAnders Roxell } 73063daa81SAnders Roxell 744baa9922SRussell King #endif /* CONFIG_MMU */ 754baa9922SRussell King #endif 76