1c13d4bd7SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2c13d4bd7SJens Wiklander /* 3*3c2e09b3SJens Wiklander * Copyright (c) 2019-2025, Linaro Limited 4c13d4bd7SJens Wiklander */ 5c13d4bd7SJens Wiklander 6c13d4bd7SJens Wiklander /* 7c13d4bd7SJens Wiklander * This file is exported by OP-TEE and is kept in sync between secure world 8c1bdf4fcSJens Wiklander * and normal world drivers. We're using ARM FF-A 1.0 specification. 9c13d4bd7SJens Wiklander */ 10c13d4bd7SJens Wiklander 11c13d4bd7SJens Wiklander #ifndef __OPTEE_FFA_H 12c13d4bd7SJens Wiklander #define __OPTEE_FFA_H 13c13d4bd7SJens Wiklander 14c13d4bd7SJens Wiklander #include <ffa.h> 15c13d4bd7SJens Wiklander 16c13d4bd7SJens Wiklander /* 17c13d4bd7SJens Wiklander * Normal world sends requests with FFA_MSG_SEND_DIRECT_REQ and 18c13d4bd7SJens Wiklander * responses are returned with FFA_MSG_SEND_DIRECT_RESP for normal 19c13d4bd7SJens Wiklander * messages. 20c13d4bd7SJens Wiklander * 21c13d4bd7SJens Wiklander * All requests with FFA_MSG_SEND_DIRECT_REQ and FFA_MSG_SEND_DIRECT_RESP 22c13d4bd7SJens Wiklander * are using the AArch32 SMC calling convention with register usage as 23c13d4bd7SJens Wiklander * defined in FF-A specification: 24c13d4bd7SJens Wiklander * w0: Function ID (0x8400006F or 0x84000070) 25c13d4bd7SJens Wiklander * w1: Source/Destination IDs 26c13d4bd7SJens Wiklander * w2: Reserved (MBZ) 27c13d4bd7SJens Wiklander * w3-w7: Implementation defined, free to be used below 28c13d4bd7SJens Wiklander */ 29c13d4bd7SJens Wiklander 30c1bdf4fcSJens Wiklander #define OPTEE_FFA_VERSION_MAJOR UINT32_C(1) 31c1bdf4fcSJens Wiklander #define OPTEE_FFA_VERSION_MINOR UINT32_C(0) 32c13d4bd7SJens Wiklander 33c13d4bd7SJens Wiklander #define OPTEE_FFA_BLOCKING_CALL(id) UINT32_C(id) 344a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_BIT U(31) 35c13d4bd7SJens Wiklander #define OPTEE_FFA_YIELDING_CALL(id) (UINT32_C(id) | \ 36c13d4bd7SJens Wiklander BIT32(OPTEE_FFA_YIELDING_CALL_BIT)) 37c13d4bd7SJens Wiklander 38c13d4bd7SJens Wiklander /* 39c13d4bd7SJens Wiklander * Returns the API version implemented, currently follows the FF-A version. 40c13d4bd7SJens Wiklander * Call register usage: 41c13d4bd7SJens Wiklander * w3: Service ID, OPTEE_FFA_GET_API_VERSION 42c13d4bd7SJens Wiklander * w4-w7: Not used (MBZ) 43c13d4bd7SJens Wiklander * 44c13d4bd7SJens Wiklander * Return register usage: 45c13d4bd7SJens Wiklander * w3: OPTEE_FFA_VERSION_MAJOR 46c13d4bd7SJens Wiklander * w4: OPTEE_FFA_VERSION_MINOR 47c13d4bd7SJens Wiklander * w5-w7: Not used (MBZ) 48c13d4bd7SJens Wiklander */ 49c13d4bd7SJens Wiklander #define OPTEE_FFA_GET_API_VERSION OPTEE_FFA_BLOCKING_CALL(0) 50c13d4bd7SJens Wiklander 51c13d4bd7SJens Wiklander /* 52c13d4bd7SJens Wiklander * Returns the revision of OP-TEE. 53c13d4bd7SJens Wiklander * 54c13d4bd7SJens Wiklander * Used by non-secure world to figure out which version of the Trusted OS 55c13d4bd7SJens Wiklander * is installed. Note that the returned revision is the revision of the 56c13d4bd7SJens Wiklander * Trusted OS, not of the API. 57c13d4bd7SJens Wiklander * 58c13d4bd7SJens Wiklander * Call register usage: 59c13d4bd7SJens Wiklander * w3: Service ID, OPTEE_FFA_GET_OS_VERSION 60c13d4bd7SJens Wiklander * w4-w7: Unused (MBZ) 61c13d4bd7SJens Wiklander * 62c13d4bd7SJens Wiklander * Return register usage: 63c13d4bd7SJens Wiklander * w3: CFG_OPTEE_REVISION_MAJOR 64c13d4bd7SJens Wiklander * w4: CFG_OPTEE_REVISION_MINOR 65c13d4bd7SJens Wiklander * w5: TEE_IMPL_GIT_SHA1 (or zero if not supported) 66c13d4bd7SJens Wiklander */ 67c13d4bd7SJens Wiklander #define OPTEE_FFA_GET_OS_VERSION OPTEE_FFA_BLOCKING_CALL(1) 68c13d4bd7SJens Wiklander 69c13d4bd7SJens Wiklander /* 70c13d4bd7SJens Wiklander * Exchange capabilities between normal world and secure world. 71c13d4bd7SJens Wiklander * 72c13d4bd7SJens Wiklander * Currently there are no defined capabilities. When features are added new 73c13d4bd7SJens Wiklander * capabilities may be added. 74c13d4bd7SJens Wiklander * 75c13d4bd7SJens Wiklander * Call register usage: 76c13d4bd7SJens Wiklander * w3: Service ID, OPTEE_FFA_EXCHANGE_CAPABILITIES 772e02a737SJens Wiklander * w4-w7: Not used (MBZ) 78c13d4bd7SJens Wiklander * 79c13d4bd7SJens Wiklander * Return register usage: 80c13d4bd7SJens Wiklander * w3: Error code, 0 on success 81c1bdf4fcSJens Wiklander * w4: Bit[7:0]: Number of parameters needed for RPC to be supplied 82c1bdf4fcSJens Wiklander * as the second MSG arg struct for 83c1bdf4fcSJens Wiklander * OPTEE_FFA_YIELDING_CALL_WITH_ARG. 84c1bdf4fcSJens Wiklander * Bit[31:8]: Reserved (MBZ) 852e02a737SJens Wiklander * w5: Bitfield of OP-TEE capabilities OPTEE_FFA_SEC_CAP_* 862e02a737SJens Wiklander * w6: The maximum secure world notification number 872e02a737SJens Wiklander * w7: Not used (MBZ) 88c13d4bd7SJens Wiklander */ 8989d99135SJens Wiklander /* 900cbde272SJens Wiklander * Secure world supports giving an offset into the argument shared memory 9189d99135SJens Wiklander * object, see also OPTEE_FFA_YIELDING_CALL_WITH_ARG 9289d99135SJens Wiklander */ 9389d99135SJens Wiklander #define OPTEE_FFA_SEC_CAP_ARG_OFFSET BIT(0) 942e02a737SJens Wiklander /* OP-TEE supports asynchronous notification via FF-A */ 952e02a737SJens Wiklander #define OPTEE_FFA_SEC_CAP_ASYNC_NOTIF BIT(1) 968dfdf392SJens Wiklander /* OP-TEE supports probing for RPMB device if needed */ 978dfdf392SJens Wiklander #define OPTEE_FFA_SEC_CAP_RPMB_PROBE BIT(2) 98*3c2e09b3SJens Wiklander /* OP-TEE supports Protected Memory for secure data path */ 99*3c2e09b3SJens Wiklander #define OPTEE_FFA_SEC_CAP_PROTMEM BIT(3) 10089d99135SJens Wiklander 101c13d4bd7SJens Wiklander #define OPTEE_FFA_EXCHANGE_CAPABILITIES OPTEE_FFA_BLOCKING_CALL(2) 102c13d4bd7SJens Wiklander 103c13d4bd7SJens Wiklander /* 104c1bdf4fcSJens Wiklander * Unregister shared memory 105c1bdf4fcSJens Wiklander * 106c1bdf4fcSJens Wiklander * Call register usage: 107c1bdf4fcSJens Wiklander * w3: Service ID, OPTEE_FFA_YIELDING_CALL_UNREGISTER_SHM 108c1bdf4fcSJens Wiklander * w4: Shared memory handle, lower bits 109c1bdf4fcSJens Wiklander * w5: Shared memory handle, higher bits 110c1bdf4fcSJens Wiklander * w6-w7: Not used (MBZ) 111c1bdf4fcSJens Wiklander * 112c1bdf4fcSJens Wiklander * Return register usage: 113c1bdf4fcSJens Wiklander * w3: Error code, 0 on success 114d2d2912dSJens Wiklander * w4-w7: Not used (MBZ) 115c1bdf4fcSJens Wiklander */ 116c1bdf4fcSJens Wiklander #define OPTEE_FFA_UNREGISTER_SHM OPTEE_FFA_BLOCKING_CALL(3) 117c1bdf4fcSJens Wiklander 118c1bdf4fcSJens Wiklander /* 1190cbde272SJens Wiklander * Inform OP-TEE that the normal world is able to receive asynchronous 1202e02a737SJens Wiklander * notifications. 1212e02a737SJens Wiklander * 1222e02a737SJens Wiklander * Call register usage: 1232e02a737SJens Wiklander * w3: Service ID, OPTEE_FFA_ENABLE_ASYNC_NOTIF 12455cd94d1SJens Wiklander * w4: Notification value to request bottom half processing, should be 12555cd94d1SJens Wiklander * less than OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE 1262e02a737SJens Wiklander * w5-w7: Not used (MBZ) 1272e02a737SJens Wiklander * 1282e02a737SJens Wiklander * Return register usage: 1292e02a737SJens Wiklander * w3: Error code, 0 on success 1302e02a737SJens Wiklander * w4-w7: Not used (MBZ) 1312e02a737SJens Wiklander */ 1322e02a737SJens Wiklander #define OPTEE_FFA_ENABLE_ASYNC_NOTIF OPTEE_FFA_BLOCKING_CALL(5) 1332e02a737SJens Wiklander 13455cd94d1SJens Wiklander #define OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE 64 13555cd94d1SJens Wiklander 1362e02a737SJens Wiklander /* 137*3c2e09b3SJens Wiklander * Release Protected memory 138*3c2e09b3SJens Wiklander * 139*3c2e09b3SJens Wiklander * Call register usage: 140*3c2e09b3SJens Wiklander * w3: Service ID, OPTEE_FFA_RECLAIM_PROTMEM 141*3c2e09b3SJens Wiklander * w4: Shared memory handle, lower bits 142*3c2e09b3SJens Wiklander * w5: Shared memory handle, higher bits 143*3c2e09b3SJens Wiklander * w6-w7: Not used (MBZ) 144*3c2e09b3SJens Wiklander * 145*3c2e09b3SJens Wiklander * Return register usage: 146*3c2e09b3SJens Wiklander * w3: Error code, 0 on success 147*3c2e09b3SJens Wiklander * w4-w7: Note used (MBZ) 148*3c2e09b3SJens Wiklander */ 149*3c2e09b3SJens Wiklander #define OPTEE_FFA_RELEASE_PROTMEM OPTEE_FFA_BLOCKING_CALL(8) 150*3c2e09b3SJens Wiklander 151*3c2e09b3SJens Wiklander /* 152c13d4bd7SJens Wiklander * Call with struct optee_msg_arg as argument in the supplied shared memory 153c13d4bd7SJens Wiklander * with a zero internal offset and normal cached memory attributes. 154c13d4bd7SJens Wiklander * Register usage: 155c13d4bd7SJens Wiklander * w3: Service ID, OPTEE_FFA_YIELDING_CALL_WITH_ARG 156c13d4bd7SJens Wiklander * w4: Lower 32 bits of a 64-bit Shared memory handle 157c13d4bd7SJens Wiklander * w5: Upper 32 bits of a 64-bit Shared memory handle 158c13d4bd7SJens Wiklander * w6: Offset into shared memory pointing to a struct optee_msg_arg 159c1bdf4fcSJens Wiklander * right after the parameters of this struct (at offset 160c1bdf4fcSJens Wiklander * OPTEE_MSG_GET_ARG_SIZE(num_params) follows a struct optee_msg_arg 161c1bdf4fcSJens Wiklander * for RPC, this struct has reserved space for the number of RPC 162c1bdf4fcSJens Wiklander * parameters as returned by OPTEE_FFA_EXCHANGE_CAPABILITIES. 16389d99135SJens Wiklander * MBZ unless the bit OPTEE_FFA_SEC_CAP_ARG_OFFSET is received with 16489d99135SJens Wiklander * OPTEE_FFA_EXCHANGE_CAPABILITIES. 165c13d4bd7SJens Wiklander * w7: Not used (MBZ) 166c13d4bd7SJens Wiklander * Resume from RPC. Register usage: 167c13d4bd7SJens Wiklander * w3: Service ID, OPTEE_FFA_YIELDING_CALL_RESUME 168c13d4bd7SJens Wiklander * w4-w6: Not used (MBZ) 169c13d4bd7SJens Wiklander * w7: Resume info 170c13d4bd7SJens Wiklander * 171c13d4bd7SJens Wiklander * Normal return (yielding call is completed). Register usage: 172c13d4bd7SJens Wiklander * w3: Error code, 0 on success 173c13d4bd7SJens Wiklander * w4: OPTEE_FFA_YIELDING_CALL_RETURN_DONE 174c13d4bd7SJens Wiklander * w5-w7: Not used (MBZ) 175c13d4bd7SJens Wiklander * 176c13d4bd7SJens Wiklander * RPC interrupt return (RPC from secure world). Register usage: 177c13d4bd7SJens Wiklander * w3: Error code == 0 178c1bdf4fcSJens Wiklander * w4: Any defined RPC code but OPTEE_FFA_YIELDING_CALL_RETURN_DONE 179c13d4bd7SJens Wiklander * w5-w6: Not used (MBZ) 180c13d4bd7SJens Wiklander * w7: Resume info 181c13d4bd7SJens Wiklander * 182c13d4bd7SJens Wiklander * Possible error codes in register w3: 183c13d4bd7SJens Wiklander * 0: Success 184c13d4bd7SJens Wiklander * FFA_DENIED: w4 isn't one of OPTEE_FFA_YIELDING_CALL_START 185c13d4bd7SJens Wiklander * OPTEE_FFA_YIELDING_CALL_RESUME 186c13d4bd7SJens Wiklander * 187c13d4bd7SJens Wiklander * Possible error codes for OPTEE_FFA_YIELDING_CALL_START, 188c13d4bd7SJens Wiklander * FFA_BUSY: Number of OP-TEE OS threads exceeded, 189c13d4bd7SJens Wiklander * try again later 190c13d4bd7SJens Wiklander * FFA_DENIED: RPC shared memory object not found 191c13d4bd7SJens Wiklander * FFA_INVALID_PARAMETER: Bad shared memory handle or offset into the memory 192c13d4bd7SJens Wiklander * 193c13d4bd7SJens Wiklander * Possible error codes for OPTEE_FFA_YIELDING_CALL_RESUME 194c13d4bd7SJens Wiklander * FFA_INVALID_PARAMETER: Bad resume info 195c13d4bd7SJens Wiklander */ 196c13d4bd7SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_WITH_ARG OPTEE_FFA_YIELDING_CALL(0) 197c1bdf4fcSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RESUME OPTEE_FFA_YIELDING_CALL(1) 198c13d4bd7SJens Wiklander 1994a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_DONE U(0) 2004a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD U(1) 2014a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT U(2) 202c13d4bd7SJens Wiklander 203c13d4bd7SJens Wiklander #endif /*__OPTEE_FFA_H*/ 204