| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | /* | 
 |  * Software async multibuffer crypto daemon headers | 
 |  * | 
 |  *    Author: | 
 |  *             Tim Chen <tim.c.chen@linux.intel.com> | 
 |  * | 
 |  *    Copyright (c) 2014, Intel Corporation. | 
 |  */ | 
 |  | 
 | #ifndef _CRYPTO_MCRYPT_H | 
 | #define _CRYPTO_MCRYPT_H | 
 |  | 
 | #include <linux/crypto.h> | 
 | #include <linux/kernel.h> | 
 | #include <crypto/hash.h> | 
 |  | 
 | struct mcryptd_ahash { | 
 | 	struct crypto_ahash base; | 
 | }; | 
 |  | 
 | static inline struct mcryptd_ahash *__mcryptd_ahash_cast( | 
 | 	struct crypto_ahash *tfm) | 
 | { | 
 | 	return (struct mcryptd_ahash *)tfm; | 
 | } | 
 |  | 
 | struct mcryptd_cpu_queue { | 
 | 	struct crypto_queue queue; | 
 | 	spinlock_t q_lock; | 
 | 	struct work_struct work; | 
 | }; | 
 |  | 
 | struct mcryptd_queue { | 
 | 	struct mcryptd_cpu_queue __percpu *cpu_queue; | 
 | }; | 
 |  | 
 | struct mcryptd_instance_ctx { | 
 | 	struct crypto_spawn spawn; | 
 | 	struct mcryptd_queue *queue; | 
 | }; | 
 |  | 
 | struct mcryptd_hash_ctx { | 
 | 	struct crypto_ahash *child; | 
 | 	struct mcryptd_alg_state *alg_state; | 
 | }; | 
 |  | 
 | struct mcryptd_tag { | 
 | 	/* seq number of request */ | 
 | 	unsigned seq_num; | 
 | 	/* arrival time of request */ | 
 | 	unsigned long arrival; | 
 | 	unsigned long expire; | 
 | 	int	cpu; | 
 | }; | 
 |  | 
 | struct mcryptd_hash_request_ctx { | 
 | 	struct list_head waiter; | 
 | 	crypto_completion_t complete; | 
 | 	struct mcryptd_tag tag; | 
 | 	struct crypto_hash_walk walk; | 
 | 	u8 *out; | 
 | 	int flag; | 
 | 	struct ahash_request areq; | 
 | }; | 
 |  | 
 | struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name, | 
 | 					u32 type, u32 mask); | 
 | struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm); | 
 | struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req); | 
 | void mcryptd_free_ahash(struct mcryptd_ahash *tfm); | 
 | void mcryptd_flusher(struct work_struct *work); | 
 |  | 
 | enum mcryptd_req_type { | 
 | 	MCRYPTD_NONE, | 
 | 	MCRYPTD_UPDATE, | 
 | 	MCRYPTD_FINUP, | 
 | 	MCRYPTD_DIGEST, | 
 | 	MCRYPTD_FINAL | 
 | }; | 
 |  | 
 | struct mcryptd_alg_cstate { | 
 | 	unsigned long next_flush; | 
 | 	unsigned next_seq_num; | 
 | 	bool	flusher_engaged; | 
 | 	struct  delayed_work flush; | 
 | 	int	cpu; | 
 | 	struct  mcryptd_alg_state *alg_state; | 
 | 	void	*mgr; | 
 | 	spinlock_t work_lock; | 
 | 	struct list_head work_list; | 
 | 	struct list_head flush_list; | 
 | }; | 
 |  | 
 | struct mcryptd_alg_state { | 
 | 	struct mcryptd_alg_cstate __percpu *alg_cstate; | 
 | 	unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate); | 
 | }; | 
 |  | 
 | /* return delay in jiffies from current time */ | 
 | static inline unsigned long get_delay(unsigned long t) | 
 | { | 
 | 	long delay; | 
 |  | 
 | 	delay = (long) t - (long) jiffies; | 
 | 	if (delay <= 0) | 
 | 		return 0; | 
 | 	else | 
 | 		return (unsigned long) delay; | 
 | } | 
 |  | 
 | void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay); | 
 |  | 
 | #endif |