xref: /linux/arch/m68k/include/asm/motorola_pgalloc.h (revision 2d7eaeb05ae265bd64270376e6a2c0d80244771f)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _MOTOROLA_PGALLOC_H
3 #define _MOTOROLA_PGALLOC_H
4 
5 #include <asm/tlb.h>
6 #include <asm/tlbflush.h>
7 
8 extern void mmu_page_ctor(void *page);
9 extern void mmu_page_dtor(void *page);
10 
11 enum m68k_table_types {
12 	TABLE_PGD,
13 	TABLE_PMD,
14 	TABLE_PTE,
15 };
16 
17 extern void init_pointer_table(void *table, int type);
18 extern void *get_pointer_table(struct mm_struct *mm, int type);
19 extern int free_pointer_table(void *table, int type);
20 extern void __tlb_remove_table(void *table);
21 
22 /*
23  * Allocate and free page tables. The xxx_kernel() versions are
24  * used to allocate a kernel page table - this turns on ASN bits
25  * if any.
26  */
27 
28 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
29 {
30 	return get_pointer_table(mm, TABLE_PTE);
31 }
32 
33 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
34 {
35 	free_pointer_table(pte, TABLE_PTE);
36 }
37 
38 static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
39 {
40 	return get_pointer_table(mm, TABLE_PTE);
41 }
42 
43 static inline void pte_free(struct mm_struct *mm, pgtable_t pgtable)
44 {
45 	free_pointer_table(pgtable, TABLE_PTE);
46 }
47 
48 static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pgtable,
49 				  unsigned long address)
50 {
51 	tlb_remove_table(tlb, (void *)((unsigned long)pgtable | TABLE_PTE));
52 }
53 
54 
55 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
56 {
57 	return get_pointer_table(mm, TABLE_PMD);
58 }
59 
60 static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd)
61 {
62 	return free_pointer_table(pmd, TABLE_PMD);
63 }
64 
65 static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
66 				  unsigned long address)
67 {
68 	tlb_remove_table(tlb, (void *)((unsigned long)pmd | TABLE_PMD));
69 }
70 
71 
72 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
73 {
74 	free_pointer_table(pgd, TABLE_PGD);
75 }
76 
77 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
78 {
79 	return get_pointer_table(mm, TABLE_PGD);
80 }
81 
82 
83 static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
84 {
85 	pmd_set(pmd, pte);
86 }
87 
88 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page)
89 {
90 	pmd_set(pmd, page);
91 }
92 
93 static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
94 {
95 	pud_set(pud, pmd);
96 }
97 
98 #endif /* _MOTOROLA_PGALLOC_H */
99