1#ifndef _MOTOROLA_PGALLOC_H
2#define _MOTOROLA_PGALLOC_H
3
4#include <asm/tlb.h>
5#include <asm/tlbflush.h>
6
7extern pmd_t *get_pointer_table(void);
8extern int free_pointer_table(pmd_t *);
9
10static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
11{
12	pte_t *pte;
13
14	pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
15	if (pte) {
16		__flush_page_to_ram(pte);
17		flush_tlb_kernel_page(pte);
18		nocache_page(pte);
19	}
20
21	return pte;
22}
23
24static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
25{
26	cache_page(pte);
27	free_page((unsigned long) pte);
28}
29
30static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
31{
32	struct page *page;
33	pte_t *pte;
34
35	page = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
36	if(!page)
37		return NULL;
38	if (!pgtable_page_ctor(page)) {
39		__free_page(page);
40		return NULL;
41	}
42
43	pte = kmap(page);
44	__flush_page_to_ram(pte);
45	flush_tlb_kernel_page(pte);
46	nocache_page(pte);
47	kunmap(page);
48	return page;
49}
50
51static inline void pte_free(struct mm_struct *mm, pgtable_t page)
52{
53	pgtable_page_dtor(page);
54	cache_page(kmap(page));
55	kunmap(page);
56	__free_page(page);
57}
58
59static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
60				  unsigned long address)
61{
62	pgtable_page_dtor(page);
63	cache_page(kmap(page));
64	kunmap(page);
65	__free_page(page);
66}
67
68
69static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
70{
71	return get_pointer_table();
72}
73
74static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd)
75{
76	return free_pointer_table(pmd);
77}
78
79static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
80				 unsigned long address)
81{
82	return free_pointer_table(pmd);
83}
84
85
86static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
87{
88	pmd_free(mm, (pmd_t *)pgd);
89}
90
91static inline pgd_t *pgd_alloc(struct mm_struct *mm)
92{
93	return (pgd_t *)get_pointer_table();
94}
95
96
97static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
98{
99	pmd_set(pmd, pte);
100}
101
102static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page)
103{
104	pmd_set(pmd, page_address(page));
105}
106#define pmd_pgtable(pmd) pmd_page(pmd)
107
108static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
109{
110	pgd_set(pgd, pmd);
111}
112
113#endif /* _MOTOROLA_PGALLOC_H */
114