xref: /openbmc/linux/arch/arm64/include/asm/hugetlb.h (revision 935d4f0c)
11802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2084bd298SSteve Capper /*
3084bd298SSteve Capper  * arch/arm64/include/asm/hugetlb.h
4084bd298SSteve Capper  *
5084bd298SSteve Capper  * Copyright (C) 2013 Linaro Ltd.
6084bd298SSteve Capper  *
7084bd298SSteve Capper  * Based on arch/x86/include/asm/hugetlb.h
8084bd298SSteve Capper  */
9084bd298SSteve Capper 
10084bd298SSteve Capper #ifndef __ASM_HUGETLB_H
11084bd298SSteve Capper #define __ASM_HUGETLB_H
12084bd298SSteve Capper 
131de8c835SHugh Dickins #include <asm/cacheflush.h>
14084bd298SSteve Capper #include <asm/page.h>
15084bd298SSteve Capper 
165480280dSAnshuman Khandual #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
175480280dSAnshuman Khandual #define arch_hugetlb_migration_supported arch_hugetlb_migration_supported
185480280dSAnshuman Khandual extern bool arch_hugetlb_migration_supported(struct hstate *h);
195480280dSAnshuman Khandual #endif
205480280dSAnshuman Khandual 
arch_clear_hugepage_flags(struct page * page)21084bd298SSteve Capper static inline void arch_clear_hugepage_flags(struct page *page)
22084bd298SSteve Capper {
23084bd298SSteve Capper 	clear_bit(PG_dcache_clean, &page->flags);
24084bd298SSteve Capper }
255be99343SAnshuman Khandual #define arch_clear_hugepage_flags arch_clear_hugepage_flags
26084bd298SSteve Capper 
2779c1c594SChristophe Leroy pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags);
2866b3923aSDavid Woods #define arch_make_huge_pte arch_make_huge_pte
29cea685d5SAlexandre Ghiti #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
3066b3923aSDavid Woods extern void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
31*935d4f0cSRyan Roberts 			    pte_t *ptep, pte_t pte, unsigned long sz);
32facf6d5bSAlexandre Ghiti #define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
3366b3923aSDavid Woods extern int huge_ptep_set_access_flags(struct vm_area_struct *vma,
3466b3923aSDavid Woods 				      unsigned long addr, pte_t *ptep,
3566b3923aSDavid Woods 				      pte_t pte, int dirty);
36a4d83853SAlexandre Ghiti #define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
3766b3923aSDavid Woods extern pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
3866b3923aSDavid Woods 				     unsigned long addr, pte_t *ptep);
398e581d43SAlexandre Ghiti #define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
4066b3923aSDavid Woods extern void huge_ptep_set_wrprotect(struct mm_struct *mm,
4166b3923aSDavid Woods 				    unsigned long addr, pte_t *ptep);
42fe632225SAlexandre Ghiti #define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
43ae075629SBaolin Wang extern pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
4466b3923aSDavid Woods 				   unsigned long addr, pte_t *ptep);
45d018498cSAlexandre Ghiti #define __HAVE_ARCH_HUGE_PTE_CLEAR
46c3e4ed5cSPunit Agrawal extern void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
47c3e4ed5cSPunit Agrawal 			   pte_t *ptep, unsigned long sz);
48bc5dfb4fSBaolin Wang #define __HAVE_ARCH_HUGE_PTEP_GET
49bc5dfb4fSBaolin Wang extern pte_t huge_ptep_get(pte_t *ptep);
50c3e4ed5cSPunit Agrawal 
51abb7962aSAnshuman Khandual void __init arm64_hugetlb_cma_reserve(void);
52abb7962aSAnshuman Khandual 
535db568e7SAnshuman Khandual #define huge_ptep_modify_prot_start huge_ptep_modify_prot_start
545db568e7SAnshuman Khandual extern pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma,
555db568e7SAnshuman Khandual 					 unsigned long addr, pte_t *ptep);
565db568e7SAnshuman Khandual 
575db568e7SAnshuman Khandual #define huge_ptep_modify_prot_commit huge_ptep_modify_prot_commit
585db568e7SAnshuman Khandual extern void huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
595db568e7SAnshuman Khandual 					 unsigned long addr, pte_t *ptep,
605db568e7SAnshuman Khandual 					 pte_t old_pte, pte_t new_pte);
615db568e7SAnshuman Khandual 
62c3e4ed5cSPunit Agrawal #include <asm-generic/hugetlb.h>
6366b3923aSDavid Woods 
649cf6a060SKefeng Wang #define __HAVE_ARCH_FLUSH_HUGETLB_TLB_RANGE
flush_hugetlb_tlb_range(struct vm_area_struct * vma,unsigned long start,unsigned long end)659cf6a060SKefeng Wang static inline void flush_hugetlb_tlb_range(struct vm_area_struct *vma,
669cf6a060SKefeng Wang 					   unsigned long start,
679cf6a060SKefeng Wang 					   unsigned long end)
689cf6a060SKefeng Wang {
699cf6a060SKefeng Wang 	unsigned long stride = huge_page_size(hstate_vma(vma));
709cf6a060SKefeng Wang 
719cf6a060SKefeng Wang 	if (stride == PMD_SIZE)
729cf6a060SKefeng Wang 		__flush_tlb_range(vma, start, end, stride, false, 2);
739cf6a060SKefeng Wang 	else if (stride == PUD_SIZE)
749cf6a060SKefeng Wang 		__flush_tlb_range(vma, start, end, stride, false, 1);
759cf6a060SKefeng Wang 	else
769cf6a060SKefeng Wang 		__flush_tlb_range(vma, start, end, PAGE_SIZE, false, 0);
779cf6a060SKefeng Wang }
789cf6a060SKefeng Wang 
79084bd298SSteve Capper #endif /* __ASM_HUGETLB_H */
80