xref: /openbmc/linux/arch/x86/xen/smp_hvm.c (revision b24413180f5600bcb3bb70fbed5cf186b60864bd)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2a52482d9SVitaly Kuznetsov #include <asm/smp.h>
3a52482d9SVitaly Kuznetsov 
484d582d2SBoris Ostrovsky #include <xen/events.h>
584d582d2SBoris Ostrovsky 
6a52482d9SVitaly Kuznetsov #include "xen-ops.h"
7a52482d9SVitaly Kuznetsov #include "smp.h"
8a52482d9SVitaly Kuznetsov 
9a52482d9SVitaly Kuznetsov 
10a52482d9SVitaly Kuznetsov static void __init xen_hvm_smp_prepare_boot_cpu(void)
11a52482d9SVitaly Kuznetsov {
12a52482d9SVitaly Kuznetsov 	BUG_ON(smp_processor_id() != 0);
13a52482d9SVitaly Kuznetsov 	native_smp_prepare_boot_cpu();
14a52482d9SVitaly Kuznetsov 
15a52482d9SVitaly Kuznetsov 	/*
16ad73fd59SAnkur Arora 	 * Setup vcpu_info for boot CPU. Secondary CPUs get their vcpu_info
17ad73fd59SAnkur Arora 	 * in xen_cpu_up_prepare_hvm().
18a52482d9SVitaly Kuznetsov 	 */
19a52482d9SVitaly Kuznetsov 	xen_vcpu_setup(0);
20a52482d9SVitaly Kuznetsov 
21a52482d9SVitaly Kuznetsov 	/*
22a52482d9SVitaly Kuznetsov 	 * The alternative logic (which patches the unlock/lock) runs before
23a52482d9SVitaly Kuznetsov 	 * the smp bootup up code is activated. Hence we need to set this up
24a52482d9SVitaly Kuznetsov 	 * the core kernel is being patched. Otherwise we will have only
25a52482d9SVitaly Kuznetsov 	 * modules patched but not core code.
26a52482d9SVitaly Kuznetsov 	 */
27a52482d9SVitaly Kuznetsov 	xen_init_spinlocks();
28a52482d9SVitaly Kuznetsov }
29a52482d9SVitaly Kuznetsov 
30a52482d9SVitaly Kuznetsov static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus)
31a52482d9SVitaly Kuznetsov {
320b64ffb8SAnkur Arora 	int cpu;
330b64ffb8SAnkur Arora 
34a52482d9SVitaly Kuznetsov 	native_smp_prepare_cpus(max_cpus);
35a52482d9SVitaly Kuznetsov 	WARN_ON(xen_smp_intr_init(0));
36a52482d9SVitaly Kuznetsov 
37a52482d9SVitaly Kuznetsov 	xen_init_lock_cpu(0);
380b64ffb8SAnkur Arora 
390b64ffb8SAnkur Arora 	for_each_possible_cpu(cpu) {
400b64ffb8SAnkur Arora 		if (cpu == 0)
410b64ffb8SAnkur Arora 			continue;
420b64ffb8SAnkur Arora 
430b64ffb8SAnkur Arora 		/* Set default vcpu_id to make sure that we don't use cpu-0's */
440b64ffb8SAnkur Arora 		per_cpu(xen_vcpu_id, cpu) = XEN_VCPU_ID_INVALID;
450b64ffb8SAnkur Arora 	}
46a52482d9SVitaly Kuznetsov }
47a52482d9SVitaly Kuznetsov 
48a52482d9SVitaly Kuznetsov #ifdef CONFIG_HOTPLUG_CPU
49a52482d9SVitaly Kuznetsov static void xen_hvm_cpu_die(unsigned int cpu)
50a52482d9SVitaly Kuznetsov {
51a52482d9SVitaly Kuznetsov 	if (common_cpu_die(cpu) == 0) {
52a52482d9SVitaly Kuznetsov 		xen_smp_intr_free(cpu);
53a52482d9SVitaly Kuznetsov 		xen_uninit_lock_cpu(cpu);
54a52482d9SVitaly Kuznetsov 		xen_teardown_timer(cpu);
55a52482d9SVitaly Kuznetsov 	}
56a52482d9SVitaly Kuznetsov }
57a52482d9SVitaly Kuznetsov #else
58a52482d9SVitaly Kuznetsov static void xen_hvm_cpu_die(unsigned int cpu)
59a52482d9SVitaly Kuznetsov {
60a52482d9SVitaly Kuznetsov 	BUG();
61a52482d9SVitaly Kuznetsov }
62a52482d9SVitaly Kuznetsov #endif
63a52482d9SVitaly Kuznetsov 
64a52482d9SVitaly Kuznetsov void __init xen_hvm_smp_init(void)
65a52482d9SVitaly Kuznetsov {
6684d582d2SBoris Ostrovsky 	if (!xen_have_vector_callback)
6784d582d2SBoris Ostrovsky 		return;
6884d582d2SBoris Ostrovsky 
69a52482d9SVitaly Kuznetsov 	smp_ops.smp_prepare_cpus = xen_hvm_smp_prepare_cpus;
70a52482d9SVitaly Kuznetsov 	smp_ops.smp_send_reschedule = xen_smp_send_reschedule;
71a52482d9SVitaly Kuznetsov 	smp_ops.cpu_die = xen_hvm_cpu_die;
72a52482d9SVitaly Kuznetsov 	smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi;
73a52482d9SVitaly Kuznetsov 	smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi;
74a52482d9SVitaly Kuznetsov 	smp_ops.smp_prepare_boot_cpu = xen_hvm_smp_prepare_boot_cpu;
75ae039001SAnkur Arora 	smp_ops.smp_cpus_done = xen_smp_cpus_done;
76a52482d9SVitaly Kuznetsov }
77