Commit | Line | Data |
---|---|---|
047ea784 PM |
1 | #ifndef _ASM_POWERPC_PGALLOC_H |
2 | #define _ASM_POWERPC_PGALLOC_H | |
88ced031 | 3 | #ifdef __KERNEL__ |
047ea784 | 4 | |
0186f47e KG |
5 | #include <linux/mm.h> |
6 | ||
c7cc58a1 BH |
7 | #ifdef CONFIG_PPC_BOOK3E |
8 | extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address); | |
9 | #else /* CONFIG_PPC_BOOK3E */ | |
10 | static inline void tlb_flush_pgtable(struct mmu_gather *tlb, | |
11 | unsigned long address) | |
12 | { | |
13 | } | |
14 | #endif /* !CONFIG_PPC_BOOK3E */ | |
15 | ||
0186f47e KG |
16 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) |
17 | { | |
18 | free_page((unsigned long)pte); | |
19 | } | |
20 | ||
21 | static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) | |
22 | { | |
23 | pgtable_page_dtor(ptepage); | |
24 | __free_page(ptepage); | |
25 | } | |
26 | ||
27 | typedef struct pgtable_free { | |
28 | unsigned long val; | |
29 | } pgtable_free_t; | |
30 | ||
31 | #define PGF_CACHENUM_MASK 0x7 | |
32 | ||
33 | static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum, | |
34 | unsigned long mask) | |
35 | { | |
36 | BUG_ON(cachenum > PGF_CACHENUM_MASK); | |
37 | ||
38 | return (pgtable_free_t){.val = ((unsigned long) p & ~mask) | cachenum}; | |
39 | } | |
40 | ||
f88df14b DG |
41 | #ifdef CONFIG_PPC64 |
42 | #include <asm/pgalloc-64.h> | |
047ea784 | 43 | #else |
f88df14b | 44 | #include <asm/pgalloc-32.h> |
3c726f8d | 45 | #endif |
1da177e4 | 46 | |
0186f47e | 47 | #ifdef CONFIG_SMP |
c7cc58a1 BH |
48 | extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf); |
49 | extern void pte_free_finish(void); | |
50 | #else /* CONFIG_SMP */ | |
51 | static inline void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf) | |
52 | { | |
53 | pgtable_free(pgf); | |
54 | } | |
55 | static inline void pte_free_finish(void) { } | |
56 | #endif /* !CONFIG_SMP */ | |
0186f47e | 57 | |
c7cc58a1 BH |
58 | static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage, |
59 | unsigned long address) | |
60 | { | |
61 | pgtable_free_t pgf = pgtable_free_cache(page_address(ptepage), | |
62 | PTE_NONCACHE_NUM, | |
63 | PTE_TABLE_SIZE-1); | |
64 | tlb_flush_pgtable(tlb, address); | |
65 | pgtable_page_dtor(ptepage); | |
66 | pgtable_free_tlb(tlb, pgf); | |
67 | } | |
0186f47e | 68 | |
88ced031 | 69 | #endif /* __KERNEL__ */ |
047ea784 | 70 | #endif /* _ASM_POWERPC_PGALLOC_H */ |