18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * include/asm-xtensa/pgalloc.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2001-2007 Tensilica Inc. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _XTENSA_PGALLOC_H 98c2ecf20Sopenharmony_ci#define _XTENSA_PGALLOC_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU 128c2ecf20Sopenharmony_ci#include <linux/highmem.h> 138c2ecf20Sopenharmony_ci#include <linux/slab.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL 168c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTE_ALLOC_ONE 178c2ecf20Sopenharmony_ci#include <asm-generic/pgalloc.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* 208c2ecf20Sopenharmony_ci * Allocating and freeing a pmd is trivial: the 1-entry pmd is 218c2ecf20Sopenharmony_ci * inside the pgd, so has no extra memory associated with it. 228c2ecf20Sopenharmony_ci */ 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define pmd_populate_kernel(mm, pmdp, ptep) \ 258c2ecf20Sopenharmony_ci (pmd_val(*(pmdp)) = ((unsigned long)ptep)) 268c2ecf20Sopenharmony_ci#define pmd_populate(mm, pmdp, page) \ 278c2ecf20Sopenharmony_ci (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) 288c2ecf20Sopenharmony_ci#define pmd_pgtable(pmd) pmd_page(pmd) 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistatic inline pgd_t* 318c2ecf20Sopenharmony_cipgd_alloc(struct mm_struct *mm) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci return (pgd_t*) __get_free_pages(GFP_KERNEL | __GFP_ZERO, PGD_ORDER); 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic inline void ptes_clear(pte_t *ptep) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci int i; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci for (i = 0; i < PTRS_PER_PTE; i++) 418c2ecf20Sopenharmony_ci pte_clear(NULL, 0, ptep + i); 428c2ecf20Sopenharmony_ci} 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 458c2ecf20Sopenharmony_ci{ 468c2ecf20Sopenharmony_ci pte_t *ptep; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci ptep = (pte_t *)__pte_alloc_one_kernel(mm); 498c2ecf20Sopenharmony_ci if (!ptep) 508c2ecf20Sopenharmony_ci return NULL; 518c2ecf20Sopenharmony_ci ptes_clear(ptep); 528c2ecf20Sopenharmony_ci return ptep; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic inline pgtable_t pte_alloc_one(struct mm_struct *mm) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci struct page *page; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci page = __pte_alloc_one(mm, GFP_PGTABLE_USER); 608c2ecf20Sopenharmony_ci if (!page) 618c2ecf20Sopenharmony_ci return NULL; 628c2ecf20Sopenharmony_ci ptes_clear(page_address(page)); 638c2ecf20Sopenharmony_ci return page; 648c2ecf20Sopenharmony_ci} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci#define pmd_pgtable(pmd) pmd_page(pmd) 678c2ecf20Sopenharmony_ci#endif /* CONFIG_MMU */ 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci#endif /* _XTENSA_PGALLOC_H */ 70