Currently the Arm arm-powerctl.h APIs allow: * arm_set_cpu_on(), which powers on a CPU and sets its initial PC and other startup state * arm_reset_cpu(), which resets a CPU which is already on (and fails if the CPU is powered off) but there is no way to say "power on a CPU as if it had just come out of reset and don't do anything else to it". Add a new function arm_set_cpu_on_and_reset(), which does this. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190219125808.25174-5-peter.maydell@linaro.org
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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
 |