| /* |
| * Copyright (c) 2023 EPAM Systems |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @file drivers/tee.h |
| * |
| * @brief Public APIs for the tee driver. |
| */ |
| |
| /* |
| * Copyright (c) 2015-2016, Linaro Limited |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| #ifndef ZEPHYR_INCLUDE_DRIVERS_TEE_H_ |
| #define ZEPHYR_INCLUDE_DRIVERS_TEE_H_ |
| |
| #include <zephyr/device.h> |
| #include <zephyr/kernel.h> |
| #include <zephyr/sys/util.h> |
| |
| /** |
| * @brief Trusted Execution Environment Interface |
| * @defgroup tee_interface TEE Interface |
| * @ingroup io_interfaces |
| * @{ |
| * |
| * The generic interface to work with Trusted Execution Environment (TEE). |
| * TEE is Trusted OS, running in the Secure Space, such as TrustZone in ARM cpus. |
| * It also can be presented as the separate secure co-processors. It allows system |
| * to implement logic, separated from the Normal World. |
| * |
| * Using TEE syscalls: |
| * - tee_get_version() to get current TEE capabilities |
| * - tee_open_session() to open new session to the TA |
| * - tee_close_session() to close session to the TA |
| * - tee_cancel() to cancel session or invoke function |
| * - tee_invoke_func() to invoke function to the TA |
| * - tee_shm_register() to register shared memory region |
| * - tee_shm_unregister() to unregister shared memory region |
| * - tee_shm_alloc() to allocate shared memory region |
| * - tee_shm_free() to free shared memory region |
| */ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| #define TEE_UUID_LEN 16 |
| |
| #define TEE_GEN_CAP_GP BIT(0) /* GlobalPlatform compliant TEE */ |
| #define TEE_GEN_CAP_PRIVILEGED BIT(1) /* Privileged device (for supplicant) */ |
| #define TEE_GEN_CAP_REG_MEM BIT(2) /* Supports registering shared memory */ |
| #define TEE_GEN_CAP_MEMREF_NULL BIT(3) /* Support NULL MemRef */ |
| |
| #define TEE_SHM_REGISTER BIT(0) |
| #define TEE_SHM_ALLOC BIT(1) |
| |
| #define TEE_PARAM_ATTR_TYPE_NONE 0 /* parameter not used */ |
| #define TEE_PARAM_ATTR_TYPE_VALUE_INPUT 1 |
| #define TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT 2 |
| #define TEE_PARAM_ATTR_TYPE_VALUE_INOUT 3 /* input and output */ |
| #define TEE_PARAM_ATTR_TYPE_MEMREF_INPUT 5 |
| #define TEE_PARAM_ATTR_TYPE_MEMREF_OUTPUT 6 |
| #define TEE_PARAM_ATTR_TYPE_MEMREF_INOUT 7 /* input and output */ |
| #define TEE_PARAM_ATTR_TYPE_MASK 0xff |
| #define TEE_PARAM_ATTR_META 0x100 |
| #define TEE_PARAM_ATTR_MASK (TEE_PARAM_ATTR_TYPE_MASK | TEE_PARAM_ATTR_META) |
| |
| /** |
| * @brief Function error origins, of type TEEC_ErrorOrigin. These indicate where in |
| * the software stack a particular return value originates from. |
| * |
| * TEEC_ORIGIN_API The error originated within the TEE Client API |
| * implementation. |
| * TEEC_ORIGIN_COMMS The error originated within the underlying |
| * communications stack linking the rich OS with |
| * the TEE. |
| * TEEC_ORIGIN_TEE The error originated within the common TEE code. |
| * TEEC_ORIGIN_TRUSTED_APP The error originated within the Trusted Application |
| * code. |
| */ |
| #define TEEC_ORIGIN_API 0x00000001 |
| #define TEEC_ORIGIN_COMMS 0x00000002 |
| #define TEEC_ORIGIN_TEE 0x00000003 |
| #define TEEC_ORIGIN_TRUSTED_APP 0x00000004 |
| |
| /** |
| * Return values. Type is TEEC_Result |
| * |
| * TEEC_SUCCESS The operation was successful. |
| * TEEC_ERROR_GENERIC Non-specific cause. |
| * TEEC_ERROR_ACCESS_DENIED Access privileges are not sufficient. |
| * TEEC_ERROR_CANCEL The operation was canceled. |
| * TEEC_ERROR_ACCESS_CONFLICT Concurrent accesses caused conflict. |
| * TEEC_ERROR_EXCESS_DATA Too much data for the requested operation was |
| * passed. |
| * TEEC_ERROR_BAD_FORMAT Input data was of invalid format. |
| * TEEC_ERROR_BAD_PARAMETERS Input parameters were invalid. |
| * TEEC_ERROR_BAD_STATE Operation is not valid in the current state. |
| * TEEC_ERROR_ITEM_NOT_FOUND The requested data item is not found. |
| * TEEC_ERROR_NOT_IMPLEMENTED The requested operation should exist but is not |
| * yet implemented. |
| * TEEC_ERROR_NOT_SUPPORTED The requested operation is valid but is not |
| * supported in this implementation. |
| * TEEC_ERROR_NO_DATA Expected data was missing. |
| * TEEC_ERROR_OUT_OF_MEMORY System ran out of resources. |
| * TEEC_ERROR_BUSY The system is busy working on something else. |
| * TEEC_ERROR_COMMUNICATION Communication with a remote party failed. |
| * TEEC_ERROR_SECURITY A security fault was detected. |
| * TEEC_ERROR_SHORT_BUFFER The supplied buffer is too short for the |
| * generated output. |
| * TEEC_ERROR_TARGET_DEAD Trusted Application has panicked |
| * during the operation. |
| */ |
| |
| /** |
| * Standard defined error codes. |
| */ |
| #define TEEC_SUCCESS 0x00000000 |
| #define TEEC_ERROR_STORAGE_NOT_AVAILABLE 0xF0100003 |
| #define TEEC_ERROR_GENERIC 0xFFFF0000 |
| #define TEEC_ERROR_ACCESS_DENIED 0xFFFF0001 |
| #define TEEC_ERROR_CANCEL 0xFFFF0002 |
| #define TEEC_ERROR_ACCESS_CONFLICT 0xFFFF0003 |
| #define TEEC_ERROR_EXCESS_DATA 0xFFFF0004 |
| #define TEEC_ERROR_BAD_FORMAT 0xFFFF0005 |
| #define TEEC_ERROR_BAD_PARAMETERS 0xFFFF0006 |
| #define TEEC_ERROR_BAD_STATE 0xFFFF0007 |
| #define TEEC_ERROR_ITEM_NOT_FOUND 0xFFFF0008 |
| #define TEEC_ERROR_NOT_IMPLEMENTED 0xFFFF0009 |
| #define TEEC_ERROR_NOT_SUPPORTED 0xFFFF000A |
| #define TEEC_ERROR_NO_DATA 0xFFFF000B |
| #define TEEC_ERROR_OUT_OF_MEMORY 0xFFFF000C |
| #define TEEC_ERROR_BUSY 0xFFFF000D |
| #define TEEC_ERROR_COMMUNICATION 0xFFFF000E |
| #define TEEC_ERROR_SECURITY 0xFFFF000F |
| #define TEEC_ERROR_SHORT_BUFFER 0xFFFF0010 |
| #define TEEC_ERROR_EXTERNAL_CANCEL 0xFFFF0011 |
| #define TEEC_ERROR_TARGET_DEAD 0xFFFF3024 |
| #define TEEC_ERROR_STORAGE_NO_SPACE 0xFFFF3041 |
| |
| /** |
| * Session login methods, for use in tee_open_session() as parameter |
| * connectionMethod. Type is uint32_t. |
| * |
| * TEEC_LOGIN_PUBLIC No login data is provided. |
| * TEEC_LOGIN_USER Login data about the user running the Client |
| * Application process is provided. |
| * TEEC_LOGIN_GROUP Login data about the group running the Client |
| * Application process is provided. |
| * TEEC_LOGIN_APPLICATION Login data about the running Client Application |
| * itself is provided. |
| * TEEC_LOGIN_USER_APPLICATION Login data about the user and the running |
| * Client Application itself is provided. |
| * TEEC_LOGIN_GROUP_APPLICATION Login data about the group and the running |
| * Client Application itself is provided. |
| */ |
| #define TEEC_LOGIN_PUBLIC 0x00000000 |
| #define TEEC_LOGIN_USER 0x00000001 |
| #define TEEC_LOGIN_GROUP 0x00000002 |
| #define TEEC_LOGIN_APPLICATION 0x00000004 |
| #define TEEC_LOGIN_USER_APPLICATION 0x00000005 |
| #define TEEC_LOGIN_GROUP_APPLICATION 0x00000006 |
| |
| /** |
| * @brief TEE version |
| * |
| * Identifies the TEE implementation,@ref impl_id is one of TEE_IMPL_ID_* above. |
| * @ref impl_caps is implementation specific, for example TEE_OPTEE_CAP_* |
| * is valid when @ref impl_id == TEE_IMPL_ID_OPTEE. |
| */ |
| struct tee_version_info { |
| uint32_t impl_id; /**< [out] TEE implementation id */ |
| uint32_t impl_caps; /**< [out] implementation specific capabilities */ |
| uint32_t gen_caps; /**< Generic capabilities, defined by TEE_GEN_CAPS_* above */ |
| }; |
| |
| /** |
| * @brief - Open session argument |
| */ |
| struct tee_open_session_arg { |
| uint8_t uuid[TEE_UUID_LEN]; /**< [in] UUID of the Trusted Application */ |
| uint8_t clnt_uuid[TEE_UUID_LEN]; /**< [in] UUID of client */ |
| uint32_t clnt_login; /**< login class of client, TEE_IOCTL_LOGIN_* above */ |
| uint32_t cancel_id; /**< [in] cancellation id, a unique value to identify this request */ |
| uint32_t session; /**< [out] session id */ |
| uint32_t ret; /**< [out] return value */ |
| uint32_t ret_origin; /**< [out] origin of the return value */ |
| }; |
| |
| /** |
| * @brief Tee parameter |
| * |
| * @ref attr & TEE_PARAM_ATTR_TYPE_MASK indicates if memref or value is used in |
| * the union. TEE_PARAM_ATTR_TYPE_VALUE_* indicates value and |
| * TEE_PARAM_ATTR_TYPE_MEMREF_* indicates memref. TEE_PARAM_ATTR_TYPE_NONE |
| * indicates that none of the members are used. |
| * |
| * Shared memory is allocated with TEE_IOC_SHM_ALLOC which returns an |
| * identifier representing the shared memory object. A memref can reference |
| * a part of a shared memory by specifying an offset (@ref a) and size (@ref b) of |
| * the object. To supply the entire shared memory object set the offset |
| * (@ref a) to 0 and size (@ref b) to the previously returned size of the object. |
| */ |
| struct tee_param { |
| uint64_t attr; /**< attributes */ |
| uint64_t a; /**< if a memref, offset into the shared memory object, else a value*/ |
| uint64_t b; /**< if a memref, size of the buffer, else a value parameter */ |
| uint64_t c; /**< if a memref, shared memory identifier, else a value parameter */ |
| }; |
| |
| /** |
| * @brief Invokes a function in a Trusted Application |
| */ |
| struct tee_invoke_func_arg { |
| uint32_t func; /**< [in] Trusted Application function, specific to the TA */ |
| uint32_t session; /**< [in] session id */ |
| uint32_t cancel_id; /**< [in] cancellation id, a unique value to identify this request */ |
| uint32_t ret; /**< [out] return value */ |
| uint32_t ret_origin; /**< [out] origin of the return value */ |
| }; |
| |
| /** |
| * @brief Tee shared memory structure |
| */ |
| struct tee_shm { |
| const struct device *dev; /**< [out] pointer to the device driver structure */ |
| void *addr; /**< [out] shared buffer pointer */ |
| uint64_t size; /**< [out] shared buffer size */ |
| uint32_t flags; /**< [out] shared buffer flags */ |
| }; |
| |
| /** |
| * @typedef tee_get_version_t |
| * |
| * @brief Callback API to get current tee version |
| * |
| * See @a tee_version_get() for argument definitions. |
| */ |
| typedef int (*tee_get_version_t)(const struct device *dev, struct tee_version_info *info); |
| |
| /** |
| * @typedef tee_open_session_t |
| * |
| * @brief Callback API to open session to Trusted Application |
| * |
| * See @a tee_open_session() for argument definitions. |
| */ |
| typedef int (*tee_open_session_t)(const struct device *dev, struct tee_open_session_arg *arg, |
| unsigned int num_param, struct tee_param *param, |
| uint32_t *session_id); |
| /** |
| * @typedef tee_close_session_t |
| * |
| * @brief Callback API to close session to TA |
| * |
| * See @a tee_close_session() for argument definitions. |
| */ |
| typedef int (*tee_close_session_t)(const struct device *dev, uint32_t session_id); |
| |
| /** |
| * @typedef tee_cancel_t |
| * |
| * @brief Callback API to cancel open session of invoke function to TA |
| * |
| * See @a tee_cancel() for argument definitions. |
| */ |
| typedef int (*tee_cancel_t)(const struct device *dev, uint32_t session_id, uint32_t cancel_id); |
| |
| /** |
| * @typedef tee_invoke_func_t |
| * |
| * @brief Callback API to invoke function to TA |
| * |
| * See @a tee_invoke_func() for argument definitions. |
| */ |
| typedef int (*tee_invoke_func_t)(const struct device *dev, struct tee_invoke_func_arg *arg, |
| unsigned int num_param, struct tee_param *param); |
| /** |
| * @typedef tee_shm_register_t |
| * |
| * @brief Callback API to register shared memory |
| * |
| * See @a tee_shm_register() for argument definitions. |
| */ |
| typedef int (*tee_shm_register_t)(const struct device *dev, struct tee_shm *shm); |
| |
| /** |
| * @typedef tee_shm_unregister_t |
| * |
| * @brief Callback API to unregister shared memory |
| * |
| * See @a tee_shm_unregister() for argument definitions. |
| */ |
| typedef int (*tee_shm_unregister_t)(const struct device *dev, struct tee_shm *shm); |
| |
| /** |
| * @typedef tee_suppl_recv_t |
| * |
| * @brief Callback API to receive a request for TEE supplicant |
| * |
| * See @a tee_suppl_recv() for argument definitions. |
| */ |
| typedef int (*tee_suppl_recv_t)(const struct device *dev, uint32_t *func, unsigned int *num_params, |
| struct tee_param *param); |
| |
| /** |
| * @typedef tee_suppl_send_t |
| * |
| * @brief Callback API to send a request for TEE supplicant |
| * |
| * See @a tee_suppl_send() for argument definitions. |
| */ |
| typedef int (*tee_suppl_send_t)(const struct device *dev, unsigned int ret, unsigned int num_params, |
| struct tee_param *param); |
| |
| __subsystem struct tee_driver_api { |
| tee_get_version_t get_version; |
| tee_open_session_t open_session; |
| tee_close_session_t close_session; |
| tee_cancel_t cancel; |
| tee_invoke_func_t invoke_func; |
| tee_shm_register_t shm_register; |
| tee_shm_unregister_t shm_unregister; |
| tee_suppl_recv_t suppl_recv; |
| tee_suppl_send_t suppl_send; |
| }; |
| |
| /** |
| * @brief Get the current TEE version info |
| * |
| * Returns info as tee version info which includes capabilities description |
| * |
| * @param dev TEE device |
| * @param info Structure to return the capabilities |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_get_version(const struct device *dev, struct tee_version_info *info); |
| |
| static inline int z_impl_tee_get_version(const struct device *dev, struct tee_version_info *info) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->get_version) { |
| return -ENOSYS; |
| } |
| |
| return api->get_version(dev, info); |
| } |
| |
| /** |
| * @brief Open session for Trusted Environment |
| * |
| * Opens the new session to the Trusted Environment |
| * |
| * @param dev TEE device |
| * @param arg Structure with the session arguments |
| * @param num_param Number of the additional params to be passed |
| * @param param List of the params to pass to open_session call |
| * @param session_id Returns id of the created session |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_open_session(const struct device *dev, struct tee_open_session_arg *arg, |
| unsigned int num_param, struct tee_param *param, |
| uint32_t *session_id); |
| |
| static inline int z_impl_tee_open_session(const struct device *dev, |
| struct tee_open_session_arg *arg, |
| unsigned int num_param, struct tee_param *param, |
| uint32_t *session_id) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->open_session) { |
| return -ENOSYS; |
| } |
| |
| return api->open_session(dev, arg, num_param, param, session_id); |
| } |
| |
| /** |
| * @brief Close session for Trusted Environment |
| * |
| * Closes session to the Trusted Environment |
| * |
| * @param dev TEE device |
| * @param session_id session to close |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_close_session(const struct device *dev, uint32_t session_id); |
| |
| static inline int z_impl_tee_close_session(const struct device *dev, uint32_t session_id) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->close_session) { |
| return -ENOSYS; |
| } |
| |
| return api->close_session(dev, session_id); |
| } |
| |
| /** |
| * @brief Cancel session or invoke function for Trusted Environment |
| * |
| * Cancels session or invoke function for TA |
| * |
| * @param dev TEE device |
| * @param session_id session to close |
| * @param cancel_id cancel reason |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_cancel(const struct device *dev, uint32_t session_id, uint32_t cancel_id); |
| |
| static inline int z_impl_tee_cancel(const struct device *dev, uint32_t session_id, |
| uint32_t cancel_id) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->cancel) { |
| return -ENOSYS; |
| } |
| |
| return api->cancel(dev, session_id, cancel_id); |
| } |
| |
| /** |
| * @brief Invoke function for Trusted Environment Application |
| * |
| * Invokes function to the TA |
| * |
| * @param dev TEE device |
| * @param arg Structure with the invoke function arguments |
| * @param num_param Number of the additional params to be passed |
| * @param param List of the params to pass to open_session call |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_invoke_func(const struct device *dev, struct tee_invoke_func_arg *arg, |
| unsigned int num_param, struct tee_param *param); |
| |
| static inline int z_impl_tee_invoke_func(const struct device *dev, struct tee_invoke_func_arg *arg, |
| unsigned int num_param, struct tee_param *param) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->invoke_func) { |
| return -ENOSYS; |
| } |
| |
| return api->invoke_func(dev, arg, num_param, param); |
| } |
| |
| /** |
| * @brief Helper function to allocate and register shared memory |
| * |
| * Allocates and registers shared memory for TEE |
| * |
| * @param dev TEE device |
| * @param addr Address of the shared memory |
| * @param align Region alignment |
| * @param size Size of the shared memory region |
| * @param flags Flags to set registering parameters |
| * @param shmp Return shared memory structure |
| * |
| * @retval 0 On success, negative on error |
| */ |
| int tee_add_shm(const struct device *dev, void *addr, size_t align, size_t size, uint32_t flags, |
| struct tee_shm **shmp); |
| |
| /** |
| * @brief Helper function to remove and unregister shared memory |
| * |
| * Removes and unregisters shared memory for TEE |
| * |
| * @param dev TEE device |
| * @param shm Pointer to tee_shm structure |
| * |
| * @retval 0 On success, negative on error |
| */ |
| int tee_rm_shm(const struct device *dev, struct tee_shm *shm); |
| |
| /** |
| * @brief Register shared memory for Trusted Environment |
| * |
| * Registers shared memory for TEE |
| * |
| * @param dev TEE device |
| * @param addr Address of the shared memory |
| * @param size Size of the shared memory region |
| * @param flags Flags to set registering parameters |
| * @param shm Return shared memory structure |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_shm_register(const struct device *dev, void *addr, size_t size, |
| uint32_t flags, struct tee_shm **shm); |
| |
| static inline int z_impl_tee_shm_register(const struct device *dev, void *addr, size_t size, |
| uint32_t flags, struct tee_shm **shm) |
| { |
| flags &= ~TEE_SHM_ALLOC; |
| return tee_add_shm(dev, addr, 0, size, flags | TEE_SHM_REGISTER, shm); |
| } |
| |
| /** |
| * @brief Unregister shared memory for Trusted Environment |
| * |
| * Unregisters shared memory for TEE |
| * |
| * @param dev TEE device |
| * @param shm Shared memory structure |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_shm_unregister(const struct device *dev, struct tee_shm *shm); |
| |
| static inline int z_impl_tee_shm_unregister(const struct device *dev, struct tee_shm *shm) |
| { |
| return tee_rm_shm(dev, shm); |
| } |
| |
| /** |
| * @brief Allocate shared memory region for Trusted Environment |
| * |
| * Allocate shared memory for TEE |
| * |
| * @param dev TEE device |
| * @param size Region size |
| * @param flags to allocate region |
| * @param shm Return shared memory structure |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_shm_alloc(const struct device *dev, size_t size, uint32_t flags, |
| struct tee_shm **shm); |
| |
| static inline int z_impl_tee_shm_alloc(const struct device *dev, size_t size, uint32_t flags, |
| struct tee_shm **shm) |
| { |
| return tee_add_shm(dev, NULL, 0, size, flags | TEE_SHM_ALLOC | TEE_SHM_REGISTER, shm); |
| } |
| |
| /** |
| * @brief Free shared memory region for Trusted Environment |
| * |
| * Frees shared memory for TEE |
| * |
| * @param dev TEE device |
| * @param shm Shared memory structure |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_shm_free(const struct device *dev, struct tee_shm *shm); |
| |
| static inline int z_impl_tee_shm_free(const struct device *dev, struct tee_shm *shm) |
| { |
| return tee_rm_shm(dev, shm); |
| } |
| |
| /** |
| * @brief Receive a request for TEE Supplicant |
| * |
| * @param dev TEE device |
| * @param func Supplicant function |
| * @param num_params Number of parameters to be passed |
| * @param param List of the params for send/receive |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_suppl_recv(const struct device *dev, uint32_t *func, unsigned int *num_params, |
| struct tee_param *param); |
| |
| static inline int z_impl_tee_suppl_recv(const struct device *dev, uint32_t *func, |
| unsigned int *num_params, struct tee_param *param) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->suppl_recv) { |
| return -ENOSYS; |
| } |
| |
| return api->suppl_recv(dev, func, num_params, param); |
| } |
| |
| /** |
| * @brief Send a request for TEE Supplicant function |
| * |
| * @param dev TEE device |
| * @param ret supplicant return code |
| * @param num_params Number of parameters to be passed |
| * @param param List of the params for send/receive |
| * |
| * @retval -ENOSYS If callback was not implemented |
| * @retval Return value for sent request |
| * |
| * @retval 0 On success, negative on error |
| */ |
| __syscall int tee_suppl_send(const struct device *dev, unsigned int ret, unsigned int num_params, |
| struct tee_param *param); |
| |
| static inline int z_impl_tee_suppl_send(const struct device *dev, unsigned int ret, |
| unsigned int num_params, struct tee_param *param) |
| { |
| const struct tee_driver_api *api = (const struct tee_driver_api *)dev->api; |
| |
| if (!api->suppl_send) { |
| return -ENOSYS; |
| } |
| |
| return api->suppl_send(dev, ret, num_params, param); |
| } |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** |
| * @} |
| */ |
| |
| #include <zephyr/syscalls/tee.h> |
| |
| #endif /* ZEPHYR_INCLUDE_DRIVERS_TEE_H_ */ |