KVM: PPC: Book3S HV: Nested support in H_RPT_INVALIDATE
[linux-2.6-microblaze.git] / arch / powerpc / mm / book3s64 / radix_tlb.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * TLB flush routines for radix kernels.
4  *
5  * Copyright 2015-2016, Aneesh Kumar K.V, IBM Corporation.
6  */
7
8 #include <linux/mm.h>
9 #include <linux/hugetlb.h>
10 #include <linux/memblock.h>
11 #include <linux/mmu_context.h>
12 #include <linux/sched/mm.h>
13
14 #include <asm/ppc-opcode.h>
15 #include <asm/tlb.h>
16 #include <asm/tlbflush.h>
17 #include <asm/trace.h>
18 #include <asm/cputhreads.h>
19 #include <asm/plpar_wrappers.h>
20
21 #include "internal.h"
22
23 /*
24  * tlbiel instruction for radix, set invalidation
25  * i.e., r=1 and is=01 or is=10 or is=11
26  */
27 static __always_inline void tlbiel_radix_set_isa300(unsigned int set, unsigned int is,
28                                         unsigned int pid,
29                                         unsigned int ric, unsigned int prs)
30 {
31         unsigned long rb;
32         unsigned long rs;
33
34         rb = (set << PPC_BITLSHIFT(51)) | (is << PPC_BITLSHIFT(53));
35         rs = ((unsigned long)pid << PPC_BITLSHIFT(31));
36
37         asm volatile(PPC_TLBIEL(%0, %1, %2, %3, 1)
38                      : : "r"(rb), "r"(rs), "i"(ric), "i"(prs)
39                      : "memory");
40 }
41
42 static void tlbiel_all_isa300(unsigned int num_sets, unsigned int is)
43 {
44         unsigned int set;
45
46         asm volatile("ptesync": : :"memory");
47
48         /*
49          * Flush the first set of the TLB, and the entire Page Walk Cache
50          * and partition table entries. Then flush the remaining sets of the
51          * TLB.
52          */
53
54         if (early_cpu_has_feature(CPU_FTR_HVMODE)) {
55                 /* MSR[HV] should flush partition scope translations first. */
56                 tlbiel_radix_set_isa300(0, is, 0, RIC_FLUSH_ALL, 0);
57
58                 if (!early_cpu_has_feature(CPU_FTR_ARCH_31)) {
59                         for (set = 1; set < num_sets; set++)
60                                 tlbiel_radix_set_isa300(set, is, 0,
61                                                         RIC_FLUSH_TLB, 0);
62                 }
63         }
64
65         /* Flush process scoped entries. */
66         tlbiel_radix_set_isa300(0, is, 0, RIC_FLUSH_ALL, 1);
67
68         if (!early_cpu_has_feature(CPU_FTR_ARCH_31)) {
69                 for (set = 1; set < num_sets; set++)
70                         tlbiel_radix_set_isa300(set, is, 0, RIC_FLUSH_TLB, 1);
71         }
72
73         ppc_after_tlbiel_barrier();
74 }
75
76 void radix__tlbiel_all(unsigned int action)
77 {
78         unsigned int is;
79
80         switch (action) {
81         case TLB_INVAL_SCOPE_GLOBAL:
82                 is = 3;
83                 break;
84         case TLB_INVAL_SCOPE_LPID:
85                 is = 2;
86                 break;
87         default:
88                 BUG();
89         }
90
91         if (early_cpu_has_feature(CPU_FTR_ARCH_300))
92                 tlbiel_all_isa300(POWER9_TLB_SETS_RADIX, is);
93         else
94                 WARN(1, "%s called on pre-POWER9 CPU\n", __func__);
95
96         asm volatile(PPC_ISA_3_0_INVALIDATE_ERAT "; isync" : : :"memory");
97 }
98
99 static __always_inline void __tlbiel_pid(unsigned long pid, int set,
100                                 unsigned long ric)
101 {
102         unsigned long rb,rs,prs,r;
103
104         rb = PPC_BIT(53); /* IS = 1 */
105         rb |= set << PPC_BITLSHIFT(51);
106         rs = ((unsigned long)pid) << PPC_BITLSHIFT(31);
107         prs = 1; /* process scoped */
108         r = 1;   /* radix format */
109
110         asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1)
111                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
112         trace_tlbie(0, 1, rb, rs, ric, prs, r);
113 }
114
115 static __always_inline void __tlbie_pid(unsigned long pid, unsigned long ric)
116 {
117         unsigned long rb,rs,prs,r;
118
119         rb = PPC_BIT(53); /* IS = 1 */
120         rs = pid << PPC_BITLSHIFT(31);
121         prs = 1; /* process scoped */
122         r = 1;   /* radix format */
123
124         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
125                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
126         trace_tlbie(0, 0, rb, rs, ric, prs, r);
127 }
128
129 static __always_inline void __tlbie_pid_lpid(unsigned long pid,
130                                              unsigned long lpid,
131                                              unsigned long ric)
132 {
133         unsigned long rb, rs, prs, r;
134
135         rb = PPC_BIT(53); /* IS = 1 */
136         rs = (pid << PPC_BITLSHIFT(31)) | (lpid & ~(PPC_BITMASK(0, 31)));
137         prs = 1; /* process scoped */
138         r = 1;   /* radix format */
139
140         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
141                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
142         trace_tlbie(0, 0, rb, rs, ric, prs, r);
143 }
144 static __always_inline void __tlbie_lpid(unsigned long lpid, unsigned long ric)
145 {
146         unsigned long rb,rs,prs,r;
147
148         rb = PPC_BIT(52); /* IS = 2 */
149         rs = lpid;
150         prs = 0; /* partition scoped */
151         r = 1;   /* radix format */
152
153         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
154                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
155         trace_tlbie(lpid, 0, rb, rs, ric, prs, r);
156 }
157
158 static __always_inline void __tlbie_lpid_guest(unsigned long lpid, unsigned long ric)
159 {
160         unsigned long rb,rs,prs,r;
161
162         rb = PPC_BIT(52); /* IS = 2 */
163         rs = lpid;
164         prs = 1; /* process scoped */
165         r = 1;   /* radix format */
166
167         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
168                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
169         trace_tlbie(lpid, 0, rb, rs, ric, prs, r);
170 }
171
172 static __always_inline void __tlbiel_va(unsigned long va, unsigned long pid,
173                                         unsigned long ap, unsigned long ric)
174 {
175         unsigned long rb,rs,prs,r;
176
177         rb = va & ~(PPC_BITMASK(52, 63));
178         rb |= ap << PPC_BITLSHIFT(58);
179         rs = pid << PPC_BITLSHIFT(31);
180         prs = 1; /* process scoped */
181         r = 1;   /* radix format */
182
183         asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1)
184                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
185         trace_tlbie(0, 1, rb, rs, ric, prs, r);
186 }
187
188 static __always_inline void __tlbie_va(unsigned long va, unsigned long pid,
189                                        unsigned long ap, unsigned long ric)
190 {
191         unsigned long rb,rs,prs,r;
192
193         rb = va & ~(PPC_BITMASK(52, 63));
194         rb |= ap << PPC_BITLSHIFT(58);
195         rs = pid << PPC_BITLSHIFT(31);
196         prs = 1; /* process scoped */
197         r = 1;   /* radix format */
198
199         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
200                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
201         trace_tlbie(0, 0, rb, rs, ric, prs, r);
202 }
203
204 static __always_inline void __tlbie_va_lpid(unsigned long va, unsigned long pid,
205                                             unsigned long lpid,
206                                             unsigned long ap, unsigned long ric)
207 {
208         unsigned long rb, rs, prs, r;
209
210         rb = va & ~(PPC_BITMASK(52, 63));
211         rb |= ap << PPC_BITLSHIFT(58);
212         rs = (pid << PPC_BITLSHIFT(31)) | (lpid & ~(PPC_BITMASK(0, 31)));
213         prs = 1; /* process scoped */
214         r = 1;   /* radix format */
215
216         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
217                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
218         trace_tlbie(0, 0, rb, rs, ric, prs, r);
219 }
220
221 static __always_inline void __tlbie_lpid_va(unsigned long va, unsigned long lpid,
222                                             unsigned long ap, unsigned long ric)
223 {
224         unsigned long rb,rs,prs,r;
225
226         rb = va & ~(PPC_BITMASK(52, 63));
227         rb |= ap << PPC_BITLSHIFT(58);
228         rs = lpid;
229         prs = 0; /* partition scoped */
230         r = 1;   /* radix format */
231
232         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
233                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
234         trace_tlbie(lpid, 0, rb, rs, ric, prs, r);
235 }
236
237
238 static inline void fixup_tlbie_va(unsigned long va, unsigned long pid,
239                                   unsigned long ap)
240 {
241         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
242                 asm volatile("ptesync": : :"memory");
243                 __tlbie_va(va, 0, ap, RIC_FLUSH_TLB);
244         }
245
246         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
247                 asm volatile("ptesync": : :"memory");
248                 __tlbie_va(va, pid, ap, RIC_FLUSH_TLB);
249         }
250 }
251
252 static inline void fixup_tlbie_va_range(unsigned long va, unsigned long pid,
253                                         unsigned long ap)
254 {
255         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
256                 asm volatile("ptesync": : :"memory");
257                 __tlbie_pid(0, RIC_FLUSH_TLB);
258         }
259
260         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
261                 asm volatile("ptesync": : :"memory");
262                 __tlbie_va(va, pid, ap, RIC_FLUSH_TLB);
263         }
264 }
265
266 static inline void fixup_tlbie_va_range_lpid(unsigned long va,
267                                              unsigned long pid,
268                                              unsigned long lpid,
269                                              unsigned long ap)
270 {
271         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
272                 asm volatile("ptesync" : : : "memory");
273                 __tlbie_pid_lpid(0, lpid, RIC_FLUSH_TLB);
274         }
275
276         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
277                 asm volatile("ptesync" : : : "memory");
278                 __tlbie_va_lpid(va, pid, lpid, ap, RIC_FLUSH_TLB);
279         }
280 }
281
282 static inline void fixup_tlbie_pid(unsigned long pid)
283 {
284         /*
285          * We can use any address for the invalidation, pick one which is
286          * probably unused as an optimisation.
287          */
288         unsigned long va = ((1UL << 52) - 1);
289
290         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
291                 asm volatile("ptesync": : :"memory");
292                 __tlbie_pid(0, RIC_FLUSH_TLB);
293         }
294
295         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
296                 asm volatile("ptesync": : :"memory");
297                 __tlbie_va(va, pid, mmu_get_ap(MMU_PAGE_64K), RIC_FLUSH_TLB);
298         }
299 }
300
301 static inline void fixup_tlbie_pid_lpid(unsigned long pid, unsigned long lpid)
302 {
303         /*
304          * We can use any address for the invalidation, pick one which is
305          * probably unused as an optimisation.
306          */
307         unsigned long va = ((1UL << 52) - 1);
308
309         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
310                 asm volatile("ptesync" : : : "memory");
311                 __tlbie_pid_lpid(0, lpid, RIC_FLUSH_TLB);
312         }
313
314         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
315                 asm volatile("ptesync" : : : "memory");
316                 __tlbie_va_lpid(va, pid, lpid, mmu_get_ap(MMU_PAGE_64K),
317                                 RIC_FLUSH_TLB);
318         }
319 }
320
321 static inline void fixup_tlbie_lpid_va(unsigned long va, unsigned long lpid,
322                                        unsigned long ap)
323 {
324         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
325                 asm volatile("ptesync": : :"memory");
326                 __tlbie_lpid_va(va, 0, ap, RIC_FLUSH_TLB);
327         }
328
329         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
330                 asm volatile("ptesync": : :"memory");
331                 __tlbie_lpid_va(va, lpid, ap, RIC_FLUSH_TLB);
332         }
333 }
334
335 static inline void fixup_tlbie_lpid(unsigned long lpid)
336 {
337         /*
338          * We can use any address for the invalidation, pick one which is
339          * probably unused as an optimisation.
340          */
341         unsigned long va = ((1UL << 52) - 1);
342
343         if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) {
344                 asm volatile("ptesync": : :"memory");
345                 __tlbie_lpid(0, RIC_FLUSH_TLB);
346         }
347
348         if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) {
349                 asm volatile("ptesync": : :"memory");
350                 __tlbie_lpid_va(va, lpid, mmu_get_ap(MMU_PAGE_64K), RIC_FLUSH_TLB);
351         }
352 }
353
354 /*
355  * We use 128 set in radix mode and 256 set in hpt mode.
356  */
357 static __always_inline void _tlbiel_pid(unsigned long pid, unsigned long ric)
358 {
359         int set;
360
361         asm volatile("ptesync": : :"memory");
362
363         /*
364          * Flush the first set of the TLB, and if we're doing a RIC_FLUSH_ALL,
365          * also flush the entire Page Walk Cache.
366          */
367         __tlbiel_pid(pid, 0, ric);
368
369         /* For PWC, only one flush is needed */
370         if (ric == RIC_FLUSH_PWC) {
371                 ppc_after_tlbiel_barrier();
372                 return;
373         }
374
375         if (!cpu_has_feature(CPU_FTR_ARCH_31)) {
376                 /* For the remaining sets, just flush the TLB */
377                 for (set = 1; set < POWER9_TLB_SETS_RADIX ; set++)
378                         __tlbiel_pid(pid, set, RIC_FLUSH_TLB);
379         }
380
381         ppc_after_tlbiel_barrier();
382         asm volatile(PPC_RADIX_INVALIDATE_ERAT_USER "; isync" : : :"memory");
383 }
384
385 static inline void _tlbie_pid(unsigned long pid, unsigned long ric)
386 {
387         asm volatile("ptesync": : :"memory");
388
389         /*
390          * Workaround the fact that the "ric" argument to __tlbie_pid
391          * must be a compile-time contraint to match the "i" constraint
392          * in the asm statement.
393          */
394         switch (ric) {
395         case RIC_FLUSH_TLB:
396                 __tlbie_pid(pid, RIC_FLUSH_TLB);
397                 fixup_tlbie_pid(pid);
398                 break;
399         case RIC_FLUSH_PWC:
400                 __tlbie_pid(pid, RIC_FLUSH_PWC);
401                 break;
402         case RIC_FLUSH_ALL:
403         default:
404                 __tlbie_pid(pid, RIC_FLUSH_ALL);
405                 fixup_tlbie_pid(pid);
406         }
407         asm volatile("eieio; tlbsync; ptesync": : :"memory");
408 }
409
410 static inline void _tlbie_pid_lpid(unsigned long pid, unsigned long lpid,
411                                    unsigned long ric)
412 {
413         asm volatile("ptesync" : : : "memory");
414
415         /*
416          * Workaround the fact that the "ric" argument to __tlbie_pid
417          * must be a compile-time contraint to match the "i" constraint
418          * in the asm statement.
419          */
420         switch (ric) {
421         case RIC_FLUSH_TLB:
422                 __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_TLB);
423                 fixup_tlbie_pid_lpid(pid, lpid);
424                 break;
425         case RIC_FLUSH_PWC:
426                 __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC);
427                 break;
428         case RIC_FLUSH_ALL:
429         default:
430                 __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_ALL);
431                 fixup_tlbie_pid_lpid(pid, lpid);
432         }
433         asm volatile("eieio; tlbsync; ptesync" : : : "memory");
434 }
435 struct tlbiel_pid {
436         unsigned long pid;
437         unsigned long ric;
438 };
439
440 static void do_tlbiel_pid(void *info)
441 {
442         struct tlbiel_pid *t = info;
443
444         if (t->ric == RIC_FLUSH_TLB)
445                 _tlbiel_pid(t->pid, RIC_FLUSH_TLB);
446         else if (t->ric == RIC_FLUSH_PWC)
447                 _tlbiel_pid(t->pid, RIC_FLUSH_PWC);
448         else
449                 _tlbiel_pid(t->pid, RIC_FLUSH_ALL);
450 }
451
452 static inline void _tlbiel_pid_multicast(struct mm_struct *mm,
453                                 unsigned long pid, unsigned long ric)
454 {
455         struct cpumask *cpus = mm_cpumask(mm);
456         struct tlbiel_pid t = { .pid = pid, .ric = ric };
457
458         on_each_cpu_mask(cpus, do_tlbiel_pid, &t, 1);
459         /*
460          * Always want the CPU translations to be invalidated with tlbiel in
461          * these paths, so while coprocessors must use tlbie, we can not
462          * optimise away the tlbiel component.
463          */
464         if (atomic_read(&mm->context.copros) > 0)
465                 _tlbie_pid(pid, RIC_FLUSH_ALL);
466 }
467
468 static inline void _tlbie_lpid(unsigned long lpid, unsigned long ric)
469 {
470         asm volatile("ptesync": : :"memory");
471
472         /*
473          * Workaround the fact that the "ric" argument to __tlbie_pid
474          * must be a compile-time contraint to match the "i" constraint
475          * in the asm statement.
476          */
477         switch (ric) {
478         case RIC_FLUSH_TLB:
479                 __tlbie_lpid(lpid, RIC_FLUSH_TLB);
480                 fixup_tlbie_lpid(lpid);
481                 break;
482         case RIC_FLUSH_PWC:
483                 __tlbie_lpid(lpid, RIC_FLUSH_PWC);
484                 break;
485         case RIC_FLUSH_ALL:
486         default:
487                 __tlbie_lpid(lpid, RIC_FLUSH_ALL);
488                 fixup_tlbie_lpid(lpid);
489         }
490         asm volatile("eieio; tlbsync; ptesync": : :"memory");
491 }
492
493 static __always_inline void _tlbie_lpid_guest(unsigned long lpid, unsigned long ric)
494 {
495         /*
496          * Workaround the fact that the "ric" argument to __tlbie_pid
497          * must be a compile-time contraint to match the "i" constraint
498          * in the asm statement.
499          */
500         switch (ric) {
501         case RIC_FLUSH_TLB:
502                 __tlbie_lpid_guest(lpid, RIC_FLUSH_TLB);
503                 break;
504         case RIC_FLUSH_PWC:
505                 __tlbie_lpid_guest(lpid, RIC_FLUSH_PWC);
506                 break;
507         case RIC_FLUSH_ALL:
508         default:
509                 __tlbie_lpid_guest(lpid, RIC_FLUSH_ALL);
510         }
511         fixup_tlbie_lpid(lpid);
512         asm volatile("eieio; tlbsync; ptesync": : :"memory");
513 }
514
515 static inline void __tlbiel_va_range(unsigned long start, unsigned long end,
516                                     unsigned long pid, unsigned long page_size,
517                                     unsigned long psize)
518 {
519         unsigned long addr;
520         unsigned long ap = mmu_get_ap(psize);
521
522         for (addr = start; addr < end; addr += page_size)
523                 __tlbiel_va(addr, pid, ap, RIC_FLUSH_TLB);
524 }
525
526 static __always_inline void _tlbiel_va(unsigned long va, unsigned long pid,
527                                        unsigned long psize, unsigned long ric)
528 {
529         unsigned long ap = mmu_get_ap(psize);
530
531         asm volatile("ptesync": : :"memory");
532         __tlbiel_va(va, pid, ap, ric);
533         ppc_after_tlbiel_barrier();
534 }
535
536 static inline void _tlbiel_va_range(unsigned long start, unsigned long end,
537                                     unsigned long pid, unsigned long page_size,
538                                     unsigned long psize, bool also_pwc)
539 {
540         asm volatile("ptesync": : :"memory");
541         if (also_pwc)
542                 __tlbiel_pid(pid, 0, RIC_FLUSH_PWC);
543         __tlbiel_va_range(start, end, pid, page_size, psize);
544         ppc_after_tlbiel_barrier();
545 }
546
547 static inline void __tlbie_va_range(unsigned long start, unsigned long end,
548                                     unsigned long pid, unsigned long page_size,
549                                     unsigned long psize)
550 {
551         unsigned long addr;
552         unsigned long ap = mmu_get_ap(psize);
553
554         for (addr = start; addr < end; addr += page_size)
555                 __tlbie_va(addr, pid, ap, RIC_FLUSH_TLB);
556
557         fixup_tlbie_va_range(addr - page_size, pid, ap);
558 }
559
560 static inline void __tlbie_va_range_lpid(unsigned long start, unsigned long end,
561                                          unsigned long pid, unsigned long lpid,
562                                          unsigned long page_size,
563                                          unsigned long psize)
564 {
565         unsigned long addr;
566         unsigned long ap = mmu_get_ap(psize);
567
568         for (addr = start; addr < end; addr += page_size)
569                 __tlbie_va_lpid(addr, pid, lpid, ap, RIC_FLUSH_TLB);
570
571         fixup_tlbie_va_range_lpid(addr - page_size, pid, lpid, ap);
572 }
573
574 static __always_inline void _tlbie_va(unsigned long va, unsigned long pid,
575                                       unsigned long psize, unsigned long ric)
576 {
577         unsigned long ap = mmu_get_ap(psize);
578
579         asm volatile("ptesync": : :"memory");
580         __tlbie_va(va, pid, ap, ric);
581         fixup_tlbie_va(va, pid, ap);
582         asm volatile("eieio; tlbsync; ptesync": : :"memory");
583 }
584
585 struct tlbiel_va {
586         unsigned long pid;
587         unsigned long va;
588         unsigned long psize;
589         unsigned long ric;
590 };
591
592 static void do_tlbiel_va(void *info)
593 {
594         struct tlbiel_va *t = info;
595
596         if (t->ric == RIC_FLUSH_TLB)
597                 _tlbiel_va(t->va, t->pid, t->psize, RIC_FLUSH_TLB);
598         else if (t->ric == RIC_FLUSH_PWC)
599                 _tlbiel_va(t->va, t->pid, t->psize, RIC_FLUSH_PWC);
600         else
601                 _tlbiel_va(t->va, t->pid, t->psize, RIC_FLUSH_ALL);
602 }
603
604 static inline void _tlbiel_va_multicast(struct mm_struct *mm,
605                                 unsigned long va, unsigned long pid,
606                                 unsigned long psize, unsigned long ric)
607 {
608         struct cpumask *cpus = mm_cpumask(mm);
609         struct tlbiel_va t = { .va = va, .pid = pid, .psize = psize, .ric = ric };
610         on_each_cpu_mask(cpus, do_tlbiel_va, &t, 1);
611         if (atomic_read(&mm->context.copros) > 0)
612                 _tlbie_va(va, pid, psize, RIC_FLUSH_TLB);
613 }
614
615 struct tlbiel_va_range {
616         unsigned long pid;
617         unsigned long start;
618         unsigned long end;
619         unsigned long page_size;
620         unsigned long psize;
621         bool also_pwc;
622 };
623
624 static void do_tlbiel_va_range(void *info)
625 {
626         struct tlbiel_va_range *t = info;
627
628         _tlbiel_va_range(t->start, t->end, t->pid, t->page_size,
629                                     t->psize, t->also_pwc);
630 }
631
632 static __always_inline void _tlbie_lpid_va(unsigned long va, unsigned long lpid,
633                               unsigned long psize, unsigned long ric)
634 {
635         unsigned long ap = mmu_get_ap(psize);
636
637         asm volatile("ptesync": : :"memory");
638         __tlbie_lpid_va(va, lpid, ap, ric);
639         fixup_tlbie_lpid_va(va, lpid, ap);
640         asm volatile("eieio; tlbsync; ptesync": : :"memory");
641 }
642
643 static inline void _tlbie_va_range(unsigned long start, unsigned long end,
644                                     unsigned long pid, unsigned long page_size,
645                                     unsigned long psize, bool also_pwc)
646 {
647         asm volatile("ptesync": : :"memory");
648         if (also_pwc)
649                 __tlbie_pid(pid, RIC_FLUSH_PWC);
650         __tlbie_va_range(start, end, pid, page_size, psize);
651         asm volatile("eieio; tlbsync; ptesync": : :"memory");
652 }
653
654 static inline void _tlbie_va_range_lpid(unsigned long start, unsigned long end,
655                                         unsigned long pid, unsigned long lpid,
656                                         unsigned long page_size,
657                                         unsigned long psize, bool also_pwc)
658 {
659         asm volatile("ptesync" : : : "memory");
660         if (also_pwc)
661                 __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC);
662         __tlbie_va_range_lpid(start, end, pid, lpid, page_size, psize);
663         asm volatile("eieio; tlbsync; ptesync" : : : "memory");
664 }
665
666 static inline void _tlbiel_va_range_multicast(struct mm_struct *mm,
667                                 unsigned long start, unsigned long end,
668                                 unsigned long pid, unsigned long page_size,
669                                 unsigned long psize, bool also_pwc)
670 {
671         struct cpumask *cpus = mm_cpumask(mm);
672         struct tlbiel_va_range t = { .start = start, .end = end,
673                                 .pid = pid, .page_size = page_size,
674                                 .psize = psize, .also_pwc = also_pwc };
675
676         on_each_cpu_mask(cpus, do_tlbiel_va_range, &t, 1);
677         if (atomic_read(&mm->context.copros) > 0)
678                 _tlbie_va_range(start, end, pid, page_size, psize, also_pwc);
679 }
680
681 /*
682  * Base TLB flushing operations:
683  *
684  *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
685  *  - flush_tlb_page(vma, vmaddr) flushes one page
686  *  - flush_tlb_range(vma, start, end) flushes a range of pages
687  *  - flush_tlb_kernel_range(start, end) flushes kernel pages
688  *
689  *  - local_* variants of page and mm only apply to the current
690  *    processor
691  */
692 void radix__local_flush_tlb_mm(struct mm_struct *mm)
693 {
694         unsigned long pid;
695
696         preempt_disable();
697         pid = mm->context.id;
698         if (pid != MMU_NO_CONTEXT)
699                 _tlbiel_pid(pid, RIC_FLUSH_TLB);
700         preempt_enable();
701 }
702 EXPORT_SYMBOL(radix__local_flush_tlb_mm);
703
704 #ifndef CONFIG_SMP
705 void radix__local_flush_all_mm(struct mm_struct *mm)
706 {
707         unsigned long pid;
708
709         preempt_disable();
710         pid = mm->context.id;
711         if (pid != MMU_NO_CONTEXT)
712                 _tlbiel_pid(pid, RIC_FLUSH_ALL);
713         preempt_enable();
714 }
715 EXPORT_SYMBOL(radix__local_flush_all_mm);
716
717 static void __flush_all_mm(struct mm_struct *mm, bool fullmm)
718 {
719         radix__local_flush_all_mm(mm);
720 }
721 #endif /* CONFIG_SMP */
722
723 void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
724                                        int psize)
725 {
726         unsigned long pid;
727
728         preempt_disable();
729         pid = mm->context.id;
730         if (pid != MMU_NO_CONTEXT)
731                 _tlbiel_va(vmaddr, pid, psize, RIC_FLUSH_TLB);
732         preempt_enable();
733 }
734
735 void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
736 {
737 #ifdef CONFIG_HUGETLB_PAGE
738         /* need the return fix for nohash.c */
739         if (is_vm_hugetlb_page(vma))
740                 return radix__local_flush_hugetlb_page(vma, vmaddr);
741 #endif
742         radix__local_flush_tlb_page_psize(vma->vm_mm, vmaddr, mmu_virtual_psize);
743 }
744 EXPORT_SYMBOL(radix__local_flush_tlb_page);
745
746 static bool mm_needs_flush_escalation(struct mm_struct *mm)
747 {
748         /*
749          * P9 nest MMU has issues with the page walk cache
750          * caching PTEs and not flushing them properly when
751          * RIC = 0 for a PID/LPID invalidate
752          */
753         if (atomic_read(&mm->context.copros) > 0)
754                 return true;
755         return false;
756 }
757
758 /*
759  * If always_flush is true, then flush even if this CPU can't be removed
760  * from mm_cpumask.
761  */
762 void exit_lazy_flush_tlb(struct mm_struct *mm, bool always_flush)
763 {
764         unsigned long pid = mm->context.id;
765         int cpu = smp_processor_id();
766
767         /*
768          * A kthread could have done a mmget_not_zero() after the flushing CPU
769          * checked mm_cpumask, and be in the process of kthread_use_mm when
770          * interrupted here. In that case, current->mm will be set to mm,
771          * because kthread_use_mm() setting ->mm and switching to the mm is
772          * done with interrupts off.
773          */
774         if (current->mm == mm)
775                 goto out;
776
777         if (current->active_mm == mm) {
778                 WARN_ON_ONCE(current->mm != NULL);
779                 /* Is a kernel thread and is using mm as the lazy tlb */
780                 mmgrab(&init_mm);
781                 current->active_mm = &init_mm;
782                 switch_mm_irqs_off(mm, &init_mm, current);
783                 mmdrop(mm);
784         }
785
786         /*
787          * This IPI may be initiated from any source including those not
788          * running the mm, so there may be a racing IPI that comes after
789          * this one which finds the cpumask already clear. Check and avoid
790          * underflowing the active_cpus count in that case. The race should
791          * not otherwise be a problem, but the TLB must be flushed because
792          * that's what the caller expects.
793          */
794         if (cpumask_test_cpu(cpu, mm_cpumask(mm))) {
795                 atomic_dec(&mm->context.active_cpus);
796                 cpumask_clear_cpu(cpu, mm_cpumask(mm));
797                 always_flush = true;
798         }
799
800 out:
801         if (always_flush)
802                 _tlbiel_pid(pid, RIC_FLUSH_ALL);
803 }
804
805 #ifdef CONFIG_SMP
806 static void do_exit_flush_lazy_tlb(void *arg)
807 {
808         struct mm_struct *mm = arg;
809         exit_lazy_flush_tlb(mm, true);
810 }
811
812 static void exit_flush_lazy_tlbs(struct mm_struct *mm)
813 {
814         /*
815          * Would be nice if this was async so it could be run in
816          * parallel with our local flush, but generic code does not
817          * give a good API for it. Could extend the generic code or
818          * make a special powerpc IPI for flushing TLBs.
819          * For now it's not too performance critical.
820          */
821         smp_call_function_many(mm_cpumask(mm), do_exit_flush_lazy_tlb,
822                                 (void *)mm, 1);
823 }
824
825 #else /* CONFIG_SMP */
826 static inline void exit_flush_lazy_tlbs(struct mm_struct *mm) { }
827 #endif /* CONFIG_SMP */
828
829 static DEFINE_PER_CPU(unsigned int, mm_cpumask_trim_clock);
830
831 /*
832  * Interval between flushes at which we send out IPIs to check whether the
833  * mm_cpumask can be trimmed for the case where it's not a single-threaded
834  * process flushing its own mm. The intent is to reduce the cost of later
835  * flushes. Don't want this to be so low that it adds noticable cost to TLB
836  * flushing, or so high that it doesn't help reduce global TLBIEs.
837  */
838 static unsigned long tlb_mm_cpumask_trim_timer = 1073;
839
840 static bool tick_and_test_trim_clock(void)
841 {
842         if (__this_cpu_inc_return(mm_cpumask_trim_clock) ==
843                         tlb_mm_cpumask_trim_timer) {
844                 __this_cpu_write(mm_cpumask_trim_clock, 0);
845                 return true;
846         }
847         return false;
848 }
849
850 enum tlb_flush_type {
851         FLUSH_TYPE_NONE,
852         FLUSH_TYPE_LOCAL,
853         FLUSH_TYPE_GLOBAL,
854 };
855
856 static enum tlb_flush_type flush_type_needed(struct mm_struct *mm, bool fullmm)
857 {
858         int active_cpus = atomic_read(&mm->context.active_cpus);
859         int cpu = smp_processor_id();
860
861         if (active_cpus == 0)
862                 return FLUSH_TYPE_NONE;
863         if (active_cpus == 1 && cpumask_test_cpu(cpu, mm_cpumask(mm))) {
864                 if (current->mm != mm) {
865                         /*
866                          * Asynchronous flush sources may trim down to nothing
867                          * if the process is not running, so occasionally try
868                          * to trim.
869                          */
870                         if (tick_and_test_trim_clock()) {
871                                 exit_lazy_flush_tlb(mm, true);
872                                 return FLUSH_TYPE_NONE;
873                         }
874                 }
875                 return FLUSH_TYPE_LOCAL;
876         }
877
878         /* Coprocessors require TLBIE to invalidate nMMU. */
879         if (atomic_read(&mm->context.copros) > 0)
880                 return FLUSH_TYPE_GLOBAL;
881
882         /*
883          * In the fullmm case there's no point doing the exit_flush_lazy_tlbs
884          * because the mm is being taken down anyway, and a TLBIE tends to
885          * be faster than an IPI+TLBIEL.
886          */
887         if (fullmm)
888                 return FLUSH_TYPE_GLOBAL;
889
890         /*
891          * If we are running the only thread of a single-threaded process,
892          * then we should almost always be able to trim off the rest of the
893          * CPU mask (except in the case of use_mm() races), so always try
894          * trimming the mask.
895          */
896         if (atomic_read(&mm->mm_users) <= 1 && current->mm == mm) {
897                 exit_flush_lazy_tlbs(mm);
898                 /*
899                  * use_mm() race could prevent IPIs from being able to clear
900                  * the cpumask here, however those users are established
901                  * after our first check (and so after the PTEs are removed),
902                  * and the TLB still gets flushed by the IPI, so this CPU
903                  * will only require a local flush.
904                  */
905                 return FLUSH_TYPE_LOCAL;
906         }
907
908         /*
909          * Occasionally try to trim down the cpumask. It's possible this can
910          * bring the mask to zero, which results in no flush.
911          */
912         if (tick_and_test_trim_clock()) {
913                 exit_flush_lazy_tlbs(mm);
914                 if (current->mm == mm)
915                         return FLUSH_TYPE_LOCAL;
916                 if (cpumask_test_cpu(cpu, mm_cpumask(mm)))
917                         exit_lazy_flush_tlb(mm, true);
918                 return FLUSH_TYPE_NONE;
919         }
920
921         return FLUSH_TYPE_GLOBAL;
922 }
923
924 #ifdef CONFIG_SMP
925 void radix__flush_tlb_mm(struct mm_struct *mm)
926 {
927         unsigned long pid;
928         enum tlb_flush_type type;
929
930         pid = mm->context.id;
931         if (unlikely(pid == MMU_NO_CONTEXT))
932                 return;
933
934         preempt_disable();
935         /*
936          * Order loads of mm_cpumask (in flush_type_needed) vs previous
937          * stores to clear ptes before the invalidate. See barrier in
938          * switch_mm_irqs_off
939          */
940         smp_mb();
941         type = flush_type_needed(mm, false);
942         if (type == FLUSH_TYPE_LOCAL) {
943                 _tlbiel_pid(pid, RIC_FLUSH_TLB);
944         } else if (type == FLUSH_TYPE_GLOBAL) {
945                 if (!mmu_has_feature(MMU_FTR_GTSE)) {
946                         unsigned long tgt = H_RPTI_TARGET_CMMU;
947
948                         if (atomic_read(&mm->context.copros) > 0)
949                                 tgt |= H_RPTI_TARGET_NMMU;
950                         pseries_rpt_invalidate(pid, tgt, H_RPTI_TYPE_TLB,
951                                                H_RPTI_PAGE_ALL, 0, -1UL);
952                 } else if (cputlb_use_tlbie()) {
953                         if (mm_needs_flush_escalation(mm))
954                                 _tlbie_pid(pid, RIC_FLUSH_ALL);
955                         else
956                                 _tlbie_pid(pid, RIC_FLUSH_TLB);
957                 } else {
958                         _tlbiel_pid_multicast(mm, pid, RIC_FLUSH_TLB);
959                 }
960         }
961         preempt_enable();
962 }
963 EXPORT_SYMBOL(radix__flush_tlb_mm);
964
965 static void __flush_all_mm(struct mm_struct *mm, bool fullmm)
966 {
967         unsigned long pid;
968         enum tlb_flush_type type;
969
970         pid = mm->context.id;
971         if (unlikely(pid == MMU_NO_CONTEXT))
972                 return;
973
974         preempt_disable();
975         smp_mb(); /* see radix__flush_tlb_mm */
976         type = flush_type_needed(mm, fullmm);
977         if (type == FLUSH_TYPE_LOCAL) {
978                 _tlbiel_pid(pid, RIC_FLUSH_ALL);
979         } else if (type == FLUSH_TYPE_GLOBAL) {
980                 if (!mmu_has_feature(MMU_FTR_GTSE)) {
981                         unsigned long tgt = H_RPTI_TARGET_CMMU;
982                         unsigned long type = H_RPTI_TYPE_TLB | H_RPTI_TYPE_PWC |
983                                              H_RPTI_TYPE_PRT;
984
985                         if (atomic_read(&mm->context.copros) > 0)
986                                 tgt |= H_RPTI_TARGET_NMMU;
987                         pseries_rpt_invalidate(pid, tgt, type,
988                                                H_RPTI_PAGE_ALL, 0, -1UL);
989                 } else if (cputlb_use_tlbie())
990                         _tlbie_pid(pid, RIC_FLUSH_ALL);
991                 else
992                         _tlbiel_pid_multicast(mm, pid, RIC_FLUSH_ALL);
993         }
994         preempt_enable();
995 }
996
997 void radix__flush_all_mm(struct mm_struct *mm)
998 {
999         __flush_all_mm(mm, false);
1000 }
1001 EXPORT_SYMBOL(radix__flush_all_mm);
1002
1003 void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
1004                                  int psize)
1005 {
1006         unsigned long pid;
1007         enum tlb_flush_type type;
1008
1009         pid = mm->context.id;
1010         if (unlikely(pid == MMU_NO_CONTEXT))
1011                 return;
1012
1013         preempt_disable();
1014         smp_mb(); /* see radix__flush_tlb_mm */
1015         type = flush_type_needed(mm, false);
1016         if (type == FLUSH_TYPE_LOCAL) {
1017                 _tlbiel_va(vmaddr, pid, psize, RIC_FLUSH_TLB);
1018         } else if (type == FLUSH_TYPE_GLOBAL) {
1019                 if (!mmu_has_feature(MMU_FTR_GTSE)) {
1020                         unsigned long tgt, pg_sizes, size;
1021
1022                         tgt = H_RPTI_TARGET_CMMU;
1023                         pg_sizes = psize_to_rpti_pgsize(psize);
1024                         size = 1UL << mmu_psize_to_shift(psize);
1025
1026                         if (atomic_read(&mm->context.copros) > 0)
1027                                 tgt |= H_RPTI_TARGET_NMMU;
1028                         pseries_rpt_invalidate(pid, tgt, H_RPTI_TYPE_TLB,
1029                                                pg_sizes, vmaddr,
1030                                                vmaddr + size);
1031                 } else if (cputlb_use_tlbie())
1032                         _tlbie_va(vmaddr, pid, psize, RIC_FLUSH_TLB);
1033                 else
1034                         _tlbiel_va_multicast(mm, vmaddr, pid, psize, RIC_FLUSH_TLB);
1035         }
1036         preempt_enable();
1037 }
1038
1039 void radix__flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
1040 {
1041 #ifdef CONFIG_HUGETLB_PAGE
1042         if (is_vm_hugetlb_page(vma))
1043                 return radix__flush_hugetlb_page(vma, vmaddr);
1044 #endif
1045         radix__flush_tlb_page_psize(vma->vm_mm, vmaddr, mmu_virtual_psize);
1046 }
1047 EXPORT_SYMBOL(radix__flush_tlb_page);
1048
1049 #endif /* CONFIG_SMP */
1050
1051 static void do_tlbiel_kernel(void *info)
1052 {
1053         _tlbiel_pid(0, RIC_FLUSH_ALL);
1054 }
1055
1056 static inline void _tlbiel_kernel_broadcast(void)
1057 {
1058         on_each_cpu(do_tlbiel_kernel, NULL, 1);
1059         if (tlbie_capable) {
1060                 /*
1061                  * Coherent accelerators don't refcount kernel memory mappings,
1062                  * so have to always issue a tlbie for them. This is quite a
1063                  * slow path anyway.
1064                  */
1065                 _tlbie_pid(0, RIC_FLUSH_ALL);
1066         }
1067 }
1068
1069 /*
1070  * If kernel TLBIs ever become local rather than global, then
1071  * drivers/misc/ocxl/link.c:ocxl_link_add_pe will need some work, as it
1072  * assumes kernel TLBIs are global.
1073  */
1074 void radix__flush_tlb_kernel_range(unsigned long start, unsigned long end)
1075 {
1076         if (!mmu_has_feature(MMU_FTR_GTSE)) {
1077                 unsigned long tgt = H_RPTI_TARGET_CMMU | H_RPTI_TARGET_NMMU;
1078                 unsigned long type = H_RPTI_TYPE_TLB | H_RPTI_TYPE_PWC |
1079                                      H_RPTI_TYPE_PRT;
1080
1081                 pseries_rpt_invalidate(0, tgt, type, H_RPTI_PAGE_ALL,
1082                                        start, end);
1083         } else if (cputlb_use_tlbie())
1084                 _tlbie_pid(0, RIC_FLUSH_ALL);
1085         else
1086                 _tlbiel_kernel_broadcast();
1087 }
1088 EXPORT_SYMBOL(radix__flush_tlb_kernel_range);
1089
1090 #define TLB_FLUSH_ALL -1UL
1091
1092 /*
1093  * Number of pages above which we invalidate the entire PID rather than
1094  * flush individual pages, for local and global flushes respectively.
1095  *
1096  * tlbie goes out to the interconnect and individual ops are more costly.
1097  * It also does not iterate over sets like the local tlbiel variant when
1098  * invalidating a full PID, so it has a far lower threshold to change from
1099  * individual page flushes to full-pid flushes.
1100  */
1101 static unsigned long tlb_single_page_flush_ceiling __read_mostly = 33;
1102 static unsigned long tlb_local_single_page_flush_ceiling __read_mostly = POWER9_TLB_SETS_RADIX * 2;
1103
1104 static inline void __radix__flush_tlb_range(struct mm_struct *mm,
1105                                             unsigned long start, unsigned long end)
1106
1107 {
1108         unsigned long pid;
1109         unsigned int page_shift = mmu_psize_defs[mmu_virtual_psize].shift;
1110         unsigned long page_size = 1UL << page_shift;
1111         unsigned long nr_pages = (end - start) >> page_shift;
1112         bool fullmm = (end == TLB_FLUSH_ALL);
1113         bool flush_pid;
1114         enum tlb_flush_type type;
1115
1116         pid = mm->context.id;
1117         if (unlikely(pid == MMU_NO_CONTEXT))
1118                 return;
1119
1120         preempt_disable();
1121         smp_mb(); /* see radix__flush_tlb_mm */
1122         type = flush_type_needed(mm, fullmm);
1123         if (type == FLUSH_TYPE_NONE)
1124                 goto out;
1125
1126         if (fullmm)
1127                 flush_pid = true;
1128         else if (type == FLUSH_TYPE_GLOBAL)
1129                 flush_pid = nr_pages > tlb_single_page_flush_ceiling;
1130         else
1131                 flush_pid = nr_pages > tlb_local_single_page_flush_ceiling;
1132
1133         if (!mmu_has_feature(MMU_FTR_GTSE) && type == FLUSH_TYPE_GLOBAL) {
1134                 unsigned long tgt = H_RPTI_TARGET_CMMU;
1135                 unsigned long pg_sizes = psize_to_rpti_pgsize(mmu_virtual_psize);
1136
1137                 if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
1138                         pg_sizes |= psize_to_rpti_pgsize(MMU_PAGE_2M);
1139                 if (atomic_read(&mm->context.copros) > 0)
1140                         tgt |= H_RPTI_TARGET_NMMU;
1141                 pseries_rpt_invalidate(pid, tgt, H_RPTI_TYPE_TLB, pg_sizes,
1142                                        start, end);
1143         } else if (flush_pid) {
1144                 if (type == FLUSH_TYPE_LOCAL) {
1145                         _tlbiel_pid(pid, RIC_FLUSH_TLB);
1146                 } else {
1147                         if (cputlb_use_tlbie()) {
1148                                 if (mm_needs_flush_escalation(mm))
1149                                         _tlbie_pid(pid, RIC_FLUSH_ALL);
1150                                 else
1151                                         _tlbie_pid(pid, RIC_FLUSH_TLB);
1152                         } else {
1153                                 _tlbiel_pid_multicast(mm, pid, RIC_FLUSH_TLB);
1154                         }
1155                 }
1156         } else {
1157                 bool hflush = false;
1158                 unsigned long hstart, hend;
1159
1160                 if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
1161                         hstart = (start + PMD_SIZE - 1) & PMD_MASK;
1162                         hend = end & PMD_MASK;
1163                         if (hstart < hend)
1164                                 hflush = true;
1165                 }
1166
1167                 if (type == FLUSH_TYPE_LOCAL) {
1168                         asm volatile("ptesync": : :"memory");
1169                         __tlbiel_va_range(start, end, pid, page_size, mmu_virtual_psize);
1170                         if (hflush)
1171                                 __tlbiel_va_range(hstart, hend, pid,
1172                                                 PMD_SIZE, MMU_PAGE_2M);
1173                         ppc_after_tlbiel_barrier();
1174                 } else if (cputlb_use_tlbie()) {
1175                         asm volatile("ptesync": : :"memory");
1176                         __tlbie_va_range(start, end, pid, page_size, mmu_virtual_psize);
1177                         if (hflush)
1178                                 __tlbie_va_range(hstart, hend, pid,
1179                                                 PMD_SIZE, MMU_PAGE_2M);
1180                         asm volatile("eieio; tlbsync; ptesync": : :"memory");
1181                 } else {
1182                         _tlbiel_va_range_multicast(mm,
1183                                         start, end, pid, page_size, mmu_virtual_psize, false);
1184                         if (hflush)
1185                                 _tlbiel_va_range_multicast(mm,
1186                                         hstart, hend, pid, PMD_SIZE, MMU_PAGE_2M, false);
1187                 }
1188         }
1189 out:
1190         preempt_enable();
1191 }
1192
1193 void radix__flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
1194                      unsigned long end)
1195
1196 {
1197 #ifdef CONFIG_HUGETLB_PAGE
1198         if (is_vm_hugetlb_page(vma))
1199                 return radix__flush_hugetlb_tlb_range(vma, start, end);
1200 #endif
1201
1202         __radix__flush_tlb_range(vma->vm_mm, start, end);
1203 }
1204 EXPORT_SYMBOL(radix__flush_tlb_range);
1205
1206 static int radix_get_mmu_psize(int page_size)
1207 {
1208         int psize;
1209
1210         if (page_size == (1UL << mmu_psize_defs[mmu_virtual_psize].shift))
1211                 psize = mmu_virtual_psize;
1212         else if (page_size == (1UL << mmu_psize_defs[MMU_PAGE_2M].shift))
1213                 psize = MMU_PAGE_2M;
1214         else if (page_size == (1UL << mmu_psize_defs[MMU_PAGE_1G].shift))
1215                 psize = MMU_PAGE_1G;
1216         else
1217                 return -1;
1218         return psize;
1219 }
1220
1221 /*
1222  * Flush partition scoped LPID address translation for all CPUs.
1223  */
1224 void radix__flush_tlb_lpid_page(unsigned int lpid,
1225                                         unsigned long addr,
1226                                         unsigned long page_size)
1227 {
1228         int psize = radix_get_mmu_psize(page_size);
1229
1230         _tlbie_lpid_va(addr, lpid, psize, RIC_FLUSH_TLB);
1231 }
1232 EXPORT_SYMBOL_GPL(radix__flush_tlb_lpid_page);
1233
1234 /*
1235  * Flush partition scoped PWC from LPID for all CPUs.
1236  */
1237 void radix__flush_pwc_lpid(unsigned int lpid)
1238 {
1239         _tlbie_lpid(lpid, RIC_FLUSH_PWC);
1240 }
1241 EXPORT_SYMBOL_GPL(radix__flush_pwc_lpid);
1242
1243 /*
1244  * Flush partition scoped translations from LPID (=LPIDR)
1245  */
1246 void radix__flush_all_lpid(unsigned int lpid)
1247 {
1248         _tlbie_lpid(lpid, RIC_FLUSH_ALL);
1249 }
1250 EXPORT_SYMBOL_GPL(radix__flush_all_lpid);
1251
1252 /*
1253  * Flush process scoped translations from LPID (=LPIDR)
1254  */
1255 void radix__flush_all_lpid_guest(unsigned int lpid)
1256 {
1257         _tlbie_lpid_guest(lpid, RIC_FLUSH_ALL);
1258 }
1259
1260 static void radix__flush_tlb_pwc_range_psize(struct mm_struct *mm, unsigned long start,
1261                                   unsigned long end, int psize);
1262
1263 void radix__tlb_flush(struct mmu_gather *tlb)
1264 {
1265         int psize = 0;
1266         struct mm_struct *mm = tlb->mm;
1267         int page_size = tlb->page_size;
1268         unsigned long start = tlb->start;
1269         unsigned long end = tlb->end;
1270
1271         /*
1272          * if page size is not something we understand, do a full mm flush
1273          *
1274          * A "fullmm" flush must always do a flush_all_mm (RIC=2) flush
1275          * that flushes the process table entry cache upon process teardown.
1276          * See the comment for radix in arch_exit_mmap().
1277          */
1278         if (tlb->fullmm || tlb->need_flush_all) {
1279                 __flush_all_mm(mm, true);
1280         } else if ( (psize = radix_get_mmu_psize(page_size)) == -1) {
1281                 if (!tlb->freed_tables)
1282                         radix__flush_tlb_mm(mm);
1283                 else
1284                         radix__flush_all_mm(mm);
1285         } else {
1286                 if (!tlb->freed_tables)
1287                         radix__flush_tlb_range_psize(mm, start, end, psize);
1288                 else
1289                         radix__flush_tlb_pwc_range_psize(mm, start, end, psize);
1290         }
1291 }
1292
1293 static __always_inline void __radix__flush_tlb_range_psize(struct mm_struct *mm,
1294                                 unsigned long start, unsigned long end,
1295                                 int psize, bool also_pwc)
1296 {
1297         unsigned long pid;
1298         unsigned int page_shift = mmu_psize_defs[psize].shift;
1299         unsigned long page_size = 1UL << page_shift;
1300         unsigned long nr_pages = (end - start) >> page_shift;
1301         bool fullmm = (end == TLB_FLUSH_ALL);
1302         bool flush_pid;
1303         enum tlb_flush_type type;
1304
1305         pid = mm->context.id;
1306         if (unlikely(pid == MMU_NO_CONTEXT))
1307                 return;
1308
1309         fullmm = (end == TLB_FLUSH_ALL);
1310
1311         preempt_disable();
1312         smp_mb(); /* see radix__flush_tlb_mm */
1313         type = flush_type_needed(mm, fullmm);
1314         if (type == FLUSH_TYPE_NONE)
1315                 goto out;
1316
1317         if (fullmm)
1318                 flush_pid = true;
1319         else if (type == FLUSH_TYPE_GLOBAL)
1320                 flush_pid = nr_pages > tlb_single_page_flush_ceiling;
1321         else
1322                 flush_pid = nr_pages > tlb_local_single_page_flush_ceiling;
1323
1324         if (!mmu_has_feature(MMU_FTR_GTSE) && type == FLUSH_TYPE_GLOBAL) {
1325                 unsigned long tgt = H_RPTI_TARGET_CMMU;
1326                 unsigned long type = H_RPTI_TYPE_TLB;
1327                 unsigned long pg_sizes = psize_to_rpti_pgsize(psize);
1328
1329                 if (also_pwc)
1330                         type |= H_RPTI_TYPE_PWC;
1331                 if (atomic_read(&mm->context.copros) > 0)
1332                         tgt |= H_RPTI_TARGET_NMMU;
1333                 pseries_rpt_invalidate(pid, tgt, type, pg_sizes, start, end);
1334         } else if (flush_pid) {
1335                 if (type == FLUSH_TYPE_LOCAL) {
1336                         _tlbiel_pid(pid, also_pwc ? RIC_FLUSH_ALL : RIC_FLUSH_TLB);
1337                 } else {
1338                         if (cputlb_use_tlbie()) {
1339                                 if (mm_needs_flush_escalation(mm))
1340                                         also_pwc = true;
1341
1342                                 _tlbie_pid(pid,
1343                                         also_pwc ?  RIC_FLUSH_ALL : RIC_FLUSH_TLB);
1344                         } else {
1345                                 _tlbiel_pid_multicast(mm, pid,
1346                                         also_pwc ?  RIC_FLUSH_ALL : RIC_FLUSH_TLB);
1347                         }
1348
1349                 }
1350         } else {
1351                 if (type == FLUSH_TYPE_LOCAL)
1352                         _tlbiel_va_range(start, end, pid, page_size, psize, also_pwc);
1353                 else if (cputlb_use_tlbie())
1354                         _tlbie_va_range(start, end, pid, page_size, psize, also_pwc);
1355                 else
1356                         _tlbiel_va_range_multicast(mm,
1357                                         start, end, pid, page_size, psize, also_pwc);
1358         }
1359 out:
1360         preempt_enable();
1361 }
1362
1363 void radix__flush_tlb_range_psize(struct mm_struct *mm, unsigned long start,
1364                                   unsigned long end, int psize)
1365 {
1366         return __radix__flush_tlb_range_psize(mm, start, end, psize, false);
1367 }
1368
1369 static void radix__flush_tlb_pwc_range_psize(struct mm_struct *mm, unsigned long start,
1370                                   unsigned long end, int psize)
1371 {
1372         __radix__flush_tlb_range_psize(mm, start, end, psize, true);
1373 }
1374
1375 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
1376 void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr)
1377 {
1378         unsigned long pid, end;
1379         enum tlb_flush_type type;
1380
1381         pid = mm->context.id;
1382         if (unlikely(pid == MMU_NO_CONTEXT))
1383                 return;
1384
1385         /* 4k page size, just blow the world */
1386         if (PAGE_SIZE == 0x1000) {
1387                 radix__flush_all_mm(mm);
1388                 return;
1389         }
1390
1391         end = addr + HPAGE_PMD_SIZE;
1392
1393         /* Otherwise first do the PWC, then iterate the pages. */
1394         preempt_disable();
1395         smp_mb(); /* see radix__flush_tlb_mm */
1396         type = flush_type_needed(mm, false);
1397         if (type == FLUSH_TYPE_LOCAL) {
1398                 _tlbiel_va_range(addr, end, pid, PAGE_SIZE, mmu_virtual_psize, true);
1399         } else if (type == FLUSH_TYPE_GLOBAL) {
1400                 if (!mmu_has_feature(MMU_FTR_GTSE)) {
1401                         unsigned long tgt, type, pg_sizes;
1402
1403                         tgt = H_RPTI_TARGET_CMMU;
1404                         type = H_RPTI_TYPE_TLB | H_RPTI_TYPE_PWC |
1405                                H_RPTI_TYPE_PRT;
1406                         pg_sizes = psize_to_rpti_pgsize(mmu_virtual_psize);
1407
1408                         if (atomic_read(&mm->context.copros) > 0)
1409                                 tgt |= H_RPTI_TARGET_NMMU;
1410                         pseries_rpt_invalidate(pid, tgt, type, pg_sizes,
1411                                                addr, end);
1412                 } else if (cputlb_use_tlbie())
1413                         _tlbie_va_range(addr, end, pid, PAGE_SIZE, mmu_virtual_psize, true);
1414                 else
1415                         _tlbiel_va_range_multicast(mm,
1416                                         addr, end, pid, PAGE_SIZE, mmu_virtual_psize, true);
1417         }
1418
1419         preempt_enable();
1420 }
1421 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
1422
1423 void radix__flush_pmd_tlb_range(struct vm_area_struct *vma,
1424                                 unsigned long start, unsigned long end)
1425 {
1426         radix__flush_tlb_range_psize(vma->vm_mm, start, end, MMU_PAGE_2M);
1427 }
1428 EXPORT_SYMBOL(radix__flush_pmd_tlb_range);
1429
1430 void radix__flush_tlb_all(void)
1431 {
1432         unsigned long rb,prs,r,rs;
1433         unsigned long ric = RIC_FLUSH_ALL;
1434
1435         rb = 0x3 << PPC_BITLSHIFT(53); /* IS = 3 */
1436         prs = 0; /* partition scoped */
1437         r = 1;   /* radix format */
1438         rs = 1 & ((1UL << 32) - 1); /* any LPID value to flush guest mappings */
1439
1440         asm volatile("ptesync": : :"memory");
1441         /*
1442          * now flush guest entries by passing PRS = 1 and LPID != 0
1443          */
1444         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
1445                      : : "r"(rb), "i"(r), "i"(1), "i"(ric), "r"(rs) : "memory");
1446         /*
1447          * now flush host entires by passing PRS = 0 and LPID == 0
1448          */
1449         asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
1450                      : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(0) : "memory");
1451         asm volatile("eieio; tlbsync; ptesync": : :"memory");
1452 }
1453
1454 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
1455 /*
1456  * Performs process-scoped invalidations for a given LPID
1457  * as part of H_RPT_INVALIDATE hcall.
1458  */
1459 void do_h_rpt_invalidate_prt(unsigned long pid, unsigned long lpid,
1460                              unsigned long type, unsigned long pg_sizes,
1461                              unsigned long start, unsigned long end)
1462 {
1463         unsigned long psize, nr_pages;
1464         struct mmu_psize_def *def;
1465         bool flush_pid;
1466
1467         /*
1468          * A H_RPTI_TYPE_ALL request implies RIC=3, hence
1469          * do a single IS=1 based flush.
1470          */
1471         if ((type & H_RPTI_TYPE_ALL) == H_RPTI_TYPE_ALL) {
1472                 _tlbie_pid_lpid(pid, lpid, RIC_FLUSH_ALL);
1473                 return;
1474         }
1475
1476         if (type & H_RPTI_TYPE_PWC)
1477                 _tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC);
1478
1479         /* Full PID flush */
1480         if (start == 0 && end == -1)
1481                 return _tlbie_pid_lpid(pid, lpid, RIC_FLUSH_TLB);
1482
1483         /* Do range invalidation for all the valid page sizes */
1484         for (psize = 0; psize < MMU_PAGE_COUNT; psize++) {
1485                 def = &mmu_psize_defs[psize];
1486                 if (!(pg_sizes & def->h_rpt_pgsize))
1487                         continue;
1488
1489                 nr_pages = (end - start) >> def->shift;
1490                 flush_pid = nr_pages > tlb_single_page_flush_ceiling;
1491
1492                 /*
1493                  * If the number of pages spanning the range is above
1494                  * the ceiling, convert the request into a full PID flush.
1495                  * And since PID flush takes out all the page sizes, there
1496                  * is no need to consider remaining page sizes.
1497                  */
1498                 if (flush_pid) {
1499                         _tlbie_pid_lpid(pid, lpid, RIC_FLUSH_TLB);
1500                         return;
1501                 }
1502                 _tlbie_va_range_lpid(start, end, pid, lpid,
1503                                      (1UL << def->shift), psize, false);
1504         }
1505 }
1506 EXPORT_SYMBOL_GPL(do_h_rpt_invalidate_prt);
1507
1508 #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */