2 * Handle async block request by crypto hardware engine.
4 * Copyright (C) 2016 Linaro, Inc.
6 * Author: Baolin Wang <baolin.wang@linaro.org>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
15 #include <linux/err.h>
16 #include <linux/delay.h>
17 #include <crypto/engine.h>
18 #include <uapi/linux/sched/types.h>
21 #define CRYPTO_ENGINE_MAX_QLEN 10
24 * crypto_finalize_request - finalize one request if the request is done
25 * @engine: the hardware engine
26 * @req: the request need to be finalized
29 static void crypto_finalize_request(struct crypto_engine
*engine
,
30 struct crypto_async_request
*req
, int err
)
33 bool finalize_cur_req
= false;
35 struct crypto_engine_ctx
*enginectx
;
37 spin_lock_irqsave(&engine
->queue_lock
, flags
);
38 if (engine
->cur_req
== req
)
39 finalize_cur_req
= true;
40 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
42 if (finalize_cur_req
) {
43 enginectx
= crypto_tfm_ctx(req
->tfm
);
44 if (engine
->cur_req_prepared
&&
45 enginectx
->op
.unprepare_request
) {
46 ret
= enginectx
->op
.unprepare_request(engine
, req
);
48 dev_err(engine
->dev
, "failed to unprepare request\n");
50 spin_lock_irqsave(&engine
->queue_lock
, flags
);
51 engine
->cur_req
= NULL
;
52 engine
->cur_req_prepared
= false;
53 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
56 req
->complete(req
, err
);
58 kthread_queue_work(engine
->kworker
, &engine
->pump_requests
);
62 * crypto_pump_requests - dequeue one request from engine queue to process
63 * @engine: the hardware engine
64 * @in_kthread: true if we are in the context of the request pump thread
66 * This function checks if there is any request in the engine queue that
67 * needs processing and if so call out to the driver to initialize hardware
68 * and handle each request.
70 static void crypto_pump_requests(struct crypto_engine
*engine
,
73 struct crypto_async_request
*async_req
, *backlog
;
75 bool was_busy
= false;
77 struct crypto_engine_ctx
*enginectx
;
79 spin_lock_irqsave(&engine
->queue_lock
, flags
);
81 /* Make sure we are not already running a request */
85 /* If another context is idling then defer */
87 kthread_queue_work(engine
->kworker
, &engine
->pump_requests
);
91 /* Check if the engine queue is idle */
92 if (!crypto_queue_len(&engine
->queue
) || !engine
->running
) {
96 /* Only do teardown in the thread */
98 kthread_queue_work(engine
->kworker
,
99 &engine
->pump_requests
);
103 engine
->busy
= false;
104 engine
->idling
= true;
105 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
107 if (engine
->unprepare_crypt_hardware
&&
108 engine
->unprepare_crypt_hardware(engine
))
109 dev_err(engine
->dev
, "failed to unprepare crypt hardware\n");
111 spin_lock_irqsave(&engine
->queue_lock
, flags
);
112 engine
->idling
= false;
116 /* Get the fist request from the engine queue to handle */
117 backlog
= crypto_get_backlog(&engine
->queue
);
118 async_req
= crypto_dequeue_request(&engine
->queue
);
122 engine
->cur_req
= async_req
;
124 backlog
->complete(backlog
, -EINPROGRESS
);
131 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
133 /* Until here we get the request need to be encrypted successfully */
134 if (!was_busy
&& engine
->prepare_crypt_hardware
) {
135 ret
= engine
->prepare_crypt_hardware(engine
);
137 dev_err(engine
->dev
, "failed to prepare crypt hardware\n");
142 enginectx
= crypto_tfm_ctx(async_req
->tfm
);
144 if (enginectx
->op
.prepare_request
) {
145 ret
= enginectx
->op
.prepare_request(engine
, async_req
);
147 dev_err(engine
->dev
, "failed to prepare request: %d\n",
151 engine
->cur_req_prepared
= true;
153 if (!enginectx
->op
.do_one_request
) {
154 dev_err(engine
->dev
, "failed to do request\n");
158 ret
= enginectx
->op
.do_one_request(engine
, async_req
);
160 dev_err(engine
->dev
, "Failed to do one request from queue: %d\n", ret
);
166 crypto_finalize_request(engine
, async_req
, ret
);
170 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
173 static void crypto_pump_work(struct kthread_work
*work
)
175 struct crypto_engine
*engine
=
176 container_of(work
, struct crypto_engine
, pump_requests
);
178 crypto_pump_requests(engine
, true);
182 * crypto_transfer_request - transfer the new request into the engine queue
183 * @engine: the hardware engine
184 * @req: the request need to be listed into the engine queue
186 static int crypto_transfer_request(struct crypto_engine
*engine
,
187 struct crypto_async_request
*req
,
193 spin_lock_irqsave(&engine
->queue_lock
, flags
);
195 if (!engine
->running
) {
196 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
200 ret
= crypto_enqueue_request(&engine
->queue
, req
);
202 if (!engine
->busy
&& need_pump
)
203 kthread_queue_work(engine
->kworker
, &engine
->pump_requests
);
205 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
210 * crypto_transfer_request_to_engine - transfer one request to list
211 * into the engine queue
212 * @engine: the hardware engine
213 * @req: the request need to be listed into the engine queue
215 static int crypto_transfer_request_to_engine(struct crypto_engine
*engine
,
216 struct crypto_async_request
*req
)
218 return crypto_transfer_request(engine
, req
, true);
222 * crypto_transfer_ablkcipher_request_to_engine - transfer one ablkcipher_request
223 * to list into the engine queue
224 * @engine: the hardware engine
225 * @req: the request need to be listed into the engine queue
226 * TODO: Remove this function when skcipher conversion is finished
228 int crypto_transfer_ablkcipher_request_to_engine(struct crypto_engine
*engine
,
229 struct ablkcipher_request
*req
)
231 return crypto_transfer_request_to_engine(engine
, &req
->base
);
233 EXPORT_SYMBOL_GPL(crypto_transfer_ablkcipher_request_to_engine
);
236 * crypto_transfer_aead_request_to_engine - transfer one aead_request
237 * to list into the engine queue
238 * @engine: the hardware engine
239 * @req: the request need to be listed into the engine queue
241 int crypto_transfer_aead_request_to_engine(struct crypto_engine
*engine
,
242 struct aead_request
*req
)
244 return crypto_transfer_request_to_engine(engine
, &req
->base
);
246 EXPORT_SYMBOL_GPL(crypto_transfer_aead_request_to_engine
);
249 * crypto_transfer_akcipher_request_to_engine - transfer one akcipher_request
250 * to list into the engine queue
251 * @engine: the hardware engine
252 * @req: the request need to be listed into the engine queue
254 int crypto_transfer_akcipher_request_to_engine(struct crypto_engine
*engine
,
255 struct akcipher_request
*req
)
257 return crypto_transfer_request_to_engine(engine
, &req
->base
);
259 EXPORT_SYMBOL_GPL(crypto_transfer_akcipher_request_to_engine
);
262 * crypto_transfer_hash_request_to_engine - transfer one ahash_request
263 * to list into the engine queue
264 * @engine: the hardware engine
265 * @req: the request need to be listed into the engine queue
267 int crypto_transfer_hash_request_to_engine(struct crypto_engine
*engine
,
268 struct ahash_request
*req
)
270 return crypto_transfer_request_to_engine(engine
, &req
->base
);
272 EXPORT_SYMBOL_GPL(crypto_transfer_hash_request_to_engine
);
275 * crypto_transfer_skcipher_request_to_engine - transfer one skcipher_request
276 * to list into the engine queue
277 * @engine: the hardware engine
278 * @req: the request need to be listed into the engine queue
280 int crypto_transfer_skcipher_request_to_engine(struct crypto_engine
*engine
,
281 struct skcipher_request
*req
)
283 return crypto_transfer_request_to_engine(engine
, &req
->base
);
285 EXPORT_SYMBOL_GPL(crypto_transfer_skcipher_request_to_engine
);
288 * crypto_finalize_ablkcipher_request - finalize one ablkcipher_request if
289 * the request is done
290 * @engine: the hardware engine
291 * @req: the request need to be finalized
293 * TODO: Remove this function when skcipher conversion is finished
295 void crypto_finalize_ablkcipher_request(struct crypto_engine
*engine
,
296 struct ablkcipher_request
*req
, int err
)
298 return crypto_finalize_request(engine
, &req
->base
, err
);
300 EXPORT_SYMBOL_GPL(crypto_finalize_ablkcipher_request
);
303 * crypto_finalize_aead_request - finalize one aead_request if
304 * the request is done
305 * @engine: the hardware engine
306 * @req: the request need to be finalized
309 void crypto_finalize_aead_request(struct crypto_engine
*engine
,
310 struct aead_request
*req
, int err
)
312 return crypto_finalize_request(engine
, &req
->base
, err
);
314 EXPORT_SYMBOL_GPL(crypto_finalize_aead_request
);
317 * crypto_finalize_akcipher_request - finalize one akcipher_request if
318 * the request is done
319 * @engine: the hardware engine
320 * @req: the request need to be finalized
323 void crypto_finalize_akcipher_request(struct crypto_engine
*engine
,
324 struct akcipher_request
*req
, int err
)
326 return crypto_finalize_request(engine
, &req
->base
, err
);
328 EXPORT_SYMBOL_GPL(crypto_finalize_akcipher_request
);
331 * crypto_finalize_hash_request - finalize one ahash_request if
332 * the request is done
333 * @engine: the hardware engine
334 * @req: the request need to be finalized
337 void crypto_finalize_hash_request(struct crypto_engine
*engine
,
338 struct ahash_request
*req
, int err
)
340 return crypto_finalize_request(engine
, &req
->base
, err
);
342 EXPORT_SYMBOL_GPL(crypto_finalize_hash_request
);
345 * crypto_finalize_skcipher_request - finalize one skcipher_request if
346 * the request is done
347 * @engine: the hardware engine
348 * @req: the request need to be finalized
351 void crypto_finalize_skcipher_request(struct crypto_engine
*engine
,
352 struct skcipher_request
*req
, int err
)
354 return crypto_finalize_request(engine
, &req
->base
, err
);
356 EXPORT_SYMBOL_GPL(crypto_finalize_skcipher_request
);
359 * crypto_engine_start - start the hardware engine
360 * @engine: the hardware engine need to be started
362 * Return 0 on success, else on fail.
364 int crypto_engine_start(struct crypto_engine
*engine
)
368 spin_lock_irqsave(&engine
->queue_lock
, flags
);
370 if (engine
->running
|| engine
->busy
) {
371 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
375 engine
->running
= true;
376 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
378 kthread_queue_work(engine
->kworker
, &engine
->pump_requests
);
382 EXPORT_SYMBOL_GPL(crypto_engine_start
);
385 * crypto_engine_stop - stop the hardware engine
386 * @engine: the hardware engine need to be stopped
388 * Return 0 on success, else on fail.
390 int crypto_engine_stop(struct crypto_engine
*engine
)
393 unsigned int limit
= 500;
396 spin_lock_irqsave(&engine
->queue_lock
, flags
);
399 * If the engine queue is not empty or the engine is on busy state,
400 * we need to wait for a while to pump the requests of engine queue.
402 while ((crypto_queue_len(&engine
->queue
) || engine
->busy
) && limit
--) {
403 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
405 spin_lock_irqsave(&engine
->queue_lock
, flags
);
408 if (crypto_queue_len(&engine
->queue
) || engine
->busy
)
411 engine
->running
= false;
413 spin_unlock_irqrestore(&engine
->queue_lock
, flags
);
416 dev_warn(engine
->dev
, "could not stop engine\n");
420 EXPORT_SYMBOL_GPL(crypto_engine_stop
);
423 * crypto_engine_alloc_init - allocate crypto hardware engine structure and
425 * @dev: the device attached with one hardware engine
426 * @rt: whether this queue is set to run as a realtime task
428 * This must be called from context that can sleep.
429 * Return: the crypto engine structure on success, else NULL.
431 struct crypto_engine
*crypto_engine_alloc_init(struct device
*dev
, bool rt
)
433 struct sched_param param
= { .sched_priority
= MAX_RT_PRIO
- 1 };
434 struct crypto_engine
*engine
;
439 engine
= devm_kzalloc(dev
, sizeof(*engine
), GFP_KERNEL
);
445 engine
->running
= false;
446 engine
->busy
= false;
447 engine
->idling
= false;
448 engine
->cur_req_prepared
= false;
449 engine
->priv_data
= dev
;
450 snprintf(engine
->name
, sizeof(engine
->name
),
451 "%s-engine", dev_name(dev
));
453 crypto_init_queue(&engine
->queue
, CRYPTO_ENGINE_MAX_QLEN
);
454 spin_lock_init(&engine
->queue_lock
);
456 engine
->kworker
= kthread_create_worker(0, "%s", engine
->name
);
457 if (IS_ERR(engine
->kworker
)) {
458 dev_err(dev
, "failed to create crypto request pump task\n");
461 kthread_init_work(&engine
->pump_requests
, crypto_pump_work
);
464 dev_info(dev
, "will run requests pump with realtime priority\n");
465 sched_setscheduler(engine
->kworker
->task
, SCHED_FIFO
, ¶m
);
470 EXPORT_SYMBOL_GPL(crypto_engine_alloc_init
);
473 * crypto_engine_exit - free the resources of hardware engine when exit
474 * @engine: the hardware engine need to be freed
476 * Return 0 for success.
478 int crypto_engine_exit(struct crypto_engine
*engine
)
482 ret
= crypto_engine_stop(engine
);
486 kthread_destroy_worker(engine
->kworker
);
490 EXPORT_SYMBOL_GPL(crypto_engine_exit
);
492 MODULE_LICENSE("GPL");
493 MODULE_DESCRIPTION("Crypto hardware engine framework");