License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[linux-block.git] / include / crypto / mcryptd.h
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
22 static 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         struct work_struct work;
31 };
32
33 struct mcryptd_queue {
34         struct mcryptd_cpu_queue __percpu *cpu_queue;
35 };
36
37 struct mcryptd_instance_ctx {
38         struct crypto_spawn spawn;
39         struct mcryptd_queue *queue;
40 };
41
42 struct mcryptd_hash_ctx {
43         struct crypto_ahash *child;
44         struct mcryptd_alg_state *alg_state;
45 };
46
47 struct mcryptd_tag {
48         /* seq number of request */
49         unsigned seq_num;
50         /* arrival time of request */
51         unsigned long arrival;
52         unsigned long expire;
53         int     cpu;
54 };
55
56 struct mcryptd_hash_request_ctx {
57         struct list_head waiter;
58         crypto_completion_t complete;
59         struct mcryptd_tag tag;
60         struct crypto_hash_walk walk;
61         u8 *out;
62         int flag;
63         struct ahash_request areq;
64 };
65
66 struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
67                                         u32 type, u32 mask);
68 struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
69 struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req);
70 void mcryptd_free_ahash(struct mcryptd_ahash *tfm);
71 void mcryptd_flusher(struct work_struct *work);
72
73 enum mcryptd_req_type {
74         MCRYPTD_NONE,
75         MCRYPTD_UPDATE,
76         MCRYPTD_FINUP,
77         MCRYPTD_DIGEST,
78         MCRYPTD_FINAL
79 };
80
81 struct mcryptd_alg_cstate {
82         unsigned long next_flush;
83         unsigned next_seq_num;
84         bool    flusher_engaged;
85         struct  delayed_work flush;
86         int     cpu;
87         struct  mcryptd_alg_state *alg_state;
88         void    *mgr;
89         spinlock_t work_lock;
90         struct list_head work_list;
91         struct list_head flush_list;
92 };
93
94 struct mcryptd_alg_state {
95         struct mcryptd_alg_cstate __percpu *alg_cstate;
96         unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate);
97 };
98
99 /* return delay in jiffies from current time */
100 static inline unsigned long get_delay(unsigned long t)
101 {
102         long delay;
103
104         delay = (long) t - (long) jiffies;
105         if (delay <= 0)
106                 return 0;
107         else
108                 return (unsigned long) delay;
109 }
110
111 void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay);
112
113 #endif