2005-11-19 12:17:32 +03:00
# ifndef _ASM_POWERPC_PGALLOC_H
# define _ASM_POWERPC_PGALLOC_H
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-11-19 12:17:32 +03:00
2008-11-19 15:50:04 +03:00
# include <linux/mm.h>
2009-07-24 03:15:28 +04:00
# ifdef CONFIG_PPC_BOOK3E
extern void tlb_flush_pgtable ( struct mmu_gather * tlb , unsigned long address ) ;
# else /* CONFIG_PPC_BOOK3E */
static inline void tlb_flush_pgtable ( struct mmu_gather * tlb ,
unsigned long address )
{
}
# endif /* !CONFIG_PPC_BOOK3E */
2008-11-19 15:50:04 +03:00
static inline void pte_free_kernel ( struct mm_struct * mm , pte_t * pte )
{
free_page ( ( unsigned long ) pte ) ;
}
static inline void pte_free ( struct mm_struct * mm , pgtable_t ptepage )
{
pgtable_page_dtor ( ptepage ) ;
__free_page ( ptepage ) ;
}
2007-04-30 10:30:56 +04:00
# ifdef CONFIG_PPC64
# include <asm/pgalloc-64.h>
2005-11-19 12:17:32 +03:00
# else
2007-04-30 10:30:56 +04:00
# include <asm/pgalloc-32.h>
2005-11-07 03:06:55 +03:00
# endif
2005-04-17 02:20:36 +04:00
2008-11-19 15:50:04 +03:00
# ifdef CONFIG_SMP
2011-05-25 04:12:00 +04:00
struct mmu_gather ;
extern void tlb_remove_table ( struct mmu_gather * , void * ) ;
static inline void pgtable_free_tlb ( struct mmu_gather * tlb , void * table , int shift )
{
unsigned long pgf = ( unsigned long ) table ;
BUG_ON ( shift > MAX_PGTABLE_INDEX_SIZE ) ;
pgf | = shift ;
tlb_remove_table ( tlb , ( void * ) pgf ) ;
}
static inline void __tlb_remove_table ( void * _table )
{
void * table = ( void * ) ( ( unsigned long ) _table & ~ MAX_PGTABLE_INDEX_SIZE ) ;
unsigned shift = ( unsigned long ) _table & MAX_PGTABLE_INDEX_SIZE ;
pgtable_free ( table , shift ) ;
}
2009-07-24 03:15:28 +04:00
# else /* CONFIG_SMP */
2009-10-28 19:27:18 +03:00
static inline void pgtable_free_tlb ( struct mmu_gather * tlb , void * table , unsigned shift )
2009-07-24 03:15:28 +04:00
{
2009-10-28 19:27:18 +03:00
pgtable_free ( table , shift ) ;
2009-07-24 03:15:28 +04:00
}
# endif /* !CONFIG_SMP */
2008-11-19 15:50:04 +03:00
2009-07-24 03:15:28 +04:00
static inline void __pte_free_tlb ( struct mmu_gather * tlb , struct page * ptepage ,
unsigned long address )
{
tlb_flush_pgtable ( tlb , address ) ;
pgtable_page_dtor ( ptepage ) ;
2009-10-28 19:27:18 +03:00
pgtable_free_tlb ( tlb , page_address ( ptepage ) , 0 ) ;
2009-07-24 03:15:28 +04:00
}
2008-11-19 15:50:04 +03:00
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-11-19 12:17:32 +03:00
# endif /* _ASM_POWERPC_PGALLOC_H */