1919#include <asm/cputhreads.h>
2020#include <asm/plpar_wrappers.h>
2121
22- #include "internal.h"
23-
2422/*
2523 * tlbiel instruction for radix, set invalidation
2624 * i.e., r=1 and is=01 or is=10 or is=11
@@ -187,7 +185,7 @@ static __always_inline void __tlbie_va(unsigned long va, unsigned long pid,
187185 trace_tlbie (0 , 0 , rb , rs , ric , prs , r );
188186}
189187
190- static __always_inline void __tlbie_lpid_va (unsigned long va , unsigned long lpid ,
188+ static __always_inline void __tlbie_va_lpid (unsigned long va , unsigned long lpid ,
191189 unsigned long ap , unsigned long ric )
192190{
193191 unsigned long rb ,rs ,prs ,r ;
@@ -251,17 +249,17 @@ static inline void fixup_tlbie_pid(unsigned long pid)
251249 }
252250}
253251
254- static inline void fixup_tlbie_lpid_va (unsigned long va , unsigned long lpid ,
252+ static inline void fixup_tlbie_va_lpid (unsigned long va , unsigned long lpid ,
255253 unsigned long ap )
256254{
257255 if (cpu_has_feature (CPU_FTR_P9_TLBIE_ERAT_BUG )) {
258256 asm volatile ("ptesync" : : :"memory" );
259- __tlbie_lpid_va (va , 0 , ap , RIC_FLUSH_TLB );
257+ __tlbie_va_lpid (va , 0 , ap , RIC_FLUSH_TLB );
260258 }
261259
262260 if (cpu_has_feature (CPU_FTR_P9_TLBIE_STQ_BUG )) {
263261 asm volatile ("ptesync" : : :"memory" );
264- __tlbie_lpid_va (va , lpid , ap , RIC_FLUSH_TLB );
262+ __tlbie_va_lpid (va , lpid , ap , RIC_FLUSH_TLB );
265263 }
266264}
267265
@@ -280,7 +278,7 @@ static inline void fixup_tlbie_lpid(unsigned long lpid)
280278
281279 if (cpu_has_feature (CPU_FTR_P9_TLBIE_STQ_BUG )) {
282280 asm volatile ("ptesync" : : :"memory" );
283- __tlbie_lpid_va (va , lpid , mmu_get_ap (MMU_PAGE_64K ), RIC_FLUSH_TLB );
281+ __tlbie_va_lpid (va , lpid , mmu_get_ap (MMU_PAGE_64K ), RIC_FLUSH_TLB );
284282 }
285283}
286284
@@ -531,14 +529,14 @@ static void do_tlbiel_va_range(void *info)
531529 t -> psize , t -> also_pwc );
532530}
533531
534- static __always_inline void _tlbie_lpid_va (unsigned long va , unsigned long lpid ,
532+ static __always_inline void _tlbie_va_lpid (unsigned long va , unsigned long lpid ,
535533 unsigned long psize , unsigned long ric )
536534{
537535 unsigned long ap = mmu_get_ap (psize );
538536
539537 asm volatile ("ptesync" : : :"memory" );
540- __tlbie_lpid_va (va , lpid , ap , ric );
541- fixup_tlbie_lpid_va (va , lpid , ap );
538+ __tlbie_va_lpid (va , lpid , ap , ric );
539+ fixup_tlbie_va_lpid (va , lpid , ap );
542540 asm volatile ("eieio; tlbsync; ptesync" : : :"memory" );
543541}
544542
@@ -660,7 +658,7 @@ static bool mm_needs_flush_escalation(struct mm_struct *mm)
660658 * If always_flush is true, then flush even if this CPU can't be removed
661659 * from mm_cpumask.
662660 */
663- void exit_lazy_flush_tlb (struct mm_struct * mm , bool always_flush )
661+ static void exit_lazy_flush_tlb (struct mm_struct * mm )
664662{
665663 unsigned long pid = mm -> context .id ;
666664 int cpu = smp_processor_id ();
@@ -703,19 +701,17 @@ void exit_lazy_flush_tlb(struct mm_struct *mm, bool always_flush)
703701 if (cpumask_test_cpu (cpu , mm_cpumask (mm ))) {
704702 dec_mm_active_cpus (mm );
705703 cpumask_clear_cpu (cpu , mm_cpumask (mm ));
706- always_flush = true;
707704 }
708705
709706out :
710- if (always_flush )
711- _tlbiel_pid (pid , RIC_FLUSH_ALL );
707+ _tlbiel_pid (pid , RIC_FLUSH_ALL );
712708}
713709
714710#ifdef CONFIG_SMP
715711static void do_exit_flush_lazy_tlb (void * arg )
716712{
717713 struct mm_struct * mm = arg ;
718- exit_lazy_flush_tlb (mm , true );
714+ exit_lazy_flush_tlb (mm );
719715}
720716
721717static void exit_flush_lazy_tlbs (struct mm_struct * mm )
@@ -777,7 +773,7 @@ static enum tlb_flush_type flush_type_needed(struct mm_struct *mm, bool fullmm)
777773 * to trim.
778774 */
779775 if (tick_and_test_trim_clock ()) {
780- exit_lazy_flush_tlb (mm , true );
776+ exit_lazy_flush_tlb (mm );
781777 return FLUSH_TYPE_NONE ;
782778 }
783779 }
@@ -823,7 +819,7 @@ static enum tlb_flush_type flush_type_needed(struct mm_struct *mm, bool fullmm)
823819 if (current -> mm == mm )
824820 return FLUSH_TYPE_LOCAL ;
825821 if (cpumask_test_cpu (cpu , mm_cpumask (mm )))
826- exit_lazy_flush_tlb (mm , true );
822+ exit_lazy_flush_tlb (mm );
827823 return FLUSH_TYPE_NONE ;
828824 }
829825
@@ -889,8 +885,7 @@ static void __flush_all_mm(struct mm_struct *mm, bool fullmm)
889885 } else if (type == FLUSH_TYPE_GLOBAL ) {
890886 if (!mmu_has_feature (MMU_FTR_GTSE )) {
891887 unsigned long tgt = H_RPTI_TARGET_CMMU ;
892- unsigned long type = H_RPTI_TYPE_TLB | H_RPTI_TYPE_PWC |
893- H_RPTI_TYPE_PRT ;
888+ unsigned long type = H_RPTI_TYPE_ALL ;
894889
895890 if (atomic_read (& mm -> context .copros ) > 0 )
896891 tgt |= H_RPTI_TARGET_NMMU ;
@@ -986,8 +981,7 @@ void radix__flush_tlb_kernel_range(unsigned long start, unsigned long end)
986981{
987982 if (!mmu_has_feature (MMU_FTR_GTSE )) {
988983 unsigned long tgt = H_RPTI_TARGET_CMMU | H_RPTI_TARGET_NMMU ;
989- unsigned long type = H_RPTI_TYPE_TLB | H_RPTI_TYPE_PWC |
990- H_RPTI_TYPE_PRT ;
984+ unsigned long type = H_RPTI_TYPE_ALL ;
991985
992986 pseries_rpt_invalidate (0 , tgt , type , H_RPTI_PAGE_ALL ,
993987 start , end );
@@ -1151,7 +1145,7 @@ void radix__flush_tlb_lpid_page(unsigned int lpid,
11511145{
11521146 int psize = radix_get_mmu_psize (page_size );
11531147
1154- _tlbie_lpid_va (addr , lpid , psize , RIC_FLUSH_TLB );
1148+ _tlbie_va_lpid (addr , lpid , psize , RIC_FLUSH_TLB );
11551149}
11561150EXPORT_SYMBOL_GPL (radix__flush_tlb_lpid_page );
11571151
@@ -1341,8 +1335,7 @@ void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr)
13411335 unsigned long tgt , type , pg_sizes ;
13421336
13431337 tgt = H_RPTI_TARGET_CMMU ;
1344- type = H_RPTI_TYPE_TLB | H_RPTI_TYPE_PWC |
1345- H_RPTI_TYPE_PRT ;
1338+ type = H_RPTI_TYPE_ALL ;
13461339 pg_sizes = psize_to_rpti_pgsize (mmu_virtual_psize );
13471340
13481341 if (atomic_read (& mm -> context .copros ) > 0 )
@@ -1415,7 +1408,7 @@ static __always_inline void __tlbie_pid_lpid(unsigned long pid,
14151408 trace_tlbie (0 , 0 , rb , rs , ric , prs , r );
14161409}
14171410
1418- static __always_inline void __tlbie_va_lpid (unsigned long va , unsigned long pid ,
1411+ static __always_inline void __tlbie_va_pid_lpid (unsigned long va , unsigned long pid ,
14191412 unsigned long lpid ,
14201413 unsigned long ap , unsigned long ric )
14211414{
@@ -1447,7 +1440,7 @@ static inline void fixup_tlbie_pid_lpid(unsigned long pid, unsigned long lpid)
14471440
14481441 if (cpu_has_feature (CPU_FTR_P9_TLBIE_STQ_BUG )) {
14491442 asm volatile ("ptesync" : : : "memory" );
1450- __tlbie_va_lpid (va , pid , lpid , mmu_get_ap (MMU_PAGE_64K ),
1443+ __tlbie_va_pid_lpid (va , pid , lpid , mmu_get_ap (MMU_PAGE_64K ),
14511444 RIC_FLUSH_TLB );
14521445 }
14531446}
@@ -1478,7 +1471,7 @@ static inline void _tlbie_pid_lpid(unsigned long pid, unsigned long lpid,
14781471 asm volatile ("eieio; tlbsync; ptesync" : : : "memory" );
14791472}
14801473
1481- static inline void fixup_tlbie_va_range_lpid (unsigned long va ,
1474+ static inline void fixup_tlbie_va_range_pid_lpid (unsigned long va ,
14821475 unsigned long pid ,
14831476 unsigned long lpid ,
14841477 unsigned long ap )
@@ -1490,11 +1483,11 @@ static inline void fixup_tlbie_va_range_lpid(unsigned long va,
14901483
14911484 if (cpu_has_feature (CPU_FTR_P9_TLBIE_STQ_BUG )) {
14921485 asm volatile ("ptesync" : : : "memory" );
1493- __tlbie_va_lpid (va , pid , lpid , ap , RIC_FLUSH_TLB );
1486+ __tlbie_va_pid_lpid (va , pid , lpid , ap , RIC_FLUSH_TLB );
14941487 }
14951488}
14961489
1497- static inline void __tlbie_va_range_lpid (unsigned long start , unsigned long end ,
1490+ static inline void __tlbie_va_range_pid_lpid (unsigned long start , unsigned long end ,
14981491 unsigned long pid , unsigned long lpid ,
14991492 unsigned long page_size ,
15001493 unsigned long psize )
@@ -1503,20 +1496,20 @@ static inline void __tlbie_va_range_lpid(unsigned long start, unsigned long end,
15031496 unsigned long ap = mmu_get_ap (psize );
15041497
15051498 for (addr = start ; addr < end ; addr += page_size )
1506- __tlbie_va_lpid (addr , pid , lpid , ap , RIC_FLUSH_TLB );
1499+ __tlbie_va_pid_lpid (addr , pid , lpid , ap , RIC_FLUSH_TLB );
15071500
1508- fixup_tlbie_va_range_lpid (addr - page_size , pid , lpid , ap );
1501+ fixup_tlbie_va_range_pid_lpid (addr - page_size , pid , lpid , ap );
15091502}
15101503
1511- static inline void _tlbie_va_range_lpid (unsigned long start , unsigned long end ,
1504+ static inline void _tlbie_va_range_pid_lpid (unsigned long start , unsigned long end ,
15121505 unsigned long pid , unsigned long lpid ,
15131506 unsigned long page_size ,
15141507 unsigned long psize , bool also_pwc )
15151508{
15161509 asm volatile ("ptesync" : : : "memory" );
15171510 if (also_pwc )
15181511 __tlbie_pid_lpid (pid , lpid , RIC_FLUSH_PWC );
1519- __tlbie_va_range_lpid (start , end , pid , lpid , page_size , psize );
1512+ __tlbie_va_range_pid_lpid (start , end , pid , lpid , page_size , psize );
15201513 asm volatile ("eieio; tlbsync; ptesync" : : : "memory" );
15211514}
15221515
@@ -1567,7 +1560,7 @@ void do_h_rpt_invalidate_prt(unsigned long pid, unsigned long lpid,
15671560 _tlbie_pid_lpid (pid , lpid , RIC_FLUSH_TLB );
15681561 return ;
15691562 }
1570- _tlbie_va_range_lpid (start , end , pid , lpid ,
1563+ _tlbie_va_range_pid_lpid (start , end , pid , lpid ,
15711564 (1UL << def -> shift ), psize , false);
15721565 }
15731566}
0 commit comments