|
@@ -235,10 +235,15 @@ void destroy_context(struct mm_struct *mm)
|
|
|
#ifdef CONFIG_PPC_RADIX_MMU
|
|
|
void radix__switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
|
|
|
{
|
|
|
- asm volatile("isync": : :"memory");
|
|
|
- mtspr(SPRN_PID, next->context.id);
|
|
|
- asm volatile("isync \n"
|
|
|
- PPC_SLBIA(0x7)
|
|
|
- : : :"memory");
|
|
|
+
|
|
|
+ if (cpu_has_feature(CPU_FTR_POWER9_DD1)) {
|
|
|
+ isync();
|
|
|
+ mtspr(SPRN_PID, next->context.id);
|
|
|
+ isync();
|
|
|
+ asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
|
|
|
+ } else {
|
|
|
+ mtspr(SPRN_PID, next->context.id);
|
|
|
+ isync();
|
|
|
+ }
|
|
|
}
|
|
|
#endif
|