]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
f5df8e26 JH |
2 | #ifndef _METAG_PGALLOC_H |
3 | #define _METAG_PGALLOC_H | |
4 | ||
5 | #include <linux/threads.h> | |
6 | #include <linux/mm.h> | |
7 | ||
8 | #define pmd_populate_kernel(mm, pmd, pte) \ | |
9 | set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte))) | |
10 | ||
11 | #define pmd_populate(mm, pmd, pte) \ | |
12 | set_pmd(pmd, __pmd(_PAGE_TABLE | page_to_phys(pte))) | |
13 | ||
14 | #define pmd_pgtable(pmd) pmd_page(pmd) | |
15 | ||
16 | /* | |
17 | * Allocate and free page tables. | |
18 | */ | |
19 | #ifdef CONFIG_METAG_META21_MMU | |
20 | static inline void pgd_ctor(pgd_t *pgd) | |
21 | { | |
22 | memcpy(pgd + USER_PTRS_PER_PGD, | |
23 | swapper_pg_dir + USER_PTRS_PER_PGD, | |
24 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | |
25 | } | |
26 | #else | |
27 | #define pgd_ctor(x) do { } while (0) | |
28 | #endif | |
29 | ||
30 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |
31 | { | |
32 | pgd_t *pgd = (pgd_t *)get_zeroed_page(GFP_KERNEL); | |
33 | if (pgd) | |
34 | pgd_ctor(pgd); | |
35 | return pgd; | |
36 | } | |
37 | ||
38 | static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | |
39 | { | |
40 | free_page((unsigned long)pgd); | |
41 | } | |
42 | ||
43 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | |
44 | unsigned long address) | |
45 | { | |
32d6bd90 | 46 | pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); |
f5df8e26 JH |
47 | return pte; |
48 | } | |
49 | ||
50 | static inline pgtable_t pte_alloc_one(struct mm_struct *mm, | |
51 | unsigned long address) | |
52 | { | |
53 | struct page *pte; | |
32d6bd90 | 54 | pte = alloc_pages(GFP_KERNEL | __GFP_ZERO, 0); |
855a3053 KS |
55 | if (!pte) |
56 | return NULL; | |
57 | if (!pgtable_page_ctor(pte)) { | |
58 | __free_page(pte); | |
59 | return NULL; | |
60 | } | |
f5df8e26 JH |
61 | return pte; |
62 | } | |
63 | ||
64 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | |
65 | { | |
66 | free_page((unsigned long)pte); | |
67 | } | |
68 | ||
69 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) | |
70 | { | |
71 | pgtable_page_dtor(pte); | |
72 | __free_page(pte); | |
73 | } | |
74 | ||
75 | #define __pte_free_tlb(tlb, pte, addr) \ | |
76 | do { \ | |
77 | pgtable_page_dtor(pte); \ | |
78 | tlb_remove_page((tlb), (pte)); \ | |
79 | } while (0) | |
80 | ||
81 | #define check_pgt_cache() do { } while (0) | |
82 | ||
83 | #endif |