]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/sparc/kernel/prom_64.c
of: Make cpu node handling more portable.
[karo-tx-linux.git] / arch / sparc / kernel / prom_64.c
index d397d7fc5c2830e288ddc60abc0c6465368db28f..6b39125eb9271d986b32896fcd35015cbd752ef8 100644 (file)
@@ -373,6 +373,59 @@ static const char *get_mid_prop(void)
        return (tlb_type == spitfire ? "upa-portid" : "portid");
 }
 
+bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
+                                      int cpu, unsigned int *thread)
+{
+       const char *mid_prop = get_mid_prop();
+       int this_cpu_id;
+
+       /* On hypervisor based platforms we interrogate the 'reg'
+        * property.  On everything else we look for a 'upa-portis',
+        * 'portid', or 'cpuid' property.
+        */
+
+       if (tlb_type == hypervisor) {
+               struct property *prop = of_find_property(cpun, "reg", NULL);
+               u32 *regs;
+
+               if (!prop) {
+                       pr_warn("CPU node missing reg property\n");
+                       return false;
+               }
+               regs = prop->value;
+               this_cpu_id = regs[0] & 0x0fffffff;
+       } else {
+               this_cpu_id = of_getintprop_default(cpun, mid_prop, -1);
+
+               if (this_cpu_id < 0) {
+                       mid_prop = "cpuid";
+                       this_cpu_id = of_getintprop_default(cpun, mid_prop, -1);
+               }
+               if (this_cpu_id < 0) {
+                       pr_warn("CPU node missing cpu ID property\n");
+                       return false;
+               }
+       }
+       if (this_cpu_id == cpu) {
+               if (thread) {
+                       int proc_id = cpu_data(cpu).proc_id;
+
+                       /* On sparc64, the cpu thread information is obtained
+                        * either from OBP or the machine description.  We've
+                        * actually probed this information already long before
+                        * this interface gets called so instead of interrogating
+                        * both the OF node and the MDESC again, just use what
+                        * we discovered already.
+                        */
+                       if (proc_id < 0)
+                               proc_id = 0;
+                       *thread = proc_id;
+               }
+               return true;
+       }
+       return false;
+}
+
 static void *of_iterate_over_cpus(void *(*func)(struct device_node *, int, int), int arg)
 {
        struct device_node *dp;