[POWERPC] Only enable cpu hotplug via RTAS if the required firmware support is found
authorMichael Ellerman <michael@ellerman.id.au>
Tue, 5 Dec 2006 06:52:38 +0000 (17:52 +1100)
committerPaul Mackerras <paulus@samba.org>
Fri, 8 Dec 2006 04:55:55 +0000 (15:55 +1100)
To support cpu hotplug on pseries we require two RTAS tokens.  The cpu
hotplug machinery should only be wired up if these tokens are found in
the device tree.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/pseries/hotplug-cpu.c

index 12864d75126d3d507e8380abd08c7daecab0028f..e78e8ac9555042d1ca34a2d24487cf226aceb56d 100644 (file)
@@ -64,6 +64,8 @@ static void pSeries_mach_cpu_die(void)
        for(;;);
 }
 
+static int qcss_tok;   /* query-cpu-stopped-state token */
+
 /* Get state of physical CPU.
  * Return codes:
  *     0       - The processor is in the RTAS stopped state
@@ -74,12 +76,8 @@ static void pSeries_mach_cpu_die(void)
  */
 static int query_cpu_stopped(unsigned int pcpu)
 {
-       int cpu_status;
-       int status, qcss_tok;
+       int cpu_status, status;
 
-       qcss_tok = rtas_token("query-cpu-stopped-state");
-       if (qcss_tok == RTAS_UNKNOWN_SERVICE)
-               return -1;
        status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu);
        if (status != 0) {
                printk(KERN_ERR
@@ -254,9 +252,16 @@ static struct notifier_block pSeries_smp_nb = {
 static int __init pseries_cpu_hotplug_init(void)
 {
        rtas_stop_self_args.token = rtas_token("stop-self");
+       qcss_tok = rtas_token("query-cpu-stopped-state");
 
-       ppc_md.cpu_die = pSeries_mach_cpu_die;
+       if (rtas_stop_self_args.token == RTAS_UNKNOWN_SERVICE ||
+                       qcss_tok == RTAS_UNKNOWN_SERVICE) {
+               printk(KERN_INFO "CPU Hotplug not supported by firmware "
+                               "- disabling.\n");
+               return 0;
+       }
 
+       ppc_md.cpu_die = pSeries_mach_cpu_die;
        smp_ops->cpu_disable = pSeries_cpu_disable;
        smp_ops->cpu_die = pSeries_cpu_die;