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