/* QTI crypto Driver * * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef __CRYPTO_MSM_QCEDEVI_H #define __CRYPTO_MSM_QCEDEVI_H #include #include #include #include #include #include "qce.h" #define CACHE_LINE_SIZE 32 #define CE_SHA_BLOCK_SIZE SHA256_BLOCK_SIZE enum qcedev_crypto_oper_type { QCEDEV_CRYPTO_OPER_CIPHER = 0, QCEDEV_CRYPTO_OPER_SHA = 1, QCEDEV_CRYPTO_OPER_LAST }; struct qcedev_handle; struct qcedev_cipher_req { struct ablkcipher_request creq; void *cookie; }; struct qcedev_sha_req { struct ahash_request sreq; void *cookie; }; struct qcedev_sha_ctxt { uint32_t auth_data[4]; uint8_t digest[QCEDEV_MAX_SHA_DIGEST]; uint32_t diglen; uint8_t trailing_buf[64]; uint32_t trailing_buf_len; uint8_t first_blk; uint8_t last_blk; uint8_t authkey[QCEDEV_MAX_SHA_BLOCK_SIZE]; bool init_done; }; struct qcedev_async_req { struct list_head list; struct completion complete; enum qcedev_crypto_oper_type op_type; union { struct qcedev_cipher_op_req cipher_op_req; struct qcedev_sha_op_req sha_op_req; }; union { struct qcedev_cipher_req cipher_req; struct qcedev_sha_req sha_req; }; struct qcedev_handle *handle; int err; }; /********************************************************************** * Register ourselves as a misc device to be able to access the dev driver * from userspace. */ #define QCEDEV_DEV "qcedev" struct qcedev_control { /* CE features supported by platform */ struct msm_ce_hw_support platform_support; uint32_t ce_lock_count; uint32_t high_bw_req_count; /* CE features/algorithms supported by HW engine*/ struct ce_hw_support ce_support; uint32_t bus_scale_handle; /* misc device */ struct miscdevice miscdevice; /* qce handle */ void *qce; /* platform device */ struct platform_device *pdev; unsigned magic; struct list_head ready_commands; struct qcedev_async_req *active_command; spinlock_t lock; struct tasklet_struct done_tasklet; }; struct qcedev_handle { /* qcedev control handle */ struct qcedev_control *cntl; /* qce internal sha context*/ struct qcedev_sha_ctxt sha_ctxt; }; void qcedev_cipher_req_cb(void *cookie, unsigned char *icv, unsigned char *iv, int ret); void qcedev_sha_req_cb(void *cookie, unsigned char *digest, unsigned char *authdata, int ret); #endif /* __CRYPTO_MSM_QCEDEVI_H */