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