Commit | Line | Data |
---|---|---|
dce623e0 ME |
1 | /* |
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 | ||
0b05ac6e BH |
10 | #include <linux/kernel.h> |
11 | #include <linux/interrupt.h> | |
12 | ||
dce623e0 ME |
13 | #include <asm/machdep.h> |
14 | #include <asm/page.h> | |
15 | #include <asm/firmware.h> | |
16 | #include <asm/kexec.h> | |
17 | #include <asm/mpic.h> | |
0b05ac6e | 18 | #include <asm/xics.h> |
f6407120 | 19 | #include <asm/smp.h> |
dce623e0 ME |
20 | |
21 | #include "pseries.h" | |
dce623e0 ME |
22 | #include "plpar_wrappers.h" |
23 | ||
24 | static 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) { | |
b1301797 | 28 | int ret; |
598c8231 AB |
29 | int cpu = smp_processor_id(); |
30 | int hwcpu = hard_smp_processor_id(); | |
b1301797 AB |
31 | |
32 | if (get_lppaca()->dtl_enable_mask) { | |
598c8231 | 33 | ret = unregister_dtl(hwcpu); |
b1301797 AB |
34 | if (ret) { |
35 | pr_err("WARNING: DTL deregistration for cpu " | |
36 | "%d (hw %d) failed with %d\n", | |
598c8231 | 37 | cpu, hwcpu, ret); |
b1301797 AB |
38 | } |
39 | } | |
dce623e0 | 40 | |
598c8231 | 41 | ret = unregister_slb_shadow(hwcpu); |
711ef84e AB |
42 | if (ret) { |
43 | pr_err("WARNING: SLB shadow buffer deregistration " | |
44 | "for cpu %d (hw %d) failed with %d\n", | |
598c8231 | 45 | cpu, hwcpu, ret); |
711ef84e | 46 | } |
dce623e0 | 47 | |
598c8231 | 48 | ret = unregister_vpa(hwcpu); |
711ef84e AB |
49 | if (ret) { |
50 | pr_err("WARNING: VPA deregistration for cpu %d " | |
598c8231 | 51 | "(hw %d) failed with %d\n", cpu, hwcpu, ret); |
dce623e0 ME |
52 | } |
53 | } | |
54 | } | |
55 | ||
56 | static void pseries_kexec_cpu_down_mpic(int crash_shutdown, int secondary) | |
57 | { | |
58 | pseries_kexec_cpu_down(crash_shutdown, secondary); | |
59 | mpic_teardown_this_cpu(secondary); | |
60 | } | |
61 | ||
62 | void __init setup_kexec_cpu_down_mpic(void) | |
63 | { | |
64 | ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic; | |
65 | } | |
66 | ||
67 | static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary) | |
68 | { | |
69 | pseries_kexec_cpu_down(crash_shutdown, secondary); | |
c3e8506c | 70 | xics_kexec_teardown_cpu(secondary); |
dce623e0 ME |
71 | } |
72 | ||
73 | void __init setup_kexec_cpu_down_xics(void) | |
74 | { | |
75 | ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics; | |
76 | } |