diff options
author | Soby Mathew <soby.mathew@arm.com> | 2016-09-13 14:19:08 +0100 |
---|---|---|
committer | Soby Mathew <soby.mathew@arm.com> | 2016-09-22 17:07:20 +0100 |
commit | f426fc0519103defb3dcf4a9d86d985d48204424 (patch) | |
tree | 91f4e21225b0da612cb8ebe5e1313fa8c342dcaa /include/lib | |
parent | 44abeaa632765bbcba672da3a8c1b4c87a8d2250 (diff) |
PSCI: Introduce PSCI Library argument structure
This patch introduces a `psci_lib_args_t` structure which must be
passed into `psci_setup()` which is then used to initialize the PSCI
library. The `psci_lib_args_t` is a versioned structure so as to enable
compatibility checks during library initialization. Both BL31 and SP_MIN
are modified to use the new structure.
SP_MIN is also modified to add version string and build message as part
of its cold boot log just like the other BLs in Trusted Firmware.
NOTE: Please be aware that this patch modifies the prototype of
`psci_setup()`, which breaks compatibility with EL3 Runtime Firmware
(excluding BL31 and SP_MIN) integrated with the PSCI Library.
Change-Id: Ic3761db0b790760a7ad664d8a437c72ea5edbcd6
Diffstat (limited to 'include/lib')
-rw-r--r-- | include/lib/psci/psci.h | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/include/lib/psci/psci.h b/include/lib/psci/psci.h index 02cbbf35..34de4c28 100644 --- a/include/lib/psci/psci.h +++ b/include/lib/psci/psci.h @@ -32,6 +32,7 @@ #define __PSCI_H__ #include <bakery_lock.h> +#include <bl_common.h> #include <platform_def.h> /* for PLAT_NUM_PWR_DOMAINS */ #if ENABLE_PLAT_COMPAT #include <psci_compat.h> @@ -356,10 +357,45 @@ void psci_arch_setup(void); */ void psci_entrypoint(void) __deprecated; -/******************************************************************************* - * Forward declarations - ******************************************************************************/ -struct entry_point_info; +/* + * Function prototype for the warmboot entrypoint function which will be + * programmed in the mailbox by the platform. + */ +typedef void (*mailbox_entrypoint_t)(void); + +/****************************************************************************** + * Structure to pass PSCI Library arguments. + *****************************************************************************/ +typedef struct psci_lib_args { + /* The version information of PSCI Library Interface */ + param_header_t h; + /* The warm boot entrypoint function */ + mailbox_entrypoint_t mailbox_ep; +} psci_lib_args_t; + +/* Helper macro to set the psci_lib_args_t structure at runtime */ +#define SET_PSCI_LIB_ARGS_V1(_p, _entry) do { \ + SET_PARAM_HEAD(_p, PARAM_PSCI_LIB_ARGS, VERSION_1, 0); \ + (_p)->mailbox_ep = (_entry); \ + } while (0) + +/* Helper macro to define the psci_lib_args_t statically */ +#define DEFINE_STATIC_PSCI_LIB_ARGS_V1(_name, _entry) \ + static const psci_lib_args_t (_name) = { \ + .h.type = (uint8_t)PARAM_PSCI_LIB_ARGS, \ + .h.version = (uint8_t)VERSION_1, \ + .h.size = (uint16_t)sizeof(_name), \ + .h.attr = 0, \ + .mailbox_ep = (_entry) \ + } + +/* Helper macro to verify the pointer to psci_lib_args_t structure */ +#define VERIFY_PSCI_LIB_ARGS_V1(_p) ((_p) \ + && ((_p)->h.type == PARAM_PSCI_LIB_ARGS) \ + && ((_p)->h.version == VERSION_1) \ + && ((_p)->h.size == sizeof(*(_p))) \ + && ((_p)->h.attr == 0) \ + && ((_p)->mailbox_ep)) /****************************************************************************** * PSCI Library Interfaces @@ -372,11 +408,11 @@ u_register_t psci_smc_handler(uint32_t smc_fid, void *cookie, void *handle, u_register_t flags); -int psci_setup(uintptr_t mailbox_ep); +int psci_setup(const psci_lib_args_t *lib_args); void psci_warmboot_entrypoint(void); void psci_register_spd_pm_hook(const spd_pm_ops_t *pm); void psci_prepare_next_non_secure_ctx( - struct entry_point_info *next_image_info); + entry_point_info_t *next_image_info); #endif /*__ASSEMBLY__*/ |