1/*
2 * QEMU support -- ARM Power Control specific functions.
3 *
4 * Copyright (c) 2016 Jean-Christophe Dubois
5 *
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
8 *
9 */
10
11#ifndef QEMU_ARM_POWERCTL_H
12#define QEMU_ARM_POWERCTL_H
13
14#include "kvm-consts.h"
15
16#define QEMU_ARM_POWERCTL_RET_SUCCESS QEMU_PSCI_RET_SUCCESS
17#define QEMU_ARM_POWERCTL_INVALID_PARAM QEMU_PSCI_RET_INVALID_PARAMS
18#define QEMU_ARM_POWERCTL_ALREADY_ON QEMU_PSCI_RET_ALREADY_ON
19#define QEMU_ARM_POWERCTL_IS_OFF QEMU_PSCI_RET_DENIED
20#define QEMU_ARM_POWERCTL_ON_PENDING QEMU_PSCI_RET_ON_PENDING
21
22/*
23 * arm_get_cpu_by_id:
24 * @cpuid: the id of the CPU we want to retrieve the state
25 *
26 * Retrieve a CPUState object from its CPU ID provided in @cpuid.
27 *
28 * Returns: a pointer to the CPUState structure of the requested CPU.
29 */
30CPUState *arm_get_cpu_by_id(uint64_t cpuid);
31
32/*
33 * arm_set_cpu_on:
34 * @cpuid: the id of the CPU we want to start/wake up.
35 * @entry: the address the CPU shall start from.
36 * @context_id: the value to put in r0/x0.
37 * @target_el: The desired exception level.
38 * @target_aa64: 1 if the requested mode is AArch64. 0 otherwise.
39 *
40 * Start the cpu designated by @cpuid in @target_el exception level. The mode
41 * shall be AArch64 if @target_aa64 is set to 1. Otherwise the mode is
42 * AArch32. The CPU shall start at @entry with @context_id in r0/x0.
43 *
44 * Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
45 * QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
46 * QEMU_ARM_POWERCTL_ALREADY_ON if the CPU was already started.
47 * QEMU_ARM_POWERCTL_ON_PENDING if the CPU is still powering up
48 */
49int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
50 uint32_t target_el, bool target_aa64);
51
52/*
53 * arm_set_cpu_off:
54 * @cpuid: the id of the CPU we want to stop/shut down.
55 *
56 * Stop the cpu designated by @cpuid.
57 *
58 * Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
59 * QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
60 * QEMU_ARM_POWERCTL_IS_OFF if CPU is already off
61 */
62
63int arm_set_cpu_off(uint64_t cpuid);
64
65/*
66 * arm_reset_cpu:
67 * @cpuid: the id of the CPU we want to reset.
68 *
69 * Reset the cpu designated by @cpuid.
70 *
71 * Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
72 * QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
73 * QEMU_ARM_POWERCTL_IS_OFF if CPU is off
74 */
75int arm_reset_cpu(uint64_t cpuid);
76
77/*
78 * arm_set_cpu_on_and_reset:
79 * @cpuid: the id of the CPU we want to star
80 *
81 * Start the cpu designated by @cpuid and put it through its normal
82 * CPU reset process. The CPU will start in the way it is architected
83 * to start after a power-on reset.
84 *
85 * Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
86 * QEMU_ARM_POWERCTL_INVALID_PARAM if there is no CPU with that ID.
87 * QEMU_ARM_POWERCTL_ALREADY_ON if the CPU is already on.
88 * QEMU_ARM_POWERCTL_ON_PENDING if the CPU is already partway through
89 * powering on.
90 */
91int arm_set_cpu_on_and_reset(uint64_t cpuid);
92
93#endif
94