162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_GENERIC_HUGETLB_H
362306a36Sopenharmony_ci#define _ASM_GENERIC_HUGETLB_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/swap.h>
662306a36Sopenharmony_ci#include <linux/swapops.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistatic inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot)
962306a36Sopenharmony_ci{
1062306a36Sopenharmony_ci	return mk_pte(page, pgprot);
1162306a36Sopenharmony_ci}
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic inline unsigned long huge_pte_write(pte_t pte)
1462306a36Sopenharmony_ci{
1562306a36Sopenharmony_ci	return pte_write(pte);
1662306a36Sopenharmony_ci}
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic inline unsigned long huge_pte_dirty(pte_t pte)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	return pte_dirty(pte);
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic inline pte_t huge_pte_mkwrite(pte_t pte)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	return pte_mkwrite_novma(pte);
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTE_WRPROTECT
2962306a36Sopenharmony_cistatic inline pte_t huge_pte_wrprotect(pte_t pte)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	return pte_wrprotect(pte);
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci#endif
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic inline pte_t huge_pte_mkdirty(pte_t pte)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	return pte_mkdirty(pte);
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	return pte_modify(pte, newprot);
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic inline pte_t huge_pte_mkuffd_wp(pte_t pte)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return huge_pte_wrprotect(pte_mkuffd_wp(pte));
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline pte_t huge_pte_clear_uffd_wp(pte_t pte)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	return pte_clear_uffd_wp(pte);
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic inline int huge_pte_uffd_wp(pte_t pte)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	return pte_uffd_wp(pte);
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTE_CLEAR
6162306a36Sopenharmony_cistatic inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
6262306a36Sopenharmony_ci		    pte_t *ptep, unsigned long sz)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	pte_clear(mm, addr, ptep);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci#endif
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
6962306a36Sopenharmony_cistatic inline void hugetlb_free_pgd_range(struct mmu_gather *tlb,
7062306a36Sopenharmony_ci		unsigned long addr, unsigned long end,
7162306a36Sopenharmony_ci		unsigned long floor, unsigned long ceiling)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	free_pgd_range(tlb, addr, end, floor, ceiling);
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci#endif
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
7862306a36Sopenharmony_cistatic inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
7962306a36Sopenharmony_ci		pte_t *ptep, pte_t pte, unsigned long sz)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	set_pte_at(mm, addr, ptep, pte);
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci#endif
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
8662306a36Sopenharmony_cistatic inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
8762306a36Sopenharmony_ci		unsigned long addr, pte_t *ptep)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	return ptep_get_and_clear(mm, addr, ptep);
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci#endif
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
9462306a36Sopenharmony_cistatic inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
9562306a36Sopenharmony_ci		unsigned long addr, pte_t *ptep)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	return ptep_clear_flush(vma, addr, ptep);
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci#endif
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTE_NONE
10262306a36Sopenharmony_cistatic inline int huge_pte_none(pte_t pte)
10362306a36Sopenharmony_ci{
10462306a36Sopenharmony_ci	return pte_none(pte);
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci#endif
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/* Please refer to comments above pte_none_mostly() for the usage */
10962306a36Sopenharmony_cistatic inline int huge_pte_none_mostly(pte_t pte)
11062306a36Sopenharmony_ci{
11162306a36Sopenharmony_ci	return huge_pte_none(pte) || is_pte_marker(pte);
11262306a36Sopenharmony_ci}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#ifndef __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE
11562306a36Sopenharmony_cistatic inline int prepare_hugepage_range(struct file *file,
11662306a36Sopenharmony_ci		unsigned long addr, unsigned long len)
11762306a36Sopenharmony_ci{
11862306a36Sopenharmony_ci	struct hstate *h = hstate_file(file);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	if (len & ~huge_page_mask(h))
12162306a36Sopenharmony_ci		return -EINVAL;
12262306a36Sopenharmony_ci	if (addr & ~huge_page_mask(h))
12362306a36Sopenharmony_ci		return -EINVAL;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci	return 0;
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci#endif
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
13062306a36Sopenharmony_cistatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
13162306a36Sopenharmony_ci		unsigned long addr, pte_t *ptep)
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	ptep_set_wrprotect(mm, addr, ptep);
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci#endif
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
13862306a36Sopenharmony_cistatic inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
13962306a36Sopenharmony_ci		unsigned long addr, pte_t *ptep,
14062306a36Sopenharmony_ci		pte_t pte, int dirty)
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci#endif
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_GET
14762306a36Sopenharmony_cistatic inline pte_t huge_ptep_get(pte_t *ptep)
14862306a36Sopenharmony_ci{
14962306a36Sopenharmony_ci	return ptep_get(ptep);
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci#endif
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#ifndef __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED
15462306a36Sopenharmony_cistatic inline bool gigantic_page_runtime_supported(void)
15562306a36Sopenharmony_ci{
15662306a36Sopenharmony_ci	return IS_ENABLED(CONFIG_ARCH_HAS_GIGANTIC_PAGE);
15762306a36Sopenharmony_ci}
15862306a36Sopenharmony_ci#endif /* __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED */
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci#endif /* _ASM_GENERIC_HUGETLB_H */
161