MODULE_PARM_DESC(h_ipi_redirect, "Redirect H_IPI wakeup to a free host core");
 #endif
 
+/* If set, the threads on each CPU core have to be in the same MMU mode */
+static bool no_mixing_hpt_and_radix;
+
 static void kvmppc_end_cede(struct kvm_vcpu *vcpu);
 static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);
 
 static bool subcore_config_ok(int n_subcores, int n_threads)
 {
        /*
-        * POWER9 "SMT4" cores are permanently in what is effectively a 4-way split-core
-        * mode, with one thread per subcore.
+        * POWER9 "SMT4" cores are permanently in what is effectively a 4-way
+        * split-core mode, with one thread per subcore.
         */
        if (cpu_has_feature(CPU_FTR_ARCH_300))
                return n_subcores <= 4 && n_threads == 1;
        if (!cpu_has_feature(CPU_FTR_ARCH_207S))
                return false;
 
-       /* POWER9 currently requires all threads to be in the same MMU mode */
-       if (cpu_has_feature(CPU_FTR_ARCH_300) &&
+       /* Some POWER9 chips require all threads to be in the same MMU mode */
+       if (no_mixing_hpt_and_radix &&
            kvm_is_radix(vc->kvm) != kvm_is_radix(cip->vc[0]->kvm))
                return false;
 
         * threads are offline.  Also check if the number of threads in this
         * guest are greater than the current system threads per guest.
         * On POWER9, we need to be not in independent-threads mode if
-        * this is a HPT guest on a radix host.
+        * this is a HPT guest on a radix host machine where the
+        * CPU threads may not be in different MMU modes.
         */
-       hpt_on_radix = radix_enabled() && !kvm_is_radix(vc->kvm);
+       hpt_on_radix = no_mixing_hpt_and_radix && radix_enabled() &&
+               !kvm_is_radix(vc->kvm);
        if (((controlled_threads > 1) &&
             ((vc->num_threads > threads_per_subcore) || !on_primary_thread())) ||
            (hpt_on_radix && vc->kvm->arch.threads_indep)) {
 
        if (kvmppc_radix_possible())
                r = kvmppc_radix_init();
+
+       /*
+        * POWER9 chips before version 2.02 can't have some threads in
+        * HPT mode and some in radix mode on the same core.
+        */
+       if (cpu_has_feature(CPU_FTR_ARCH_300)) {
+               unsigned int pvr = mfspr(SPRN_PVR);
+               if ((pvr >> 16) == PVR_POWER9 &&
+                   (((pvr & 0xe000) == 0 && (pvr & 0xfff) < 0x202) ||
+                    ((pvr & 0xe000) == 0x2000 && (pvr & 0xfff) < 0x101)))
+                       no_mixing_hpt_and_radix = true;
+       }
+
        return r;
 }