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