drivers: PSCI: Add driver and subsystem
Firmware implementing the PSCI functions described in ARM document number ARM DEN 0022A ("Power State Coordination Interface System Software on ARM processors") can be used by Zephyr to initiate various CPU-centric power operations. It is needed for virtualization, it is used to coordinate OSes and hypervisors and it provides the functions used for SMP bring-up such as CPU_ON and CPU_OFF. A new PSCI driver is introduced to setup a proper subsystem used to communicate with the PSCI firmware, implementing the basic operations: get_version, cpu_on, cpu_off and affinity_info. The current implementation only supports PSCI 0.2 and PSCI 1.0 The PSCI conduit (SMC or HVC) is setup reading the corresponding property in the DTS node. Signed-off-by: Carlo Caione <ccaione@baylibre.com>
This commit is contained in:
parent
602b71ca5c
commit
57f7e31017
16 changed files with 596 additions and 0 deletions
53
include/arch/arm/arm-smccc.h
Normal file
53
include/arch/arm/arm-smccc.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* Copyright 2020 Carlo Caione <ccaione@baylibre.com>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef ZEPHYR_INCLUDE_ARCH_ARM_ARM_SMCCC_H_
|
||||
#define ZEPHYR_INCLUDE_ARCH_ARM_ARM_SMCCC_H_
|
||||
|
||||
/*
|
||||
* Result from SMC/HVC call
|
||||
* @a0-a3 result values from registers 0 to 3
|
||||
*/
|
||||
struct arm_smccc_res {
|
||||
unsigned long a0;
|
||||
unsigned long a1;
|
||||
unsigned long a2;
|
||||
unsigned long a3;
|
||||
};
|
||||
|
||||
enum arm_smccc_conduit {
|
||||
SMCCC_CONDUIT_NONE,
|
||||
SMCCC_CONDUIT_SMC,
|
||||
SMCCC_CONDUIT_HVC,
|
||||
};
|
||||
|
||||
/*
|
||||
* @brief Make HVC calls
|
||||
*
|
||||
* @param a0 function identifier
|
||||
* @param a1-a7 parameters registers
|
||||
* @param res results
|
||||
*/
|
||||
void arm_smccc_hvc(unsigned long a0, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3,
|
||||
unsigned long a4, unsigned long a5,
|
||||
unsigned long a6, unsigned long a7,
|
||||
struct arm_smccc_res *res);
|
||||
|
||||
/*
|
||||
* @brief Make SMC calls
|
||||
*
|
||||
* @param a0 function identifier
|
||||
* @param a1-a7 parameters registers
|
||||
* @param res results
|
||||
*/
|
||||
void arm_smccc_smc(unsigned long a0, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3,
|
||||
unsigned long a4, unsigned long a5,
|
||||
unsigned long a6, unsigned long a7,
|
||||
struct arm_smccc_res *res);
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_ARCH_ARM_ARM_SMCCC_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue