/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (c) 2016-2017, 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.
 */

/*
 * Load a TA into memory
 *
 * Since the size of the TA isn't known in advance the size of the TA is
 * can be queried with a NULL buffer.
 *
 * [in]     value[0].a-b    UUID
 * [out]    memref[1]	    Buffer with TA
 */
#define OPTEE_RPC_CMD_LOAD_TA		0

/*
 * Replay Protected Memory Block access
 *
 * [in]     memref[0]	    Frames to device
 * [out]    memref[1]	    Frames from device
 */
#define OPTEE_RPC_CMD_RPMB		1

/*
 * File system access, see definition of protocol below
 */
#define OPTEE_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]    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
/*
 * Memory shared with non-secure kernel and exported to a non-secure user
 * space application
 */
#define OPTEE_RPC_SHM_TYPE_GLOBAL	2

/*
 * 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

/* Was OPTEE_RPC_CMD_SQL_FS, which isn't supported any longer */
#define OPTEE_RPC_CMD_SQL_FS_RESERVED	8

/*
 * Send TA profiling information to normal world
 *
 * [in/out] value[0].a	    File identifier. Must be set to 0 on
 *			    first call. A value >= 1 will be
 *			    returned on success. Re-use this value
 *			    to append data to the same file.
 * [in]     memref[1]	    TA UUID
 * [in]     memref[2]	    Profile data
 */
#define OPTEE_RPC_CMD_GPROF		9

/*
 * Socket command, see definition of protocol below
 */
#define OPTEE_RPC_CMD_SOCKET		10

/*
 * Register timestamp buffer in the linux kernel optee driver
 *
 * [in]     value[0].a	    Subcommand (register buffer, unregister buffer)
 * [in]     value[0].b	    Physical address of timestamp buffer
 * [in]     value[0].c	    Size of buffer
 */
#define OPTEE_RPC_CMD_BENCH_REG		20

/*
 * Definition of protocol for command OPTEE_RPC_CMD_FS
 */

/*
 * Open a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_OPEN
 * [in]     memref[1]	    A string holding the file name
 * [out]    value[2].a	    File descriptor of open file
 */
#define OPTEE_RPC_FS_OPEN		0

/*
 * Create a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_CREATE
 * [in]     memref[1]	    A string holding the file name
 * [out]    value[2].a	    File descriptor of open file
 */
#define OPTEE_RPC_FS_CREATE		1

/*
 * Close a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_CLOSE
 * [in]     value[0].b	    File descriptor of open file.
 */
#define OPTEE_RPC_FS_CLOSE		2

/*
 * Read from a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_READ
 * [in]     value[0].b	    File descriptor of open file
 * [in]     value[0].c	    Offset into file
 * [out]    memref[1]	    Buffer to hold returned data
 */
#define OPTEE_RPC_FS_READ		3

/*
 * Write to a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_WRITE
 * [in]     value[0].b	    File descriptor of open file
 * [in]     value[0].c	    Offset into file
 * [in]     memref[1]	    Buffer holding data to be written
 */
#define OPTEE_RPC_FS_WRITE		4

/*
 * Truncate a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_TRUNCATE
 * [in]     value[0].b	    File descriptor of open file
 * [in]     value[0].c	    Length of file.
 */
#define OPTEE_RPC_FS_TRUNCATE		5

/*
 * Remove a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_REMOVE
 * [in]     memref[1]	    A string holding the file name
 */
#define OPTEE_RPC_FS_REMOVE		6

/*
 * Rename a file
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_RENAME
 * [in]     value[0].b	    True if existing target should be removed
 * [in]     memref[1]	    A string holding the old file name
 * [in]     memref[2]	    A string holding the new file name
 */
#define OPTEE_RPC_FS_RENAME		7

/*
 * Opens a directory for file listing
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_OPENDIR
 * [in]     memref[1]	    A string holding the name of the directory
 * [out]    value[2].a	    Handle to open directory
 */
#define OPTEE_RPC_FS_OPENDIR		8

/*
 * Closes a directory handle
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_CLOSEDIR
 * [in]     value[0].b	    Handle to open directory
 */
#define OPTEE_RPC_FS_CLOSEDIR		9

/*
 * Read next file name of directory
 *
 *
 * [in]     value[0].a	    OPTEE_RPC_FS_READDIR
 * [in]     value[0].b	    Handle to open directory
 * [out]    memref[1]	    A string holding the file name
 */
#define OPTEE_RPC_FS_READDIR		10

/* End of definition of protocol for command OPTEE_RPC_CMD_FS */

/*
 * Definition of protocol for command OPTEE_RPC_CMD_SOCKET
 */

#define OPTEE_RPC_SOCKET_TIMEOUT_NONBLOCKING	0
#define OPTEE_RPC_SOCKET_TIMEOUT_BLOCKING	0xffffffff

/*
 * Open socket
 *
 * [in]     value[0].a	    OPTEE_RPC_SOCKET_OPEN
 * [in]     value[0].b	    TA instance id
 * [in]     value[1].a	    Server port number
 * [in]     value[1].b	    Protocol, TEE_ISOCKET_PROTOCOLID_*
 * [in]     value[1].c	    Ip version TEE_IP_VERSION_* from tee_ipsocket.h
 * [in]     memref[2]	    Server address
 * [out]    value[3].a	    Socket handle (32-bit)
 */
#define OPTEE_RPC_SOCKET_OPEN	0

/*
 * Close socket
 *
 * [in]     value[0].a	    OPTEE_RPC_SOCKET_CLOSE
 * [in]     value[0].b	    TA instance id
 * [in]     value[0].c	    Socket handle
 */
#define OPTEE_RPC_SOCKET_CLOSE	1

/*
 * Close all sockets
 *
 * [in]     value[0].a	    OPTEE_RPC_SOCKET_CLOSE_ALL
 * [in]     value[0].b	    TA instance id
 */
#define OPTEE_RPC_SOCKET_CLOSE_ALL 2

/*
 * Send data on socket
 *
 * [in]     value[0].a	    OPTEE_RPC_SOCKET_SEND
 * [in]     value[0].b	    TA instance id
 * [in]     value[0].c	    Socket handle
 * [in]     memref[1]	    Buffer to transmit
 * [in]     value[2].a	    Timeout ms or OPTEE_RPC_SOCKET_TIMEOUT_*
 * [out]    value[2].b	    Number of transmitted bytes
 */
#define OPTEE_RPC_SOCKET_SEND	3

/*
 * Receive data on socket
 *
 * [in]     value[0].a	    OPTEE_RPC_SOCKET_RECV
 * [in]     value[0].b	    TA instance id
 * [in]     value[0].c	    Socket handle
 * [out]    memref[1]	    Buffer to receive
 * [in]     value[2].a	    Timeout ms or OPTEE_RPC_SOCKET_TIMEOUT_*
 */
#define OPTEE_RPC_SOCKET_RECV	4

/*
 * Perform IOCTL on socket
 *
 * [in]     value[0].a	    OPTEE_RPC_SOCKET_IOCTL
 * [in]     value[0].b	    TA instance id
 * [in]     value[0].c	    Socket handle
 * [in/out] memref[1]	    Buffer
 * [in]     value[2].a	    Ioctl command
 */
#define OPTEE_RPC_SOCKET_IOCTL	5

/* End of definition of protocol for command OPTEE_RPC_CMD_SOCKET */

#endif /*__OPTEE_RPC_CMD_H*/
