162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H
362306a36Sopenharmony_ci#define _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#define PAGE_SHIFT_8M		23
662306a36Sopenharmony_ci
762306a36Sopenharmony_cistatic inline pte_t *hugepd_page(hugepd_t hpd)
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci	BUG_ON(!hugepd_ok(hpd));
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci	return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK);
1262306a36Sopenharmony_ci}
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic inline unsigned int hugepd_shift(hugepd_t hpd)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	return PAGE_SHIFT_8M;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
2062306a36Sopenharmony_ci				    unsigned int pdshift)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	unsigned long idx = (addr & (SZ_4M - 1)) >> PAGE_SHIFT;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	return hugepd_page(hpd) + idx;
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic inline void flush_hugetlb_page(struct vm_area_struct *vma,
2862306a36Sopenharmony_ci				      unsigned long vmaddr)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	flush_tlb_page(vma, vmaddr);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic inline void hugepd_populate(hugepd_t *hpdp, pte_t *new, unsigned int pshift)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	*hpdp = __hugepd(__pa(new) | _PMD_USER | _PMD_PRESENT | _PMD_PAGE_8M);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic inline void hugepd_populate_kernel(hugepd_t *hpdp, pte_t *new, unsigned int pshift)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	*hpdp = __hugepd(__pa(new) | _PMD_PRESENT | _PMD_PAGE_8M);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic inline int check_and_get_huge_psize(int shift)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	return shift_to_mmu_psize(shift);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
4962306a36Sopenharmony_civoid set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep,
5062306a36Sopenharmony_ci		     pte_t pte, unsigned long sz);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTE_CLEAR
5362306a36Sopenharmony_cistatic inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
5462306a36Sopenharmony_ci				  pte_t *ptep, unsigned long sz)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	pte_update(mm, addr, ptep, ~0UL, 0, 1);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
6062306a36Sopenharmony_cistatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
6162306a36Sopenharmony_ci					   unsigned long addr, pte_t *ptep)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	unsigned long clr = ~pte_val(pte_wrprotect(__pte(~0)));
6462306a36Sopenharmony_ci	unsigned long set = pte_val(pte_wrprotect(__pte(0)));
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	pte_update(mm, addr, ptep, clr, set, 1);
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#ifdef CONFIG_PPC_4K_PAGES
7062306a36Sopenharmony_cistatic inline pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	size_t size = 1UL << shift;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	if (size == SZ_16K)
7562306a36Sopenharmony_ci		return __pte(pte_val(entry) | _PAGE_SPS);
7662306a36Sopenharmony_ci	else
7762306a36Sopenharmony_ci		return __pte(pte_val(entry) | _PAGE_SPS | _PAGE_HUGE);
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci#define arch_make_huge_pte arch_make_huge_pte
8062306a36Sopenharmony_ci#endif
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#endif /* _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H */
83