ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-parisc / pgalloc.h
1 #ifndef _ASM_PGALLOC_H
2 #define _ASM_PGALLOC_H
3
4 #include <linux/gfp.h>
5 #include <linux/mm.h>
6 #include <linux/threads.h>
7 #include <asm/processor.h>
8 #include <asm/fixmap.h>
9
10 #include <asm/pgtable.h>
11 #include <asm/cache.h>
12
13 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
14 {
15         pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
16         if (likely(pgd != NULL))
17                 clear_page(pgd);
18         return pgd;
19 }
20
21 static inline void pgd_free(pgd_t *pgd)
22 {
23         free_page((unsigned long)pgd);
24 }
25
26 #ifdef __LP64__
27
28 /* Three Level Page Table Support for pmd's */
29
30 static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
31 {
32         pgd_val(*pgd) = _PAGE_TABLE + __pa((unsigned long)pmd);
33 }
34
35 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
36 {
37         pmd_t *pmd = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
38         if (pmd)
39                 clear_page(pmd);
40         return pmd;
41 }
42
43 static inline void pmd_free(pmd_t *pmd)
44 {
45         free_page((unsigned long)pmd);
46 }
47
48 #else
49
50 /* Two Level Page Table Support for pmd's */
51
52 /*
53  * allocating and freeing a pmd is trivial: the 1-entry pmd is
54  * inside the pgd, so has no extra memory associated with it.
55  */
56
57 #define pmd_alloc_one(mm, addr)         ({ BUG(); ((pmd_t *)2); })
58 #define pmd_free(x)                     do { } while (0)
59 #define pgd_populate(mm, pmd, pte)      BUG()
60
61 #endif
62
63 static inline void
64 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
65 {
66         pmd_val(*pmd) = _PAGE_TABLE + __pa((unsigned long)pte);
67 }
68
69 #define pmd_populate(mm, pmd, pte_page) \
70         pmd_populate_kernel(mm, pmd, page_address(pte_page))
71
72 static inline struct page *
73 pte_alloc_one(struct mm_struct *mm, unsigned long address)
74 {
75         struct page *page = alloc_page(GFP_KERNEL|__GFP_REPEAT);
76         if (likely(page != NULL))
77                 clear_page(page_address(page));
78         return page;
79 }
80
81 static inline pte_t *
82 pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
83 {
84         pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
85         if (likely(pte != NULL))
86                 clear_page(pte);
87         return pte;
88 }
89
90 static inline void pte_free_kernel(pte_t *pte)
91 {
92         free_page((unsigned long)pte);
93 }
94
95 #define pte_free(page)  pte_free_kernel(page_address(page))
96
97 extern int do_check_pgt_cache(int, int);
98 #define check_pgt_cache()       do { } while (0)
99
100 #endif