GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / tee / optee / optee_rpc_cmd.h
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*/