1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2367b8112SChris Zankel /* 3367b8112SChris Zankel * include/asm-xtensa/pgalloc.h 4367b8112SChris Zankel * 5367b8112SChris Zankel * Copyright (C) 2001-2007 Tensilica Inc. 6367b8112SChris Zankel */ 7367b8112SChris Zankel 8367b8112SChris Zankel #ifndef _XTENSA_PGALLOC_H 9367b8112SChris Zankel #define _XTENSA_PGALLOC_H 10367b8112SChris Zankel 117278914cSMike Rapoport #ifdef CONFIG_MMU 12367b8112SChris Zankel #include <linux/highmem.h> 134573e398SChris Zankel #include <linux/slab.h> 14367b8112SChris Zankel 157278914cSMike Rapoport #define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL 167278914cSMike Rapoport #define __HAVE_ARCH_PTE_ALLOC_ONE 177278914cSMike Rapoport #include <asm-generic/pgalloc.h> 187278914cSMike Rapoport 19367b8112SChris Zankel /* 20367b8112SChris Zankel * Allocating and freeing a pmd is trivial: the 1-entry pmd is 21367b8112SChris Zankel * inside the pgd, so has no extra memory associated with it. 22367b8112SChris Zankel */ 23367b8112SChris Zankel 24367b8112SChris Zankel #define pmd_populate_kernel(mm, pmdp, ptep) \ 25367b8112SChris Zankel (pmd_val(*(pmdp)) = ((unsigned long)ptep)) 26367b8112SChris Zankel #define pmd_populate(mm, pmdp, page) \ 27367b8112SChris Zankel (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) 28367b8112SChris Zankel 29367b8112SChris Zankel static inline pgd_t* pgd_alloc(struct mm_struct * mm)30367b8112SChris Zankelpgd_alloc(struct mm_struct *mm) 31367b8112SChris Zankel { 32*a9b3c355SKevin Brodsky return __pgd_alloc(mm, 0); 33367b8112SChris Zankel } 34367b8112SChris Zankel ptes_clear(pte_t * ptep)357278914cSMike Rapoportstatic inline void ptes_clear(pte_t *ptep) 367278914cSMike Rapoport { 377278914cSMike Rapoport int i; 387278914cSMike Rapoport 397278914cSMike Rapoport for (i = 0; i < PTRS_PER_PTE; i++) 407278914cSMike Rapoport pte_clear(NULL, 0, ptep + i); 417278914cSMike Rapoport } 427278914cSMike Rapoport pte_alloc_one_kernel(struct mm_struct * mm)434cf58924SJoel Fernandes (Google)static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 44367b8112SChris Zankel { 45f820e280SKirill A. Shutemov pte_t *ptep; 46f820e280SKirill A. Shutemov 477278914cSMike Rapoport ptep = (pte_t *)__pte_alloc_one_kernel(mm); 48f820e280SKirill A. Shutemov if (!ptep) 49f820e280SKirill A. Shutemov return NULL; 507278914cSMike Rapoport ptes_clear(ptep); 51f820e280SKirill A. Shutemov return ptep; 52367b8112SChris Zankel } 53367b8112SChris Zankel pte_alloc_one(struct mm_struct * mm)544cf58924SJoel Fernandes (Google)static inline pgtable_t pte_alloc_one(struct mm_struct *mm) 55367b8112SChris Zankel { 56367b8112SChris Zankel struct page *page; 57367b8112SChris Zankel 587278914cSMike Rapoport page = __pte_alloc_one(mm, GFP_PGTABLE_USER); 597278914cSMike Rapoport if (!page) 60f8c6d30bSKirill A. Shutemov return NULL; 617278914cSMike Rapoport ptes_clear(page_address(page)); 62367b8112SChris Zankel return page; 63367b8112SChris Zankel } 64367b8112SChris Zankel 657278914cSMike Rapoport #endif /* CONFIG_MMU */ 66367b8112SChris Zankel 67367b8112SChris Zankel #endif /* _XTENSA_PGALLOC_H */ 68