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