diff options
author | Michael Neuling <mikey@neuling.org> | 2010-04-28 09:39:41 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-05-06 02:49:25 -0400 |
commit | f8b67691828321f5c85bb853283aa101ae673130 (patch) | |
tree | 0938bf959cb7d830547d76bc8a40c33dd03c1d2a | |
parent | a32fe93daf9c6b6ffbab1d9b9e2a8e4c335bda5c (diff) |
powerpc/pseries: Make query_cpu_stopped callable outside hotplug cpu
This moves query_cpu_stopped() out of the hotplug cpu code and into
smp.c so it can called in other places and renames it to
smp_query_cpu_stopped().
It also cleans up the return values by adding some #defines
Cc: <stable@kernel.org>
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/platforms/pseries/hotplug-cpu.c | 30 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/plpar_wrappers.h | 8 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/smp.c | 22 |
3 files changed, 34 insertions, 26 deletions
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index a8e1d5d17a28..b0760d7701b4 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | |||
@@ -154,30 +154,6 @@ static void pseries_mach_cpu_die(void) | |||
154 | for(;;); | 154 | for(;;); |
155 | } | 155 | } |
156 | 156 | ||
157 | static int qcss_tok; /* query-cpu-stopped-state token */ | ||
158 | |||
159 | /* Get state of physical CPU. | ||
160 | * Return codes: | ||
161 | * 0 - The processor is in the RTAS stopped state | ||
162 | * 1 - stop-self is in progress | ||
163 | * 2 - The processor is not in the RTAS stopped state | ||
164 | * -1 - Hardware Error | ||
165 | * -2 - Hardware Busy, Try again later. | ||
166 | */ | ||
167 | static int query_cpu_stopped(unsigned int pcpu) | ||
168 | { | ||
169 | int cpu_status, status; | ||
170 | |||
171 | status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu); | ||
172 | if (status != 0) { | ||
173 | printk(KERN_ERR | ||
174 | "RTAS query-cpu-stopped-state failed: %i\n", status); | ||
175 | return status; | ||
176 | } | ||
177 | |||
178 | return cpu_status; | ||
179 | } | ||
180 | |||
181 | static int pseries_cpu_disable(void) | 157 | static int pseries_cpu_disable(void) |
182 | { | 158 | { |
183 | int cpu = smp_processor_id(); | 159 | int cpu = smp_processor_id(); |
@@ -224,8 +200,9 @@ static void pseries_cpu_die(unsigned int cpu) | |||
224 | } else if (get_preferred_offline_state(cpu) == CPU_STATE_OFFLINE) { | 200 | } else if (get_preferred_offline_state(cpu) == CPU_STATE_OFFLINE) { |
225 | 201 | ||
226 | for (tries = 0; tries < 25; tries++) { | 202 | for (tries = 0; tries < 25; tries++) { |
227 | cpu_status = query_cpu_stopped(pcpu); | 203 | cpu_status = smp_query_cpu_stopped(pcpu); |
228 | if (cpu_status == 0 || cpu_status == -1) | 204 | if (cpu_status == QCSS_STOPPED || |
205 | cpu_status == QCSS_HARDWARE_ERROR) | ||
229 | break; | 206 | break; |
230 | cpu_relax(); | 207 | cpu_relax(); |
231 | } | 208 | } |
@@ -388,6 +365,7 @@ static int __init pseries_cpu_hotplug_init(void) | |||
388 | struct device_node *np; | 365 | struct device_node *np; |
389 | const char *typep; | 366 | const char *typep; |
390 | int cpu; | 367 | int cpu; |
368 | int qcss_tok; | ||
391 | 369 | ||
392 | for_each_node_by_name(np, "interrupt-controller") { | 370 | for_each_node_by_name(np, "interrupt-controller") { |
393 | typep = of_get_property(np, "compatible", NULL); | 371 | typep = of_get_property(np, "compatible", NULL); |
diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/platforms/pseries/plpar_wrappers.h index a05f8d427856..6c4fd2c3f385 100644 --- a/arch/powerpc/platforms/pseries/plpar_wrappers.h +++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h | |||
@@ -4,6 +4,14 @@ | |||
4 | #include <asm/hvcall.h> | 4 | #include <asm/hvcall.h> |
5 | #include <asm/page.h> | 5 | #include <asm/page.h> |
6 | 6 | ||
7 | /* Get state of physical CPU from query_cpu_stopped */ | ||
8 | int smp_query_cpu_stopped(unsigned int pcpu); | ||
9 | #define QCSS_STOPPED 0 | ||
10 | #define QCSS_STOPPING 1 | ||
11 | #define QCSS_NOT_STOPPED 2 | ||
12 | #define QCSS_HARDWARE_ERROR -1 | ||
13 | #define QCSS_HARDWARE_BUSY -2 | ||
14 | |||
7 | static inline long poll_pending(void) | 15 | static inline long poll_pending(void) |
8 | { | 16 | { |
9 | return plpar_hcall_norets(H_POLL_PENDING); | 17 | return plpar_hcall_norets(H_POLL_PENDING); |
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 4e7f89a84561..20b694280a66 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c | |||
@@ -57,6 +57,28 @@ | |||
57 | */ | 57 | */ |
58 | static cpumask_t of_spin_map; | 58 | static cpumask_t of_spin_map; |
59 | 59 | ||
60 | /* Query where a cpu is now. Return codes #defined in plpar_wrappers.h */ | ||
61 | int smp_query_cpu_stopped(unsigned int pcpu) | ||
62 | { | ||
63 | int cpu_status, status; | ||
64 | int qcss_tok = rtas_token("query-cpu-stopped-state"); | ||
65 | |||
66 | if (qcss_tok == RTAS_UNKNOWN_SERVICE) { | ||
67 | printk(KERN_INFO "Firmware doesn't support " | ||
68 | "query-cpu-stopped-state\n"); | ||
69 | return QCSS_HARDWARE_ERROR; | ||
70 | } | ||
71 | |||
72 | status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu); | ||
73 | if (status != 0) { | ||
74 | printk(KERN_ERR | ||
75 | "RTAS query-cpu-stopped-state failed: %i\n", status); | ||
76 | return status; | ||
77 | } | ||
78 | |||
79 | return cpu_status; | ||
80 | } | ||
81 | |||
60 | /** | 82 | /** |
61 | * smp_startup_cpu() - start the given cpu | 83 | * smp_startup_cpu() - start the given cpu |
62 | * | 84 | * |