18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_SPARC64_HUGETLB_H
38c2ecf20Sopenharmony_ci#define _ASM_SPARC64_HUGETLB_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <asm/page.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifdef CONFIG_HUGETLB_PAGE
88c2ecf20Sopenharmony_cistruct pud_huge_patch_entry {
98c2ecf20Sopenharmony_ci	unsigned int addr;
108c2ecf20Sopenharmony_ci	unsigned int insn;
118c2ecf20Sopenharmony_ci};
128c2ecf20Sopenharmony_ciextern struct pud_huge_patch_entry __pud_huge_patch, __pud_huge_patch_end;
138c2ecf20Sopenharmony_ci#endif
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
168c2ecf20Sopenharmony_civoid set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
178c2ecf20Sopenharmony_ci		     pte_t *ptep, pte_t pte);
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
208c2ecf20Sopenharmony_cipte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
218c2ecf20Sopenharmony_ci			      pte_t *ptep);
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
248c2ecf20Sopenharmony_cistatic inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
258c2ecf20Sopenharmony_ci					 unsigned long addr, pte_t *ptep)
268c2ecf20Sopenharmony_ci{
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
308c2ecf20Sopenharmony_cistatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
318c2ecf20Sopenharmony_ci					   unsigned long addr, pte_t *ptep)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	pte_t old_pte = *ptep;
348c2ecf20Sopenharmony_ci	set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
358c2ecf20Sopenharmony_ci}
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
388c2ecf20Sopenharmony_cistatic inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
398c2ecf20Sopenharmony_ci					     unsigned long addr, pte_t *ptep,
408c2ecf20Sopenharmony_ci					     pte_t pte, int dirty)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	int changed = !pte_same(*ptep, pte);
438c2ecf20Sopenharmony_ci	if (changed) {
448c2ecf20Sopenharmony_ci		set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
458c2ecf20Sopenharmony_ci		flush_tlb_page(vma, addr);
468c2ecf20Sopenharmony_ci	}
478c2ecf20Sopenharmony_ci	return changed;
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
518c2ecf20Sopenharmony_civoid hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
528c2ecf20Sopenharmony_ci			    unsigned long end, unsigned long floor,
538c2ecf20Sopenharmony_ci			    unsigned long ceiling);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#include <asm-generic/hugetlb.h>
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#endif /* _ASM_SPARC64_HUGETLB_H */
58