diff options
author | davidcunado-arm <david.cunado@arm.com> | 2017-05-11 16:04:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-11 16:04:52 +0100 |
commit | d6104f5ab4e68f92cf97f6a3e55395c71ed137ac (patch) | |
tree | 4c9488add4622ce77fc328e34efe6f4bb7289873 /include | |
parent | 78b7134927422425bcad3413cf78783e3eaf633c (diff) | |
parent | b10d44995eb652675863c2cc6a7726683613da0d (diff) |
Merge pull request #927 from jeenu-arm/state-switch
Execution state switch
Diffstat (limited to 'include')
-rw-r--r-- | include/lib/aarch64/arch.h | 7 | ||||
-rw-r--r-- | include/lib/aarch64/arch_helpers.h | 8 | ||||
-rw-r--r-- | include/lib/el3_runtime/context_mgmt.h | 2 | ||||
-rw-r--r-- | include/lib/psci/psci_lib.h | 1 | ||||
-rw-r--r-- | include/plat/arm/common/arm_sip_svc.h | 7 | ||||
-rw-r--r-- | include/plat/arm/common/plat_arm.h | 11 |
6 files changed, 33 insertions, 3 deletions
diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h index c627263a..16adcf76 100644 --- a/include/lib/aarch64/arch.h +++ b/include/lib/aarch64/arch.h @@ -110,6 +110,10 @@ #define ID_AA64PFR0_EL3_SHIFT 12 #define ID_AA64PFR0_ELX_MASK 0xf +#define EL_IMPL_NONE 0 +#define EL_IMPL_A64ONLY 1 +#define EL_IMPL_A64_A32 2 + #define ID_AA64PFR0_GIC_SHIFT 24 #define ID_AA64PFR0_GIC_WIDTH 4 #define ID_AA64PFR0_GIC_MASK ((1 << ID_AA64PFR0_GIC_WIDTH) - 1) @@ -183,7 +187,8 @@ #define MDCR_DEF_VAL (MDCR_SDD_BIT | MDCR_SPD32(MDCR_SPD32_DISABLE)) /* HCR definitions */ -#define HCR_RW_BIT (1ull << 31) +#define HCR_RW_SHIFT 31 +#define HCR_RW_BIT (1ull << HCR_RW_SHIFT) #define HCR_AMO_BIT (1 << 5) #define HCR_IMO_BIT (1 << 4) #define HCR_FMO_BIT (1 << 3) diff --git a/include/lib/aarch64/arch_helpers.h b/include/lib/aarch64/arch_helpers.h index 56d248c2..32290e26 100644 --- a/include/lib/aarch64/arch_helpers.h +++ b/include/lib/aarch64/arch_helpers.h @@ -328,6 +328,14 @@ DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir1_el1, ICC_EOIR1_EL1) #define IS_IN_EL1() IS_IN_EL(1) #define IS_IN_EL3() IS_IN_EL(3) +/* + * Check if an EL is implemented from AA64PFR0 register fields. 'el' argument + * must be one of 1, 2 or 3. + */ +#define EL_IMPLEMENTED(el) \ + ((read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL##el##_SHIFT) \ + & ID_AA64PFR0_ELX_MASK) + /* Previously defined accesor functions with incomplete register names */ #define read_current_el() read_CurrentEl() diff --git a/include/lib/el3_runtime/context_mgmt.h b/include/lib/el3_runtime/context_mgmt.h index c1f04b97..94798691 100644 --- a/include/lib/el3_runtime/context_mgmt.h +++ b/include/lib/el3_runtime/context_mgmt.h @@ -9,6 +9,8 @@ #ifndef AARCH32 #include <arch.h> +#include <assert.h> +#include <stdint.h> #endif /******************************************************************************* diff --git a/include/lib/psci/psci_lib.h b/include/lib/psci/psci_lib.h index 1e25f2ef..4697f17c 100644 --- a/include/lib/psci/psci_lib.h +++ b/include/lib/psci/psci_lib.h @@ -82,6 +82,7 @@ u_register_t psci_smc_handler(uint32_t smc_fid, void *handle, u_register_t flags); int psci_setup(const psci_lib_args_t *lib_args); +int psci_secondaries_brought_up(void); void psci_warmboot_entrypoint(void); void psci_register_spd_pm_hook(const spd_pm_ops_t *pm); void psci_prepare_next_non_secure_ctx( diff --git a/include/plat/arm/common/arm_sip_svc.h b/include/plat/arm/common/arm_sip_svc.h index bbfd4daf..68375afa 100644 --- a/include/plat/arm/common/arm_sip_svc.h +++ b/include/plat/arm/common/arm_sip_svc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -14,8 +14,11 @@ /* 0x8200ff02 is reserved */ #define ARM_SIP_SVC_VERSION 0x8200ff03 +/* Function ID for requesting state switch of lower EL */ +#define ARM_SIP_SVC_EXE_STATE_SWITCH 0x82000020 + /* ARM SiP Service Calls version numbers */ #define ARM_SIP_SVC_VERSION_MAJOR 0x0 -#define ARM_SIP_SVC_VERSION_MINOR 0x1 +#define ARM_SIP_SVC_VERSION_MINOR 0x2 #endif /* __ARM_SIP_SVC_H__ */ diff --git a/include/plat/arm/common/plat_arm.h b/include/plat/arm/common/plat_arm.h index 9aa7a301..79671731 100644 --- a/include/plat/arm/common/plat_arm.h +++ b/include/plat/arm/common/plat_arm.h @@ -100,6 +100,9 @@ void arm_setup_page_tables(uintptr_t total_base, #endif /* __ARM_RECOM_STATE_ID_ENC__ */ +/* ARM State switch error codes */ +#define STATE_SW_E_PARAM (-2) +#define STATE_SW_E_DENIED (-3) /* IO storage utility functions */ void arm_io_setup(void); @@ -206,4 +209,12 @@ const mmap_region_t *plat_arm_get_mmap(void); /* Allow platform to override psci_pm_ops during runtime */ const plat_psci_ops_t *plat_arm_psci_override_pm_ops(plat_psci_ops_t *ops); +/* Execution state switch in ARM platforms */ +int arm_execution_state_switch(unsigned int smc_fid, + uint32_t pc_hi, + uint32_t pc_lo, + uint32_t cookie_hi, + uint32_t cookie_lo, + void *handle); + #endif /* __PLAT_ARM_H__ */ |