/* Switch to the guard PID before turning on MMU */
        radix__switch_mmu_context(NULL, &init_mm);
-       if (cpu_has_feature(CPU_FTR_HVMODE))
-               tlbiel_all();
+       tlbiel_all();
 }
 
 void radix__early_init_mmu_secondary(void)
        }
 
        radix__switch_mmu_context(NULL, &init_mm);
-       if (cpu_has_feature(CPU_FTR_HVMODE))
-               tlbiel_all();
+       tlbiel_all();
 }
 
 void radix__mmu_cleanup_all(void)
 
         * and partition table entries. Then flush the remaining sets of the
         * TLB.
         */
-       tlbiel_radix_set_isa300(0, is, 0, RIC_FLUSH_ALL, 0);
-       for (set = 1; set < num_sets; set++)
-               tlbiel_radix_set_isa300(set, is, 0, RIC_FLUSH_TLB, 0);
 
-       /* Do the same for process scoped entries. */
+       if (early_cpu_has_feature(CPU_FTR_HVMODE)) {
+               /* MSR[HV] should flush partition scope translations first. */
+               tlbiel_radix_set_isa300(0, is, 0, RIC_FLUSH_ALL, 0);
+               for (set = 1; set < num_sets; set++)
+                       tlbiel_radix_set_isa300(set, is, 0, RIC_FLUSH_TLB, 0);
+       }
+
+       /* Flush process scoped entries. */
        tlbiel_radix_set_isa300(0, is, 0, RIC_FLUSH_ALL, 1);
        for (set = 1; set < num_sets; set++)
                tlbiel_radix_set_isa300(set, is, 0, RIC_FLUSH_TLB, 1);