162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm64/include/asm/hugetlb.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2013 Linaro Ltd.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Based on arch/x86/include/asm/hugetlb.h
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __ASM_HUGETLB_H
1162306a36Sopenharmony_ci#define __ASM_HUGETLB_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <asm/cacheflush.h>
1462306a36Sopenharmony_ci#include <asm/page.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
1762306a36Sopenharmony_ci#define arch_hugetlb_migration_supported arch_hugetlb_migration_supported
1862306a36Sopenharmony_ciextern bool arch_hugetlb_migration_supported(struct hstate *h);
1962306a36Sopenharmony_ci#endif
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic inline void arch_clear_hugepage_flags(struct page *page)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	clear_bit(PG_dcache_clean, &page->flags);
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci#define arch_clear_hugepage_flags arch_clear_hugepage_flags
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cipte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags);
2862306a36Sopenharmony_ci#define arch_make_huge_pte arch_make_huge_pte
2962306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
3062306a36Sopenharmony_ciextern void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
3162306a36Sopenharmony_ci			    pte_t *ptep, pte_t pte, unsigned long sz);
3262306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
3362306a36Sopenharmony_ciextern int huge_ptep_set_access_flags(struct vm_area_struct *vma,
3462306a36Sopenharmony_ci				      unsigned long addr, pte_t *ptep,
3562306a36Sopenharmony_ci				      pte_t pte, int dirty);
3662306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
3762306a36Sopenharmony_ciextern pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
3862306a36Sopenharmony_ci				     unsigned long addr, pte_t *ptep);
3962306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
4062306a36Sopenharmony_ciextern void huge_ptep_set_wrprotect(struct mm_struct *mm,
4162306a36Sopenharmony_ci				    unsigned long addr, pte_t *ptep);
4262306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
4362306a36Sopenharmony_ciextern pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
4462306a36Sopenharmony_ci				   unsigned long addr, pte_t *ptep);
4562306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTE_CLEAR
4662306a36Sopenharmony_ciextern void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
4762306a36Sopenharmony_ci			   pte_t *ptep, unsigned long sz);
4862306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_GET
4962306a36Sopenharmony_ciextern pte_t huge_ptep_get(pte_t *ptep);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_civoid __init arm64_hugetlb_cma_reserve(void);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define huge_ptep_modify_prot_start huge_ptep_modify_prot_start
5462306a36Sopenharmony_ciextern pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma,
5562306a36Sopenharmony_ci					 unsigned long addr, pte_t *ptep);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define huge_ptep_modify_prot_commit huge_ptep_modify_prot_commit
5862306a36Sopenharmony_ciextern void huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
5962306a36Sopenharmony_ci					 unsigned long addr, pte_t *ptep,
6062306a36Sopenharmony_ci					 pte_t old_pte, pte_t new_pte);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#include <asm-generic/hugetlb.h>
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define __HAVE_ARCH_FLUSH_HUGETLB_TLB_RANGE
6562306a36Sopenharmony_cistatic inline void flush_hugetlb_tlb_range(struct vm_area_struct *vma,
6662306a36Sopenharmony_ci					   unsigned long start,
6762306a36Sopenharmony_ci					   unsigned long end)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	unsigned long stride = huge_page_size(hstate_vma(vma));
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	if (stride == PMD_SIZE)
7262306a36Sopenharmony_ci		__flush_tlb_range(vma, start, end, stride, false, 2);
7362306a36Sopenharmony_ci	else if (stride == PUD_SIZE)
7462306a36Sopenharmony_ci		__flush_tlb_range(vma, start, end, stride, false, 1);
7562306a36Sopenharmony_ci	else
7662306a36Sopenharmony_ci		__flush_tlb_range(vma, start, end, PAGE_SIZE, false, 0);
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#endif /* __ASM_HUGETLB_H */
80