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 33 extern "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 * -------------------------------------------------------------------------*/ 54 struct QSEECom_handle { 55 unsigned char *ion_sbuffer; 56 }; 57 58 struct QSEECom_ion_fd_data { 59 int32_t fd; 60 uint32_t cmd_buf_offset; 61 }; 62 63 struct 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 */ 95 int 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 */ 110 int 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 */ 126 int 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 */ 139 int 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 */ 155 int 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 */ 166 int 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 */ 193 int 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 */ 228 int 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 */ 242 int 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 */ 261 int 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 */ 282 int 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 */ 293 int QSEECom_app_load_query(struct QSEECom_handle *handle, char *app_name); 294 295 #ifdef __cplusplus 296 } 297 #endif 298 299 #endif 300