1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H
3*4882a593Smuzhiyun #define _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H
4*4882a593Smuzhiyun
hugepd_page(hugepd_t hpd)5*4882a593Smuzhiyun static inline pte_t *hugepd_page(hugepd_t hpd)
6*4882a593Smuzhiyun {
7*4882a593Smuzhiyun if (WARN_ON(!hugepd_ok(hpd)))
8*4882a593Smuzhiyun return NULL;
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun return (pte_t *)((hpd_val(hpd) & ~HUGEPD_SHIFT_MASK) | PD_HUGE);
11*4882a593Smuzhiyun }
12*4882a593Smuzhiyun
hugepd_shift(hugepd_t hpd)13*4882a593Smuzhiyun static inline unsigned int hugepd_shift(hugepd_t hpd)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun return hpd_val(hpd) & HUGEPD_SHIFT_MASK;
16*4882a593Smuzhiyun }
17*4882a593Smuzhiyun
hugepte_offset(hugepd_t hpd,unsigned long addr,unsigned int pdshift)18*4882a593Smuzhiyun static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
19*4882a593Smuzhiyun unsigned int pdshift)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun /*
22*4882a593Smuzhiyun * On FSL BookE, we have multiple higher-level table entries that
23*4882a593Smuzhiyun * point to the same hugepte. Just use the first one since they're all
24*4882a593Smuzhiyun * identical. So for that case, idx=0.
25*4882a593Smuzhiyun */
26*4882a593Smuzhiyun return hugepd_page(hpd);
27*4882a593Smuzhiyun }
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
30*4882a593Smuzhiyun
hugepd_populate(hugepd_t * hpdp,pte_t * new,unsigned int pshift)31*4882a593Smuzhiyun static inline void hugepd_populate(hugepd_t *hpdp, pte_t *new, unsigned int pshift)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun /* We use the old format for PPC_FSL_BOOK3E */
34*4882a593Smuzhiyun *hpdp = __hugepd(((unsigned long)new & ~PD_HUGE) | pshift);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
check_and_get_huge_psize(int shift)37*4882a593Smuzhiyun static inline int check_and_get_huge_psize(int shift)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun if (shift & 1) /* Not a power of 4 */
40*4882a593Smuzhiyun return -EINVAL;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun return shift_to_mmu_psize(shift);
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun #endif /* _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H */
46