162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_PGALLOC_64_H
362306a36Sopenharmony_ci#define _ASM_POWERPC_PGALLOC_64_H
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/slab.h>
862306a36Sopenharmony_ci#include <linux/cpumask.h>
962306a36Sopenharmony_ci#include <linux/percpu.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct vmemmap_backing {
1262306a36Sopenharmony_ci	struct vmemmap_backing *list;
1362306a36Sopenharmony_ci	unsigned long phys;
1462306a36Sopenharmony_ci	unsigned long virt_addr;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ciextern struct vmemmap_backing *vmemmap_list;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	p4d_set(p4d, (unsigned long)pud);
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	return kmem_cache_alloc(PGT_CACHE(PUD_INDEX_SIZE),
2662306a36Sopenharmony_ci			pgtable_gfp_flags(mm, GFP_KERNEL));
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic inline void pud_free(struct mm_struct *mm, pud_t *pud)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	kmem_cache_free(PGT_CACHE(PUD_INDEX_SIZE), pud);
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	pud_set(pud, (unsigned long)pmd);
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
4062306a36Sopenharmony_ci				       pte_t *pte)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	pmd_set(pmd, (unsigned long)pte);
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
4662306a36Sopenharmony_ci				pgtable_t pte_page)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	pmd_set(pmd, (unsigned long)pte_page);
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return kmem_cache_alloc(PGT_CACHE(PMD_CACHE_INDEX),
5462306a36Sopenharmony_ci			pgtable_gfp_flags(mm, GFP_KERNEL));
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	kmem_cache_free(PGT_CACHE(PMD_CACHE_INDEX), pmd);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define __pmd_free_tlb(tlb, pmd, addr)		      \
6362306a36Sopenharmony_ci	pgtable_free_tlb(tlb, pmd, PMD_CACHE_INDEX)
6462306a36Sopenharmony_ci#define __pud_free_tlb(tlb, pud, addr)		      \
6562306a36Sopenharmony_ci	pgtable_free_tlb(tlb, pud, PUD_INDEX_SIZE)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#endif /* _ASM_POWERPC_PGALLOC_64_H */
68