aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/pseries/setup.c
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2007-02-08 02:33:55 -0500
committerPaul Mackerras <paulus@samba.org>2007-02-13 19:50:03 -0500
commitdce623e0827e8d0ad60ce7f385c3394bf1b0bae0 (patch)
tree5fc868fc1f365a40a949614dfc3982fc02f9219c /arch/powerpc/platforms/pseries/setup.c
parent8feaeca23ab8f520e7af2a862fd6ea8e7bfd8854 (diff)
[POWERPC] Cleanup pseries kexec code
Move all the pseries kexec code into one file, platforms/pseries/kexec.c Provide helpers for setting up ppc_md.kexec_cpu_down, so that we don't have to have #ifdef CONFIG_KEXEC in setup.c Move the initialisation of the ppc_md kexec callbacks into an init routine. This is well and truly early enough to cause no change in behaviour, we can't kexec until userspace has given us a kernel to kexec into. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/pseries/setup.c')
-rw-r--r--arch/powerpc/platforms/pseries/setup.c50
1 files changed, 2 insertions, 48 deletions
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 769815680be1..435a04596526 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -55,7 +55,6 @@
55#include <asm/dma.h> 55#include <asm/dma.h>
56#include <asm/machdep.h> 56#include <asm/machdep.h>
57#include <asm/irq.h> 57#include <asm/irq.h>
58#include <asm/kexec.h>
59#include <asm/time.h> 58#include <asm/time.h>
60#include <asm/nvram.h> 59#include <asm/nvram.h>
61#include "xics.h" 60#include "xics.h"
@@ -219,42 +218,6 @@ static void pseries_lpar_enable_pmcs(void)
219 get_lppaca()->pmcregs_in_use = 1; 218 get_lppaca()->pmcregs_in_use = 1;
220} 219}
221 220
222#ifdef CONFIG_KEXEC
223static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
224{
225 /* Don't risk a hypervisor call if we're crashing */
226 if (firmware_has_feature(FW_FEATURE_SPLPAR) && !crash_shutdown) {
227 unsigned long addr;
228
229 addr = __pa(get_slb_shadow());
230 if (unregister_slb_shadow(hard_smp_processor_id(), addr))
231 printk("SLB shadow buffer deregistration of "
232 "cpu %u (hw_cpu_id %d) failed\n",
233 smp_processor_id(),
234 hard_smp_processor_id());
235
236 addr = __pa(get_lppaca());
237 if (unregister_vpa(hard_smp_processor_id(), addr)) {
238 printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
239 "failed\n", smp_processor_id(),
240 hard_smp_processor_id());
241 }
242 }
243}
244
245static void pseries_kexec_cpu_down_mpic(int crash_shutdown, int secondary)
246{
247 pseries_kexec_cpu_down(crash_shutdown, secondary);
248 mpic_teardown_this_cpu(secondary);
249}
250
251static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
252{
253 pseries_kexec_cpu_down(crash_shutdown, secondary);
254 xics_teardown_cpu(secondary);
255}
256#endif /* CONFIG_KEXEC */
257
258static void __init pseries_discover_pic(void) 221static void __init pseries_discover_pic(void)
259{ 222{
260 struct device_node *np; 223 struct device_node *np;
@@ -267,16 +230,12 @@ static void __init pseries_discover_pic(void)
267 pSeries_mpic_node = of_node_get(np); 230 pSeries_mpic_node = of_node_get(np);
268 ppc_md.init_IRQ = pseries_mpic_init_IRQ; 231 ppc_md.init_IRQ = pseries_mpic_init_IRQ;
269 ppc_md.get_irq = mpic_get_irq; 232 ppc_md.get_irq = mpic_get_irq;
270#ifdef CONFIG_KEXEC 233 setup_kexec_cpu_down_mpic();
271 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
272#endif
273 smp_init_pseries_mpic(); 234 smp_init_pseries_mpic();
274 return; 235 return;
275 } else if (strstr(typep, "ppc-xicp")) { 236 } else if (strstr(typep, "ppc-xicp")) {
276 ppc_md.init_IRQ = xics_init_IRQ; 237 ppc_md.init_IRQ = xics_init_IRQ;
277#ifdef CONFIG_KEXEC 238 setup_kexec_cpu_down_xics();
278 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
279#endif
280 smp_init_pseries_xics(); 239 smp_init_pseries_xics();
281 return; 240 return;
282 } 241 }
@@ -548,9 +507,4 @@ define_machine(pseries) {
548 .check_legacy_ioport = pSeries_check_legacy_ioport, 507 .check_legacy_ioport = pSeries_check_legacy_ioport,
549 .system_reset_exception = pSeries_system_reset_exception, 508 .system_reset_exception = pSeries_system_reset_exception,
550 .machine_check_exception = pSeries_machine_check_exception, 509 .machine_check_exception = pSeries_machine_check_exception,
551#ifdef CONFIG_KEXEC
552 .machine_kexec = default_machine_kexec,
553 .machine_kexec_prepare = default_machine_kexec_prepare,
554 .machine_crash_shutdown = default_machine_crash_shutdown,
555#endif
556}; 510};