18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_PGALLOC_64_H
38c2ecf20Sopenharmony_ci#define _ASM_POWERPC_PGALLOC_64_H
48c2ecf20Sopenharmony_ci/*
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/slab.h>
88c2ecf20Sopenharmony_ci#include <linux/cpumask.h>
98c2ecf20Sopenharmony_ci#include <linux/percpu.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct vmemmap_backing {
128c2ecf20Sopenharmony_ci	struct vmemmap_backing *list;
138c2ecf20Sopenharmony_ci	unsigned long phys;
148c2ecf20Sopenharmony_ci	unsigned long virt_addr;
158c2ecf20Sopenharmony_ci};
168c2ecf20Sopenharmony_ciextern struct vmemmap_backing *vmemmap_list;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define p4d_populate(MM, P4D, PUD)	p4d_set(P4D, (unsigned long)PUD)
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistatic inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	return kmem_cache_alloc(PGT_CACHE(PUD_INDEX_SIZE),
238c2ecf20Sopenharmony_ci			pgtable_gfp_flags(mm, GFP_KERNEL));
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic inline void pud_free(struct mm_struct *mm, pud_t *pud)
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	kmem_cache_free(PGT_CACHE(PUD_INDEX_SIZE), pud);
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	pud_set(pud, (unsigned long)pmd);
348c2ecf20Sopenharmony_ci}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistatic inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
378c2ecf20Sopenharmony_ci				       pte_t *pte)
388c2ecf20Sopenharmony_ci{
398c2ecf20Sopenharmony_ci	pmd_set(pmd, (unsigned long)pte);
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_cistatic inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
438c2ecf20Sopenharmony_ci				pgtable_t pte_page)
448c2ecf20Sopenharmony_ci{
458c2ecf20Sopenharmony_ci	pmd_set(pmd, (unsigned long)pte_page);
468c2ecf20Sopenharmony_ci}
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cistatic inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	return kmem_cache_alloc(PGT_CACHE(PMD_CACHE_INDEX),
518c2ecf20Sopenharmony_ci			pgtable_gfp_flags(mm, GFP_KERNEL));
528c2ecf20Sopenharmony_ci}
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_cistatic inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
558c2ecf20Sopenharmony_ci{
568c2ecf20Sopenharmony_ci	kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), pmd);
578c2ecf20Sopenharmony_ci}
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci#define __pmd_free_tlb(tlb, pmd, addr)		      \
608c2ecf20Sopenharmony_ci	pgtable_free_tlb(tlb, pmd, PMD_CACHE_INDEX)
618c2ecf20Sopenharmony_ci#define __pud_free_tlb(tlb, pud, addr)		      \
628c2ecf20Sopenharmony_ci	pgtable_free_tlb(tlb, pud, PUD_INDEX_SIZE)
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#endif /* _ASM_POWERPC_PGALLOC_64_H */
65