1890b5088SRaghu Krishnamurthy /* 2890b5088SRaghu Krishnamurthy * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved. 3890b5088SRaghu Krishnamurthy * SPDX-License-Identifier: BSD-3-Clause 4890b5088SRaghu Krishnamurthy */ 5890b5088SRaghu Krishnamurthy #ifndef EL3_SPMD_LOGICAL_SP_H 6890b5088SRaghu Krishnamurthy #define EL3_SPMD_LOGICAL_SP_H 7890b5088SRaghu Krishnamurthy 8890b5088SRaghu Krishnamurthy #include <common/bl_common.h> 9890b5088SRaghu Krishnamurthy #include <lib/cassert.h> 10890b5088SRaghu Krishnamurthy #include <services/ffa_svc.h> 11890b5088SRaghu Krishnamurthy 12890b5088SRaghu Krishnamurthy /******************************************************************************* 13890b5088SRaghu Krishnamurthy * Structure definition, typedefs & constants for the SPMD Logical Partitions. 14890b5088SRaghu Krishnamurthy ******************************************************************************/ 1566bdfd6eSRaghu Krishnamurthy typedef struct spmd_spm_core_context spmd_spm_core_context_t; 16890b5088SRaghu Krishnamurthy 17890b5088SRaghu Krishnamurthy /* Prototype for SPMD logical partition initializing function. */ 18890b5088SRaghu Krishnamurthy typedef int32_t (*ffa_spmd_lp_init_t)(void); 19890b5088SRaghu Krishnamurthy 20890b5088SRaghu Krishnamurthy /* SPMD Logical Partition Descriptor. */ 21890b5088SRaghu Krishnamurthy struct spmd_lp_desc { 22890b5088SRaghu Krishnamurthy ffa_spmd_lp_init_t init; 23890b5088SRaghu Krishnamurthy uint16_t sp_id; 24890b5088SRaghu Krishnamurthy uint32_t properties; 25890b5088SRaghu Krishnamurthy uint32_t uuid[4]; /* Little Endian. */ 26890b5088SRaghu Krishnamurthy const char *debug_name; 27890b5088SRaghu Krishnamurthy }; 28890b5088SRaghu Krishnamurthy 2966bdfd6eSRaghu Krishnamurthy struct ffa_value { 3066bdfd6eSRaghu Krishnamurthy uint64_t func; 3166bdfd6eSRaghu Krishnamurthy uint64_t arg1; 3266bdfd6eSRaghu Krishnamurthy uint64_t arg2; 3366bdfd6eSRaghu Krishnamurthy uint64_t arg3; 3466bdfd6eSRaghu Krishnamurthy uint64_t arg4; 3566bdfd6eSRaghu Krishnamurthy uint64_t arg5; 3666bdfd6eSRaghu Krishnamurthy uint64_t arg6; 3766bdfd6eSRaghu Krishnamurthy uint64_t arg7; 38*0b850e9eSRaghu Krishnamurthy uint64_t arg8; 39*0b850e9eSRaghu Krishnamurthy uint64_t arg9; 40*0b850e9eSRaghu Krishnamurthy uint64_t arg10; 41*0b850e9eSRaghu Krishnamurthy uint64_t arg11; 42*0b850e9eSRaghu Krishnamurthy uint64_t arg12; 43*0b850e9eSRaghu Krishnamurthy uint64_t arg13; 44*0b850e9eSRaghu Krishnamurthy uint64_t arg14; 45*0b850e9eSRaghu Krishnamurthy uint64_t arg15; 46*0b850e9eSRaghu Krishnamurthy uint64_t arg16; 47*0b850e9eSRaghu Krishnamurthy uint64_t arg17; 4866bdfd6eSRaghu Krishnamurthy }; 4966bdfd6eSRaghu Krishnamurthy 50890b5088SRaghu Krishnamurthy /* Convenience macro to declare a SPMD logical partition descriptor. */ 51890b5088SRaghu Krishnamurthy #define DECLARE_SPMD_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties) \ 52890b5088SRaghu Krishnamurthy static const struct spmd_lp_desc __partition_desc_ ## _name \ 53890b5088SRaghu Krishnamurthy __section(".spmd_lp_descs") __used = { \ 54890b5088SRaghu Krishnamurthy .debug_name = #_name, \ 55890b5088SRaghu Krishnamurthy .init = (_init), \ 56890b5088SRaghu Krishnamurthy .sp_id = (_sp_id), \ 57890b5088SRaghu Krishnamurthy .uuid = _uuid, \ 58890b5088SRaghu Krishnamurthy .properties = (_properties), \ 59890b5088SRaghu Krishnamurthy } 60890b5088SRaghu Krishnamurthy 61890b5088SRaghu Krishnamurthy IMPORT_SYM(uintptr_t, __SPMD_LP_DESCS_START__, SPMD_LP_DESCS_START); 62890b5088SRaghu Krishnamurthy IMPORT_SYM(uintptr_t, __SPMD_LP_DESCS_END__, SPMD_LP_DESCS_END); 63890b5088SRaghu Krishnamurthy 64890b5088SRaghu Krishnamurthy #define SPMD_LP_DESCS_COUNT ((SPMD_LP_DESCS_END - SPMD_LP_DESCS_START) \ 65890b5088SRaghu Krishnamurthy / sizeof(struct spmd_lp_desc)) 66890b5088SRaghu Krishnamurthy CASSERT(sizeof(struct spmd_lp_desc) == 40, assert_spmd_lp_desc_size_mismatch); 67890b5088SRaghu Krishnamurthy 68890b5088SRaghu Krishnamurthy /* 69890b5088SRaghu Krishnamurthy * Reserve 63 IDs for SPMD Logical Partitions. Currently, 0xFFC0 to 0xFFFE 70890b5088SRaghu Krishnamurthy * is reserved. 71890b5088SRaghu Krishnamurthy */ 72890b5088SRaghu Krishnamurthy #define SPMD_LP_ID_END (SPMD_DIRECT_MSG_ENDPOINT_ID - 1) 73890b5088SRaghu Krishnamurthy #define SPMD_LP_ID_START (SPMD_LP_ID_END - 62) 74890b5088SRaghu Krishnamurthy 75890b5088SRaghu Krishnamurthy static inline bool is_spmd_lp_id(unsigned int id) 76890b5088SRaghu Krishnamurthy { 7766bdfd6eSRaghu Krishnamurthy #if ENABLE_SPMD_LP 78890b5088SRaghu Krishnamurthy return (id >= SPMD_LP_ID_START && id <= SPMD_LP_ID_END); 7966bdfd6eSRaghu Krishnamurthy #else 8066bdfd6eSRaghu Krishnamurthy return false; 8166bdfd6eSRaghu Krishnamurthy #endif 8266bdfd6eSRaghu Krishnamurthy } 8366bdfd6eSRaghu Krishnamurthy 8466bdfd6eSRaghu Krishnamurthy static inline bool is_ffa_error(struct ffa_value *retval) 8566bdfd6eSRaghu Krishnamurthy { 8666bdfd6eSRaghu Krishnamurthy return retval->func == FFA_ERROR; 8766bdfd6eSRaghu Krishnamurthy } 8866bdfd6eSRaghu Krishnamurthy 89*0b850e9eSRaghu Krishnamurthy static inline bool is_ffa_success(struct ffa_value *retval) 90*0b850e9eSRaghu Krishnamurthy { 91*0b850e9eSRaghu Krishnamurthy return (retval->func == FFA_SUCCESS_SMC32) || 92*0b850e9eSRaghu Krishnamurthy (retval->func == FFA_SUCCESS_SMC64); 93*0b850e9eSRaghu Krishnamurthy } 94*0b850e9eSRaghu Krishnamurthy 9566bdfd6eSRaghu Krishnamurthy static inline bool is_ffa_direct_msg_resp(struct ffa_value *retval) 9666bdfd6eSRaghu Krishnamurthy { 9766bdfd6eSRaghu Krishnamurthy return (retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC32) || 9866bdfd6eSRaghu Krishnamurthy (retval->func == FFA_MSG_SEND_DIRECT_RESP_SMC64); 99890b5088SRaghu Krishnamurthy } 100890b5088SRaghu Krishnamurthy 101*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_last_idx( 102*0b850e9eSRaghu Krishnamurthy struct ffa_value args) 103*0b850e9eSRaghu Krishnamurthy { 104*0b850e9eSRaghu Krishnamurthy return (uint16_t)(args.arg2 & 0xFFFFU); 105*0b850e9eSRaghu Krishnamurthy } 106*0b850e9eSRaghu Krishnamurthy 107*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_curr_idx( 108*0b850e9eSRaghu Krishnamurthy struct ffa_value args) 109*0b850e9eSRaghu Krishnamurthy { 110*0b850e9eSRaghu Krishnamurthy return (uint16_t)((args.arg2 >> 16) & 0xFFFFU); 111*0b850e9eSRaghu Krishnamurthy } 112*0b850e9eSRaghu Krishnamurthy 113*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_tag(struct ffa_value args) 114*0b850e9eSRaghu Krishnamurthy { 115*0b850e9eSRaghu Krishnamurthy return (uint16_t)((args.arg2 >> 32) & 0xFFFFU); 116*0b850e9eSRaghu Krishnamurthy } 117*0b850e9eSRaghu Krishnamurthy 118*0b850e9eSRaghu Krishnamurthy static inline uint16_t ffa_partition_info_regs_get_desc_size( 119*0b850e9eSRaghu Krishnamurthy struct ffa_value args) 120*0b850e9eSRaghu Krishnamurthy { 121*0b850e9eSRaghu Krishnamurthy return (uint16_t)(args.arg2 >> 48); 122*0b850e9eSRaghu Krishnamurthy } 123*0b850e9eSRaghu Krishnamurthy 124*0b850e9eSRaghu Krishnamurthy bool ffa_partition_info_regs_get_part_info( 125*0b850e9eSRaghu Krishnamurthy struct ffa_value args, uint8_t idx, 126*0b850e9eSRaghu Krishnamurthy struct ffa_partition_info_v1_1 *partition_info); 127*0b850e9eSRaghu Krishnamurthy 128*0b850e9eSRaghu Krishnamurthy bool spmd_el3_invoke_partition_info_get( 129*0b850e9eSRaghu Krishnamurthy const uint32_t target_uuid[4], 130*0b850e9eSRaghu Krishnamurthy const uint16_t start_index, 131*0b850e9eSRaghu Krishnamurthy const uint16_t tag, 132*0b850e9eSRaghu Krishnamurthy struct ffa_value *retval); 133890b5088SRaghu Krishnamurthy void spmd_logical_sp_set_spmc_initialized(void); 134890b5088SRaghu Krishnamurthy void spmc_logical_sp_set_spmc_failure(void); 135890b5088SRaghu Krishnamurthy 136890b5088SRaghu Krishnamurthy int32_t spmd_logical_sp_init(void); 13766bdfd6eSRaghu Krishnamurthy bool is_spmd_logical_sp_dir_req_in_progress( 13866bdfd6eSRaghu Krishnamurthy spmd_spm_core_context_t *ctx); 13966bdfd6eSRaghu Krishnamurthy 140*0b850e9eSRaghu Krishnamurthy bool is_spmd_logical_sp_info_regs_req_in_progress( 141*0b850e9eSRaghu Krishnamurthy spmd_spm_core_context_t *ctx); 142*0b850e9eSRaghu Krishnamurthy 14366bdfd6eSRaghu Krishnamurthy bool spmd_el3_ffa_msg_direct_req(uint64_t x1, 14466bdfd6eSRaghu Krishnamurthy uint64_t x2, 14566bdfd6eSRaghu Krishnamurthy uint64_t x3, 14666bdfd6eSRaghu Krishnamurthy uint64_t x4, 14766bdfd6eSRaghu Krishnamurthy void *handle, 14866bdfd6eSRaghu Krishnamurthy struct ffa_value *retval); 149890b5088SRaghu Krishnamurthy 150890b5088SRaghu Krishnamurthy #endif /* EL3_SPMD_LOGICAL_SP_H */ 151