Commit | Line | Data |
---|---|---|
5f97f7f9 HS |
1 | /* |
2 | * Copyright (C) 2004-2006 Atmel Corporation | |
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 | #ifndef __ASM_AVR32_PGALLOC_H | |
9 | #define __ASM_AVR32_PGALLOC_H | |
10 | ||
11 | #include <asm/processor.h> | |
12 | #include <linux/threads.h> | |
13 | #include <linux/slab.h> | |
14 | #include <linux/mm.h> | |
15 | ||
16 | #define pmd_populate_kernel(mm, pmd, pte) \ | |
17 | set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte))) | |
18 | ||
19 | static __inline__ void pmd_populate(struct mm_struct *mm, pmd_t *pmd, | |
2f569afd | 20 | pgtable_t pte) |
5f97f7f9 HS |
21 | { |
22 | set_pmd(pmd, __pmd(_PAGE_TABLE + page_to_phys(pte))); | |
23 | } | |
2f569afd | 24 | #define pmd_pgtable(pmd) pmd_page(pmd) |
5f97f7f9 HS |
25 | |
26 | /* | |
27 | * Allocate and free page tables | |
28 | */ | |
29 | static __inline__ pgd_t *pgd_alloc(struct mm_struct *mm) | |
30 | { | |
5221b34e | 31 | return kcalloc(USER_PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL); |
5f97f7f9 HS |
32 | } |
33 | ||
5e541973 | 34 | static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) |
5f97f7f9 HS |
35 | { |
36 | kfree(pgd); | |
37 | } | |
38 | ||
39 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | |
40 | unsigned long address) | |
41 | { | |
5f97f7f9 HS |
42 | pte_t *pte; |
43 | ||
e7f3bac9 | 44 | pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT); |
5f97f7f9 HS |
45 | |
46 | return pte; | |
47 | } | |
48 | ||
49 | static inline struct page *pte_alloc_one(struct mm_struct *mm, | |
50 | unsigned long address) | |
51 | { | |
5f97f7f9 HS |
52 | struct page *pte; |
53 | ||
e7f3bac9 | 54 | pte = alloc_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO); |
2f569afd MS |
55 | if (!pte) |
56 | return NULL; | |
57 | pgtable_page_ctor(pte); | |
5f97f7f9 HS |
58 | return pte; |
59 | } | |
60 | ||
5e541973 | 61 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) |
5f97f7f9 HS |
62 | { |
63 | free_page((unsigned long)pte); | |
64 | } | |
65 | ||
2f569afd | 66 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) |
5f97f7f9 | 67 | { |
2f569afd | 68 | pgtable_page_dtor(pte); |
5f97f7f9 HS |
69 | __free_page(pte); |
70 | } | |
71 | ||
2f569afd MS |
72 | #define __pte_free_tlb(tlb,pte) \ |
73 | do { \ | |
74 | pgtable_page_dtor(pte); \ | |
75 | tlb_remove_page((tlb), pte); \ | |
76 | } while (0) | |
5f97f7f9 HS |
77 | |
78 | #define check_pgt_cache() do { } while(0) | |
79 | ||
80 | #endif /* __ASM_AVR32_PGALLOC_H */ |