mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
optee: sync OP-TEE headers
Pulls in updates in the internal headers from OP-TEE OS [1]. A few defines has been shortened, hence the changes in rpc.c. Defines not used by the driver in tee_rpc_cmd.h has been filtered out. Note that this does not change the ABI. Link: [1] https://github.com/OP-TEE/optee_os Reviewed-by: Sumit Garg <sumit.garg@linaro.org> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) */
|
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2019, Linaro Limited
|
* Copyright (c) 2015-2021, Linaro Limited
|
||||||
*/
|
*/
|
||||||
#ifndef _OPTEE_MSG_H
|
#ifndef _OPTEE_MSG_H
|
||||||
#define _OPTEE_MSG_H
|
#define _OPTEE_MSG_H
|
||||||
@@ -12,11 +12,9 @@
|
|||||||
* This file defines the OP-TEE message protocol used to communicate
|
* This file defines the OP-TEE message protocol used to communicate
|
||||||
* with an instance of OP-TEE running in secure world.
|
* with an instance of OP-TEE running in secure world.
|
||||||
*
|
*
|
||||||
* This file is divided into three sections.
|
* This file is divided into two sections.
|
||||||
* 1. Formatting of messages.
|
* 1. Formatting of messages.
|
||||||
* 2. Requests from normal world
|
* 2. Requests from normal world
|
||||||
* 3. Requests from secure world, Remote Procedure Call (RPC), handled by
|
|
||||||
* tee-supplicant.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -54,8 +52,8 @@
|
|||||||
* Every entry in buffer should point to a 4k page beginning (12 least
|
* Every entry in buffer should point to a 4k page beginning (12 least
|
||||||
* significant bits must be equal to zero).
|
* significant bits must be equal to zero).
|
||||||
*
|
*
|
||||||
* 12 least significant bints of optee_msg_param.u.tmem.buf_ptr should hold page
|
* 12 least significant bits of optee_msg_param.u.tmem.buf_ptr should hold
|
||||||
* offset of the user buffer.
|
* page offset of user buffer.
|
||||||
*
|
*
|
||||||
* So, entries should be placed like members of this structure:
|
* So, entries should be placed like members of this structure:
|
||||||
*
|
*
|
||||||
@@ -176,17 +174,9 @@ struct optee_msg_param {
|
|||||||
* @params: the parameters supplied to the OS Command
|
* @params: the parameters supplied to the OS Command
|
||||||
*
|
*
|
||||||
* All normal calls to Trusted OS uses this struct. If cmd requires further
|
* All normal calls to Trusted OS uses this struct. If cmd requires further
|
||||||
* information than what these field holds it can be passed as a parameter
|
* information than what these fields hold it can be passed as a parameter
|
||||||
* tagged as meta (setting the OPTEE_MSG_ATTR_META bit in corresponding
|
* tagged as meta (setting the OPTEE_MSG_ATTR_META bit in corresponding
|
||||||
* attrs field). All parameters tagged as meta has to come first.
|
* attrs field). All parameters tagged as meta have to come first.
|
||||||
*
|
|
||||||
* Temp memref parameters can be fragmented if supported by the Trusted OS
|
|
||||||
* (when optee_smc.h is bearer of this protocol this is indicated with
|
|
||||||
* OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM). If a logical memref parameter is
|
|
||||||
* fragmented then has all but the last fragment the
|
|
||||||
* OPTEE_MSG_ATTR_FRAGMENT bit set in attrs. Even if a memref is fragmented
|
|
||||||
* it will still be presented as a single logical memref to the Trusted
|
|
||||||
* Application.
|
|
||||||
*/
|
*/
|
||||||
struct optee_msg_arg {
|
struct optee_msg_arg {
|
||||||
u32 cmd;
|
u32 cmd;
|
||||||
@@ -290,15 +280,12 @@ struct optee_msg_arg {
|
|||||||
* OPTEE_MSG_CMD_REGISTER_SHM registers a shared memory reference. The
|
* OPTEE_MSG_CMD_REGISTER_SHM registers a shared memory reference. The
|
||||||
* information is passed as:
|
* information is passed as:
|
||||||
* [in] param[0].attr OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
|
* [in] param[0].attr OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
|
||||||
* [| OPTEE_MSG_ATTR_FRAGMENT]
|
* [| OPTEE_MSG_ATTR_NONCONTIG]
|
||||||
* [in] param[0].u.tmem.buf_ptr physical address (of first fragment)
|
* [in] param[0].u.tmem.buf_ptr physical address (of first fragment)
|
||||||
* [in] param[0].u.tmem.size size (of first fragment)
|
* [in] param[0].u.tmem.size size (of first fragment)
|
||||||
* [in] param[0].u.tmem.shm_ref holds shared memory reference
|
* [in] param[0].u.tmem.shm_ref holds shared memory reference
|
||||||
* ...
|
|
||||||
* The shared memory can optionally be fragmented, temp memrefs can follow
|
|
||||||
* each other with all but the last with the OPTEE_MSG_ATTR_FRAGMENT bit set.
|
|
||||||
*
|
*
|
||||||
* OPTEE_MSG_CMD_UNREGISTER_SHM unregisteres a previously registered shared
|
* OPTEE_MSG_CMD_UNREGISTER_SHM unregisters a previously registered shared
|
||||||
* memory reference. The information is passed as:
|
* memory reference. The information is passed as:
|
||||||
* [in] param[0].attr OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
|
* [in] param[0].attr OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
|
||||||
* [in] param[0].u.rmem.shm_ref holds shared memory reference
|
* [in] param[0].u.rmem.shm_ref holds shared memory reference
|
||||||
@@ -313,131 +300,4 @@ struct optee_msg_arg {
|
|||||||
#define OPTEE_MSG_CMD_UNREGISTER_SHM 5
|
#define OPTEE_MSG_CMD_UNREGISTER_SHM 5
|
||||||
#define OPTEE_MSG_FUNCID_CALL_WITH_ARG 0x0004
|
#define OPTEE_MSG_FUNCID_CALL_WITH_ARG 0x0004
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Part 3 - Requests from secure world, RPC
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All RPC is done with a struct optee_msg_arg as bearer of information,
|
|
||||||
* struct optee_msg_arg::arg holds values defined by OPTEE_MSG_RPC_CMD_* below
|
|
||||||
*
|
|
||||||
* RPC communication with tee-supplicant is reversed compared to normal
|
|
||||||
* client communication desribed above. The supplicant receives requests
|
|
||||||
* and sends responses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Load a TA into memory, defined in tee-supplicant
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_LOAD_TA 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reserved
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_RPMB 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* File system access, defined in tee-supplicant
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_FS 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get time
|
|
||||||
*
|
|
||||||
* Returns number of seconds and nano seconds since the Epoch,
|
|
||||||
* 1970-01-01 00:00:00 +0000 (UTC).
|
|
||||||
*
|
|
||||||
* [out] param[0].u.value.a Number of seconds
|
|
||||||
* [out] param[0].u.value.b Number of nano seconds.
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_GET_TIME 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wait queue primitive, helper for secure world to implement a wait queue.
|
|
||||||
*
|
|
||||||
* If secure world need to wait for a secure world mutex it issues a sleep
|
|
||||||
* request instead of spinning in secure world. Conversely is a wakeup
|
|
||||||
* request issued when a secure world mutex with a thread waiting thread is
|
|
||||||
* unlocked.
|
|
||||||
*
|
|
||||||
* Waiting on a key
|
|
||||||
* [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP
|
|
||||||
* [in] param[0].u.value.b wait key
|
|
||||||
*
|
|
||||||
* Waking up a key
|
|
||||||
* [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP
|
|
||||||
* [in] param[0].u.value.b wakeup key
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_WAIT_QUEUE 4
|
|
||||||
#define OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP 0
|
|
||||||
#define OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Suspend execution
|
|
||||||
*
|
|
||||||
* [in] param[0].value .a number of milliseconds to suspend
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_SUSPEND 5
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate a piece of shared memory
|
|
||||||
*
|
|
||||||
* Shared memory can optionally be fragmented, to support that additional
|
|
||||||
* spare param entries are allocated to make room for eventual fragments.
|
|
||||||
* The spare param entries has .attr = OPTEE_MSG_ATTR_TYPE_NONE when
|
|
||||||
* unused. All returned temp memrefs except the last should have the
|
|
||||||
* OPTEE_MSG_ATTR_FRAGMENT bit set in the attr field.
|
|
||||||
*
|
|
||||||
* [in] param[0].u.value.a type of memory one of
|
|
||||||
* OPTEE_MSG_RPC_SHM_TYPE_* below
|
|
||||||
* [in] param[0].u.value.b requested size
|
|
||||||
* [in] param[0].u.value.c required alignment
|
|
||||||
*
|
|
||||||
* [out] param[0].u.tmem.buf_ptr physical address (of first fragment)
|
|
||||||
* [out] param[0].u.tmem.size size (of first fragment)
|
|
||||||
* [out] param[0].u.tmem.shm_ref shared memory reference
|
|
||||||
* ...
|
|
||||||
* [out] param[n].u.tmem.buf_ptr physical address
|
|
||||||
* [out] param[n].u.tmem.size size
|
|
||||||
* [out] param[n].u.tmem.shm_ref shared memory reference (same value
|
|
||||||
* as in param[n-1].u.tmem.shm_ref)
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_SHM_ALLOC 6
|
|
||||||
/* Memory that can be shared with a non-secure user space application */
|
|
||||||
#define OPTEE_MSG_RPC_SHM_TYPE_APPL 0
|
|
||||||
/* Memory only shared with non-secure kernel */
|
|
||||||
#define OPTEE_MSG_RPC_SHM_TYPE_KERNEL 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Free shared memory previously allocated with OPTEE_MSG_RPC_CMD_SHM_ALLOC
|
|
||||||
*
|
|
||||||
* [in] param[0].u.value.a type of memory one of
|
|
||||||
* OPTEE_MSG_RPC_SHM_TYPE_* above
|
|
||||||
* [in] param[0].u.value.b value of shared memory reference
|
|
||||||
* returned in param[0].u.tmem.shm_ref
|
|
||||||
* above
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_SHM_FREE 7
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Access a device on an i2c bus
|
|
||||||
*
|
|
||||||
* [in] param[0].u.value.a mode: RD(0), WR(1)
|
|
||||||
* [in] param[0].u.value.b i2c adapter
|
|
||||||
* [in] param[0].u.value.c i2c chip
|
|
||||||
*
|
|
||||||
* [in] param[1].u.value.a i2c control flags
|
|
||||||
*
|
|
||||||
* [in/out] memref[2] buffer to exchange the transfer data
|
|
||||||
* with the secure world
|
|
||||||
*
|
|
||||||
* [out] param[3].u.value.a bytes transferred by the driver
|
|
||||||
*/
|
|
||||||
#define OPTEE_MSG_RPC_CMD_I2C_TRANSFER 21
|
|
||||||
/* I2C master transfer modes */
|
|
||||||
#define OPTEE_MSG_RPC_CMD_I2C_TRANSFER_RD 0
|
|
||||||
#define OPTEE_MSG_RPC_CMD_I2C_TRANSFER_WR 1
|
|
||||||
/* I2C master control flags */
|
|
||||||
#define OPTEE_MSG_RPC_CMD_I2C_FLAGS_TEN_BIT BIT(0)
|
|
||||||
|
|
||||||
#endif /* _OPTEE_MSG_H */
|
#endif /* _OPTEE_MSG_H */
|
||||||
|
103
drivers/tee/optee/optee_rpc_cmd.h
Normal file
103
drivers/tee/optee/optee_rpc_cmd.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2021, Linaro Limited
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __OPTEE_RPC_CMD_H
|
||||||
|
#define __OPTEE_RPC_CMD_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All RPC is done with a struct optee_msg_arg as bearer of information,
|
||||||
|
* struct optee_msg_arg::arg holds values defined by OPTEE_RPC_CMD_* below.
|
||||||
|
* Only the commands handled by the kernel driver are defined here.
|
||||||
|
*
|
||||||
|
* RPC communication with tee-supplicant is reversed compared to normal
|
||||||
|
* client communication described above. The supplicant receives requests
|
||||||
|
* and sends responses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get time
|
||||||
|
*
|
||||||
|
* Returns number of seconds and nano seconds since the Epoch,
|
||||||
|
* 1970-01-01 00:00:00 +0000 (UTC).
|
||||||
|
*
|
||||||
|
* [out] value[0].a Number of seconds
|
||||||
|
* [out] value[0].b Number of nano seconds.
|
||||||
|
*/
|
||||||
|
#define OPTEE_RPC_CMD_GET_TIME 3
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait queue primitive, helper for secure world to implement a wait queue.
|
||||||
|
*
|
||||||
|
* If secure world needs to wait for a secure world mutex it issues a sleep
|
||||||
|
* request instead of spinning in secure world. Conversely is a wakeup
|
||||||
|
* request issued when a secure world mutex with a thread waiting thread is
|
||||||
|
* unlocked.
|
||||||
|
*
|
||||||
|
* Waiting on a key
|
||||||
|
* [in] value[0].a OPTEE_RPC_WAIT_QUEUE_SLEEP
|
||||||
|
* [in] value[0].b Wait key
|
||||||
|
*
|
||||||
|
* Waking up a key
|
||||||
|
* [in] value[0].a OPTEE_RPC_WAIT_QUEUE_WAKEUP
|
||||||
|
* [in] value[0].b Wakeup key
|
||||||
|
*/
|
||||||
|
#define OPTEE_RPC_CMD_WAIT_QUEUE 4
|
||||||
|
#define OPTEE_RPC_WAIT_QUEUE_SLEEP 0
|
||||||
|
#define OPTEE_RPC_WAIT_QUEUE_WAKEUP 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Suspend execution
|
||||||
|
*
|
||||||
|
* [in] value[0].a Number of milliseconds to suspend
|
||||||
|
*/
|
||||||
|
#define OPTEE_RPC_CMD_SUSPEND 5
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate a piece of shared memory
|
||||||
|
*
|
||||||
|
* [in] value[0].a Type of memory one of
|
||||||
|
* OPTEE_RPC_SHM_TYPE_* below
|
||||||
|
* [in] value[0].b Requested size
|
||||||
|
* [in] value[0].c Required alignment
|
||||||
|
* [out] memref[0] Buffer
|
||||||
|
*/
|
||||||
|
#define OPTEE_RPC_CMD_SHM_ALLOC 6
|
||||||
|
/* Memory that can be shared with a non-secure user space application */
|
||||||
|
#define OPTEE_RPC_SHM_TYPE_APPL 0
|
||||||
|
/* Memory only shared with non-secure kernel */
|
||||||
|
#define OPTEE_RPC_SHM_TYPE_KERNEL 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Free shared memory previously allocated with OPTEE_RPC_CMD_SHM_ALLOC
|
||||||
|
*
|
||||||
|
* [in] value[0].a Type of memory one of
|
||||||
|
* OPTEE_RPC_SHM_TYPE_* above
|
||||||
|
* [in] value[0].b Value of shared memory reference or cookie
|
||||||
|
*/
|
||||||
|
#define OPTEE_RPC_CMD_SHM_FREE 7
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue master requests (read and write operations) to an I2C chip.
|
||||||
|
*
|
||||||
|
* [in] value[0].a Transfer mode (OPTEE_RPC_I2C_TRANSFER_*)
|
||||||
|
* [in] value[0].b The I2C bus (a.k.a adapter).
|
||||||
|
* 16 bit field.
|
||||||
|
* [in] value[0].c The I2C chip (a.k.a address).
|
||||||
|
* 16 bit field (either 7 or 10 bit effective).
|
||||||
|
* [in] value[1].a The I2C master control flags (ie, 10 bit address).
|
||||||
|
* 16 bit field.
|
||||||
|
* [in/out] memref[2] Buffer used for data transfers.
|
||||||
|
* [out] value[3].a Number of bytes transferred by the REE.
|
||||||
|
*/
|
||||||
|
#define OPTEE_RPC_CMD_I2C_TRANSFER 21
|
||||||
|
|
||||||
|
/* I2C master transfer modes */
|
||||||
|
#define OPTEE_RPC_I2C_TRANSFER_RD 0
|
||||||
|
#define OPTEE_RPC_I2C_TRANSFER_WR 1
|
||||||
|
|
||||||
|
/* I2C master control flags */
|
||||||
|
#define OPTEE_RPC_I2C_FLAGS_TEN_BIT BIT(0)
|
||||||
|
|
||||||
|
#endif /*__OPTEE_RPC_CMD_H*/
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) */
|
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2019, Linaro Limited
|
* Copyright (c) 2015-2021, Linaro Limited
|
||||||
*/
|
*/
|
||||||
#ifndef OPTEE_SMC_H
|
#ifndef OPTEE_SMC_H
|
||||||
#define OPTEE_SMC_H
|
#define OPTEE_SMC_H
|
||||||
@@ -39,10 +39,10 @@
|
|||||||
/*
|
/*
|
||||||
* Function specified by SMC Calling convention
|
* Function specified by SMC Calling convention
|
||||||
*
|
*
|
||||||
* Return one of the following UIDs if using API specified in this file
|
* Return the following UID if using API specified in this file
|
||||||
* without further extentions:
|
* without further extensions:
|
||||||
* 65cb6b93-af0c-4617-8ed6-644a8d1140f8
|
* 384fb3e0-e7f8-11e3-af63-0002a5d5c51b.
|
||||||
* see also OPTEE_SMC_UID_* in optee_msg.h
|
* see also OPTEE_MSG_UID_* in optee_msg.h
|
||||||
*/
|
*/
|
||||||
#define OPTEE_SMC_FUNCID_CALLS_UID OPTEE_MSG_FUNCID_CALLS_UID
|
#define OPTEE_SMC_FUNCID_CALLS_UID OPTEE_MSG_FUNCID_CALLS_UID
|
||||||
#define OPTEE_SMC_CALLS_UID \
|
#define OPTEE_SMC_CALLS_UID \
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
/*
|
/*
|
||||||
* Function specified by SMC Calling convention
|
* Function specified by SMC Calling convention
|
||||||
*
|
*
|
||||||
* Returns 2.0 if using API specified in this file without further extentions.
|
* Returns 2.0 if using API specified in this file without further extensions.
|
||||||
* see also OPTEE_MSG_REVISION_* in optee_msg.h
|
* see also OPTEE_MSG_REVISION_* in optee_msg.h
|
||||||
*/
|
*/
|
||||||
#define OPTEE_SMC_FUNCID_CALLS_REVISION OPTEE_MSG_FUNCID_CALLS_REVISION
|
#define OPTEE_SMC_FUNCID_CALLS_REVISION OPTEE_MSG_FUNCID_CALLS_REVISION
|
||||||
@@ -109,8 +109,8 @@ struct optee_smc_call_get_os_revision_result {
|
|||||||
*
|
*
|
||||||
* Call register usage:
|
* Call register usage:
|
||||||
* a0 SMC Function ID, OPTEE_SMC*CALL_WITH_ARG
|
* a0 SMC Function ID, OPTEE_SMC*CALL_WITH_ARG
|
||||||
* a1 Upper 32bit of a 64bit physical pointer to a struct optee_msg_arg
|
* a1 Upper 32 bits of a 64-bit physical pointer to a struct optee_msg_arg
|
||||||
* a2 Lower 32bit of a 64bit physical pointer to a struct optee_msg_arg
|
* a2 Lower 32 bits of a 64-bit physical pointer to a struct optee_msg_arg
|
||||||
* a3 Cache settings, not used if physical pointer is in a predefined shared
|
* a3 Cache settings, not used if physical pointer is in a predefined shared
|
||||||
* memory area else per OPTEE_SMC_SHM_*
|
* memory area else per OPTEE_SMC_SHM_*
|
||||||
* a4-6 Not used
|
* a4-6 Not used
|
||||||
@@ -214,8 +214,9 @@ struct optee_smc_get_shm_config_result {
|
|||||||
* secure world accepts command buffers located in any parts of non-secure RAM
|
* secure world accepts command buffers located in any parts of non-secure RAM
|
||||||
*/
|
*/
|
||||||
#define OPTEE_SMC_SEC_CAP_DYNAMIC_SHM BIT(2)
|
#define OPTEE_SMC_SEC_CAP_DYNAMIC_SHM BIT(2)
|
||||||
|
/* Secure world is built with virtualization support */
|
||||||
/* Secure world supports Shared Memory with a NULL buffer reference */
|
#define OPTEE_SMC_SEC_CAP_VIRTUALIZATION BIT(3)
|
||||||
|
/* Secure world supports Shared Memory with a NULL reference */
|
||||||
#define OPTEE_SMC_SEC_CAP_MEMREF_NULL BIT(4)
|
#define OPTEE_SMC_SEC_CAP_MEMREF_NULL BIT(4)
|
||||||
|
|
||||||
#define OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES 9
|
#define OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES 9
|
||||||
@@ -245,8 +246,8 @@ struct optee_smc_exchange_capabilities_result {
|
|||||||
*
|
*
|
||||||
* Normal return register usage:
|
* Normal return register usage:
|
||||||
* a0 OPTEE_SMC_RETURN_OK
|
* a0 OPTEE_SMC_RETURN_OK
|
||||||
* a1 Upper 32bit of a 64bit Shared memory cookie
|
* a1 Upper 32 bits of a 64-bit Shared memory cookie
|
||||||
* a2 Lower 32bit of a 64bit Shared memory cookie
|
* a2 Lower 32 bits of a 64-bit Shared memory cookie
|
||||||
* a3-7 Preserved
|
* a3-7 Preserved
|
||||||
*
|
*
|
||||||
* Cache empty return register usage:
|
* Cache empty return register usage:
|
||||||
@@ -293,6 +294,31 @@ struct optee_smc_disable_shm_cache_result {
|
|||||||
#define OPTEE_SMC_ENABLE_SHM_CACHE \
|
#define OPTEE_SMC_ENABLE_SHM_CACHE \
|
||||||
OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_ENABLE_SHM_CACHE)
|
OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_ENABLE_SHM_CACHE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Query OP-TEE about number of supported threads
|
||||||
|
*
|
||||||
|
* Normal World OS or Hypervisor issues this call to find out how many
|
||||||
|
* threads OP-TEE supports. That is how many standard calls can be issued
|
||||||
|
* in parallel before OP-TEE will return OPTEE_SMC_RETURN_ETHREAD_LIMIT.
|
||||||
|
*
|
||||||
|
* Call requests usage:
|
||||||
|
* a0 SMC Function ID, OPTEE_SMC_GET_THREAD_COUNT
|
||||||
|
* a1-6 Not used
|
||||||
|
* a7 Hypervisor Client ID register
|
||||||
|
*
|
||||||
|
* Normal return register usage:
|
||||||
|
* a0 OPTEE_SMC_RETURN_OK
|
||||||
|
* a1 Number of threads
|
||||||
|
* a2-7 Preserved
|
||||||
|
*
|
||||||
|
* Error return:
|
||||||
|
* a0 OPTEE_SMC_RETURN_UNKNOWN_FUNCTION Requested call is not implemented
|
||||||
|
* a1-7 Preserved
|
||||||
|
*/
|
||||||
|
#define OPTEE_SMC_FUNCID_GET_THREAD_COUNT 15
|
||||||
|
#define OPTEE_SMC_GET_THREAD_COUNT \
|
||||||
|
OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_THREAD_COUNT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Resume from RPC (for example after processing a foreign interrupt)
|
* Resume from RPC (for example after processing a foreign interrupt)
|
||||||
*
|
*
|
||||||
@@ -341,16 +367,16 @@ struct optee_smc_disable_shm_cache_result {
|
|||||||
*
|
*
|
||||||
* "Return" register usage:
|
* "Return" register usage:
|
||||||
* a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
|
* a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
|
||||||
* a1 Upper 32bits of 64bit physical pointer to allocated
|
* a1 Upper 32 bits of 64-bit physical pointer to allocated
|
||||||
* memory, (a1 == 0 && a2 == 0) if size was 0 or if memory can't
|
* memory, (a1 == 0 && a2 == 0) if size was 0 or if memory can't
|
||||||
* be allocated.
|
* be allocated.
|
||||||
* a2 Lower 32bits of 64bit physical pointer to allocated
|
* a2 Lower 32 bits of 64-bit physical pointer to allocated
|
||||||
* memory, (a1 == 0 && a2 == 0) if size was 0 or if memory can't
|
* memory, (a1 == 0 && a2 == 0) if size was 0 or if memory can't
|
||||||
* be allocated
|
* be allocated
|
||||||
* a3 Preserved
|
* a3 Preserved
|
||||||
* a4 Upper 32bits of 64bit Shared memory cookie used when freeing
|
* a4 Upper 32 bits of 64-bit Shared memory cookie used when freeing
|
||||||
* the memory or doing an RPC
|
* the memory or doing an RPC
|
||||||
* a5 Lower 32bits of 64bit Shared memory cookie used when freeing
|
* a5 Lower 32 bits of 64-bit Shared memory cookie used when freeing
|
||||||
* the memory or doing an RPC
|
* the memory or doing an RPC
|
||||||
* a6-7 Preserved
|
* a6-7 Preserved
|
||||||
*/
|
*/
|
||||||
@@ -363,9 +389,9 @@ struct optee_smc_disable_shm_cache_result {
|
|||||||
*
|
*
|
||||||
* "Call" register usage:
|
* "Call" register usage:
|
||||||
* a0 This value, OPTEE_SMC_RETURN_RPC_FREE
|
* a0 This value, OPTEE_SMC_RETURN_RPC_FREE
|
||||||
* a1 Upper 32bits of 64bit shared memory cookie belonging to this
|
* a1 Upper 32 bits of 64-bit shared memory cookie belonging to this
|
||||||
* argument memory
|
* argument memory
|
||||||
* a2 Lower 32bits of 64bit shared memory cookie belonging to this
|
* a2 Lower 32 bits of 64-bit shared memory cookie belonging to this
|
||||||
* argument memory
|
* argument memory
|
||||||
* a3-7 Resume information, must be preserved
|
* a3-7 Resume information, must be preserved
|
||||||
*
|
*
|
||||||
@@ -379,7 +405,7 @@ struct optee_smc_disable_shm_cache_result {
|
|||||||
OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FREE)
|
OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FREE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Deliver foreign interrupt to normal world.
|
* Deliver a foreign interrupt in normal world.
|
||||||
*
|
*
|
||||||
* "Call" register usage:
|
* "Call" register usage:
|
||||||
* a0 OPTEE_SMC_RETURN_RPC_FOREIGN_INTR
|
* a0 OPTEE_SMC_RETURN_RPC_FOREIGN_INTR
|
||||||
@@ -389,7 +415,7 @@ struct optee_smc_disable_shm_cache_result {
|
|||||||
* a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
|
* a0 SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
|
||||||
* a1-7 Preserved
|
* a1-7 Preserved
|
||||||
*/
|
*/
|
||||||
#define OPTEE_SMC_RPC_FUNC_FOREIGN_INTR 4
|
#define OPTEE_SMC_RPC_FUNC_FOREIGN_INTR 4
|
||||||
#define OPTEE_SMC_RETURN_RPC_FOREIGN_INTR \
|
#define OPTEE_SMC_RETURN_RPC_FOREIGN_INTR \
|
||||||
OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FOREIGN_INTR)
|
OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FOREIGN_INTR)
|
||||||
|
|
||||||
@@ -405,10 +431,10 @@ struct optee_smc_disable_shm_cache_result {
|
|||||||
*
|
*
|
||||||
* "Call" register usage:
|
* "Call" register usage:
|
||||||
* a0 OPTEE_SMC_RETURN_RPC_CMD
|
* a0 OPTEE_SMC_RETURN_RPC_CMD
|
||||||
* a1 Upper 32bit of a 64bit Shared memory cookie holding a
|
* a1 Upper 32 bits of a 64-bit Shared memory cookie holding a
|
||||||
* struct optee_msg_arg, must be preserved, only the data should
|
* struct optee_msg_arg, must be preserved, only the data should
|
||||||
* be updated
|
* be updated
|
||||||
* a2 Lower 32bit of a 64bit Shared memory cookie holding a
|
* a2 Lower 32 bits of a 64-bit Shared memory cookie holding a
|
||||||
* struct optee_msg_arg, must be preserved, only the data should
|
* struct optee_msg_arg, must be preserved, only the data should
|
||||||
* be updated
|
* be updated
|
||||||
* a3-7 Resume information, must be preserved
|
* a3-7 Resume information, must be preserved
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include <linux/tee_drv.h>
|
#include <linux/tee_drv.h>
|
||||||
#include "optee_private.h"
|
#include "optee_private.h"
|
||||||
#include "optee_smc.h"
|
#include "optee_smc.h"
|
||||||
|
#include "optee_rpc_cmd.h"
|
||||||
|
|
||||||
struct wq_entry {
|
struct wq_entry {
|
||||||
struct list_head link;
|
struct list_head link;
|
||||||
@@ -89,7 +90,7 @@ static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx,
|
|||||||
if (!client.adapter)
|
if (!client.adapter)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
if (params[1].u.value.a & OPTEE_MSG_RPC_CMD_I2C_FLAGS_TEN_BIT) {
|
if (params[1].u.value.a & OPTEE_RPC_I2C_FLAGS_TEN_BIT) {
|
||||||
if (!i2c_check_functionality(client.adapter,
|
if (!i2c_check_functionality(client.adapter,
|
||||||
I2C_FUNC_10BIT_ADDR)) {
|
I2C_FUNC_10BIT_ADDR)) {
|
||||||
i2c_put_adapter(client.adapter);
|
i2c_put_adapter(client.adapter);
|
||||||
@@ -103,11 +104,11 @@ static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx,
|
|||||||
snprintf(client.name, I2C_NAME_SIZE, "i2c%d", client.adapter->nr);
|
snprintf(client.name, I2C_NAME_SIZE, "i2c%d", client.adapter->nr);
|
||||||
|
|
||||||
switch (params[0].u.value.a) {
|
switch (params[0].u.value.a) {
|
||||||
case OPTEE_MSG_RPC_CMD_I2C_TRANSFER_RD:
|
case OPTEE_RPC_I2C_TRANSFER_RD:
|
||||||
ret = i2c_master_recv(&client, params[2].u.memref.shm->kaddr,
|
ret = i2c_master_recv(&client, params[2].u.memref.shm->kaddr,
|
||||||
params[2].u.memref.size);
|
params[2].u.memref.size);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_CMD_I2C_TRANSFER_WR:
|
case OPTEE_RPC_I2C_TRANSFER_WR:
|
||||||
ret = i2c_master_send(&client, params[2].u.memref.shm->kaddr,
|
ret = i2c_master_send(&client, params[2].u.memref.shm->kaddr,
|
||||||
params[2].u.memref.size);
|
params[2].u.memref.size);
|
||||||
break;
|
break;
|
||||||
@@ -194,10 +195,10 @@ static void handle_rpc_func_cmd_wq(struct optee *optee,
|
|||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
switch (arg->params[0].u.value.a) {
|
switch (arg->params[0].u.value.a) {
|
||||||
case OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP:
|
case OPTEE_RPC_WAIT_QUEUE_SLEEP:
|
||||||
wq_sleep(&optee->wait_queue, arg->params[0].u.value.b);
|
wq_sleep(&optee->wait_queue, arg->params[0].u.value.b);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP:
|
case OPTEE_RPC_WAIT_QUEUE_WAKEUP:
|
||||||
wq_wakeup(&optee->wait_queue, arg->params[0].u.value.b);
|
wq_wakeup(&optee->wait_queue, arg->params[0].u.value.b);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -267,11 +268,11 @@ static struct tee_shm *cmd_alloc_suppl(struct tee_context *ctx, size_t sz)
|
|||||||
struct tee_shm *shm;
|
struct tee_shm *shm;
|
||||||
|
|
||||||
param.attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT;
|
param.attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT;
|
||||||
param.u.value.a = OPTEE_MSG_RPC_SHM_TYPE_APPL;
|
param.u.value.a = OPTEE_RPC_SHM_TYPE_APPL;
|
||||||
param.u.value.b = sz;
|
param.u.value.b = sz;
|
||||||
param.u.value.c = 0;
|
param.u.value.c = 0;
|
||||||
|
|
||||||
ret = optee_supp_thrd_req(ctx, OPTEE_MSG_RPC_CMD_SHM_ALLOC, 1, ¶m);
|
ret = optee_supp_thrd_req(ctx, OPTEE_RPC_CMD_SHM_ALLOC, 1, ¶m);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
@@ -308,10 +309,10 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx,
|
|||||||
|
|
||||||
sz = arg->params[0].u.value.b;
|
sz = arg->params[0].u.value.b;
|
||||||
switch (arg->params[0].u.value.a) {
|
switch (arg->params[0].u.value.a) {
|
||||||
case OPTEE_MSG_RPC_SHM_TYPE_APPL:
|
case OPTEE_RPC_SHM_TYPE_APPL:
|
||||||
shm = cmd_alloc_suppl(ctx, sz);
|
shm = cmd_alloc_suppl(ctx, sz);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_SHM_TYPE_KERNEL:
|
case OPTEE_RPC_SHM_TYPE_KERNEL:
|
||||||
shm = tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED);
|
shm = tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -383,7 +384,7 @@ static void cmd_free_suppl(struct tee_context *ctx, struct tee_shm *shm)
|
|||||||
struct tee_param param;
|
struct tee_param param;
|
||||||
|
|
||||||
param.attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT;
|
param.attr = TEE_IOCTL_PARAM_ATTR_TYPE_VALUE_INOUT;
|
||||||
param.u.value.a = OPTEE_MSG_RPC_SHM_TYPE_APPL;
|
param.u.value.a = OPTEE_RPC_SHM_TYPE_APPL;
|
||||||
param.u.value.b = tee_shm_get_id(shm);
|
param.u.value.b = tee_shm_get_id(shm);
|
||||||
param.u.value.c = 0;
|
param.u.value.c = 0;
|
||||||
|
|
||||||
@@ -400,7 +401,7 @@ static void cmd_free_suppl(struct tee_context *ctx, struct tee_shm *shm)
|
|||||||
*/
|
*/
|
||||||
tee_shm_put(shm);
|
tee_shm_put(shm);
|
||||||
|
|
||||||
optee_supp_thrd_req(ctx, OPTEE_MSG_RPC_CMD_SHM_FREE, 1, ¶m);
|
optee_supp_thrd_req(ctx, OPTEE_RPC_CMD_SHM_FREE, 1, ¶m);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_rpc_func_cmd_shm_free(struct tee_context *ctx,
|
static void handle_rpc_func_cmd_shm_free(struct tee_context *ctx,
|
||||||
@@ -418,10 +419,10 @@ static void handle_rpc_func_cmd_shm_free(struct tee_context *ctx,
|
|||||||
|
|
||||||
shm = (struct tee_shm *)(unsigned long)arg->params[0].u.value.b;
|
shm = (struct tee_shm *)(unsigned long)arg->params[0].u.value.b;
|
||||||
switch (arg->params[0].u.value.a) {
|
switch (arg->params[0].u.value.a) {
|
||||||
case OPTEE_MSG_RPC_SHM_TYPE_APPL:
|
case OPTEE_RPC_SHM_TYPE_APPL:
|
||||||
cmd_free_suppl(ctx, shm);
|
cmd_free_suppl(ctx, shm);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_SHM_TYPE_KERNEL:
|
case OPTEE_RPC_SHM_TYPE_KERNEL:
|
||||||
tee_shm_free(shm);
|
tee_shm_free(shm);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -458,23 +459,23 @@ static void handle_rpc_func_cmd(struct tee_context *ctx, struct optee *optee,
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (arg->cmd) {
|
switch (arg->cmd) {
|
||||||
case OPTEE_MSG_RPC_CMD_GET_TIME:
|
case OPTEE_RPC_CMD_GET_TIME:
|
||||||
handle_rpc_func_cmd_get_time(arg);
|
handle_rpc_func_cmd_get_time(arg);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_CMD_WAIT_QUEUE:
|
case OPTEE_RPC_CMD_WAIT_QUEUE:
|
||||||
handle_rpc_func_cmd_wq(optee, arg);
|
handle_rpc_func_cmd_wq(optee, arg);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_CMD_SUSPEND:
|
case OPTEE_RPC_CMD_SUSPEND:
|
||||||
handle_rpc_func_cmd_wait(arg);
|
handle_rpc_func_cmd_wait(arg);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_CMD_SHM_ALLOC:
|
case OPTEE_RPC_CMD_SHM_ALLOC:
|
||||||
free_pages_list(call_ctx);
|
free_pages_list(call_ctx);
|
||||||
handle_rpc_func_cmd_shm_alloc(ctx, arg, call_ctx);
|
handle_rpc_func_cmd_shm_alloc(ctx, arg, call_ctx);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_CMD_SHM_FREE:
|
case OPTEE_RPC_CMD_SHM_FREE:
|
||||||
handle_rpc_func_cmd_shm_free(ctx, arg);
|
handle_rpc_func_cmd_shm_free(ctx, arg);
|
||||||
break;
|
break;
|
||||||
case OPTEE_MSG_RPC_CMD_I2C_TRANSFER:
|
case OPTEE_RPC_CMD_I2C_TRANSFER:
|
||||||
handle_rpc_func_cmd_i2c_transfer(ctx, arg);
|
handle_rpc_func_cmd_i2c_transfer(ctx, arg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user