Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/powerpc/platforms/pseries/kexec.c
10818 views
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
21
#include "pseries.h"
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) {
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
46
static 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
52
void __init setup_kexec_cpu_down_mpic(void)
53
{
54
ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
55
}
56
57
static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
58
{
59
pseries_kexec_cpu_down(crash_shutdown, secondary);
60
xics_kexec_teardown_cpu(secondary);
61
}
62
63
void __init setup_kexec_cpu_down_xics(void)
64
{
65
ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
66
}
67
68