xref: /openbmc/linux/arch/arm/include/asm/tlb.h (revision b78180b97dcf667350aac716cd3f32356eaf4984)
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