1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*
3   * Crypto engine API
4   *
5   * Copyright (c) 2016 Baolin Wang <baolin.wang@linaro.org>
6   * Copyright (c) 2023 Herbert Xu <herbert@gondor.apana.org.au>
7   */
8  #ifndef _CRYPTO_INTERNAL_ENGINE_H
9  #define _CRYPTO_INTERNAL_ENGINE_H
10  
11  #include <crypto/algapi.h>
12  #include <crypto/engine.h>
13  #include <linux/kthread.h>
14  #include <linux/spinlock_types.h>
15  #include <linux/types.h>
16  
17  #define ENGINE_NAME_LEN	30
18  
19  struct device;
20  
21  /*
22   * struct crypto_engine - crypto hardware engine
23   * @name: the engine name
24   * @idling: the engine is entering idle state
25   * @busy: request pump is busy
26   * @running: the engine is on working
27   * @retry_support: indication that the hardware allows re-execution
28   * of a failed backlog request
29   * crypto-engine, in head position to keep order
30   * @list: link with the global crypto engine list
31   * @queue_lock: spinlock to synchronise access to request queue
32   * @queue: the crypto queue of the engine
33   * @rt: whether this queue is set to run as a realtime task
34   * @prepare_crypt_hardware: a request will soon arrive from the queue
35   * so the subsystem requests the driver to prepare the hardware
36   * by issuing this call
37   * @unprepare_crypt_hardware: there are currently no more requests on the
38   * queue so the subsystem notifies the driver that it may relax the
39   * hardware by issuing this call
40   * @do_batch_requests: execute a batch of requests. Depends on multiple
41   * requests support.
42   * @kworker: kthread worker struct for request pump
43   * @pump_requests: work struct for scheduling work to the request pump
44   * @priv_data: the engine private data
45   * @cur_req: the current request which is on processing
46   */
47  struct crypto_engine {
48  	char			name[ENGINE_NAME_LEN];
49  	bool			idling;
50  	bool			busy;
51  	bool			running;
52  
53  	bool			retry_support;
54  
55  	struct list_head	list;
56  	spinlock_t		queue_lock;
57  	struct crypto_queue	queue;
58  	struct device		*dev;
59  
60  	bool			rt;
61  
62  	int (*prepare_crypt_hardware)(struct crypto_engine *engine);
63  	int (*unprepare_crypt_hardware)(struct crypto_engine *engine);
64  	int (*do_batch_requests)(struct crypto_engine *engine);
65  
66  
67  	struct kthread_worker           *kworker;
68  	struct kthread_work             pump_requests;
69  
70  	void				*priv_data;
71  	struct crypto_async_request	*cur_req;
72  };
73  
74  #endif
75