1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _ASM_POWERPC_TLBFLUSH_RADIX_H
3*4882a593Smuzhiyun #define _ASM_POWERPC_TLBFLUSH_RADIX_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <asm/hvcall.h>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun struct vm_area_struct;
8*4882a593Smuzhiyun struct mm_struct;
9*4882a593Smuzhiyun struct mmu_gather;
10*4882a593Smuzhiyun
psize_to_rpti_pgsize(unsigned long psize)11*4882a593Smuzhiyun static inline u64 psize_to_rpti_pgsize(unsigned long psize)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun if (psize == MMU_PAGE_4K)
14*4882a593Smuzhiyun return H_RPTI_PAGE_4K;
15*4882a593Smuzhiyun if (psize == MMU_PAGE_64K)
16*4882a593Smuzhiyun return H_RPTI_PAGE_64K;
17*4882a593Smuzhiyun if (psize == MMU_PAGE_2M)
18*4882a593Smuzhiyun return H_RPTI_PAGE_2M;
19*4882a593Smuzhiyun if (psize == MMU_PAGE_1G)
20*4882a593Smuzhiyun return H_RPTI_PAGE_1G;
21*4882a593Smuzhiyun return H_RPTI_PAGE_ALL;
22*4882a593Smuzhiyun }
23*4882a593Smuzhiyun
mmu_get_ap(int psize)24*4882a593Smuzhiyun static inline int mmu_get_ap(int psize)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun return mmu_psize_defs[psize].ap;
27*4882a593Smuzhiyun }
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #ifdef CONFIG_PPC_RADIX_MMU
30*4882a593Smuzhiyun extern void radix__tlbiel_all(unsigned int action);
31*4882a593Smuzhiyun extern void radix__flush_tlb_lpid_page(unsigned int lpid,
32*4882a593Smuzhiyun unsigned long addr,
33*4882a593Smuzhiyun unsigned long page_size);
34*4882a593Smuzhiyun extern void radix__flush_pwc_lpid(unsigned int lpid);
35*4882a593Smuzhiyun extern void radix__flush_all_lpid(unsigned int lpid);
36*4882a593Smuzhiyun extern void radix__flush_all_lpid_guest(unsigned int lpid);
37*4882a593Smuzhiyun #else
radix__tlbiel_all(unsigned int action)38*4882a593Smuzhiyun static inline void radix__tlbiel_all(unsigned int action) { WARN_ON(1); };
radix__flush_tlb_lpid_page(unsigned int lpid,unsigned long addr,unsigned long page_size)39*4882a593Smuzhiyun static inline void radix__flush_tlb_lpid_page(unsigned int lpid,
40*4882a593Smuzhiyun unsigned long addr,
41*4882a593Smuzhiyun unsigned long page_size)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun WARN_ON(1);
44*4882a593Smuzhiyun }
radix__flush_pwc_lpid(unsigned int lpid)45*4882a593Smuzhiyun static inline void radix__flush_pwc_lpid(unsigned int lpid)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun WARN_ON(1);
48*4882a593Smuzhiyun }
radix__flush_all_lpid(unsigned int lpid)49*4882a593Smuzhiyun static inline void radix__flush_all_lpid(unsigned int lpid)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun WARN_ON(1);
52*4882a593Smuzhiyun }
radix__flush_all_lpid_guest(unsigned int lpid)53*4882a593Smuzhiyun static inline void radix__flush_all_lpid_guest(unsigned int lpid)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun WARN_ON(1);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun extern void radix__flush_hugetlb_tlb_range(struct vm_area_struct *vma,
60*4882a593Smuzhiyun unsigned long start, unsigned long end);
61*4882a593Smuzhiyun extern void radix__flush_tlb_range_psize(struct mm_struct *mm, unsigned long start,
62*4882a593Smuzhiyun unsigned long end, int psize);
63*4882a593Smuzhiyun extern void radix__flush_pmd_tlb_range(struct vm_area_struct *vma,
64*4882a593Smuzhiyun unsigned long start, unsigned long end);
65*4882a593Smuzhiyun extern void radix__flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
66*4882a593Smuzhiyun unsigned long end);
67*4882a593Smuzhiyun extern void radix__flush_tlb_kernel_range(unsigned long start, unsigned long end);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun extern void radix__local_flush_tlb_mm(struct mm_struct *mm);
70*4882a593Smuzhiyun extern void radix__local_flush_all_mm(struct mm_struct *mm);
71*4882a593Smuzhiyun extern void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
72*4882a593Smuzhiyun extern void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
73*4882a593Smuzhiyun int psize);
74*4882a593Smuzhiyun extern void radix__tlb_flush(struct mmu_gather *tlb);
75*4882a593Smuzhiyun #ifdef CONFIG_SMP
76*4882a593Smuzhiyun extern void radix__flush_tlb_mm(struct mm_struct *mm);
77*4882a593Smuzhiyun extern void radix__flush_all_mm(struct mm_struct *mm);
78*4882a593Smuzhiyun extern void radix__flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
79*4882a593Smuzhiyun extern void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
80*4882a593Smuzhiyun int psize);
81*4882a593Smuzhiyun #else
82*4882a593Smuzhiyun #define radix__flush_tlb_mm(mm) radix__local_flush_tlb_mm(mm)
83*4882a593Smuzhiyun #define radix__flush_all_mm(mm) radix__local_flush_all_mm(mm)
84*4882a593Smuzhiyun #define radix__flush_tlb_page(vma,addr) radix__local_flush_tlb_page(vma,addr)
85*4882a593Smuzhiyun #define radix__flush_tlb_page_psize(mm,addr,p) radix__local_flush_tlb_page_psize(mm,addr,p)
86*4882a593Smuzhiyun #endif
87*4882a593Smuzhiyun extern void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr);
88*4882a593Smuzhiyun extern void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr);
89*4882a593Smuzhiyun extern void radix__flush_tlb_all(void);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun #endif
92