1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Crypto engine API 4 * 5 * Copyright (c) 2016 Baolin Wang <[email protected]> 6 */ 7 #ifndef _CRYPTO_ENGINE_H 8 #define _CRYPTO_ENGINE_H 9 10 #include <linux/crypto.h> 11 #include <linux/list.h> 12 #include <linux/kthread.h> 13 #include <linux/spinlock.h> 14 #include <linux/types.h> 15 16 #include <crypto/algapi.h> 17 #include <crypto/aead.h> 18 #include <crypto/akcipher.h> 19 #include <crypto/hash.h> 20 #include <crypto/skcipher.h> 21 #include <crypto/kpp.h> 22 23 struct device; 24 25 #define ENGINE_NAME_LEN 30 26 /* 27 * struct crypto_engine - crypto hardware engine 28 * @name: the engine name 29 * @idling: the engine is entering idle state 30 * @busy: request pump is busy 31 * @running: the engine is on working 32 * @retry_support: indication that the hardware allows re-execution 33 * of a failed backlog request 34 * crypto-engine, in head position to keep order 35 * @list: link with the global crypto engine list 36 * @queue_lock: spinlock to synchronise access to request queue 37 * @queue: the crypto queue of the engine 38 * @rt: whether this queue is set to run as a realtime task 39 * @prepare_crypt_hardware: a request will soon arrive from the queue 40 * so the subsystem requests the driver to prepare the hardware 41 * by issuing this call 42 * @unprepare_crypt_hardware: there are currently no more requests on the 43 * queue so the subsystem notifies the driver that it may relax the 44 * hardware by issuing this call 45 * @do_batch_requests: execute a batch of requests. Depends on multiple 46 * requests support. 47 * @kworker: kthread worker struct for request pump 48 * @pump_requests: work struct for scheduling work to the request pump 49 * @priv_data: the engine private data 50 * @cur_req: the current request which is on processing 51 */ 52 struct crypto_engine { 53 char name[ENGINE_NAME_LEN]; 54 bool idling; 55 bool busy; 56 bool running; 57 58 bool retry_support; 59 60 struct list_head list; 61 spinlock_t queue_lock; 62 struct crypto_queue queue; 63 struct device *dev; 64 65 bool rt; 66 67 int (*prepare_crypt_hardware)(struct crypto_engine *engine); 68 int (*unprepare_crypt_hardware)(struct crypto_engine *engine); 69 int (*do_batch_requests)(struct crypto_engine *engine); 70 71 72 struct kthread_worker *kworker; 73 struct kthread_work pump_requests; 74 75 void *priv_data; 76 struct crypto_async_request *cur_req; 77 }; 78 79 /* 80 * struct crypto_engine_op - crypto hardware engine operations 81 * @do_one_request: do encryption for current request 82 */ 83 struct crypto_engine_op { 84 int (*do_one_request)(struct crypto_engine *engine, 85 void *areq); 86 }; 87 88 struct crypto_engine_ctx { 89 struct crypto_engine_op op; 90 }; 91 92 int crypto_transfer_aead_request_to_engine(struct crypto_engine *engine, 93 struct aead_request *req); 94 int crypto_transfer_akcipher_request_to_engine(struct crypto_engine *engine, 95 struct akcipher_request *req); 96 int crypto_transfer_hash_request_to_engine(struct crypto_engine *engine, 97 struct ahash_request *req); 98 int crypto_transfer_kpp_request_to_engine(struct crypto_engine *engine, 99 struct kpp_request *req); 100 int crypto_transfer_skcipher_request_to_engine(struct crypto_engine *engine, 101 struct skcipher_request *req); 102 void crypto_finalize_aead_request(struct crypto_engine *engine, 103 struct aead_request *req, int err); 104 void crypto_finalize_akcipher_request(struct crypto_engine *engine, 105 struct akcipher_request *req, int err); 106 void crypto_finalize_hash_request(struct crypto_engine *engine, 107 struct ahash_request *req, int err); 108 void crypto_finalize_kpp_request(struct crypto_engine *engine, 109 struct kpp_request *req, int err); 110 void crypto_finalize_skcipher_request(struct crypto_engine *engine, 111 struct skcipher_request *req, int err); 112 int crypto_engine_start(struct crypto_engine *engine); 113 int crypto_engine_stop(struct crypto_engine *engine); 114 struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt); 115 struct crypto_engine *crypto_engine_alloc_init_and_set(struct device *dev, 116 bool retry_support, 117 int (*cbk_do_batch)(struct crypto_engine *engine), 118 bool rt, int qlen); 119 int crypto_engine_exit(struct crypto_engine *engine); 120 121 #endif /* _CRYPTO_ENGINE_H */ 122