linux/arch/powerpc/platforms/pseries/kexec.c
<<
>>
Prefs
   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
  10#include <linux/kernel.h>
  11#include <linux/interrupt.h>
  12
  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>
  18#include <asm/xics.h>
  19#include <asm/smp.h>
  20#include <asm/plpar_wrappers.h>
  21
  22#include "pseries.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                int ret;
  29                int cpu = smp_processor_id();
  30                int hwcpu = hard_smp_processor_id();
  31
  32                if (get_lppaca()->dtl_enable_mask) {
  33                        ret = unregister_dtl(hwcpu);
  34                        if (ret) {
  35                                pr_err("WARNING: DTL deregistration for cpu "
  36                                       "%d (hw %d) failed with %d\n",
  37                                       cpu, hwcpu, ret);
  38                        }
  39                }
  40
  41                ret = unregister_slb_shadow(hwcpu);
  42                if (ret) {
  43                        pr_err("WARNING: SLB shadow buffer deregistration "
  44                               "for cpu %d (hw %d) failed with %d\n",
  45                               cpu, hwcpu, ret);
  46                }
  47
  48                ret = unregister_vpa(hwcpu);
  49                if (ret) {
  50                        pr_err("WARNING: VPA deregistration for cpu %d "
  51                               "(hw %d) failed with %d\n", cpu, hwcpu, ret);
  52                }
  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);
  70        xics_kexec_teardown_cpu(secondary);
  71}
  72
  73void __init setup_kexec_cpu_down_xics(void)
  74{
  75        ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
  76}
  77