xref: /rk3399_ARM-atf/include/services/lfa_svc.h (revision 3b98554064bf572b9781720f935a097761f707b5)
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