]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/powerpc/kernel/prom.c
powerpc/64s: Support new device tree binding for discovering CPU features
[linux.git] / arch / powerpc / kernel / prom.c
index d2f0afeae5a0cd24ead16ba9e94b8ff95e621c57..40c4887c27b613d73bc420b4aca34cee406325a8 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>
 
@@ -375,23 +376,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 +730,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, ...)
         */