blob: 13fa95b3aa8bb2bef958c9909cd7fb200cd3fdd6 [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>
Deepthi Dharwar212bebb2013-08-22 15:23:52 +053020#include <asm/plpar_wrappers.h>
Michael Ellermandce623e2007-02-08 18:33:55 +110021
22#include "pseries.h"
Michael Ellermandce623e2007-02-08 18:33:55 +110023
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) {
Anton Blanchardb1301792011-07-25 01:46:32 +000028 int ret;
Anton Blanchard598c8232011-07-25 01:46:34 +000029 int cpu = smp_processor_id();
30 int hwcpu = hard_smp_processor_id();
Anton Blanchardb1301792011-07-25 01:46:32 +000031
32 if (get_lppaca()->dtl_enable_mask) {
Anton Blanchard598c8232011-07-25 01:46:34 +000033 ret = unregister_dtl(hwcpu);
Anton Blanchardb1301792011-07-25 01:46:32 +000034 if (ret) {
35 pr_err("WARNING: DTL deregistration for cpu "
36 "%d (hw %d) failed with %d\n",
Anton Blanchard598c8232011-07-25 01:46:34 +000037 cpu, hwcpu, ret);
Anton Blanchardb1301792011-07-25 01:46:32 +000038 }
39 }
Michael Ellermandce623e2007-02-08 18:33:55 +110040
Anton Blanchard598c8232011-07-25 01:46:34 +000041 ret = unregister_slb_shadow(hwcpu);
Anton Blanchard711ef842011-07-25 01:46:33 +000042 if (ret) {
43 pr_err("WARNING: SLB shadow buffer deregistration "
44 "for cpu %d (hw %d) failed with %d\n",
Anton Blanchard598c8232011-07-25 01:46:34 +000045 cpu, hwcpu, ret);
Anton Blanchard711ef842011-07-25 01:46:33 +000046 }
Michael Ellermandce623e2007-02-08 18:33:55 +110047
Anton Blanchard598c8232011-07-25 01:46:34 +000048 ret = unregister_vpa(hwcpu);
Anton Blanchard711ef842011-07-25 01:46:33 +000049 if (ret) {
50 pr_err("WARNING: VPA deregistration for cpu %d "
Anton Blanchard598c8232011-07-25 01:46:34 +000051 "(hw %d) failed with %d\n", cpu, hwcpu, ret);
Michael Ellermandce623e2007-02-08 18:33:55 +110052 }
53 }
54}
55
56static 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
62void __init setup_kexec_cpu_down_mpic(void)
63{
64 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
65}
66
67static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
68{
69 pseries_kexec_cpu_down(crash_shutdown, secondary);
Nathan Fontenotc3e85062008-02-07 07:37:31 +110070 xics_kexec_teardown_cpu(secondary);
Michael Ellermandce623e2007-02-08 18:33:55 +110071}
72
73void __init setup_kexec_cpu_down_xics(void)
74{
75 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
76}