1 /* SPDX-License-Identifier: GPL-2.0-or-later * 1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 2 /* 3 * Crypto engine API 3 * Crypto engine API 4 * 4 * 5 * Copyright (c) 2016 Baolin Wang <baolin.wang 5 * Copyright (c) 2016 Baolin Wang <baolin.wang@linaro.org> 6 */ 6 */ 7 #ifndef _CRYPTO_ENGINE_H 7 #ifndef _CRYPTO_ENGINE_H 8 #define _CRYPTO_ENGINE_H 8 #define _CRYPTO_ENGINE_H 9 9 >> 10 #include <linux/crypto.h> >> 11 #include <linux/list.h> >> 12 #include <linux/kernel.h> >> 13 #include <linux/kthread.h> >> 14 #include <crypto/algapi.h> 10 #include <crypto/aead.h> 15 #include <crypto/aead.h> 11 #include <crypto/akcipher.h> 16 #include <crypto/akcipher.h> 12 #include <crypto/hash.h> 17 #include <crypto/hash.h> 13 #include <crypto/kpp.h> << 14 #include <crypto/skcipher.h> 18 #include <crypto/skcipher.h> 15 #include <linux/types.h> << 16 19 17 struct crypto_engine; !! 20 #define ENGINE_NAME_LEN 30 18 struct device; !! 21 /* >> 22 * struct crypto_engine - crypto hardware engine >> 23 * @name: the engine name >> 24 * @idling: the engine is entering idle state >> 25 * @busy: request pump is busy >> 26 * @running: the engine is on working >> 27 * @retry_support: indication that the hardware allows re-execution >> 28 * of a failed backlog request >> 29 * crypto-engine, in head position to keep order >> 30 * @list: link with the global crypto engine list >> 31 * @queue_lock: spinlock to syncronise access to request queue >> 32 * @queue: the crypto queue of the engine >> 33 * @rt: whether this queue is set to run as a realtime task >> 34 * @prepare_crypt_hardware: a request will soon arrive from the queue >> 35 * so the subsystem requests the driver to prepare the hardware >> 36 * by issuing this call >> 37 * @unprepare_crypt_hardware: there are currently no more requests on the >> 38 * queue so the subsystem notifies the driver that it may relax the >> 39 * hardware by issuing this call >> 40 * @do_batch_requests: execute a batch of requests. Depends on multiple >> 41 * requests support. >> 42 * @kworker: kthread worker struct for request pump >> 43 * @pump_requests: work struct for scheduling work to the request pump >> 44 * @priv_data: the engine private data >> 45 * @cur_req: the current request which is on processing >> 46 */ >> 47 struct crypto_engine { >> 48 char name[ENGINE_NAME_LEN]; >> 49 bool idling; >> 50 bool busy; >> 51 bool running; >> 52 >> 53 bool retry_support; >> 54 >> 55 struct list_head list; >> 56 spinlock_t queue_lock; >> 57 struct crypto_queue queue; >> 58 struct device *dev; >> 59 >> 60 bool rt; >> 61 >> 62 int (*prepare_crypt_hardware)(struct crypto_engine *engine); >> 63 int (*unprepare_crypt_hardware)(struct crypto_engine *engine); >> 64 int (*do_batch_requests)(struct crypto_engine *engine); >> 65 >> 66 >> 67 struct kthread_worker *kworker; >> 68 struct kthread_work pump_requests; >> 69 >> 70 void *priv_data; >> 71 struct crypto_async_request *cur_req; >> 72 }; 19 73 20 /* 74 /* 21 * struct crypto_engine_op - crypto hardware e 75 * struct crypto_engine_op - crypto hardware engine operations >> 76 * @prepare__request: do some prepare if need before handle the current request >> 77 * @unprepare_request: undo any work done by prepare_request() 22 * @do_one_request: do encryption for current 78 * @do_one_request: do encryption for current request 23 */ 79 */ 24 struct crypto_engine_op { 80 struct crypto_engine_op { >> 81 int (*prepare_request)(struct crypto_engine *engine, >> 82 void *areq); >> 83 int (*unprepare_request)(struct crypto_engine *engine, >> 84 void *areq); 25 int (*do_one_request)(struct crypto_en 85 int (*do_one_request)(struct crypto_engine *engine, 26 void *areq); 86 void *areq); 27 }; 87 }; 28 88 29 struct aead_engine_alg { !! 89 struct crypto_engine_ctx { 30 struct aead_alg base; << 31 struct crypto_engine_op op; << 32 }; << 33 << 34 struct ahash_engine_alg { << 35 struct ahash_alg base; << 36 struct crypto_engine_op op; << 37 }; << 38 << 39 struct akcipher_engine_alg { << 40 struct akcipher_alg base; << 41 struct crypto_engine_op op; << 42 }; << 43 << 44 struct kpp_engine_alg { << 45 struct kpp_alg base; << 46 struct crypto_engine_op op; << 47 }; << 48 << 49 struct skcipher_engine_alg { << 50 struct skcipher_alg base; << 51 struct crypto_engine_op op; 90 struct crypto_engine_op op; 52 }; 91 }; 53 92 54 int crypto_transfer_aead_request_to_engine(str 93 int crypto_transfer_aead_request_to_engine(struct crypto_engine *engine, 55 str 94 struct aead_request *req); 56 int crypto_transfer_akcipher_request_to_engine 95 int crypto_transfer_akcipher_request_to_engine(struct crypto_engine *engine, 57 96 struct akcipher_request *req); 58 int crypto_transfer_hash_request_to_engine(str 97 int crypto_transfer_hash_request_to_engine(struct crypto_engine *engine, 59 98 struct ahash_request *req); 60 int crypto_transfer_kpp_request_to_engine(stru << 61 stru << 62 int crypto_transfer_skcipher_request_to_engine 99 int crypto_transfer_skcipher_request_to_engine(struct crypto_engine *engine, 63 100 struct skcipher_request *req); 64 void crypto_finalize_aead_request(struct crypt 101 void crypto_finalize_aead_request(struct crypto_engine *engine, 65 struct aead_ 102 struct aead_request *req, int err); 66 void crypto_finalize_akcipher_request(struct c 103 void crypto_finalize_akcipher_request(struct crypto_engine *engine, 67 struct a 104 struct akcipher_request *req, int err); 68 void crypto_finalize_hash_request(struct crypt 105 void crypto_finalize_hash_request(struct crypto_engine *engine, 69 struct ahash 106 struct ahash_request *req, int err); 70 void crypto_finalize_kpp_request(struct crypto << 71 struct kpp_re << 72 void crypto_finalize_skcipher_request(struct c 107 void crypto_finalize_skcipher_request(struct crypto_engine *engine, 73 struct s 108 struct skcipher_request *req, int err); 74 int crypto_engine_start(struct crypto_engine * 109 int crypto_engine_start(struct crypto_engine *engine); 75 int crypto_engine_stop(struct crypto_engine *e 110 int crypto_engine_stop(struct crypto_engine *engine); 76 struct crypto_engine *crypto_engine_alloc_init 111 struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt); 77 struct crypto_engine *crypto_engine_alloc_init 112 struct crypto_engine *crypto_engine_alloc_init_and_set(struct device *dev, 78 113 bool retry_support, 79 114 int (*cbk_do_batch)(struct crypto_engine *engine), 80 115 bool rt, int qlen); 81 void crypto_engine_exit(struct crypto_engine * !! 116 int crypto_engine_exit(struct crypto_engine *engine); 82 << 83 int crypto_engine_register_aead(struct aead_en << 84 void crypto_engine_unregister_aead(struct aead << 85 int crypto_engine_register_aeads(struct aead_e << 86 void crypto_engine_unregister_aeads(struct aea << 87 << 88 int crypto_engine_register_ahash(struct ahash_ << 89 void crypto_engine_unregister_ahash(struct aha << 90 int crypto_engine_register_ahashes(struct ahas << 91 void crypto_engine_unregister_ahashes(struct a << 92 int coun << 93 << 94 int crypto_engine_register_akcipher(struct akc << 95 void crypto_engine_unregister_akcipher(struct << 96 << 97 int crypto_engine_register_kpp(struct kpp_engi << 98 void crypto_engine_unregister_kpp(struct kpp_e << 99 << 100 int crypto_engine_register_skcipher(struct skc << 101 void crypto_engine_unregister_skcipher(struct << 102 int crypto_engine_register_skciphers(struct sk << 103 int count << 104 void crypto_engine_unregister_skciphers(struct << 105 int co << 106 117 107 #endif /* _CRYPTO_ENGINE_H */ 118 #endif /* _CRYPTO_ENGINE_H */ 108 119
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.