]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/prom.c
powerpc: Fix booting P9 hash with CONFIG_PPC_RADIX_MMU=N
[karo-tx-linux.git] / arch / powerpc / kernel / prom.c
index d2f0afeae5a0cd24ead16ba9e94b8ff95e621c57..f830562974417bfd0f338766b59a6ffd7a09a176 100644 (file)
@@ -57,6 +57,7 @@
 #include <asm/fadump.h>
 #include <asm/epapr_hcalls.h>
 #include <asm/firmware.h>
+#include <asm/dt_cpu_ftrs.h>
 
 #include <mm/mmu_decl.h>
 
@@ -160,7 +161,9 @@ static struct ibm_pa_feature {
        { .pabyte = 0,  .pabit = 3, .cpu_features  = CPU_FTR_CTRL },
        { .pabyte = 0,  .pabit = 6, .cpu_features  = CPU_FTR_NOEXECUTE },
        { .pabyte = 1,  .pabit = 2, .mmu_features  = MMU_FTR_CI_LARGE_PAGE },
+#ifdef CONFIG_PPC_RADIX_MMU
        { .pabyte = 40, .pabit = 0, .mmu_features  = MMU_FTR_TYPE_RADIX },
+#endif
        { .pabyte = 1,  .pabit = 1, .invert = 1, .cpu_features = CPU_FTR_NODSISRALIGN },
        { .pabyte = 5,  .pabit = 0, .cpu_features  = CPU_FTR_REAL_LE,
                                    .cpu_user_ftrs = PPC_FEATURE_TRUE_LE },
@@ -375,23 +378,31 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
         * A POWER6 partition in "POWER6 architected" mode
         * uses the 0x0f000002 PVR value; in POWER5+ mode
         * it uses 0x0f000001.
+        *
+        * If we're using device tree CPU feature discovery then we don't
+        * support the cpu-version property, and it's the responsibility of the
+        * firmware/hypervisor to provide the correct feature set for the
+        * architecture level via the ibm,powerpc-cpu-features binding.
         */
-       prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
-       if (prop && (be32_to_cpup(prop) & 0xff000000) == 0x0f000000)
-               identify_cpu(0, be32_to_cpup(prop));
+       if (!dt_cpu_ftrs_in_use()) {
+               prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
+               if (prop && (be32_to_cpup(prop) & 0xff000000) == 0x0f000000)
+                       identify_cpu(0, be32_to_cpup(prop));
 
-       identical_pvr_fixup(node);
+               check_cpu_feature_properties(node);
+               check_cpu_pa_features(node);
+       }
 
-       check_cpu_feature_properties(node);
-       check_cpu_pa_features(node);
+       identical_pvr_fixup(node);
        init_mmu_slb_size(node);
 
 #ifdef CONFIG_PPC64
-       if (nthreads > 1)
-               cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
-       else
+       if (nthreads == 1)
                cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
+       else if (!dt_cpu_ftrs_in_use())
+               cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
 #endif
+
        return 0;
 }
 
@@ -721,6 +732,8 @@ void __init early_init_devtree(void *params)
 
        DBG("Scanning CPUs ...\n");
 
+       dt_cpu_ftrs_scan();
+
        /* Retrieve CPU related informations from the flat tree
         * (altivec support, boot CPU ID, ...)
         */