1 /* 2 * include/asm-xtensa/pgalloc.h 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * Copyright (C) 2001-2007 Tensilica Inc. 9 */ 10 11 #ifndef _XTENSA_PGALLOC_H 12 #define _XTENSA_PGALLOC_H 13 14 #include <linux/highmem.h> 15 #include <linux/slab.h> 16 17 /* 18 * Allocating and freeing a pmd is trivial: the 1-entry pmd is 19 * inside the pgd, so has no extra memory associated with it. 20 */ 21 22 #define pmd_populate_kernel(mm, pmdp, ptep) \ 23 (pmd_val(*(pmdp)) = ((unsigned long)ptep)) 24 #define pmd_populate(mm, pmdp, page) \ 25 (pmd_val(*(pmdp)) = ((unsigned long)page_to_virt(page))) 26 #define pmd_pgtable(pmd) pmd_page(pmd) 27 28 static inline pgd_t* 29 pgd_alloc(struct mm_struct *mm) 30 { 31 return (pgd_t*) __get_free_pages(GFP_KERNEL | __GFP_ZERO, PGD_ORDER); 32 } 33 34 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 35 { 36 free_page((unsigned long)pgd); 37 } 38 39 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 40 { 41 pte_t *ptep; 42 int i; 43 44 ptep = (pte_t *)__get_free_page(GFP_KERNEL); 45 if (!ptep) 46 return NULL; 47 for (i = 0; i < 1024; i++) 48 pte_clear(NULL, 0, ptep + i); 49 return ptep; 50 } 51 52 static inline pgtable_t pte_alloc_one(struct mm_struct *mm) 53 { 54 pte_t *pte; 55 struct page *page; 56 57 pte = pte_alloc_one_kernel(mm); 58 if (!pte) 59 return NULL; 60 page = virt_to_page(pte); 61 if (!pgtable_page_ctor(page)) { 62 __free_page(page); 63 return NULL; 64 } 65 return page; 66 } 67 68 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 69 { 70 free_page((unsigned long)pte); 71 } 72 73 static inline void pte_free(struct mm_struct *mm, pgtable_t pte) 74 { 75 pgtable_page_dtor(pte); 76 __free_page(pte); 77 } 78 #define pmd_pgtable(pmd) pmd_page(pmd) 79 80 #endif /* _XTENSA_PGALLOC_H */ 81