1cf48f49fSManish V Badarkhe /* 2cf48f49fSManish V Badarkhe * Copyright (c) 2025, Arm Limited. All rights reserved. 3cf48f49fSManish V Badarkhe * 4cf48f49fSManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 5cf48f49fSManish V Badarkhe */ 6cf48f49fSManish V Badarkhe 7cf48f49fSManish V Badarkhe #ifndef LFA_SVC_H 8cf48f49fSManish V Badarkhe #define LFA_SVC_H 9cf48f49fSManish V Badarkhe 10b9dee50cSManish V Badarkhe #include <stdbool.h> 11b9dee50cSManish V Badarkhe #include <stdint.h> 12b9dee50cSManish V Badarkhe 13cf48f49fSManish V Badarkhe #include <lib/smccc.h> 14b9dee50cSManish V Badarkhe #include <services/lfa_component_desc.h> 15b9dee50cSManish V Badarkhe #include <tools_share/uuid.h> 16cf48f49fSManish V Badarkhe 17cf48f49fSManish V Badarkhe /* 18cf48f49fSManish V Badarkhe * SMC function IDs for LFA Service 19cf48f49fSManish V Badarkhe * Upper word bits set: Fast call, SMC64, Standard Secure Svc. Call (OEN = 4) 20cf48f49fSManish V Badarkhe */ 21cf48f49fSManish V Badarkhe #define LFA_FID(func_num) \ 22cf48f49fSManish V Badarkhe ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ 23cf48f49fSManish V Badarkhe (SMC_64 << FUNCID_CC_SHIFT) | \ 24cf48f49fSManish V Badarkhe (OEN_STD_START << FUNCID_OEN_SHIFT) | \ 25cf48f49fSManish V Badarkhe ((func_num) << FUNCID_NUM_SHIFT)) 26cf48f49fSManish V Badarkhe 27cf48f49fSManish V Badarkhe #define LFA_VERSION LFA_FID(0x2E0) 28cf48f49fSManish V Badarkhe #define LFA_FEATURES LFA_FID(0x2E1) 29cf48f49fSManish V Badarkhe #define LFA_GET_INFO LFA_FID(0x2E2) 30cf48f49fSManish V Badarkhe #define LFA_GET_INVENTORY LFA_FID(0x2E3) 31cf48f49fSManish V Badarkhe #define LFA_PRIME LFA_FID(0x2E4) 32cf48f49fSManish V Badarkhe #define LFA_ACTIVATE LFA_FID(0x2E5) 33cf48f49fSManish V Badarkhe #define LFA_CANCEL LFA_FID(0x2E6) 34cf48f49fSManish V Badarkhe 35cf48f49fSManish V Badarkhe /* Check whether FID is in the range */ 36cf48f49fSManish V Badarkhe #define is_lfa_fid(_fid) \ 37cf48f49fSManish V Badarkhe ((_fid >= LFA_VERSION) && (_fid <= LFA_CANCEL)) 38cf48f49fSManish V Badarkhe 39cf48f49fSManish V Badarkhe /* LFA Service Calls version numbers */ 40cf48f49fSManish V Badarkhe #define LFA_VERSION_MAJOR U(1) 41cf48f49fSManish V Badarkhe #define LFA_VERSION_MAJOR_SHIFT 16 42cf48f49fSManish V Badarkhe #define LFA_VERSION_MAJOR_MASK U(0x7FFF) 43cf48f49fSManish V Badarkhe #define LFA_VERSION_MINOR U(0) 44cf48f49fSManish V Badarkhe #define LFA_VERSION_MINOR_SHIFT 0 45cf48f49fSManish V Badarkhe #define LFA_VERSION_MINOR_MASK U(0xFFFF) 46cf48f49fSManish V Badarkhe 47cf48f49fSManish V Badarkhe #define LFA_VERSION_VAL \ 48cf48f49fSManish V Badarkhe ((((LFA_VERSION_MAJOR) & LFA_VERSION_MAJOR_MASK) << \ 49cf48f49fSManish V Badarkhe LFA_VERSION_MAJOR_SHIFT) \ 50cf48f49fSManish V Badarkhe | (((LFA_VERSION_MINOR) & LFA_VERSION_MINOR_MASK) << \ 51cf48f49fSManish V Badarkhe LFA_VERSION_MINOR_SHIFT)) 52cf48f49fSManish V Badarkhe 53b9dee50cSManish V Badarkhe #define LFA_INVALID_COMPONENT U(0xFFFFFFFF) 54b9dee50cSManish V Badarkhe 5506a6f296SManish V Badarkhe #define LFA_ACTIVATION_CAPABLE_SHIFT 0 5606a6f296SManish V Badarkhe #define LFA_ACTIVATION_PENDING_SHIFT 1 5706a6f296SManish V Badarkhe #define LFA_MAY_RESET_CPU_SHIFT 2 5806a6f296SManish V Badarkhe #define LFA_CPU_RENDEZVOUS_OPTIONAL_SHIFT 3 5906a6f296SManish V Badarkhe 6007de22d2SManish V Badarkhe #define LFA_SKIP_CPU_RENDEZVOUS_BIT BIT(0) 6107de22d2SManish V Badarkhe 62*59b826ceSVarun Wadekar #define LFA_CALL_AGAIN ULL(1) 63*59b826ceSVarun Wadekar 64cf48f49fSManish V Badarkhe /* List of errors as per the specification */ 65cf48f49fSManish V Badarkhe enum lfa_retc { 66cf48f49fSManish V Badarkhe LFA_SUCCESS = 0, 67cf48f49fSManish V Badarkhe LFA_NOT_SUPPORTED = -1, 68cf48f49fSManish V Badarkhe LFA_BUSY = -2, 69cf48f49fSManish V Badarkhe LFA_AUTH_ERROR = -3, 70cf48f49fSManish V Badarkhe LFA_NO_MEMORY = -4, 71cf48f49fSManish V Badarkhe LFA_CRITICAL_ERROR = -5, 72cf48f49fSManish V Badarkhe LFA_DEVICE_ERROR = -6, 73cf48f49fSManish V Badarkhe LFA_WRONG_STATE = -7, 74cf48f49fSManish V Badarkhe LFA_INVALID_PARAMETERS = -8, 75cf48f49fSManish V Badarkhe LFA_COMPONENT_WRONG_STATE = -9, 76cf48f49fSManish V Badarkhe LFA_INVALID_ADDRESS = -10, 77cf48f49fSManish V Badarkhe LFA_ACTIVATION_FAILED = -11, 78cf48f49fSManish V Badarkhe }; 79cf48f49fSManish V Badarkhe 80cf48f49fSManish V Badarkhe /* Initialization routine for the LFA service */ 81cf48f49fSManish V Badarkhe int lfa_setup(void); 82cf48f49fSManish V Badarkhe 83cf48f49fSManish V Badarkhe uint64_t lfa_smc_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2, 84cf48f49fSManish V Badarkhe u_register_t x3, u_register_t x4, void *cookie, 85cf48f49fSManish V Badarkhe void *handle, u_register_t flags); 86b9dee50cSManish V Badarkhe void lfa_reset_activation(void); 87b17fc0a6SManish V Badarkhe bool lfa_is_prime_complete(uint32_t lfa_component_id); 88cf48f49fSManish V Badarkhe 89cf48f49fSManish V Badarkhe #endif /* LFA_SVC_H */ 90