blob: 54cf3a4aa16b31d58214655c1b69d209a7a335ac [file] [log] [blame]
Michael Ellermandce623e2007-02-08 18:33:55 +11001/*
2 * Copyright 2006 Michael Ellerman, IBM Corporation
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 */
9
Benjamin Herrenschmidt0b05ac62011-04-04 13:46:58 +100010#include <linux/kernel.h>
11#include <linux/interrupt.h>
12
Michael Ellermandce623e2007-02-08 18:33:55 +110013#include <asm/machdep.h>
14#include <asm/page.h>
15#include <asm/firmware.h>
16#include <asm/kexec.h>
17#include <asm/mpic.h>
Benjamin Herrenschmidt0b05ac62011-04-04 13:46:58 +100018#include <asm/xics.h>
Paul Mackerrasf6407122007-05-10 22:17:18 +100019#include <asm/smp.h>
Michael Ellermandce623e2007-02-08 18:33:55 +110020
21#include "pseries.h"
Michael Ellermandce623e2007-02-08 18:33:55 +110022#include "plpar_wrappers.h"
23
24static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
25{
26 /* Don't risk a hypervisor call if we're crashing */
27 if (firmware_has_feature(FW_FEATURE_SPLPAR) && !crash_shutdown) {
28 unsigned long addr;
29
30 addr = __pa(get_slb_shadow());
31 if (unregister_slb_shadow(hard_smp_processor_id(), addr))
32 printk("SLB shadow buffer deregistration of "
33 "cpu %u (hw_cpu_id %d) failed\n",
34 smp_processor_id(),
35 hard_smp_processor_id());
36
37 addr = __pa(get_lppaca());
38 if (unregister_vpa(hard_smp_processor_id(), addr)) {
39 printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
40 "failed\n", smp_processor_id(),
41 hard_smp_processor_id());
42 }
43 }
44}
45
46static void pseries_kexec_cpu_down_mpic(int crash_shutdown, int secondary)
47{
48 pseries_kexec_cpu_down(crash_shutdown, secondary);
49 mpic_teardown_this_cpu(secondary);
50}
51
52void __init setup_kexec_cpu_down_mpic(void)
53{
54 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
55}
56
57static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
58{
59 pseries_kexec_cpu_down(crash_shutdown, secondary);
Nathan Fontenotc3e85062008-02-07 07:37:31 +110060 xics_kexec_teardown_cpu(secondary);
Michael Ellermandce623e2007-02-08 18:33:55 +110061}
62
63void __init setup_kexec_cpu_down_xics(void)
64{
65 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
66}