xref: /openbmc/linux/drivers/tee/optee/optee_ffa.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
14615e5a3SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
24615e5a3SJens Wiklander /*
34615e5a3SJens Wiklander  * Copyright (c) 2019-2021, Linaro Limited
44615e5a3SJens Wiklander  */
54615e5a3SJens Wiklander 
64615e5a3SJens Wiklander /*
74615e5a3SJens Wiklander  * This file is exported by OP-TEE and is kept in sync between secure world
84615e5a3SJens Wiklander  * and normal world drivers. We're using ARM FF-A 1.0 specification.
94615e5a3SJens Wiklander  */
104615e5a3SJens Wiklander 
114615e5a3SJens Wiklander #ifndef __OPTEE_FFA_H
124615e5a3SJens Wiklander #define __OPTEE_FFA_H
134615e5a3SJens Wiklander 
144615e5a3SJens Wiklander #include <linux/arm_ffa.h>
154615e5a3SJens Wiklander 
164615e5a3SJens Wiklander /*
174615e5a3SJens Wiklander  * Normal world sends requests with FFA_MSG_SEND_DIRECT_REQ and
184615e5a3SJens Wiklander  * responses are returned with FFA_MSG_SEND_DIRECT_RESP for normal
194615e5a3SJens Wiklander  * messages.
204615e5a3SJens Wiklander  *
214615e5a3SJens Wiklander  * All requests with FFA_MSG_SEND_DIRECT_REQ and FFA_MSG_SEND_DIRECT_RESP
224615e5a3SJens Wiklander  * are using the AArch32 SMC calling convention with register usage as
234615e5a3SJens Wiklander  * defined in FF-A specification:
244615e5a3SJens Wiklander  * w0:    Function ID (0x8400006F or 0x84000070)
254615e5a3SJens Wiklander  * w1:    Source/Destination IDs
264615e5a3SJens Wiklander  * w2:    Reserved (MBZ)
274615e5a3SJens Wiklander  * w3-w7: Implementation defined, free to be used below
284615e5a3SJens Wiklander  */
294615e5a3SJens Wiklander 
304615e5a3SJens Wiklander #define OPTEE_FFA_VERSION_MAJOR	1
314615e5a3SJens Wiklander #define OPTEE_FFA_VERSION_MINOR	0
324615e5a3SJens Wiklander 
334615e5a3SJens Wiklander #define OPTEE_FFA_BLOCKING_CALL(id)	(id)
344615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_BIT	31
354615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL(id)	((id) | BIT(OPTEE_FFA_YIELDING_CALL_BIT))
364615e5a3SJens Wiklander 
374615e5a3SJens Wiklander /*
384615e5a3SJens Wiklander  * Returns the API version implemented, currently follows the FF-A version.
394615e5a3SJens Wiklander  * Call register usage:
404615e5a3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_GET_API_VERSION
414615e5a3SJens Wiklander  * w4-w7: Not used (MBZ)
424615e5a3SJens Wiklander  *
434615e5a3SJens Wiklander  * Return register usage:
444615e5a3SJens Wiklander  * w3:    OPTEE_FFA_VERSION_MAJOR
454615e5a3SJens Wiklander  * w4:    OPTEE_FFA_VERSION_MINOR
464615e5a3SJens Wiklander  * w5-w7: Not used (MBZ)
474615e5a3SJens Wiklander  */
484615e5a3SJens Wiklander #define OPTEE_FFA_GET_API_VERSION	OPTEE_FFA_BLOCKING_CALL(0)
494615e5a3SJens Wiklander 
504615e5a3SJens Wiklander /*
514615e5a3SJens Wiklander  * Returns the revision of OP-TEE.
524615e5a3SJens Wiklander  *
534615e5a3SJens Wiklander  * Used by non-secure world to figure out which version of the Trusted OS
544615e5a3SJens Wiklander  * is installed. Note that the returned revision is the revision of the
554615e5a3SJens Wiklander  * Trusted OS, not of the API.
564615e5a3SJens Wiklander  *
574615e5a3SJens Wiklander  * Call register usage:
584615e5a3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_GET_OS_VERSION
594615e5a3SJens Wiklander  * w4-w7: Unused (MBZ)
604615e5a3SJens Wiklander  *
614615e5a3SJens Wiklander  * Return register usage:
624615e5a3SJens Wiklander  * w3:    CFG_OPTEE_REVISION_MAJOR
634615e5a3SJens Wiklander  * w4:    CFG_OPTEE_REVISION_MINOR
644615e5a3SJens Wiklander  * w5:    TEE_IMPL_GIT_SHA1 (or zero if not supported)
654615e5a3SJens Wiklander  */
664615e5a3SJens Wiklander #define OPTEE_FFA_GET_OS_VERSION	OPTEE_FFA_BLOCKING_CALL(1)
674615e5a3SJens Wiklander 
684615e5a3SJens Wiklander /*
694615e5a3SJens Wiklander  * Exchange capabilities between normal world and secure world.
704615e5a3SJens Wiklander  *
714615e5a3SJens Wiklander  * Currently there are no defined capabilities. When features are added new
724615e5a3SJens Wiklander  * capabilities may be added.
734615e5a3SJens Wiklander  *
744615e5a3SJens Wiklander  * Call register usage:
754615e5a3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_EXCHANGE_CAPABILITIES
764615e5a3SJens Wiklander  * w4-w7: Note used (MBZ)
774615e5a3SJens Wiklander  *
784615e5a3SJens Wiklander  * Return register usage:
794615e5a3SJens Wiklander  * w3:    Error code, 0 on success
804615e5a3SJens Wiklander  * w4:    Bit[7:0]:  Number of parameters needed for RPC to be supplied
814615e5a3SJens Wiklander  *                   as the second MSG arg struct for
824615e5a3SJens Wiklander  *                   OPTEE_FFA_YIELDING_CALL_WITH_ARG.
834615e5a3SJens Wiklander  *        Bit[31:8]: Reserved (MBZ)
84*a639b2b1SJens Wiklander  * w5:	  Bitfield of secure world capabilities OPTEE_FFA_SEC_CAP_* below,
85*a639b2b1SJens Wiklander  *	  unused bits MBZ.
86*a639b2b1SJens Wiklander  * w6-w7: Not used (MBZ)
874615e5a3SJens Wiklander  */
88*a639b2b1SJens Wiklander /*
89*a639b2b1SJens Wiklander  * Secure world supports giving an offset into the argument shared memory
90*a639b2b1SJens Wiklander  * object, see also OPTEE_FFA_YIELDING_CALL_WITH_ARG
91*a639b2b1SJens Wiklander  */
92*a639b2b1SJens Wiklander #define OPTEE_FFA_SEC_CAP_ARG_OFFSET	BIT(0)
93*a639b2b1SJens Wiklander 
944615e5a3SJens Wiklander #define OPTEE_FFA_EXCHANGE_CAPABILITIES OPTEE_FFA_BLOCKING_CALL(2)
954615e5a3SJens Wiklander 
964615e5a3SJens Wiklander /*
974615e5a3SJens Wiklander  * Unregister shared memory
984615e5a3SJens Wiklander  *
994615e5a3SJens Wiklander  * Call register usage:
1004615e5a3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_UNREGISTER_SHM
1014615e5a3SJens Wiklander  * w4:    Shared memory handle, lower bits
1024615e5a3SJens Wiklander  * w5:    Shared memory handle, higher bits
1034615e5a3SJens Wiklander  * w6-w7: Not used (MBZ)
1044615e5a3SJens Wiklander  *
1054615e5a3SJens Wiklander  * Return register usage:
1064615e5a3SJens Wiklander  * w3:    Error code, 0 on success
1074615e5a3SJens Wiklander  * w4-w7: Note used (MBZ)
1084615e5a3SJens Wiklander  */
1094615e5a3SJens Wiklander #define OPTEE_FFA_UNREGISTER_SHM	OPTEE_FFA_BLOCKING_CALL(3)
1104615e5a3SJens Wiklander 
1114615e5a3SJens Wiklander /*
1124615e5a3SJens Wiklander  * Call with struct optee_msg_arg as argument in the supplied shared memory
1134615e5a3SJens Wiklander  * with a zero internal offset and normal cached memory attributes.
1144615e5a3SJens Wiklander  * Register usage:
1154615e5a3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_WITH_ARG
1164615e5a3SJens Wiklander  * w4:    Lower 32 bits of a 64-bit Shared memory handle
1174615e5a3SJens Wiklander  * w5:    Upper 32 bits of a 64-bit Shared memory handle
1184615e5a3SJens Wiklander  * w6:    Offset into shared memory pointing to a struct optee_msg_arg
1194615e5a3SJens Wiklander  *	  right after the parameters of this struct (at offset
1204615e5a3SJens Wiklander  *	  OPTEE_MSG_GET_ARG_SIZE(num_params) follows a struct optee_msg_arg
1214615e5a3SJens Wiklander  *	  for RPC, this struct has reserved space for the number of RPC
1224615e5a3SJens Wiklander  *	  parameters as returned by OPTEE_FFA_EXCHANGE_CAPABILITIES.
123*a639b2b1SJens Wiklander  *	  MBZ unless the bit OPTEE_FFA_SEC_CAP_ARG_OFFSET is received with
124*a639b2b1SJens Wiklander  *	  OPTEE_FFA_EXCHANGE_CAPABILITIES.
1254615e5a3SJens Wiklander  * w7:    Not used (MBZ)
1264615e5a3SJens Wiklander  * Resume from RPC. Register usage:
1274615e5a3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_RESUME
1284615e5a3SJens Wiklander  * w4-w6: Not used (MBZ)
1294615e5a3SJens Wiklander  * w7:    Resume info
1304615e5a3SJens Wiklander  *
1314615e5a3SJens Wiklander  * Normal return (yielding call is completed). Register usage:
1324615e5a3SJens Wiklander  * w3:    Error code, 0 on success
1334615e5a3SJens Wiklander  * w4:    OPTEE_FFA_YIELDING_CALL_RETURN_DONE
1344615e5a3SJens Wiklander  * w5-w7: Not used (MBZ)
1354615e5a3SJens Wiklander  *
1364615e5a3SJens Wiklander  * RPC interrupt return (RPC from secure world). Register usage:
1374615e5a3SJens Wiklander  * w3:    Error code == 0
1384615e5a3SJens Wiklander  * w4:    Any defined RPC code but OPTEE_FFA_YIELDING_CALL_RETURN_DONE
1394615e5a3SJens Wiklander  * w5-w6: Not used (MBZ)
1404615e5a3SJens Wiklander  * w7:    Resume info
1414615e5a3SJens Wiklander  *
1424615e5a3SJens Wiklander  * Possible error codes in register w3:
1434615e5a3SJens Wiklander  * 0:                       Success
1444615e5a3SJens Wiklander  * FFA_DENIED:              w4 isn't one of OPTEE_FFA_YIELDING_CALL_START
1454615e5a3SJens Wiklander  *                          OPTEE_FFA_YIELDING_CALL_RESUME
1464615e5a3SJens Wiklander  *
1474615e5a3SJens Wiklander  * Possible error codes for OPTEE_FFA_YIELDING_CALL_START,
1484615e5a3SJens Wiklander  * FFA_BUSY:               Number of OP-TEE OS threads exceeded,
1494615e5a3SJens Wiklander  *                         try again later
1504615e5a3SJens Wiklander  * FFA_DENIED:             RPC shared memory object not found
1514615e5a3SJens Wiklander  * FFA_INVALID_PARAMETER:  Bad shared memory handle or offset into the memory
1524615e5a3SJens Wiklander  *
1534615e5a3SJens Wiklander  * Possible error codes for OPTEE_FFA_YIELDING_CALL_RESUME
1544615e5a3SJens Wiklander  * FFA_INVALID_PARAMETER:  Bad resume info
1554615e5a3SJens Wiklander  */
1564615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_WITH_ARG	OPTEE_FFA_YIELDING_CALL(0)
1574615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RESUME		OPTEE_FFA_YIELDING_CALL(1)
1584615e5a3SJens Wiklander 
1594615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_DONE		0
1604615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD		1
1614615e5a3SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT	2
1624615e5a3SJens Wiklander 
1634615e5a3SJens Wiklander #endif /*__OPTEE_FFA_H*/
164