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