1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2022, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu #ifndef EL3_SP_H 7*91f16700Schasinglulu #define EL3_SP_H 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <common/bl_common.h> 10*91f16700Schasinglulu #include <lib/cassert.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu /******************************************************************************* 13*91f16700Schasinglulu * Structure definition, typedefs & constants for the Logical SPs. 14*91f16700Schasinglulu ******************************************************************************/ 15*91f16700Schasinglulu 16*91f16700Schasinglulu typedef uint64_t (*direct_msg_handler)(uint32_t smc_fid, bool secure_origin, 17*91f16700Schasinglulu uint64_t x1, uint64_t x2, uint64_t x3, 18*91f16700Schasinglulu uint64_t x4, void *cookie, void *handle, 19*91f16700Schasinglulu uint64_t flags); 20*91f16700Schasinglulu 21*91f16700Schasinglulu /* Prototype for logical partition initializing function. */ 22*91f16700Schasinglulu typedef int32_t (*ffa_partition_init_t)(void); 23*91f16700Schasinglulu 24*91f16700Schasinglulu /* Logical Partition Descriptor. */ 25*91f16700Schasinglulu struct el3_lp_desc { 26*91f16700Schasinglulu ffa_partition_init_t init; 27*91f16700Schasinglulu uint16_t sp_id; 28*91f16700Schasinglulu uint32_t properties; 29*91f16700Schasinglulu uint32_t uuid[4]; /* Little Endian. */ 30*91f16700Schasinglulu direct_msg_handler direct_req; 31*91f16700Schasinglulu const char *debug_name; 32*91f16700Schasinglulu }; 33*91f16700Schasinglulu 34*91f16700Schasinglulu /* Convenience macro to declare a logical partition descriptor. */ 35*91f16700Schasinglulu #define DECLARE_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties, \ 36*91f16700Schasinglulu _direct_req) \ 37*91f16700Schasinglulu static const struct el3_lp_desc __partition_desc_ ## _name \ 38*91f16700Schasinglulu __section(".el3_lp_descs") __used = { \ 39*91f16700Schasinglulu .debug_name = #_name, \ 40*91f16700Schasinglulu .init = (_init), \ 41*91f16700Schasinglulu .sp_id = (_sp_id), \ 42*91f16700Schasinglulu .uuid = _uuid, \ 43*91f16700Schasinglulu .properties = (_properties), \ 44*91f16700Schasinglulu .direct_req = (_direct_req), \ 45*91f16700Schasinglulu } 46*91f16700Schasinglulu 47*91f16700Schasinglulu 48*91f16700Schasinglulu /******************************************************************************* 49*91f16700Schasinglulu * Function & variable prototypes. 50*91f16700Schasinglulu ******************************************************************************/ 51*91f16700Schasinglulu int el3_sp_desc_validate(void); 52*91f16700Schasinglulu 53*91f16700Schasinglulu IMPORT_SYM(uintptr_t, __EL3_LP_DESCS_START__, EL3_LP_DESCS_START); 54*91f16700Schasinglulu IMPORT_SYM(uintptr_t, __EL3_LP_DESCS_END__, EL3_LP_DESCS_END); 55*91f16700Schasinglulu 56*91f16700Schasinglulu #define EL3_LP_DESCS_COUNT ((EL3_LP_DESCS_END - EL3_LP_DESCS_START) \ 57*91f16700Schasinglulu / sizeof(struct el3_lp_desc)) 58*91f16700Schasinglulu 59*91f16700Schasinglulu #endif /* EL3_SP_H */ 60