linux/include/crypto/mcryptd.h
<<
>>
Prefs
   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
  18struct mcryptd_ahash {
  19        struct crypto_ahash base;
  20};
  21
  22static inline struct mcryptd_ahash *__mcryptd_ahash_cast(
  23        struct crypto_ahash *tfm)
  24{
  25        return (struct mcryptd_ahash *)tfm;
  26}
  27
  28struct mcryptd_cpu_queue {
  29        struct crypto_queue queue;
  30        spinlock_t q_lock;
  31        struct work_struct work;
  32};
  33
  34struct mcryptd_queue {
  35        struct mcryptd_cpu_queue __percpu *cpu_queue;
  36};
  37
  38struct mcryptd_instance_ctx {
  39        struct crypto_spawn spawn;
  40        struct mcryptd_queue *queue;
  41};
  42
  43struct mcryptd_hash_ctx {
  44        struct crypto_ahash *child;
  45        struct mcryptd_alg_state *alg_state;
  46};
  47
  48struct 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
  57struct 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
  67struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
  68                                        u32 type, u32 mask);
  69struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
  70struct ahash_request *mcryptd_ahash_desc(struct ahash_request *req);
  71void mcryptd_free_ahash(struct mcryptd_ahash *tfm);
  72void mcryptd_flusher(struct work_struct *work);
  73
  74enum mcryptd_req_type {
  75        MCRYPTD_NONE,
  76        MCRYPTD_UPDATE,
  77        MCRYPTD_FINUP,
  78        MCRYPTD_DIGEST,
  79        MCRYPTD_FINAL
  80};
  81
  82struct 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
  95struct 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 */
 101static 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
 112void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay);
 113
 114#endif
 115