blob: 37c8a04f0a9c14fcc58daade7bcad65402f6139a [file] [log] [blame]
/*
* QEMU support -- ARM Power Control specific functions.
*
* Copyright (c) 2016 Jean-Christophe Dubois
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*
*/
#ifndef QEMU_ARM_POWERCTL_H
#define QEMU_ARM_POWERCTL_H
#include "kvm-consts.h"
#define QEMU_ARM_POWERCTL_RET_SUCCESS QEMU_PSCI_RET_SUCCESS
#define QEMU_ARM_POWERCTL_INVALID_PARAM QEMU_PSCI_RET_INVALID_PARAMS
#define QEMU_ARM_POWERCTL_ALREADY_ON QEMU_PSCI_RET_ALREADY_ON
#define QEMU_ARM_POWERCTL_IS_OFF QEMU_PSCI_RET_DENIED
#define QEMU_ARM_POWERCTL_ON_PENDING QEMU_PSCI_RET_ON_PENDING
/*
* arm_get_cpu_by_id:
* @cpuid: the id of the CPU we want to retrieve the state
*
* Retrieve a CPUState object from its CPU ID provided in @cpuid.
*
* Returns: a pointer to the CPUState structure of the requested CPU.
*/
CPUState *arm_get_cpu_by_id(uint64_t cpuid);
/*
* arm_set_cpu_on:
* @cpuid: the id of the CPU we want to start/wake up.
* @entry: the address the CPU shall start from.
* @context_id: the value to put in r0/x0.
* @target_el: The desired exception level.
* @target_aa64: 1 if the requested mode is AArch64. 0 otherwise.
*
* Start the cpu designated by @cpuid in @target_el exception level. The mode
* shall be AArch64 if @target_aa64 is set to 1. Otherwise the mode is
* AArch32. The CPU shall start at @entry with @context_id in r0/x0.
*
* Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
* QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
* QEMU_ARM_POWERCTL_ALREADY_ON if the CPU was already started.
* QEMU_ARM_POWERCTL_ON_PENDING if the CPU is still powering up
*/
int arm_set_cpu_on(uint64_t cpuid, uint64_t entry, uint64_t context_id,
uint32_t target_el, bool target_aa64);
/*
* arm_set_cpu_off:
* @cpuid: the id of the CPU we want to stop/shut down.
*
* Stop the cpu designated by @cpuid.
*
* Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
* QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
* QEMU_ARM_POWERCTL_IS_OFF if CPU is already off
*/
int arm_set_cpu_off(uint64_t cpuid);
/*
* arm_reset_cpu:
* @cpuid: the id of the CPU we want to reset.
*
* Reset the cpu designated by @cpuid.
*
* Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
* QEMU_ARM_POWERCTL_INVALID_PARAM if bad parameters are provided.
* QEMU_ARM_POWERCTL_IS_OFF if CPU is off
*/
int arm_reset_cpu(uint64_t cpuid);
/*
* arm_set_cpu_on_and_reset:
* @cpuid: the id of the CPU we want to star
*
* Start the cpu designated by @cpuid and put it through its normal
* CPU reset process. The CPU will start in the way it is architected
* to start after a power-on reset.
*
* Returns: QEMU_ARM_POWERCTL_RET_SUCCESS on success.
* QEMU_ARM_POWERCTL_INVALID_PARAM if there is no CPU with that ID.
* QEMU_ARM_POWERCTL_ALREADY_ON if the CPU is already on.
* QEMU_ARM_POWERCTL_ON_PENDING if the CPU is already partway through
* powering on.
*/
int arm_set_cpu_on_and_reset(uint64_t cpuid);
#endif