xref: /OK3568_Linux_fs/kernel/drivers/tee/amdtee/amdtee_private.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: MIT */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun /*
4*4882a593Smuzhiyun  * Copyright 2019 Advanced Micro Devices, Inc.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef AMDTEE_PRIVATE_H
8*4882a593Smuzhiyun #define AMDTEE_PRIVATE_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/mutex.h>
11*4882a593Smuzhiyun #include <linux/spinlock.h>
12*4882a593Smuzhiyun #include <linux/tee_drv.h>
13*4882a593Smuzhiyun #include <linux/kref.h>
14*4882a593Smuzhiyun #include <linux/types.h>
15*4882a593Smuzhiyun #include "amdtee_if.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define DRIVER_NAME	"amdtee"
18*4882a593Smuzhiyun #define DRIVER_AUTHOR   "AMD-TEE Linux driver team"
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /* Some GlobalPlatform error codes used in this driver */
21*4882a593Smuzhiyun #define TEEC_SUCCESS			0x00000000
22*4882a593Smuzhiyun #define TEEC_ERROR_GENERIC		0xFFFF0000
23*4882a593Smuzhiyun #define TEEC_ERROR_BAD_PARAMETERS	0xFFFF0006
24*4882a593Smuzhiyun #define TEEC_ERROR_OUT_OF_MEMORY	0xFFFF000C
25*4882a593Smuzhiyun #define TEEC_ERROR_COMMUNICATION	0xFFFF000E
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define TEEC_ORIGIN_COMMS		0x00000002
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /* Maximum number of sessions which can be opened with a Trusted Application */
30*4882a593Smuzhiyun #define TEE_NUM_SESSIONS			32
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define TA_LOAD_PATH				"/amdtee"
33*4882a593Smuzhiyun #define TA_PATH_MAX				60
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /**
36*4882a593Smuzhiyun  * struct amdtee - main service struct
37*4882a593Smuzhiyun  * @teedev:		client device
38*4882a593Smuzhiyun  * @pool:		shared memory pool
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun struct amdtee {
41*4882a593Smuzhiyun 	struct tee_device *teedev;
42*4882a593Smuzhiyun 	struct tee_shm_pool *pool;
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /**
46*4882a593Smuzhiyun  * struct amdtee_session - Trusted Application (TA) session related information.
47*4882a593Smuzhiyun  * @ta_handle:     handle to Trusted Application (TA) loaded in TEE environment
48*4882a593Smuzhiyun  * @refcount:      counter to keep track of sessions opened for the TA instance
49*4882a593Smuzhiyun  * @session_info:  an array pointing to TA allocated session data.
50*4882a593Smuzhiyun  * @sess_mask:     session usage bit-mask. If a particular bit is set, then the
51*4882a593Smuzhiyun  *                 corresponding @session_info entry is in use or valid.
52*4882a593Smuzhiyun  *
53*4882a593Smuzhiyun  * Session structure is updated on open_session and this information is used for
54*4882a593Smuzhiyun  * subsequent operations with the Trusted Application.
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun struct amdtee_session {
57*4882a593Smuzhiyun 	struct list_head list_node;
58*4882a593Smuzhiyun 	u32 ta_handle;
59*4882a593Smuzhiyun 	struct kref refcount;
60*4882a593Smuzhiyun 	u32 session_info[TEE_NUM_SESSIONS];
61*4882a593Smuzhiyun 	DECLARE_BITMAP(sess_mask, TEE_NUM_SESSIONS);
62*4882a593Smuzhiyun 	spinlock_t lock;	/* synchronizes access to @sess_mask */
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /**
66*4882a593Smuzhiyun  * struct amdtee_context_data - AMD-TEE driver context data
67*4882a593Smuzhiyun  * @sess_list:    Keeps track of sessions opened in current TEE context
68*4882a593Smuzhiyun  * @shm_list:     Keeps track of buffers allocated and mapped in current TEE
69*4882a593Smuzhiyun  *                context
70*4882a593Smuzhiyun  */
71*4882a593Smuzhiyun struct amdtee_context_data {
72*4882a593Smuzhiyun 	struct list_head sess_list;
73*4882a593Smuzhiyun 	struct list_head shm_list;
74*4882a593Smuzhiyun 	struct mutex shm_mutex;   /* synchronizes access to @shm_list */
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun struct amdtee_driver_data {
78*4882a593Smuzhiyun 	struct amdtee *amdtee;
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct shmem_desc {
82*4882a593Smuzhiyun 	void *kaddr;
83*4882a593Smuzhiyun 	u64 size;
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /**
87*4882a593Smuzhiyun  * struct amdtee_shm_data - Shared memory data
88*4882a593Smuzhiyun  * @kaddr:	Kernel virtual address of shared memory
89*4882a593Smuzhiyun  * @buf_id:	Buffer id of memory mapped by TEE_CMD_ID_MAP_SHARED_MEM
90*4882a593Smuzhiyun  */
91*4882a593Smuzhiyun struct amdtee_shm_data {
92*4882a593Smuzhiyun 	struct  list_head shm_node;
93*4882a593Smuzhiyun 	void    *kaddr;
94*4882a593Smuzhiyun 	u32     buf_id;
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /**
98*4882a593Smuzhiyun  * struct amdtee_ta_data - Keeps track of all TAs loaded in AMD Secure
99*4882a593Smuzhiyun  *			   Processor
100*4882a593Smuzhiyun  * @ta_handle:	Handle to TA loaded in TEE
101*4882a593Smuzhiyun  * @refcount:	Reference count for the loaded TA
102*4882a593Smuzhiyun  */
103*4882a593Smuzhiyun struct amdtee_ta_data {
104*4882a593Smuzhiyun 	struct list_head list_node;
105*4882a593Smuzhiyun 	u32 ta_handle;
106*4882a593Smuzhiyun 	u32 refcount;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define LOWER_TWO_BYTE_MASK	0x0000FFFF
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun /**
112*4882a593Smuzhiyun  * set_session_id() - Sets the session identifier.
113*4882a593Smuzhiyun  * @ta_handle:      [in] handle of the loaded Trusted Application (TA)
114*4882a593Smuzhiyun  * @session_index:  [in] Session index. Range: 0 to (TEE_NUM_SESSIONS - 1).
115*4882a593Smuzhiyun  * @session:        [out] Pointer to session id
116*4882a593Smuzhiyun  *
117*4882a593Smuzhiyun  * Lower two bytes of the session identifier represents the TA handle and the
118*4882a593Smuzhiyun  * upper two bytes is session index.
119*4882a593Smuzhiyun  */
set_session_id(u32 ta_handle,u32 session_index,u32 * session)120*4882a593Smuzhiyun static inline void set_session_id(u32 ta_handle, u32 session_index,
121*4882a593Smuzhiyun 				  u32 *session)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun 	*session = (session_index << 16) | (LOWER_TWO_BYTE_MASK & ta_handle);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
get_ta_handle(u32 session)126*4882a593Smuzhiyun static inline u32 get_ta_handle(u32 session)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	return session & LOWER_TWO_BYTE_MASK;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun 
get_session_index(u32 session)131*4882a593Smuzhiyun static inline u32 get_session_index(u32 session)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	return (session >> 16) & LOWER_TWO_BYTE_MASK;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun int amdtee_open_session(struct tee_context *ctx,
137*4882a593Smuzhiyun 			struct tee_ioctl_open_session_arg *arg,
138*4882a593Smuzhiyun 			struct tee_param *param);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun int amdtee_close_session(struct tee_context *ctx, u32 session);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun int amdtee_invoke_func(struct tee_context *ctx,
143*4882a593Smuzhiyun 		       struct tee_ioctl_invoke_arg *arg,
144*4882a593Smuzhiyun 		       struct tee_param *param);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun int amdtee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session);
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun int amdtee_map_shmem(struct tee_shm *shm);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun void amdtee_unmap_shmem(struct tee_shm *shm);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun int handle_load_ta(void *data, u32 size,
153*4882a593Smuzhiyun 		   struct tee_ioctl_open_session_arg *arg);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun int handle_unload_ta(u32 ta_handle);
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun int handle_open_session(struct tee_ioctl_open_session_arg *arg, u32 *info,
158*4882a593Smuzhiyun 			struct tee_param *p);
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun int handle_close_session(u32 ta_handle, u32 info);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun int handle_map_shmem(u32 count, struct shmem_desc *start, u32 *buf_id);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun void handle_unmap_shmem(u32 buf_id);
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun int handle_invoke_cmd(struct tee_ioctl_invoke_arg *arg, u32 sinfo,
167*4882a593Smuzhiyun 		      struct tee_param *p);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun struct tee_shm_pool *amdtee_config_shm(void);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun u32 get_buffer_id(struct tee_shm *shm);
172*4882a593Smuzhiyun #endif /*AMDTEE_PRIVATE_H*/
173