1// Copyright 2016 The Fuchsia Authors
2// Copyright (c) 2014 Travis Geiselbrecht
3//
4// Use of this source code is governed by a MIT-style
5// license that can be found in the LICENSE file or at
6// https://opensource.org/licenses/MIT
7
8#pragma once
9
10#include <sys/types.h>
11#include <kernel/cpu.h>
12#include <kernel/mp.h>
13#include <zircon/types.h>
14
15__BEGIN_CDECLS
16
17/* send inter processor interrupt, if supported */
18zx_status_t arch_mp_send_ipi(mp_ipi_target_t, cpu_mask_t mask, mp_ipi_t ipi);
19
20/* Reschedules tasks on the cpus specified by mask. Mask will not
21 * contain the local cpu_id. Will be called under the thread lock.
22 */
23zx_status_t arch_mp_reschedule(cpu_mask_t mask);
24/* Sets the idle state of the current cpu. Will be called under the
25 * thread lock. */
26void arch_prepare_current_cpu_idle_state(bool idle);
27
28/* Bring a CPU up and enter it into the scheduler */
29zx_status_t platform_mp_cpu_hotplug(cpu_num_t cpu_id);
30
31/* Prepare for CPU unplug.  The platform may want to shift
32 * around external interrupts at this time. */
33zx_status_t platform_mp_prep_cpu_unplug(cpu_num_t cpu_id);
34
35/* shutdown the specified CPU.  called after it is no longer
36 * being scheduled on.  */
37zx_status_t platform_mp_cpu_unplug(cpu_num_t cpu_id);
38
39/* Should be invoked by platform_mp_cpu_hotplug to ask the arch
40 * to bring a CPU up and enter it into the scheduler */
41zx_status_t arch_mp_cpu_hotplug(cpu_num_t cpu_id);
42
43/* Should be invoked by platform_mp_prep_cpu_unplug to ask the
44 * arch to do whatever it needs to do to stop the CPU */
45zx_status_t arch_mp_prep_cpu_unplug(cpu_num_t cpu_id);
46
47/* Should be invoked by platform_mp_cpu_unplug to ask the
48 * arch to do whatever it needs to do to stop the CPU */
49zx_status_t arch_mp_cpu_unplug(cpu_num_t cpu_id);
50
51void arch_mp_init_percpu(void);
52
53__END_CDECLS
54