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