2008-04-28 13:13:27 +04:00
# ifndef _ASM_POWERPC_HUGETLB_H
# define _ASM_POWERPC_HUGETLB_H
# include <asm/page.h>
2009-10-26 22:24:31 +03:00
pte_t * huge_pte_offset_and_shift ( struct mm_struct * mm ,
unsigned long addr , unsigned * shift ) ;
2009-10-26 22:24:31 +03:00
void flush_dcache_icache_hugepage ( struct page * page ) ;
2008-04-28 13:13:27 +04:00
int is_hugepage_only_range ( struct mm_struct * mm , unsigned long addr ,
unsigned long len ) ;
2008-07-24 08:27:10 +04:00
void hugetlb_free_pgd_range ( struct mmu_gather * tlb , unsigned long addr ,
2008-04-28 13:13:27 +04:00
unsigned long end , unsigned long floor ,
unsigned long ceiling ) ;
2009-01-07 01:38:54 +03:00
/*
* The version of vma_mmu_pagesize ( ) in arch / powerpc / mm / hugetlbpage . c needs
* to override the version in mm / hugetlb . c
*/
# define vma_mmu_pagesize vma_mmu_pagesize
2008-04-28 13:13:27 +04:00
/*
* If the arch doesn ' t supply something else , assume that hugepage
* size aligned regions are ok without further preparation .
*/
2008-07-24 08:27:41 +04:00
static inline int prepare_hugepage_range ( struct file * file ,
unsigned long addr , unsigned long len )
2008-04-28 13:13:27 +04:00
{
2008-07-24 08:27:56 +04:00
struct hstate * h = hstate_file ( file ) ;
if ( len & ~ huge_page_mask ( h ) )
2008-04-28 13:13:27 +04:00
return - EINVAL ;
2008-07-24 08:27:56 +04:00
if ( addr & ~ huge_page_mask ( h ) )
2008-04-28 13:13:27 +04:00
return - EINVAL ;
return 0 ;
}
static inline void hugetlb_prefault_arch_hook ( struct mm_struct * mm )
{
}
2009-10-26 22:24:31 +03:00
static inline void set_huge_pte_at ( struct mm_struct * mm , unsigned long addr ,
pte_t * ptep , pte_t pte )
{
set_pte_at ( mm , addr , ptep , pte ) ;
}
static inline pte_t huge_ptep_get_and_clear ( struct mm_struct * mm ,
unsigned long addr , pte_t * ptep )
{
unsigned long old = pte_update ( mm , addr , ptep , ~ 0UL , 1 ) ;
return __pte ( old ) ;
}
2008-04-28 13:13:28 +04:00
static inline void huge_ptep_clear_flush ( struct vm_area_struct * vma ,
unsigned long addr , pte_t * ptep )
{
2009-10-26 22:24:31 +03:00
pte_t pte ;
pte = huge_ptep_get_and_clear ( vma - > vm_mm , addr , ptep ) ;
flush_tlb_page ( vma , addr ) ;
2008-04-28 13:13:28 +04:00
}
2008-04-28 13:13:29 +04:00
static inline int huge_pte_none ( pte_t pte )
{
return pte_none ( pte ) ;
}
static inline pte_t huge_pte_wrprotect ( pte_t pte )
{
return pte_wrprotect ( pte ) ;
}
static inline int huge_ptep_set_access_flags ( struct vm_area_struct * vma ,
unsigned long addr , pte_t * ptep ,
pte_t pte , int dirty )
{
return ptep_set_access_flags ( vma , addr , ptep , pte , dirty ) ;
}
static inline pte_t huge_ptep_get ( pte_t * ptep )
{
return * ptep ;
}
static inline int arch_prepare_hugepage ( struct page * page )
{
return 0 ;
}
static inline void arch_release_hugepage ( struct page * page )
{
}
2008-04-28 13:13:27 +04:00
# endif /* _ASM_POWERPC_HUGETLB_H */