linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / include / asm-sparc64 / smp.h
index 388249b..473edb2 100644 (file)
@@ -6,6 +6,7 @@
 #ifndef _SPARC64_SMP_H
 #define _SPARC64_SMP_H
 
+#include <linux/config.h>
 #include <linux/threads.h>
 #include <asm/asi.h>
 #include <asm/starfire.h>
 extern cpumask_t phys_cpu_present_map;
 #define cpu_possible_map phys_cpu_present_map
 
-extern cpumask_t cpu_sibling_map[NR_CPUS];
-
 /*
  *     General functions that each host system must provide.
  */
 
-extern int hard_smp_processor_id(void);
+static __inline__ int hard_smp_processor_id(void)
+{
+       if (tlb_type == cheetah || tlb_type == cheetah_plus) {
+               unsigned long cfg, ver;
+               __asm__ __volatile__("rdpr %%ver, %0" : "=r" (ver));
+               if ((ver >> 32) == 0x003e0016) {
+                       __asm__ __volatile__("ldxa [%%g0] %1, %0"
+                                            : "=r" (cfg)
+                                            : "i" (ASI_JBUS_CONFIG));
+                       return ((cfg >> 17) & 0x1f);
+               } else {
+                       __asm__ __volatile__("ldxa [%%g0] %1, %0"
+                                            : "=r" (cfg)
+                                            : "i" (ASI_SAFARI_CONFIG));
+                       return ((cfg >> 17) & 0x3ff);
+               }
+       } else if (this_is_starfire != 0) {
+               return starfire_hard_smp_processor_id();
+       } else {
+               unsigned long upaconfig;
+               __asm__ __volatile__("ldxa      [%%g0] %1, %0"
+                                    : "=r" (upaconfig)
+                                    : "i" (ASI_UPA_CONFIG));
+               return ((upaconfig >> 17) & 0x1f);
+       }
+}
+
 #define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern void smp_setup_cpu_possible_map(void);