xref: /openbmc/linux/arch/x86/xen/smp_hvm.c (revision ad73fd595c2ab168fdd01a266cbe6e4df95f8db0)
1a52482d9SVitaly Kuznetsov #include <asm/smp.h>
2a52482d9SVitaly Kuznetsov 
384d582d2SBoris Ostrovsky #include <xen/events.h>
484d582d2SBoris Ostrovsky 
5a52482d9SVitaly Kuznetsov #include "xen-ops.h"
6a52482d9SVitaly Kuznetsov #include "smp.h"
7a52482d9SVitaly Kuznetsov 
8a52482d9SVitaly Kuznetsov 
9a52482d9SVitaly Kuznetsov static void __init xen_hvm_smp_prepare_boot_cpu(void)
10a52482d9SVitaly Kuznetsov {
11a52482d9SVitaly Kuznetsov 	BUG_ON(smp_processor_id() != 0);
12a52482d9SVitaly Kuznetsov 	native_smp_prepare_boot_cpu();
13a52482d9SVitaly Kuznetsov 
14a52482d9SVitaly Kuznetsov 	/*
15*ad73fd59SAnkur Arora 	 * Setup vcpu_info for boot CPU. Secondary CPUs get their vcpu_info
16*ad73fd59SAnkur Arora 	 * in xen_cpu_up_prepare_hvm().
17a52482d9SVitaly Kuznetsov 	 */
18a52482d9SVitaly Kuznetsov 	xen_vcpu_setup(0);
19a52482d9SVitaly Kuznetsov 
20a52482d9SVitaly Kuznetsov 	/*
21a52482d9SVitaly Kuznetsov 	 * The alternative logic (which patches the unlock/lock) runs before
22a52482d9SVitaly Kuznetsov 	 * the smp bootup up code is activated. Hence we need to set this up
23a52482d9SVitaly Kuznetsov 	 * the core kernel is being patched. Otherwise we will have only
24a52482d9SVitaly Kuznetsov 	 * modules patched but not core code.
25a52482d9SVitaly Kuznetsov 	 */
26a52482d9SVitaly Kuznetsov 	xen_init_spinlocks();
27a52482d9SVitaly Kuznetsov }
28a52482d9SVitaly Kuznetsov 
29a52482d9SVitaly Kuznetsov static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus)
30a52482d9SVitaly Kuznetsov {
31a52482d9SVitaly Kuznetsov 	native_smp_prepare_cpus(max_cpus);
32a52482d9SVitaly Kuznetsov 	WARN_ON(xen_smp_intr_init(0));
33a52482d9SVitaly Kuznetsov 
34a52482d9SVitaly Kuznetsov 	xen_init_lock_cpu(0);
35a52482d9SVitaly Kuznetsov }
36a52482d9SVitaly Kuznetsov 
37a52482d9SVitaly Kuznetsov #ifdef CONFIG_HOTPLUG_CPU
38a52482d9SVitaly Kuznetsov static void xen_hvm_cpu_die(unsigned int cpu)
39a52482d9SVitaly Kuznetsov {
40a52482d9SVitaly Kuznetsov 	if (common_cpu_die(cpu) == 0) {
41a52482d9SVitaly Kuznetsov 		xen_smp_intr_free(cpu);
42a52482d9SVitaly Kuznetsov 		xen_uninit_lock_cpu(cpu);
43a52482d9SVitaly Kuznetsov 		xen_teardown_timer(cpu);
44a52482d9SVitaly Kuznetsov 	}
45a52482d9SVitaly Kuznetsov }
46a52482d9SVitaly Kuznetsov #else
47a52482d9SVitaly Kuznetsov static void xen_hvm_cpu_die(unsigned int cpu)
48a52482d9SVitaly Kuznetsov {
49a52482d9SVitaly Kuznetsov 	BUG();
50a52482d9SVitaly Kuznetsov }
51a52482d9SVitaly Kuznetsov #endif
52a52482d9SVitaly Kuznetsov 
53a52482d9SVitaly Kuznetsov void __init xen_hvm_smp_init(void)
54a52482d9SVitaly Kuznetsov {
5584d582d2SBoris Ostrovsky 	if (!xen_have_vector_callback)
5684d582d2SBoris Ostrovsky 		return;
5784d582d2SBoris Ostrovsky 
58a52482d9SVitaly Kuznetsov 	smp_ops.smp_prepare_cpus = xen_hvm_smp_prepare_cpus;
59a52482d9SVitaly Kuznetsov 	smp_ops.smp_send_reschedule = xen_smp_send_reschedule;
60a52482d9SVitaly Kuznetsov 	smp_ops.cpu_die = xen_hvm_cpu_die;
61a52482d9SVitaly Kuznetsov 	smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi;
62a52482d9SVitaly Kuznetsov 	smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi;
63a52482d9SVitaly Kuznetsov 	smp_ops.smp_prepare_boot_cpu = xen_hvm_smp_prepare_boot_cpu;
64a52482d9SVitaly Kuznetsov }
65