diff options
Diffstat (limited to 'QSEEComAPI.h')
-rw-r--r-- | QSEEComAPI.h | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/QSEEComAPI.h b/QSEEComAPI.h new file mode 100644 index 0000000..a96cda3 --- /dev/null +++ b/QSEEComAPI.h @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2012, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You may + * obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +#ifndef __QSEECOMAPI_H_ +#define __QSEECOMAPI_H_ + + +/*---------------------------------------------------------------------------- + * Include Files +* -------------------------------------------------------------------------*/ +#include <stdint.h> +#include <stdbool.h> + +#define QSEECOM_ALIGN_SIZE 0x40 +#define QSEECOM_ALIGN_MASK (QSEECOM_ALIGN_SIZE - 1) +#define QSEECOM_ALIGN(x) \ + ((x + QSEECOM_ALIGN_SIZE) & (~QSEECOM_ALIGN_MASK)) + +#ifdef __cplusplus +extern "C" { +#endif + +/*---------------------------------------------------------------------------- + * Preprocessor Definitions and Constants + * -------------------------------------------------------------------------*/ +/** The memory is locked and non-pageable */ +#define MEM_LOCKED 0x00000001 +/** The memory is marked non-cacheable */ +#define MEM_NON_CACHED 0x00000002 + +#define QSEECOM_APP_QUERY_FAILED -6 +#define QSEECOM_APP_NOT_LOADED -5 +#define QSEECOM_APP_ALREADY_LOADED -4 +#define QSEECOM_LISTENER_UNREGISTERED -3 +#define QSEECOM_LISTENER_ALREADY_REGISTERED -2 +#define QSEECOM_LISTENER_REGISTER_FAIL -1 + +/*---------------------------------------------------------------------------- + * Type Declarations + * -------------------------------------------------------------------------*/ +struct QSEECom_handle { + unsigned char *ion_sbuffer; +}; + +struct QSEECom_ion_fd_data { + int32_t fd; + uint32_t cmd_buf_offset; +}; + +struct QSEECom_ion_fd_info { + struct QSEECom_ion_fd_data data[4]; +}; + +/*---------------------------------------------------------------------------- + * Function Declarations and Documentation + * -------------------------------------------------------------------------*/ +/** + * @brief Open a handle to the QSEECom device. + * + * - Load a secure application. The application will be verified that it is + * secure by digital signature verification. + * Allocate memory for sending requests to the QSAPP + * + * Note/Comments: + * There is a one-to-one relation for a HLOS client and a QSAPP; + * meaning that only one app can communicate to a QSAPP at a time. + * + * Please note that there is difference between an application and a listener + * service. A QSAPP must be loaded at the request of the HLOS, + * and all requests are orginated by the HLOS client. + * A listener service on the otherhand is started during start-up by a + * daemon, qseecomd. + * + * A HLOS application may create mutiple handles to the QSAPP + * + * @param[in/out] handle The device handle + * @param[in] fname The directory and filename to load. + * @param[in] sb_size Size of the shared buffer memory for sending requests. + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_start_app(struct QSEECom_handle **clnt_handle, const char *path, + const char *fname, uint32_t sb_size); + +/** + * @brief Close the application associated with the handle. + * + * - Unload a secure application. The driver will verify if there exists + * any other applications that are communicating with the QSAPP to which + * the "handle" is tied. + * - De-allocate memory for sending requests to QSAPP. + * + * @param[in] handle The device handle + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_shutdown_app(struct QSEECom_handle **handle); + +/** + * @brief Open a handle to the QSEECom device. + * + * - Load an external elf. The elf will be verified that it is + * secure by digital signature verification. + * + * A HLOS application may create mutiple opens (only one is permitted for the + * app, but each listener service can open a unique device in the same HLOS app + * /executable. + * @param[in/out] handle The device handle + * @param[in] fname The directory and filename to load. + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_load_external_elf(struct QSEECom_handle **clnt_handle, const char *path, + const char *fname); + +/** + * @brief Close the external elf + * + * - Unload an external elf. + * + * @param[in] handle The device handle + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_unload_external_elf(struct QSEECom_handle **handle); + +/** + * @brief Register an HLOS listener service. This allows messages from QSAPP + * to be received. + * + * @param[in] handle The device handle + * @param[in] lstnr_id The listener service identifier. This ID must be uniquely + * assigned to avoid any collisions. + * @param[in] sb_length Shared memory buffer between OS and QSE. + * @param[in] flags Provide the shared memory flags attributes. + * + * @return Zero on success, negative on failure. errno will be set on + * error. + * + */ +int QSEECom_register_listener(struct QSEECom_handle **handle, + uint32_t lstnr_id, uint32_t sb_length, uint32_t flags); + +/** + * @brief Unregister a listener service. + * + * @param[in] handle The device handle + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_unregister_listener(struct QSEECom_handle *handle); + + +/** + * @brief Send QSAPP a "user" defined buffer (may contain some message/ + * command request) and receives a response from QSAPP in receive buffer. + * The HLOS client writes to the send_buf, where QSAPP writes to the rcv_buf. + * This is a blocking call. + * + * @param[in] handle The device handle + * @param[in] send_buf The buffer to be sent. + * If using ion_sbuffer, ensure this + * QSEECOM_BUFFER_ALIGN'ed. + * @param[in] sbuf_len The send buffer length + * If using ion_sbuffer, ensure length is + * multiple of QSEECOM_BUFFER_ALIGN. + * @param[in] rcv_buf The QSEOS returned buffer. + * If using ion_sbuffer, ensure this is + * QSEECOM_BUFFER_ALIGN'ed. + * @param[in] rbuf_len The returned buffer length. + * If using ion_sbuffer, ensure length is + * multiple of QSEECOM_BUFFER_ALIGN. + * @param[in] rbuf_len The returned buffer length. + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_send_cmd(struct QSEECom_handle *handle, void *send_buf, + uint32_t sbuf_len, void *rcv_buf, uint32_t rbuf_len); + + +/** + * @brief Send QSAPP a "user" defined buffer (may contain some message/ + * command request) and receives a response from QSAPP in receive buffer. + * This API is same as send_cmd except it takes in addition parameter, + * "ifd_data". This "ifd_data" holds information (ion fd handle and + * cmd_buf_offset) used for modifying data in the message in send_buf + * at an offset. Essentailly, it has the ion fd handle information to + * retrieve physical address and modify the message in send_buf at the + * mentioned offset. + * + * The HLOS client writes to the send_buf, where QSAPP writes to the rcv_buf. + * This is a blocking call. + * + * @param[in] handle The device handle + * @param[in] send_buf The buffer to be sent. + * If using ion_sbuffer, ensure this + * QSEECOM_BUFFER_ALIGN'ed. + * @param[in] sbuf_len The send buffer length + * If using ion_sbuffer, ensure length is + * multiple of QSEECOM_BUFFER_ALIGN. + * @param[in] rcv_buf The QSEOS returned buffer. + * If using ion_sbuffer, ensure this is + * QSEECOM_BUFFER_ALIGN'ed. + * @param[in] rbuf_len The returned buffer length. + * If using ion_sbuffer, ensure length is + * multiple of QSEECOM_BUFFER_ALIGN. + * @param[in] QSEECom_ion_fd_info data related to memory allocated by ion. + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_send_modified_cmd(struct QSEECom_handle *handle, void *send_buf, + uint32_t sbuf_len, void *resp_buf, uint32_t rbuf_len, + struct QSEECom_ion_fd_info *ifd_data); + +/** + * @brief Receive a service defined buffer. + * + * @param[in] handle The device handle + * @param[out] buf The buffer that is received + * @param[in] len The receive buffer length + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_receive_req(struct QSEECom_handle *handle, + void *buf, uint32_t len); + +/** + * @brief Send a response based on the previous QSEECom_receive_req. + * + * This allows a listener service to receive a command (e.g. read file abc). + * The service can then handle the request from QSEECom_receive_req, and provide + * that information back to QSAPP. + * + * This allows the HLOS to act as the server and QSAPP to behave as the client. + * + * @param[in] handle The device handle + * @param[out] send_buf The buffer to be returned back to QSAPP + * @param[in] len The send buffer length + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_send_resp(struct QSEECom_handle *handle, + void *send_buf, uint32_t len); + +/** + * @brief Set the bandwidth for QSEE. + * + * This API resulst in improving the performance on the Crypto hardware + * in QSEE. It should be called before issuing send_cmd/send_modified_cmd + * for commands that requires using the crypto hardware on the QSEE. + * Typically this API should be called before issuing the send request to + * enable high performance mode and after completion of the send_cmd to + * resume to low performance and hence to low power mode. + * + * This allows the clients of QSEECom to set the QSEE cyptpo HW bus + * bandwidth to high/low. + * + * @param[in] high Set to 1 to enable bandwidth. + * + * @return Zero on success, negative on failure. errno will be set on + * error. + */ +int QSEECom_set_bandwidth(struct QSEECom_handle *handle, bool high); + +/** + * @brief Query QSEE to check if app is loaded. + * + * This API queries QSEE to see if the app is loaded or not. + * + * @param[in] app_name Name of the app. + * + * @return QSEECOM_APP_QUERY_FAILED/QSEECOM_APP_NOT_LOADED/QSEECOM_APP_LOADED. + */ +int QSEECom_app_load_query(struct QSEECom_handle *handle, char *app_name); + +#ifdef __cplusplus +} +#endif + +#endif |