vserver 1.9.3
[linux-2.6.git] / arch / ppc64 / kernel / sysfs.c
index 41b3493..cfc3c0b 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/percpu.h>
 #include <linux/init.h>
 #include <linux/sched.h>
+#include <linux/module.h>
 #include <asm/current.h>
 #include <asm/processor.h>
 #include <asm/cputable.h>
@@ -96,6 +97,14 @@ __setup("smt-snooze-delay=", setup_smt_snooze_delay);
 
 /* PMC stuff */
 
+#ifdef CONFIG_PPC_ISERIES
+void ppc64_enable_pmcs(void)
+{
+       /* XXX Implement for iseries */
+}
+#endif
+
+#ifdef CONFIG_PPC_MULTIPLATFORM
 /*
  * Enabling PMCs will slow partition context switch times so we only do
  * it the first time we write to the PMCs.
@@ -103,18 +112,14 @@ __setup("smt-snooze-delay=", setup_smt_snooze_delay);
 
 static DEFINE_PER_CPU(char, pmcs_enabled);
 
-#ifdef CONFIG_PPC_ISERIES
-void ppc64_enable_pmcs(void)
-{
-       /* XXX Implement for iseries */
-}
-#else
 void ppc64_enable_pmcs(void)
 {
        unsigned long hid0;
+#ifdef CONFIG_PPC_PSERIES
        unsigned long set, reset;
        int ret;
        unsigned int ctrl;
+#endif /* CONFIG_PPC_PSERIES */
 
        /* Only need to enable them once */
        if (__get_cpu_var(pmcs_enabled))
@@ -123,37 +128,42 @@ void ppc64_enable_pmcs(void)
        __get_cpu_var(pmcs_enabled) = 1;
 
        switch (systemcfg->platform) {
-               case PLATFORM_PSERIES:
-                       hid0 = mfspr(HID0);
-                       hid0 |= 1UL << (63 - 20);
-
-                       /* POWER4 requires the following sequence */
-                       asm volatile(
-                               "sync\n"
-                               "mtspr  %1, %0\n"
-                               "mfspr  %0, %1\n"
-                               "mfspr  %0, %1\n"
-                               "mfspr  %0, %1\n"
-                               "mfspr  %0, %1\n"
-                               "mfspr  %0, %1\n"
-                               "mfspr  %0, %1\n"
-                               "isync" : "=&r" (hid0) : "i" (HID0), "0" (hid0):
-                               "memory");
-                       break;
-
-               case PLATFORM_PSERIES_LPAR:
-                       set = 1UL << 63;
-                       reset = 0;
-                       ret = plpar_hcall_norets(H_PERFMON, set, reset);
-                       if (ret)
-                               printk(KERN_ERR "H_PERFMON call returned %d",
-                                      ret);
-                       break;
-
-               default:
-                       break;
+       case PLATFORM_PSERIES:
+       case PLATFORM_POWERMAC:
+               hid0 = mfspr(HID0);
+               hid0 |= 1UL << (63 - 20);
+
+               /* POWER4 requires the following sequence */
+               asm volatile(
+                            "sync\n"
+                            "mtspr     %1, %0\n"
+                            "mfspr     %0, %1\n"
+                            "mfspr     %0, %1\n"
+                            "mfspr     %0, %1\n"
+                            "mfspr     %0, %1\n"
+                            "mfspr     %0, %1\n"
+                            "mfspr     %0, %1\n"
+                            "isync" : "=&r" (hid0) : "i" (HID0), "0" (hid0):
+                            "memory");
+               break;
+
+#ifdef CONFIG_PPC_PSERIES
+       case PLATFORM_PSERIES_LPAR:
+               set = 1UL << 63;
+               reset = 0;
+               ret = plpar_hcall_norets(H_PERFMON, set, reset);
+               if (ret)
+                       printk(KERN_ERR "H_PERFMON call on cpu %u "
+                              "returned %d\n",
+                              smp_processor_id(), ret);
+               break;
+#endif /* CONFIG_PPC_PSERIES */
+
+       default:
+               break;
        }
 
+#ifdef CONFIG_PPC_PSERIES
        /* instruct hypervisor to maintain PMCs */
        if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
                char *ptr = (char *)&paca[smp_processor_id()].lppaca;
@@ -169,8 +179,11 @@ void ppc64_enable_pmcs(void)
                ctrl |= RUNLATCH;
                mtspr(CTRLT, ctrl);
        }
+#endif /* CONFIG_PPC_PSERIES */
 }
-#endif
+#endif /* CONFIG_PPC_MULTIPLATFORM */
+
+EXPORT_SYMBOL(ppc64_enable_pmcs);
 
 /* XXX convert to rusty's on_one_cpu */
 static unsigned long run_on_cpu(unsigned long cpu,