]>
Commit | Line | Data |
---|---|---|
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 | 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 */ | |
101 | static 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 |