162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_HUGETLB_H
362306a36Sopenharmony_ci#define _ASM_POWERPC_HUGETLB_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifdef CONFIG_HUGETLB_PAGE
662306a36Sopenharmony_ci#include <asm/page.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64
962306a36Sopenharmony_ci#include <asm/book3s/64/hugetlb.h>
1062306a36Sopenharmony_ci#elif defined(CONFIG_PPC_E500)
1162306a36Sopenharmony_ci#include <asm/nohash/hugetlb-e500.h>
1262306a36Sopenharmony_ci#elif defined(CONFIG_PPC_8xx)
1362306a36Sopenharmony_ci#include <asm/nohash/32/hugetlb-8xx.h>
1462306a36Sopenharmony_ci#endif /* CONFIG_PPC_BOOK3S_64 */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciextern bool hugetlb_disabled;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_civoid __init hugetlbpage_init_defaultsize(void);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciint slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
2162306a36Sopenharmony_ci			   unsigned long len);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic inline int is_hugepage_only_range(struct mm_struct *mm,
2462306a36Sopenharmony_ci					 unsigned long addr,
2562306a36Sopenharmony_ci					 unsigned long len)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_PPC_64S_HASH_MMU) && !radix_enabled())
2862306a36Sopenharmony_ci		return slice_is_hugepage_only_range(mm, addr, len);
2962306a36Sopenharmony_ci	return 0;
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci#define is_hugepage_only_range is_hugepage_only_range
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
3462306a36Sopenharmony_civoid hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
3562306a36Sopenharmony_ci			    unsigned long end, unsigned long floor,
3662306a36Sopenharmony_ci			    unsigned long ceiling);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
3962306a36Sopenharmony_cistatic inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
4062306a36Sopenharmony_ci					    unsigned long addr, pte_t *ptep)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	return __pte(pte_update(mm, addr, ptep, ~0UL, 0, 1));
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
4662306a36Sopenharmony_cistatic inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
4762306a36Sopenharmony_ci					  unsigned long addr, pte_t *ptep)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	pte_t pte;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	pte = huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
5262306a36Sopenharmony_ci	flush_hugetlb_page(vma, addr);
5362306a36Sopenharmony_ci	return pte;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
5762306a36Sopenharmony_ciint huge_ptep_set_access_flags(struct vm_area_struct *vma,
5862306a36Sopenharmony_ci			       unsigned long addr, pte_t *ptep,
5962306a36Sopenharmony_ci			       pte_t pte, int dirty);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_civoid gigantic_hugetlb_cma_reserve(void) __init;
6262306a36Sopenharmony_ci#include <asm-generic/hugetlb.h>
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#else /* ! CONFIG_HUGETLB_PAGE */
6562306a36Sopenharmony_cistatic inline void flush_hugetlb_page(struct vm_area_struct *vma,
6662306a36Sopenharmony_ci				      unsigned long vmaddr)
6762306a36Sopenharmony_ci{
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define hugepd_shift(x) 0
7162306a36Sopenharmony_cistatic inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
7262306a36Sopenharmony_ci				    unsigned pdshift)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	return NULL;
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic inline void __init gigantic_hugetlb_cma_reserve(void)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic inline void __init hugetlbpage_init_defaultsize(void)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci#endif /* CONFIG_HUGETLB_PAGE */
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#endif /* _ASM_POWERPC_HUGETLB_H */
88