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