1/* SPDX-License-Identifier: BSD-2-Clause */
2/*
3 * Copyright (c) 2016-2021, Linaro Limited
4 */
5
6#ifndef __OPTEE_RPC_CMD_H
7#define __OPTEE_RPC_CMD_H
8
9/*
10 * All RPC is done with a struct optee_msg_arg as bearer of information,
11 * struct optee_msg_arg::arg holds values defined by OPTEE_RPC_CMD_* below.
12 * Only the commands handled by the kernel driver are defined here.
13 *
14 * RPC communication with tee-supplicant is reversed compared to normal
15 * client communication described above. The supplicant receives requests
16 * and sends responses.
17 */
18
19/*
20 * Get time
21 *
22 * Returns number of seconds and nano seconds since the Epoch,
23 * 1970-01-01 00:00:00 +0000 (UTC).
24 *
25 * [out]    value[0].a	    Number of seconds
26 * [out]    value[0].b	    Number of nano seconds.
27 */
28#define OPTEE_RPC_CMD_GET_TIME		3
29
30/*
31 * Notification from/to secure world.
32 *
33 * If secure world needs to wait for something, for instance a mutex, it
34 * does a notification wait request instead of spinning in secure world.
35 * Conversely can a synchronous notification can be sent when a secure
36 * world mutex with a thread waiting thread is unlocked.
37 *
38 * This interface can also be used to wait for a asynchronous notification
39 * which instead is sent via a non-secure interrupt.
40 *
41 * Waiting on notification
42 * [in]    value[0].a	    OPTEE_RPC_NOTIFICATION_WAIT
43 * [in]    value[0].b	    notification value
44 *
45 * Sending a synchronous notification
46 * [in]    value[0].a	    OPTEE_RPC_NOTIFICATION_SEND
47 * [in]    value[0].b	    notification value
48 */
49#define OPTEE_RPC_CMD_NOTIFICATION	4
50#define OPTEE_RPC_NOTIFICATION_WAIT	0
51#define OPTEE_RPC_NOTIFICATION_SEND	1
52
53/*
54 * Suspend execution
55 *
56 * [in]    value[0].a	Number of milliseconds to suspend
57 */
58#define OPTEE_RPC_CMD_SUSPEND		5
59
60/*
61 * Allocate a piece of shared memory
62 *
63 * [in]    value[0].a	    Type of memory one of
64 *			    OPTEE_RPC_SHM_TYPE_* below
65 * [in]    value[0].b	    Requested size
66 * [in]    value[0].c	    Required alignment
67 * [out]   memref[0]	    Buffer
68 */
69#define OPTEE_RPC_CMD_SHM_ALLOC		6
70/* Memory that can be shared with a non-secure user space application */
71#define OPTEE_RPC_SHM_TYPE_APPL		0
72/* Memory only shared with non-secure kernel */
73#define OPTEE_RPC_SHM_TYPE_KERNEL	1
74
75/*
76 * Free shared memory previously allocated with OPTEE_RPC_CMD_SHM_ALLOC
77 *
78 * [in]     value[0].a	    Type of memory one of
79 *			    OPTEE_RPC_SHM_TYPE_* above
80 * [in]     value[0].b	    Value of shared memory reference or cookie
81 */
82#define OPTEE_RPC_CMD_SHM_FREE		7
83
84/*
85 * Issue master requests (read and write operations) to an I2C chip.
86 *
87 * [in]     value[0].a	    Transfer mode (OPTEE_RPC_I2C_TRANSFER_*)
88 * [in]     value[0].b	    The I2C bus (a.k.a adapter).
89 *				16 bit field.
90 * [in]     value[0].c	    The I2C chip (a.k.a address).
91 *				16 bit field (either 7 or 10 bit effective).
92 * [in]     value[1].a	    The I2C master control flags (ie, 10 bit address).
93 *				16 bit field.
94 * [in/out] memref[2]	    Buffer used for data transfers.
95 * [out]    value[3].a	    Number of bytes transferred by the REE.
96 */
97#define OPTEE_RPC_CMD_I2C_TRANSFER	21
98
99/* I2C master transfer modes */
100#define OPTEE_RPC_I2C_TRANSFER_RD	0
101#define OPTEE_RPC_I2C_TRANSFER_WR	1
102
103/* I2C master control flags */
104#define OPTEE_RPC_I2C_FLAGS_TEN_BIT	BIT(0)
105
106#endif /*__OPTEE_RPC_CMD_H*/
107