162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * include/asm-xtensa/pgalloc.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2001-2007 Tensilica Inc. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _XTENSA_PGALLOC_H 962306a36Sopenharmony_ci#define _XTENSA_PGALLOC_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifdef CONFIG_MMU 1262306a36Sopenharmony_ci#include <linux/highmem.h> 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL 1662306a36Sopenharmony_ci#define __HAVE_ARCH_PTE_ALLOC_ONE 1762306a36Sopenharmony_ci#include <asm-generic/pgalloc.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Allocating and freeing a pmd is trivial: the 1-entry pmd is 2162306a36Sopenharmony_ci * inside the pgd, so has no extra memory associated with it. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define pmd_populate_kernel(mm, pmdp, ptep) \ 2562306a36Sopenharmony_ci (pmd_val(*(pmdp)) = ((unsigned long)ptep)) 2662306a36Sopenharmony_ci#define pmd_populate(mm, pmdp, page) \ 2762306a36Sopenharmony_ci (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic inline pgd_t* 3062306a36Sopenharmony_cipgd_alloc(struct mm_struct *mm) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci return (pgd_t*) __get_free_page(GFP_KERNEL | __GFP_ZERO); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic inline void ptes_clear(pte_t *ptep) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci int i; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci for (i = 0; i < PTRS_PER_PTE; i++) 4062306a36Sopenharmony_ci pte_clear(NULL, 0, ptep + i); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci pte_t *ptep; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci ptep = (pte_t *)__pte_alloc_one_kernel(mm); 4862306a36Sopenharmony_ci if (!ptep) 4962306a36Sopenharmony_ci return NULL; 5062306a36Sopenharmony_ci ptes_clear(ptep); 5162306a36Sopenharmony_ci return ptep; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic inline pgtable_t pte_alloc_one(struct mm_struct *mm) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci struct page *page; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci page = __pte_alloc_one(mm, GFP_PGTABLE_USER); 5962306a36Sopenharmony_ci if (!page) 6062306a36Sopenharmony_ci return NULL; 6162306a36Sopenharmony_ci ptes_clear(page_address(page)); 6262306a36Sopenharmony_ci return page; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#endif /* CONFIG_MMU */ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#endif /* _XTENSA_PGALLOC_H */ 68