• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _METAG_PGALLOC_H
2 #define _METAG_PGALLOC_H
3 
4 #include <linux/threads.h>
5 #include <linux/mm.h>
6 
7 #define pmd_populate_kernel(mm, pmd, pte) \
8 	set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)))
9 
10 #define pmd_populate(mm, pmd, pte) \
11 	set_pmd(pmd, __pmd(_PAGE_TABLE | page_to_phys(pte)))
12 
13 #define pmd_pgtable(pmd) pmd_page(pmd)
14 
15 /*
16  * Allocate and free page tables.
17  */
18 #ifdef CONFIG_METAG_META21_MMU
pgd_ctor(pgd_t * pgd)19 static inline void pgd_ctor(pgd_t *pgd)
20 {
21 	memcpy(pgd + USER_PTRS_PER_PGD,
22 	       swapper_pg_dir + USER_PTRS_PER_PGD,
23 	       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
24 }
25 #else
26 #define pgd_ctor(x)	do { } while (0)
27 #endif
28 
pgd_alloc(struct mm_struct * mm)29 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
30 {
31 	pgd_t *pgd = (pgd_t *)get_zeroed_page(GFP_KERNEL);
32 	if (pgd)
33 		pgd_ctor(pgd);
34 	return pgd;
35 }
36 
pgd_free(struct mm_struct * mm,pgd_t * pgd)37 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
38 {
39 	free_page((unsigned long)pgd);
40 }
41 
pte_alloc_one_kernel(struct mm_struct * mm,unsigned long address)42 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
43 					  unsigned long address)
44 {
45 	pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
46 	return pte;
47 }
48 
pte_alloc_one(struct mm_struct * mm,unsigned long address)49 static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
50 				      unsigned long address)
51 {
52 	struct page *pte;
53 	pte = alloc_pages(GFP_KERNEL  | __GFP_ZERO, 0);
54 	if (!pte)
55 		return NULL;
56 	if (!pgtable_page_ctor(pte)) {
57 		__free_page(pte);
58 		return NULL;
59 	}
60 	return pte;
61 }
62 
pte_free_kernel(struct mm_struct * mm,pte_t * pte)63 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
64 {
65 	free_page((unsigned long)pte);
66 }
67 
pte_free(struct mm_struct * mm,pgtable_t pte)68 static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
69 {
70 	pgtable_page_dtor(pte);
71 	__free_page(pte);
72 }
73 
74 #define __pte_free_tlb(tlb, pte, addr)				\
75 	do {							\
76 		pgtable_page_dtor(pte);				\
77 		tlb_remove_page((tlb), (pte));			\
78 	} while (0)
79 
80 #define check_pgt_cache()	do { } while (0)
81 
82 #endif
83