1 #ifndef _ASM_POWERPC_PGALLOC_H 2 #define _ASM_POWERPC_PGALLOC_H 3 #ifdef __KERNEL__ 4 5 #include <linux/mm.h> 6 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 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 #ifdef CONFIG_PPC64 28 #include <asm/pgalloc-64.h> 29 #else 30 #include <asm/pgalloc-32.h> 31 #endif 32 33 #ifdef CONFIG_SMP 34 struct mmu_gather; 35 extern void tlb_remove_table(struct mmu_gather *, void *); 36 37 static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift) 38 { 39 unsigned long pgf = (unsigned long)table; 40 BUG_ON(shift > MAX_PGTABLE_INDEX_SIZE); 41 pgf |= shift; 42 tlb_remove_table(tlb, (void *)pgf); 43 } 44 45 static inline void __tlb_remove_table(void *_table) 46 { 47 void *table = (void *)((unsigned long)_table & ~MAX_PGTABLE_INDEX_SIZE); 48 unsigned shift = (unsigned long)_table & MAX_PGTABLE_INDEX_SIZE; 49 50 pgtable_free(table, shift); 51 } 52 #else /* CONFIG_SMP */ 53 static inline void pgtable_free_tlb(struct mmu_gather *tlb, void *table, unsigned shift) 54 { 55 pgtable_free(table, shift); 56 } 57 #endif /* !CONFIG_SMP */ 58 59 static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *ptepage, 60 unsigned long address) 61 { 62 tlb_flush_pgtable(tlb, address); 63 pgtable_page_dtor(ptepage); 64 pgtable_free_tlb(tlb, page_address(ptepage), 0); 65 } 66 67 #endif /* __KERNEL__ */ 68 #endif /* _ASM_POWERPC_PGALLOC_H */ 69