blob: 1118cb79f9e3f7af435bc73762b510cb37242934 [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;
Anton Blanchardb1301792011-07-25 01:46:32 +000029 int ret;
30
31 if (get_lppaca()->dtl_enable_mask) {
32 ret = unregister_dtl(hard_smp_processor_id());
33 if (ret) {
34 pr_err("WARNING: DTL deregistration for cpu "
35 "%d (hw %d) failed with %d\n",
36 smp_processor_id(),
37 hard_smp_processor_id(), ret);
38 }
39 }
Michael Ellermandce623e2007-02-08 18:33:55 +110040
41 addr = __pa(get_slb_shadow());
42 if (unregister_slb_shadow(hard_smp_processor_id(), addr))
43 printk("SLB shadow buffer deregistration of "
44 "cpu %u (hw_cpu_id %d) failed\n",
45 smp_processor_id(),
46 hard_smp_processor_id());
47
48 addr = __pa(get_lppaca());
49 if (unregister_vpa(hard_smp_processor_id(), addr)) {
50 printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
51 "failed\n", smp_processor_id(),
52 hard_smp_processor_id());
53 }
54 }
55}
56
57static void pseries_kexec_cpu_down_mpic(int crash_shutdown, int secondary)
58{
59 pseries_kexec_cpu_down(crash_shutdown, secondary);
60 mpic_teardown_this_cpu(secondary);
61}
62
63void __init setup_kexec_cpu_down_mpic(void)
64{
65 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
66}
67
68static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
69{
70 pseries_kexec_cpu_down(crash_shutdown, secondary);
Nathan Fontenotc3e85062008-02-07 07:37:31 +110071 xics_kexec_teardown_cpu(secondary);
Michael Ellermandce623e2007-02-08 18:33:55 +110072}
73
74void __init setup_kexec_cpu_down_xics(void)
75{
76 ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
77}