6e21ebdfcef753176a0c3c6f980d66c754f1b242
[powerpc.git] / arch / powerpc / platforms / pseries / hotplug-cpu.c
1 /*
2  * pseries CPU Hotplug infrastructure.
3  *
4  * Split out from arch/powerpc/kernel/rtas.c
5  *
6  * Peter Bergner, IBM   March 2001.
7  * Copyright (C) 2001 IBM.
8  *
9  * Copyright (C) 2006 Michael Ellerman, IBM Corporation
10  *
11  *      This program is free software; you can redistribute it and/or
12  *      modify it under the terms of the GNU General Public License
13  *      as published by the Free Software Foundation; either version
14  *      2 of the License, or (at your option) any later version.
15  */
16
17 #include <linux/kernel.h>
18 #include <linux/delay.h>
19 #include <linux/cpu.h>
20 #include <asm/system.h>
21 #include <asm/prom.h>
22 #include <asm/rtas.h>
23 #include <asm/firmware.h>
24 #include <asm/machdep.h>
25 #include <asm/vdso_datapage.h>
26 #include <asm/pSeries_reconfig.h>
27 #include "xics.h"
28
29 /* This version can't take the spinlock, because it never returns */
30 static struct rtas_args rtas_stop_self_args = {
31         .token = RTAS_UNKNOWN_SERVICE,
32         .nargs = 0,
33         .nret = 1,
34         .rets = &rtas_stop_self_args.args[0],
35 };
36
37 void rtas_stop_self(void)
38 {
39         struct rtas_args *args = &rtas_stop_self_args;
40
41         local_irq_disable();
42
43         BUG_ON(args->token == RTAS_UNKNOWN_SERVICE);
44
45         printk("cpu %u (hwid %u) Ready to die...\n",
46                smp_processor_id(), hard_smp_processor_id());
47         enter_rtas(__pa(args));
48
49         panic("Alas, I survived.\n");
50 }
51
52 static int __init pseries_cpu_hotplug_init(void)
53 {
54         rtas_stop_self_args.token = rtas_token("stop-self");
55
56         return 0;
57 }
58 arch_initcall(pseries_cpu_hotplug_init);