1*cf48f49fSManish V Badarkhe /* 2*cf48f49fSManish V Badarkhe * Copyright (c) 2025, Arm Limited. All rights reserved. 3*cf48f49fSManish V Badarkhe * 4*cf48f49fSManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 5*cf48f49fSManish V Badarkhe */ 6*cf48f49fSManish V Badarkhe 7*cf48f49fSManish V Badarkhe #ifndef LFA_SVC_H 8*cf48f49fSManish V Badarkhe #define LFA_SVC_H 9*cf48f49fSManish V Badarkhe 10*cf48f49fSManish V Badarkhe #include <lib/smccc.h> 11*cf48f49fSManish V Badarkhe 12*cf48f49fSManish V Badarkhe /* 13*cf48f49fSManish V Badarkhe * SMC function IDs for LFA Service 14*cf48f49fSManish V Badarkhe * Upper word bits set: Fast call, SMC64, Standard Secure Svc. Call (OEN = 4) 15*cf48f49fSManish V Badarkhe */ 16*cf48f49fSManish V Badarkhe #define LFA_FID(func_num) \ 17*cf48f49fSManish V Badarkhe ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ 18*cf48f49fSManish V Badarkhe (SMC_64 << FUNCID_CC_SHIFT) | \ 19*cf48f49fSManish V Badarkhe (OEN_STD_START << FUNCID_OEN_SHIFT) | \ 20*cf48f49fSManish V Badarkhe ((func_num) << FUNCID_NUM_SHIFT)) 21*cf48f49fSManish V Badarkhe 22*cf48f49fSManish V Badarkhe #define LFA_VERSION LFA_FID(0x2E0) 23*cf48f49fSManish V Badarkhe #define LFA_FEATURES LFA_FID(0x2E1) 24*cf48f49fSManish V Badarkhe #define LFA_GET_INFO LFA_FID(0x2E2) 25*cf48f49fSManish V Badarkhe #define LFA_GET_INVENTORY LFA_FID(0x2E3) 26*cf48f49fSManish V Badarkhe #define LFA_PRIME LFA_FID(0x2E4) 27*cf48f49fSManish V Badarkhe #define LFA_ACTIVATE LFA_FID(0x2E5) 28*cf48f49fSManish V Badarkhe #define LFA_CANCEL LFA_FID(0x2E6) 29*cf48f49fSManish V Badarkhe 30*cf48f49fSManish V Badarkhe /* Check whether FID is in the range */ 31*cf48f49fSManish V Badarkhe #define is_lfa_fid(_fid) \ 32*cf48f49fSManish V Badarkhe ((_fid >= LFA_VERSION) && (_fid <= LFA_CANCEL)) 33*cf48f49fSManish V Badarkhe 34*cf48f49fSManish V Badarkhe /* LFA Service Calls version numbers */ 35*cf48f49fSManish V Badarkhe #define LFA_VERSION_MAJOR U(1) 36*cf48f49fSManish V Badarkhe #define LFA_VERSION_MAJOR_SHIFT 16 37*cf48f49fSManish V Badarkhe #define LFA_VERSION_MAJOR_MASK U(0x7FFF) 38*cf48f49fSManish V Badarkhe #define LFA_VERSION_MINOR U(0) 39*cf48f49fSManish V Badarkhe #define LFA_VERSION_MINOR_SHIFT 0 40*cf48f49fSManish V Badarkhe #define LFA_VERSION_MINOR_MASK U(0xFFFF) 41*cf48f49fSManish V Badarkhe 42*cf48f49fSManish V Badarkhe #define LFA_VERSION_VAL \ 43*cf48f49fSManish V Badarkhe ((((LFA_VERSION_MAJOR) & LFA_VERSION_MAJOR_MASK) << \ 44*cf48f49fSManish V Badarkhe LFA_VERSION_MAJOR_SHIFT) \ 45*cf48f49fSManish V Badarkhe | (((LFA_VERSION_MINOR) & LFA_VERSION_MINOR_MASK) << \ 46*cf48f49fSManish V Badarkhe LFA_VERSION_MINOR_SHIFT)) 47*cf48f49fSManish V Badarkhe 48*cf48f49fSManish V Badarkhe /* List of errors as per the specification */ 49*cf48f49fSManish V Badarkhe enum lfa_retc { 50*cf48f49fSManish V Badarkhe LFA_SUCCESS = 0, 51*cf48f49fSManish V Badarkhe LFA_NOT_SUPPORTED = -1, 52*cf48f49fSManish V Badarkhe LFA_BUSY = -2, 53*cf48f49fSManish V Badarkhe LFA_AUTH_ERROR = -3, 54*cf48f49fSManish V Badarkhe LFA_NO_MEMORY = -4, 55*cf48f49fSManish V Badarkhe LFA_CRITICAL_ERROR = -5, 56*cf48f49fSManish V Badarkhe LFA_DEVICE_ERROR = -6, 57*cf48f49fSManish V Badarkhe LFA_WRONG_STATE = -7, 58*cf48f49fSManish V Badarkhe LFA_INVALID_PARAMETERS = -8, 59*cf48f49fSManish V Badarkhe LFA_COMPONENT_WRONG_STATE = -9, 60*cf48f49fSManish V Badarkhe LFA_INVALID_ADDRESS = -10, 61*cf48f49fSManish V Badarkhe LFA_ACTIVATION_FAILED = -11, 62*cf48f49fSManish V Badarkhe }; 63*cf48f49fSManish V Badarkhe 64*cf48f49fSManish V Badarkhe /* Initialization routine for the LFA service */ 65*cf48f49fSManish V Badarkhe int lfa_setup(void); 66*cf48f49fSManish V Badarkhe 67*cf48f49fSManish V Badarkhe uint64_t lfa_smc_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2, 68*cf48f49fSManish V Badarkhe u_register_t x3, u_register_t x4, void *cookie, 69*cf48f49fSManish V Badarkhe void *handle, u_register_t flags); 70*cf48f49fSManish V Badarkhe 71*cf48f49fSManish V Badarkhe #endif /* LFA_SVC_H */ 72