1/*
2 *  Copyright (c) 2012, The Android Open Source Project
3 *
4 *  Licensed under the Apache License, Version 2.0 (the "License"); you
5 *  may not use this file except in compliance with the License.  You may
6 *  obtain a copy of the License at
7 *
8 *  http://www.apache.org/licenses/LICENSE-2.0
9 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 *  implied.  See the License for the specific language governing
14 *  permissions and limitations under the License.
15 */
16
17#ifndef __QSEECOMAPI_H_
18#define __QSEECOMAPI_H_
19
20
21/*----------------------------------------------------------------------------
22 * Include Files
23* -------------------------------------------------------------------------*/
24#include <stdint.h>
25#include <stdbool.h>
26
27#define QSEECOM_ALIGN_SIZE	0x40
28#define QSEECOM_ALIGN_MASK	(QSEECOM_ALIGN_SIZE - 1)
29#define QSEECOM_ALIGN(x)	\
30	((x + QSEECOM_ALIGN_SIZE) & (~QSEECOM_ALIGN_MASK))
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36/*----------------------------------------------------------------------------
37 * Preprocessor Definitions and Constants
38 * -------------------------------------------------------------------------*/
39/** The memory is locked and non-pageable */
40#define MEM_LOCKED         0x00000001
41/** The memory is marked non-cacheable */
42#define MEM_NON_CACHED     0x00000002
43
44#define QSEECOM_APP_QUERY_FAILED       -6
45#define QSEECOM_APP_NOT_LOADED         -5
46#define QSEECOM_APP_ALREADY_LOADED     -4
47#define QSEECOM_LISTENER_UNREGISTERED	-3
48#define QSEECOM_LISTENER_ALREADY_REGISTERED	-2
49#define QSEECOM_LISTENER_REGISTER_FAIL		-1
50
51/*----------------------------------------------------------------------------
52 * Type Declarations
53 * -------------------------------------------------------------------------*/
54struct QSEECom_handle {
55	unsigned char *ion_sbuffer;
56};
57
58struct QSEECom_ion_fd_data {
59	int32_t fd;
60	uint32_t cmd_buf_offset;
61};
62
63struct QSEECom_ion_fd_info {
64	struct QSEECom_ion_fd_data data[4];
65};
66
67/*----------------------------------------------------------------------------
68 * Function Declarations and Documentation
69 * -------------------------------------------------------------------------*/
70/**
71 * @brief Open a handle to the  QSEECom device.
72 *
73 * - Load a secure application. The application will be verified that it is
74 *    secure by digital signature verification.
75 * Allocate memory for sending requests to the QSAPP
76 *
77 * Note/Comments:
78 * There is a one-to-one relation for a HLOS client and a QSAPP;
79 * meaning that only one app can communicate to a QSAPP at a time.
80 *
81 * Please note that there is difference between an application and a listener
82 * service. A QSAPP must be loaded at the request of the HLOS,
83 * and all requests are orginated by the HLOS client.
84 * A listener service on the otherhand is started during start-up by a
85 * daemon, qseecomd.
86 *
87 * A HLOS application may create mutiple handles to the QSAPP
88 *
89 * @param[in/out] handle The device handle
90 * @param[in] fname The directory and filename to load.
91 * @param[in] sb_size Size of the shared buffer memory  for sending requests.
92 * @return Zero on success, negative on failure. errno will be set on
93 *  error.
94 */
95int QSEECom_start_app(struct QSEECom_handle **clnt_handle, const char *path,
96			const char *fname, uint32_t sb_size);
97
98/**
99 * @brief Close the application associated with the handle.
100 *
101 * - Unload a secure application. The driver will verify if there exists
102 *   any other applications that are communicating with the QSAPP to which
103 *   the "handle" is tied.
104 * - De-allocate memory for sending requests to QSAPP.
105 *
106 * @param[in] handle The device handle
107 * @return Zero on success, negative on failure. errno will be set on
108 *  error.
109 */
110int QSEECom_shutdown_app(struct QSEECom_handle **handle);
111
112/**
113 * @brief Open a handle to the  QSEECom device.
114 *
115 * - Load an external elf. The elf will be verified that it is
116 *    secure by digital signature verification.
117 *
118 * A HLOS application may create mutiple opens (only one is permitted for the
119 * app, but each listener service can open a unique device in the same HLOS app
120 * /executable.
121 * @param[in/out] handle The device handle
122 * @param[in] fname The directory and filename to load.
123 * @return Zero on success, negative on failure. errno will be set on
124 *  error.
125 */
126int QSEECom_load_external_elf(struct QSEECom_handle **clnt_handle, const char *path,
127			const char *fname);
128
129/**
130 * @brief Close the external elf
131 *
132 * - Unload an external elf.
133 *
134 * @param[in] handle The device handle
135 *
136 * @return Zero on success, negative on failure. errno will be set on
137 *  error.
138 */
139int QSEECom_unload_external_elf(struct QSEECom_handle **handle);
140
141/**
142 * @brief Register an HLOS listener service. This allows messages from QSAPP
143 * to be received.
144 *
145 * @param[in] handle The device handle
146 * @param[in] lstnr_id The listener service identifier. This ID must be uniquely
147 * assigned to avoid any collisions.
148 * @param[in] sb_length Shared memory buffer between OS and QSE.
149 * @param[in] flags Provide the shared memory flags attributes.
150 *
151 * @return Zero on success, negative on failure. errno will be set on
152 *  error.
153 *
154 */
155int QSEECom_register_listener(struct QSEECom_handle **handle,
156			uint32_t lstnr_id, uint32_t sb_length, uint32_t flags);
157
158/**
159 * @brief Unregister a listener service.
160 *
161 * @param[in] handle The device handle
162 *
163 * @return Zero on success, negative on failure. errno will be set on
164 *  error.
165 */
166int QSEECom_unregister_listener(struct QSEECom_handle *handle);
167
168
169/**
170 * @brief Send QSAPP a "user" defined buffer (may contain some message/
171 * command request) and receives a response from QSAPP in receive buffer.
172 * The HLOS client writes to the send_buf, where QSAPP writes to the rcv_buf.
173 * This is a blocking call.
174 *
175 * @param[in] handle    The device handle
176 * @param[in] send_buf  The buffer to be sent.
177 *                      If using ion_sbuffer, ensure this
178 *                      QSEECOM_BUFFER_ALIGN'ed.
179 * @param[in] sbuf_len  The send buffer length
180 *                      If using ion_sbuffer, ensure length is
181 *                      multiple of QSEECOM_BUFFER_ALIGN.
182 * @param[in] rcv_buf   The QSEOS returned buffer.
183 *                      If using ion_sbuffer, ensure this is
184 *                      QSEECOM_BUFFER_ALIGN'ed.
185 * @param[in] rbuf_len  The returned buffer length.
186 *                      If using ion_sbuffer, ensure length is
187 *                      multiple of QSEECOM_BUFFER_ALIGN.
188 * @param[in] rbuf_len  The returned buffer length.
189 *
190 * @return Zero on success, negative on failure. errno will be set on
191 *  error.
192 */
193int QSEECom_send_cmd(struct QSEECom_handle *handle, void *send_buf,
194			uint32_t sbuf_len, void *rcv_buf, uint32_t rbuf_len);
195
196
197/**
198 * @brief Send QSAPP a "user" defined buffer (may contain some message/
199 * command request) and receives a response from QSAPP in receive buffer.
200 * This API is same as send_cmd except it takes in addition parameter,
201 * "ifd_data".  This "ifd_data" holds information (ion fd handle and
202 * cmd_buf_offset) used for modifying data in the message in send_buf
203 * at an offset.  Essentailly, it has the ion fd handle information to
204 * retrieve physical address and modify the message in send_buf at the
205 * mentioned offset.
206 *
207 * The HLOS client writes to the send_buf, where QSAPP writes to the rcv_buf.
208 * This is a blocking call.
209 *
210 * @param[in] handle    The device handle
211 * @param[in] send_buf  The buffer to be sent.
212 *                      If using ion_sbuffer, ensure this
213 *                      QSEECOM_BUFFER_ALIGN'ed.
214 * @param[in] sbuf_len  The send buffer length
215 *                      If using ion_sbuffer, ensure length is
216 *                      multiple of QSEECOM_BUFFER_ALIGN.
217 * @param[in] rcv_buf   The QSEOS returned buffer.
218 *                      If using ion_sbuffer, ensure this is
219 *                      QSEECOM_BUFFER_ALIGN'ed.
220 * @param[in] rbuf_len  The returned buffer length.
221 *                      If using ion_sbuffer, ensure length is
222 *                      multiple of QSEECOM_BUFFER_ALIGN.
223 * @param[in] QSEECom_ion_fd_info  data related to memory allocated by ion.
224 *
225 * @return Zero on success, negative on failure. errno will be set on
226 *  error.
227 */
228int QSEECom_send_modified_cmd(struct QSEECom_handle *handle, void *send_buf,
229			uint32_t sbuf_len, void *resp_buf, uint32_t rbuf_len,
230			struct QSEECom_ion_fd_info  *ifd_data);
231
232/**
233 * @brief Receive a service defined buffer.
234 *
235 * @param[in] handle    The device handle
236 * @param[out] buf      The buffer that is received
237 * @param[in] len       The receive buffer length
238 *
239 * @return Zero on success, negative on failure. errno will be set on
240 *  error.
241 */
242int QSEECom_receive_req(struct QSEECom_handle *handle,
243			void *buf, uint32_t len);
244
245/**
246 * @brief Send a response based on the previous QSEECom_receive_req.
247 *
248 * This allows a listener service to receive a command (e.g. read file abc).
249 * The service can then handle the request from QSEECom_receive_req, and provide
250 * that information back to QSAPP.
251 *
252 * This allows the HLOS to act as the server and QSAPP to behave as the client.
253 *
254 * @param[in] handle    The device handle
255 * @param[out] send_buf  The buffer to be returned back to QSAPP
256 * @param[in] len       The send buffer length
257 *
258 * @return Zero on success, negative on failure. errno will be set on
259 *  error.
260 */
261int QSEECom_send_resp(struct QSEECom_handle *handle,
262			void *send_buf, uint32_t len);
263
264/**
265 * @brief Set the bandwidth for QSEE.
266 *
267 * This API resulst in improving the performance on the Crypto hardware
268 * in QSEE. It should be called before issuing send_cmd/send_modified_cmd
269 * for commands that requires using the crypto hardware on the QSEE.
270 * Typically this API should be called before issuing the send request to
271 * enable high performance mode and after completion of the send_cmd to
272 * resume to low performance and hence to low power mode.
273 *
274 * This allows the clients of QSEECom to set the QSEE cyptpo HW bus
275 * bandwidth to high/low.
276 *
277 * @param[in] high    Set to 1 to enable bandwidth.
278 *
279 * @return Zero on success, negative on failure. errno will be set on
280 *  error.
281 */
282int QSEECom_set_bandwidth(struct QSEECom_handle *handle, bool high);
283
284/**
285 * @brief Query QSEE to check if app is loaded.
286 *
287 * This API queries QSEE to see if the app is loaded or not.
288 *
289 * @param[in] app_name  Name of the app.
290 *
291 * @return QSEECOM_APP_QUERY_FAILED/QSEECOM_APP_NOT_LOADED/QSEECOM_APP_LOADED.
292 */
293int QSEECom_app_load_query(struct QSEECom_handle *handle, char *app_name);
294
295#ifdef __cplusplus
296}
297#endif
298
299#endif
300