aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/pseries/xics.c
diff options
context:
space:
mode:
authorNathan Fontenot <nfont@austin.ibm.com>2008-02-06 15:37:31 -0500
committerPaul Mackerras <paulus@samba.org>2008-02-06 19:40:19 -0500
commitc3e8506c54f7263e71289e9e66533236d09f2fb7 (patch)
treeb2f067efe5e93a8acd35e876cf906697e4d0b7c6 /arch/powerpc/platforms/pseries/xics.c
parenta52572ddcd3d16cc5ccc9679bcbb7256d0ddad84 (diff)
[POWERPC] Split xics_teardown_cpu()
This splits off the kexec path bits of the xics_teardown_cpu() routine into its own xics_kexec_teardown_cpu() routine. With the previous combined routine the CPPR for a cpu that is being removed may have its CPPR reset in the plpar_eoi() call (which explicitly sets the CPPR to a non-zero value). Splitting of the kexec bits of the code prevents this from happening in the cpu remove path. Once again, this does not cause the cpu remove from the kernel to fail, but it does cause cpu dlpar operations to not be able to return the cpu to the hypervisor. Signed-off-by: Nathan Fontenot <nfont@austin.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/pseries/xics.c')
-rw-r--r--arch/powerpc/platforms/pseries/xics.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c
index 00e9d296118e..485cb399b837 100644
--- a/arch/powerpc/platforms/pseries/xics.c
+++ b/arch/powerpc/platforms/pseries/xics.c
@@ -775,11 +775,9 @@ void xics_request_IPIs(void)
775} 775}
776#endif /* CONFIG_SMP */ 776#endif /* CONFIG_SMP */
777 777
778void xics_teardown_cpu(int secondary) 778void xics_teardown_cpu()
779{ 779{
780 int cpu = smp_processor_id(); 780 int cpu = smp_processor_id();
781 unsigned int ipi;
782 struct irq_desc *desc;
783 781
784 xics_set_cpu_priority(0); 782 xics_set_cpu_priority(0);
785 783
@@ -790,9 +788,17 @@ void xics_teardown_cpu(int secondary)
790 lpar_qirr_info(cpu, 0xff); 788 lpar_qirr_info(cpu, 0xff);
791 else 789 else
792 direct_qirr_info(cpu, 0xff); 790 direct_qirr_info(cpu, 0xff);
791}
792
793void xics_kexec_teardown_cpu(int secondary)
794{
795 unsigned int ipi;
796 struct irq_desc *desc;
797
798 xics_teardown_cpu();
793 799
794 /* 800 /*
795 * we need to EOI the IPI if we got here from kexec down IPI 801 * we need to EOI the IPI
796 * 802 *
797 * probably need to check all the other interrupts too 803 * probably need to check all the other interrupts too
798 * should we be flagging idle loop instead? 804 * should we be flagging idle loop instead?