1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 #ifndef _ASM_POWERPC_PGALLOC_64_H 3 #define _ASM_POWERPC_PGALLOC_64_H 4 /* 5 */ 6 7 #include <linux/slab.h> 8 #include <linux/cpumask.h> 9 #include <linux/percpu.h> 10 11 struct vmemmap_backing { 12 struct vmemmap_backing *list; 13 unsigned long phys; 14 unsigned long virt_addr; 15 }; 16 extern struct vmemmap_backing *vmemmap_list; 17 18 static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud) 19 { 20 p4d_set(p4d, (unsigned long)pud); 21 } 22 23 static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) 24 { 25 return kmem_cache_alloc(PGT_CACHE(PUD_INDEX_SIZE), 26 pgtable_gfp_flags(mm, GFP_KERNEL)); 27 } 28 29 static inline void pud_free(struct mm_struct *mm, pud_t *pud) 30 { 31 kmem_cache_free(PGT_CACHE(PUD_INDEX_SIZE), pud); 32 } 33 34 static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) 35 { 36 pud_set(pud, (unsigned long)pmd); 37 } 38 39 static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, 40 pte_t *pte) 41 { 42 pmd_set(pmd, (unsigned long)pte); 43 } 44 45 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, 46 pgtable_t pte_page) 47 { 48 pmd_set(pmd, (unsigned long)pte_page); 49 } 50 51 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) 52 { 53 return kmem_cache_alloc(PGT_CACHE(PMD_CACHE_INDEX), 54 pgtable_gfp_flags(mm, GFP_KERNEL)); 55 } 56 57 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) 58 { 59 kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), pmd); 60 } 61 62 #define __pmd_free_tlb(tlb, pmd, addr) \ 63 pgtable_free_tlb(tlb, pmd, PMD_CACHE_INDEX) 64 #define __pud_free_tlb(tlb, pud, addr) \ 65 pgtable_free_tlb(tlb, pud, PUD_INDEX_SIZE) 66 67 #endif /* _ASM_POWERPC_PGALLOC_64_H */ 68