1*cbd15b3fSLey Foon Tan /* 2*cbd15b3fSLey Foon Tan * This file is subject to the terms and conditions of the GNU General Public 3*cbd15b3fSLey Foon Tan * License. See the file "COPYING" in the main directory of this archive 4*cbd15b3fSLey Foon Tan * for more details. 5*cbd15b3fSLey Foon Tan * 6*cbd15b3fSLey Foon Tan * Copyright (C) 1994 - 2001, 2003 by Ralf Baechle 7*cbd15b3fSLey Foon Tan * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc. 8*cbd15b3fSLey Foon Tan */ 9*cbd15b3fSLey Foon Tan 10*cbd15b3fSLey Foon Tan #ifndef _ASM_NIOS2_PGALLOC_H 11*cbd15b3fSLey Foon Tan #define _ASM_NIOS2_PGALLOC_H 12*cbd15b3fSLey Foon Tan 13*cbd15b3fSLey Foon Tan #include <linux/mm.h> 14*cbd15b3fSLey Foon Tan 15*cbd15b3fSLey Foon Tan static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, 16*cbd15b3fSLey Foon Tan pte_t *pte) 17*cbd15b3fSLey Foon Tan { 18*cbd15b3fSLey Foon Tan set_pmd(pmd, __pmd((unsigned long)pte)); 19*cbd15b3fSLey Foon Tan } 20*cbd15b3fSLey Foon Tan 21*cbd15b3fSLey Foon Tan static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, 22*cbd15b3fSLey Foon Tan pgtable_t pte) 23*cbd15b3fSLey Foon Tan { 24*cbd15b3fSLey Foon Tan set_pmd(pmd, __pmd((unsigned long)page_address(pte))); 25*cbd15b3fSLey Foon Tan } 26*cbd15b3fSLey Foon Tan #define pmd_pgtable(pmd) pmd_page(pmd) 27*cbd15b3fSLey Foon Tan 28*cbd15b3fSLey Foon Tan /* 29*cbd15b3fSLey Foon Tan * Initialize a new pmd table with invalid pointers. 30*cbd15b3fSLey Foon Tan */ 31*cbd15b3fSLey Foon Tan extern void pmd_init(unsigned long page, unsigned long pagetable); 32*cbd15b3fSLey Foon Tan 33*cbd15b3fSLey Foon Tan extern pgd_t *pgd_alloc(struct mm_struct *mm); 34*cbd15b3fSLey Foon Tan 35*cbd15b3fSLey Foon Tan static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 36*cbd15b3fSLey Foon Tan { 37*cbd15b3fSLey Foon Tan free_pages((unsigned long)pgd, PGD_ORDER); 38*cbd15b3fSLey Foon Tan } 39*cbd15b3fSLey Foon Tan 40*cbd15b3fSLey Foon Tan static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, 41*cbd15b3fSLey Foon Tan unsigned long address) 42*cbd15b3fSLey Foon Tan { 43*cbd15b3fSLey Foon Tan pte_t *pte; 44*cbd15b3fSLey Foon Tan 45*cbd15b3fSLey Foon Tan pte = (pte_t *) __get_free_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 46*cbd15b3fSLey Foon Tan PTE_ORDER); 47*cbd15b3fSLey Foon Tan 48*cbd15b3fSLey Foon Tan return pte; 49*cbd15b3fSLey Foon Tan } 50*cbd15b3fSLey Foon Tan 51*cbd15b3fSLey Foon Tan static inline pgtable_t pte_alloc_one(struct mm_struct *mm, 52*cbd15b3fSLey Foon Tan unsigned long address) 53*cbd15b3fSLey Foon Tan { 54*cbd15b3fSLey Foon Tan struct page *pte; 55*cbd15b3fSLey Foon Tan 56*cbd15b3fSLey Foon Tan pte = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER); 57*cbd15b3fSLey Foon Tan if (pte) { 58*cbd15b3fSLey Foon Tan if (!pgtable_page_ctor(pte)) { 59*cbd15b3fSLey Foon Tan __free_page(pte); 60*cbd15b3fSLey Foon Tan return NULL; 61*cbd15b3fSLey Foon Tan } 62*cbd15b3fSLey Foon Tan clear_highpage(pte); 63*cbd15b3fSLey Foon Tan } 64*cbd15b3fSLey Foon Tan return pte; 65*cbd15b3fSLey Foon Tan } 66*cbd15b3fSLey Foon Tan 67*cbd15b3fSLey Foon Tan static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 68*cbd15b3fSLey Foon Tan { 69*cbd15b3fSLey Foon Tan free_pages((unsigned long)pte, PTE_ORDER); 70*cbd15b3fSLey Foon Tan } 71*cbd15b3fSLey Foon Tan 72*cbd15b3fSLey Foon Tan static inline void pte_free(struct mm_struct *mm, struct page *pte) 73*cbd15b3fSLey Foon Tan { 74*cbd15b3fSLey Foon Tan pgtable_page_dtor(pte); 75*cbd15b3fSLey Foon Tan __free_pages(pte, PTE_ORDER); 76*cbd15b3fSLey Foon Tan } 77*cbd15b3fSLey Foon Tan 78*cbd15b3fSLey Foon Tan #define __pte_free_tlb(tlb, pte, addr) \ 79*cbd15b3fSLey Foon Tan do { \ 80*cbd15b3fSLey Foon Tan pgtable_page_dtor(pte); \ 81*cbd15b3fSLey Foon Tan tlb_remove_page((tlb), (pte)); \ 82*cbd15b3fSLey Foon Tan } while (0) 83*cbd15b3fSLey Foon Tan 84*cbd15b3fSLey Foon Tan #define check_pgt_cache() do { } while (0) 85*cbd15b3fSLey Foon Tan 86*cbd15b3fSLey Foon Tan #endif /* _ASM_NIOS2_PGALLOC_H */ 87