linux-stable/drivers/tee/optee/optee_rpc_cmd.h
Jens Wiklander 787c80cc7b optee: separate notification functions
Renames struct optee_wait_queue to struct optee_notif and all related
functions to optee_notif_*().

The implementation is changed to allow sending a notification from an
atomic state, that is from the top half of an interrupt handler.

Waiting for keys is currently only used when secure world is waiting for
a mutex or condition variable. The old implementation could handle any
32-bit key while this new implementation is restricted to only 8 bits or
the maximum value 255. A upper value is needed since a bitmap is
allocated to allow an interrupt handler to only set a bit in case the
waiter hasn't had the time yet to allocate and register a completion.

The keys are currently only representing secure world threads which
number usually are never even close to 255 so it should be safe for now.
In future ABI updates the maximum value of the key will be communicated
while the driver is initializing.

Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
2021-11-17 14:08:56 +01:00

106 lines
3.2 KiB
C

/* 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
/*
* Notification from/to secure world.
*
* If secure world needs to wait for something, for instance a mutex, it
* does a notification wait request instead of spinning in secure world.
* Conversely can a synchronous notification can be sent when a secure
* world mutex with a thread waiting thread is unlocked.
*
* This interface can also be used to wait for a asynchronous notification
* which instead is sent via a non-secure interrupt.
*
* Waiting on notification
* [in] value[0].a OPTEE_RPC_NOTIFICATION_WAIT
* [in] value[0].b notification value
*
* Sending a synchronous notification
* [in] value[0].a OPTEE_RPC_NOTIFICATION_SEND
* [in] value[0].b notification value
*/
#define OPTEE_RPC_CMD_NOTIFICATION 4
#define OPTEE_RPC_NOTIFICATION_WAIT 0
#define OPTEE_RPC_NOTIFICATION_SEND 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*/