Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / include / crypto / mcryptd.h
diff --git a/kernel/include/crypto/mcryptd.h b/kernel/include/crypto/mcryptd.h
new file mode 100644 (file)
index 0000000..c23ee1f
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * 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;
+       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_shash *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 shash_desc desc;
+};
+
+struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
+                                       u32 type, u32 mask);
+struct crypto_shash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
+struct shash_desc *mcryptd_shash_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