17affa25cSMarc Bonnici /* 27affa25cSMarc Bonnici * Copyright (c) 2022, ARM Limited and Contributors. All rights reserved. 37affa25cSMarc Bonnici * 47affa25cSMarc Bonnici * SPDX-License-Identifier: BSD-3-Clause 57affa25cSMarc Bonnici */ 67affa25cSMarc Bonnici #ifndef EL3_SP_H 77affa25cSMarc Bonnici #define EL3_SP_H 87affa25cSMarc Bonnici 97affa25cSMarc Bonnici #include <common/bl_common.h> 107affa25cSMarc Bonnici #include <lib/cassert.h> 117affa25cSMarc Bonnici 127affa25cSMarc Bonnici /******************************************************************************* 137affa25cSMarc Bonnici * Structure definition, typedefs & constants for the Logical SPs. 147affa25cSMarc Bonnici ******************************************************************************/ 157affa25cSMarc Bonnici 167affa25cSMarc Bonnici typedef uint64_t (*direct_msg_handler)(uint32_t smc_fid, bool secure_origin, 177affa25cSMarc Bonnici uint64_t x1, uint64_t x2, uint64_t x3, 187affa25cSMarc Bonnici uint64_t x4, void *cookie, void *handle, 197affa25cSMarc Bonnici uint64_t flags); 207affa25cSMarc Bonnici 217affa25cSMarc Bonnici /* Prototype for logical partition initializing function. */ 227affa25cSMarc Bonnici typedef int32_t (*ffa_partition_init_t)(void); 237affa25cSMarc Bonnici 247affa25cSMarc Bonnici /* Logical Partition Descriptor. */ 257affa25cSMarc Bonnici struct el3_lp_desc { 267affa25cSMarc Bonnici ffa_partition_init_t init; 277affa25cSMarc Bonnici uint16_t sp_id; 287affa25cSMarc Bonnici uint32_t properties; 297affa25cSMarc Bonnici uint32_t uuid[4]; /* Little Endian. */ 307affa25cSMarc Bonnici direct_msg_handler direct_req; 317affa25cSMarc Bonnici const char *debug_name; 327affa25cSMarc Bonnici }; 337affa25cSMarc Bonnici 347affa25cSMarc Bonnici /* Convenience macro to declare a logical partition descriptor. */ 357affa25cSMarc Bonnici #define DECLARE_LOGICAL_PARTITION(_name, _init, _sp_id, _uuid, _properties, \ 367affa25cSMarc Bonnici _direct_req) \ 377affa25cSMarc Bonnici static const struct el3_lp_desc __partition_desc_ ## _name \ 38da04341eSChris Kay __section(".el3_lp_descs") __used = { \ 397affa25cSMarc Bonnici .debug_name = #_name, \ 407affa25cSMarc Bonnici .init = (_init), \ 417affa25cSMarc Bonnici .sp_id = (_sp_id), \ 427affa25cSMarc Bonnici .uuid = _uuid, \ 437affa25cSMarc Bonnici .properties = (_properties), \ 447affa25cSMarc Bonnici .direct_req = (_direct_req), \ 457affa25cSMarc Bonnici } 467affa25cSMarc Bonnici 477affa25cSMarc Bonnici 487affa25cSMarc Bonnici /******************************************************************************* 497affa25cSMarc Bonnici * Function & variable prototypes. 507affa25cSMarc Bonnici ******************************************************************************/ 517affa25cSMarc Bonnici int el3_sp_desc_validate(void); 52*01c1b3e1SRaghu Krishnamurthy 537affa25cSMarc Bonnici IMPORT_SYM(uintptr_t, __EL3_LP_DESCS_START__, EL3_LP_DESCS_START); 547affa25cSMarc Bonnici IMPORT_SYM(uintptr_t, __EL3_LP_DESCS_END__, EL3_LP_DESCS_END); 557affa25cSMarc Bonnici 567affa25cSMarc Bonnici #define EL3_LP_DESCS_COUNT ((EL3_LP_DESCS_END - EL3_LP_DESCS_START) \ 577affa25cSMarc Bonnici / sizeof(struct el3_lp_desc)) 587affa25cSMarc Bonnici 597affa25cSMarc Bonnici #endif /* EL3_SP_H */ 60