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 11struct vmemmap_backing { 12 struct vmemmap_backing *list; 13 unsigned long phys; 14 unsigned long virt_addr; 15}; 16extern struct vmemmap_backing *vmemmap_list; 17 18static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud) 19{ 20 p4d_set(p4d, (unsigned long)pud); 21} 22 23static 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 29static inline void pud_free(struct mm_struct *mm, pud_t *pud) 30{ 31 kmem_cache_free(PGT_CACHE(PUD_INDEX_SIZE), pud); 32} 33 34static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) 35{ 36 pud_set(pud, (unsigned long)pmd); 37} 38 39static 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 45static 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 51static 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 57static 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