Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
1da177e4 | 2 | /* |
4baa9922 | 3 | * arch/arm/include/asm/tlb.h |
1da177e4 LT |
4 | * |
5 | * Copyright (C) 2002 Russell King | |
6 | * | |
1da177e4 LT |
7 | * Experimentation shows that on a StrongARM, it appears to be faster |
8 | * to use the "invalidate whole tlb" rather than "invalidate single | |
9 | * tlb" for this. | |
10 | * | |
11 | * This appears true for both the process fork+exit case, as well as | |
12 | * the munmap-large-area case. | |
13 | */ | |
14 | #ifndef __ASMARM_TLB_H | |
15 | #define __ASMARM_TLB_H | |
16 | ||
17 | #include <asm/cacheflush.h> | |
0157903e HC |
18 | |
19 | #ifndef CONFIG_MMU | |
20 | ||
21 | #include <linux/pagemap.h> | |
58e9c47f RK |
22 | |
23 | #define tlb_flush(tlb) ((void) tlb) | |
24 | ||
0157903e HC |
25 | #include <asm-generic/tlb.h> |
26 | ||
27 | #else /* !CONFIG_MMU */ | |
28 | ||
06824ba8 | 29 | #include <linux/swap.h> |
1da177e4 | 30 | #include <asm/pgalloc.h> |
06824ba8 RK |
31 | #include <asm/tlbflush.h> |
32 | ||
a0ad5496 SC |
33 | static inline void __tlb_remove_table(void *_table) |
34 | { | |
35 | free_page_and_swap_cache((struct page *)_table); | |
36 | } | |
37 | ||
b78180b9 | 38 | #include <asm-generic/tlb.h> |
a0ad5496 | 39 | |
b78180b9 PZ |
40 | #ifndef CONFIG_HAVE_RCU_TABLE_FREE |
41 | #define tlb_remove_table(tlb, entry) tlb_remove_page(tlb, entry) | |
a0ad5496 | 42 | #endif |
1da177e4 LT |
43 | |
44 | static inline void | |
b78180b9 | 45 | __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, unsigned long addr) |
06824ba8 | 46 | { |
b4ed71f5 | 47 | pgtable_pte_page_dtor(pte); |
6d3ec1ae | 48 | |
b78180b9 | 49 | #ifndef CONFIG_ARM_LPAE |
6d3ec1ae CM |
50 | /* |
51 | * With the classic ARM MMU, a pte page has two corresponding pmd | |
52 | * entries, each covering 1MB. | |
53 | */ | |
b78180b9 PZ |
54 | addr = (addr & PMD_MASK) + SZ_1M; |
55 | __tlb_adjust_range(tlb, addr - PAGE_SIZE, 2 * PAGE_SIZE); | |
df547e08 | 56 | #endif |
6d3ec1ae | 57 | |
b78180b9 | 58 | tlb_remove_table(tlb, pte); |
c9f27f10 CM |
59 | } |
60 | ||
8d962507 | 61 | static inline void |
b78180b9 | 62 | __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, unsigned long addr) |
07e32661 | 63 | { |
b78180b9 PZ |
64 | #ifdef CONFIG_ARM_LPAE |
65 | struct page *page = virt_to_page(pmdp); | |
063daa81 | 66 | |
b78180b9 PZ |
67 | tlb_remove_table(tlb, page); |
68 | #endif | |
063daa81 AR |
69 | } |
70 | ||
0157903e | 71 | #endif /* CONFIG_MMU */ |
1da177e4 | 72 | #endif |