1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Software async multibuffer crypto daemon headers 4 * 5 * Author: 6 * Tim Chen <tim.c.chen@linux.intel.com> 7 * 8 * Copyright (c) 2014, Intel Corporation. 9 */ 10 11 #ifndef _CRYPTO_MCRYPT_H 12 #define _CRYPTO_MCRYPT_H 13 14 #include <linux/crypto.h> 15 #include <linux/kernel.h> 16 #include <crypto/hash.h> 17 18 struct mcryptd_ahash { 19 struct crypto_ahash base; 20 }; 21 __mcryptd_ahash_cast(struct crypto_ahash * tfm)22static inline struct mcryptd_ahash *__mcryptd_ahash_cast( 23 struct crypto_ahash *tfm) 24 { 25 return (struct mcryptd_ahash *)tfm; 26 } 27 28 struct mcryptd_cpu_queue { 29 struct crypto_queue queue; 30 spinlock_t q_lock; 31 struct work_struct work; 32 }; 33 34 struct mcryptd_queue { 35 struct mcryptd_cpu_queue __percpu *cpu_queue; 36 }; 37 38 struct mcryptd_instance_ctx { 39 struct crypto_spawn spawn; 40 struct mcryptd_queue *queue; 41 }; 42 43 struct mcryptd_hash_ctx { 44 struct crypto_ahash *child; 45 struct mcryptd_alg_state *alg_state; 46 }; 47 48 struct mcryptd_tag { 49 /* seq number of request */ 50 unsigned seq_num; 51 /* arrival time of request */ 52 unsigned long arrival; 53 unsigned long expire; 54 int cpu; 55 }; 56 57 struct mcryptd_hash_request_ctx { 58 struct list_head waiter; 59 crypto_completion_t complete; 60 struct mcryptd_tag tag; 61 struct crypto_hash_walk walk; 62 u8 *out; 63 int flag; 64 struct ahash_request areq; 65 }; 66 67 struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name, 68 u32 type, u32 mask); 69 struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm); 70 struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req); 71 void mcryptd_free_ahash(struct mcryptd_ahash *tfm); 72 void mcryptd_flusher(struct work_struct *work); 73 74 enum mcryptd_req_type { 75 MCRYPTD_NONE, 76 MCRYPTD_UPDATE, 77 MCRYPTD_FINUP, 78 MCRYPTD_DIGEST, 79 MCRYPTD_FINAL 80 }; 81 82 struct mcryptd_alg_cstate { 83 unsigned long next_flush; 84 unsigned next_seq_num; 85 bool flusher_engaged; 86 struct delayed_work flush; 87 int cpu; 88 struct mcryptd_alg_state *alg_state; 89 void *mgr; 90 spinlock_t work_lock; 91 struct list_head work_list; 92 struct list_head flush_list; 93 }; 94 95 struct mcryptd_alg_state { 96 struct mcryptd_alg_cstate __percpu *alg_cstate; 97 unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate); 98 }; 99 100 /* return delay in jiffies from current time */ get_delay(unsigned long t)101static inline unsigned long get_delay(unsigned long t) 102 { 103 long delay; 104 105 delay = (long) t - (long) jiffies; 106 if (delay <= 0) 107 return 0; 108 else 109 return (unsigned long) delay; 110 } 111 112 void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay); 113 114 #endif 115