blob: 69d549c875041f87f402738a9db632288344b54d [file] [log] [blame]
/*
* Copyright (c) 2025, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef LFA_SVC_H
#define LFA_SVC_H
#include <stdbool.h>
#include <stdint.h>
#include <lib/smccc.h>
#include <services/lfa_component_desc.h>
#include <tools_share/uuid.h>
/*
* SMC function IDs for LFA Service
* Upper word bits set: Fast call, SMC64, Standard Secure Svc. Call (OEN = 4)
*/
#define LFA_FID(func_num) \
((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \
(SMC_64 << FUNCID_CC_SHIFT) | \
(OEN_STD_START << FUNCID_OEN_SHIFT) | \
((func_num) << FUNCID_NUM_SHIFT))
#define LFA_VERSION LFA_FID(0x2E0)
#define LFA_FEATURES LFA_FID(0x2E1)
#define LFA_GET_INFO LFA_FID(0x2E2)
#define LFA_GET_INVENTORY LFA_FID(0x2E3)
#define LFA_PRIME LFA_FID(0x2E4)
#define LFA_ACTIVATE LFA_FID(0x2E5)
#define LFA_CANCEL LFA_FID(0x2E6)
/* Check whether FID is in the range */
#define is_lfa_fid(_fid) \
((_fid >= LFA_VERSION) && (_fid <= LFA_CANCEL))
/* LFA Service Calls version numbers */
#define LFA_VERSION_MAJOR U(1)
#define LFA_VERSION_MAJOR_SHIFT 16
#define LFA_VERSION_MAJOR_MASK U(0x7FFF)
#define LFA_VERSION_MINOR U(0)
#define LFA_VERSION_MINOR_SHIFT 0
#define LFA_VERSION_MINOR_MASK U(0xFFFF)
#define LFA_VERSION_VAL \
((((LFA_VERSION_MAJOR) & LFA_VERSION_MAJOR_MASK) << \
LFA_VERSION_MAJOR_SHIFT) \
| (((LFA_VERSION_MINOR) & LFA_VERSION_MINOR_MASK) << \
LFA_VERSION_MINOR_SHIFT))
#define LFA_INVALID_COMPONENT U(0xFFFFFFFF)
#define LFA_ACTIVATION_CAPABLE_SHIFT 0
#define LFA_ACTIVATION_PENDING_SHIFT 1
#define LFA_MAY_RESET_CPU_SHIFT 2
#define LFA_CPU_RENDEZVOUS_OPTIONAL_SHIFT 3
#define LFA_SKIP_CPU_RENDEZVOUS_BIT BIT(0)
/* List of errors as per the specification */
enum lfa_retc {
LFA_SUCCESS = 0,
LFA_NOT_SUPPORTED = -1,
LFA_BUSY = -2,
LFA_AUTH_ERROR = -3,
LFA_NO_MEMORY = -4,
LFA_CRITICAL_ERROR = -5,
LFA_DEVICE_ERROR = -6,
LFA_WRONG_STATE = -7,
LFA_INVALID_PARAMETERS = -8,
LFA_COMPONENT_WRONG_STATE = -9,
LFA_INVALID_ADDRESS = -10,
LFA_ACTIVATION_FAILED = -11,
};
/* Initialization routine for the LFA service */
int lfa_setup(void);
uint64_t lfa_smc_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2,
u_register_t x3, u_register_t x4, void *cookie,
void *handle, u_register_t flags);
void lfa_reset_activation(void);
#endif /* LFA_SVC_H */