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 18struct mcryptd_ahash { 19 struct crypto_ahash base; 20}; 21 22static inline struct mcryptd_ahash *__mcryptd_ahash_cast( 23 struct crypto_ahash *tfm) 24{ 25 return (struct mcryptd_ahash *)tfm; 26} 27 28struct mcryptd_cpu_queue { 29 struct crypto_queue queue; 30 spinlock_t q_lock; 31 struct work_struct work; 32}; 33 34struct mcryptd_queue { 35 struct mcryptd_cpu_queue __percpu *cpu_queue; 36}; 37 38struct mcryptd_instance_ctx { 39 struct crypto_spawn spawn; 40 struct mcryptd_queue *queue; 41}; 42 43struct mcryptd_hash_ctx { 44 struct crypto_ahash *child; 45 struct mcryptd_alg_state *alg_state; 46}; 47 48struct 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 57struct 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 67struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name, 68 u32 type, u32 mask); 69struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm); 70struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req); 71void mcryptd_free_ahash(struct mcryptd_ahash *tfm); 72void mcryptd_flusher(struct work_struct *work); 73 74enum mcryptd_req_type { 75 MCRYPTD_NONE, 76 MCRYPTD_UPDATE, 77 MCRYPTD_FINUP, 78 MCRYPTD_DIGEST, 79 MCRYPTD_FINAL 80}; 81 82struct 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 95struct 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 */ 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 112void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay); 113 114#endif 115