18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H
38c2ecf20Sopenharmony_ci#define _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#define PAGE_SHIFT_8M		23
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cistatic inline pte_t *hugepd_page(hugepd_t hpd)
88c2ecf20Sopenharmony_ci{
98c2ecf20Sopenharmony_ci	BUG_ON(!hugepd_ok(hpd));
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci	return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK);
128c2ecf20Sopenharmony_ci}
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistatic inline unsigned int hugepd_shift(hugepd_t hpd)
158c2ecf20Sopenharmony_ci{
168c2ecf20Sopenharmony_ci	return PAGE_SHIFT_8M;
178c2ecf20Sopenharmony_ci}
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistatic inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
208c2ecf20Sopenharmony_ci				    unsigned int pdshift)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	unsigned long idx = (addr & (SZ_4M - 1)) >> PAGE_SHIFT;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	return hugepd_page(hpd) + idx;
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistatic inline void flush_hugetlb_page(struct vm_area_struct *vma,
288c2ecf20Sopenharmony_ci				      unsigned long vmaddr)
298c2ecf20Sopenharmony_ci{
308c2ecf20Sopenharmony_ci	flush_tlb_page(vma, vmaddr);
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistatic inline void hugepd_populate(hugepd_t *hpdp, pte_t *new, unsigned int pshift)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	*hpdp = __hugepd(__pa(new) | _PMD_USER | _PMD_PRESENT | _PMD_PAGE_8M);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic inline void hugepd_populate_kernel(hugepd_t *hpdp, pte_t *new, unsigned int pshift)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	*hpdp = __hugepd(__pa(new) | _PMD_PRESENT | _PMD_PAGE_8M);
418c2ecf20Sopenharmony_ci}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cistatic inline int check_and_get_huge_psize(int shift)
448c2ecf20Sopenharmony_ci{
458c2ecf20Sopenharmony_ci	return shift_to_mmu_psize(shift);
468c2ecf20Sopenharmony_ci}
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
498c2ecf20Sopenharmony_civoid set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTE_CLEAR
528c2ecf20Sopenharmony_cistatic inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
538c2ecf20Sopenharmony_ci				  pte_t *ptep, unsigned long sz)
548c2ecf20Sopenharmony_ci{
558c2ecf20Sopenharmony_ci	pte_update(mm, addr, ptep, ~0UL, 0, 1);
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
598c2ecf20Sopenharmony_cistatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
608c2ecf20Sopenharmony_ci					   unsigned long addr, pte_t *ptep)
618c2ecf20Sopenharmony_ci{
628c2ecf20Sopenharmony_ci	unsigned long clr = ~pte_val(pte_wrprotect(__pte(~0)));
638c2ecf20Sopenharmony_ci	unsigned long set = pte_val(pte_wrprotect(__pte(0)));
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	pte_update(mm, addr, ptep, clr, set, 1);
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC_4K_PAGES
698c2ecf20Sopenharmony_cistatic inline pte_t arch_make_huge_pte(pte_t entry, struct vm_area_struct *vma,
708c2ecf20Sopenharmony_ci				       struct page *page, int writable)
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci	size_t size = huge_page_size(hstate_vma(vma));
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	if (size == SZ_16K)
758c2ecf20Sopenharmony_ci		return __pte(pte_val(entry) & ~_PAGE_HUGE);
768c2ecf20Sopenharmony_ci	else
778c2ecf20Sopenharmony_ci		return entry;
788c2ecf20Sopenharmony_ci}
798c2ecf20Sopenharmony_ci#define arch_make_huge_pte arch_make_huge_pte
808c2ecf20Sopenharmony_ci#endif
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#endif /* _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H */
83