This patchs adds two new function wrapper in crypto_engine.
- enqueue_request() for drivers enqueuing request to hardware.
- can_queue_more() for letting drivers to tell if they can
enqueue/prepare more.

Since some drivers (like caam) only enqueue request without "doing"
them, do_one_request() is now optional.

Signed-off-by: Corentin Labbe <clabbe.montj...@gmail.com>
---
 crypto/crypto_engine.c  | 25 ++++++++++++++++++++++---
 include/crypto/engine.h | 14 ++++++++------
 2 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/crypto/crypto_engine.c b/crypto/crypto_engine.c
index 5bcb1e740fd9..4a28548c49aa 100644
--- a/crypto/crypto_engine.c
+++ b/crypto/crypto_engine.c
@@ -83,6 +83,7 @@ static void crypto_pump_requests(struct crypto_engine *engine,
                goto out;
        }
 
+retry:
        /* Get the fist request from the engine queue to handle */
        backlog = crypto_get_backlog(&engine->queue);
        async_req = crypto_dequeue_request(&engine->queue);
@@ -118,10 +119,28 @@ static void crypto_pump_requests(struct crypto_engine 
*engine,
                        goto req_err2;
                }
        }
+
+       if (enginectx->op.enqueue_request) {
+               ret = enginectx->op.enqueue_request(engine, async_req);
+               if (ret) {
+                       dev_err(engine->dev, "failed to enqueue request: %d\n",
+                               ret);
+                       goto req_err;
+               }
+       }
+       if (enginectx->op.can_queue_more && engine->queue.qlen > 0) {
+               ret = enginectx->op.can_queue_more(engine, async_req);
+               if (ret > 0) {
+                       spin_lock_irqsave(&engine->queue_lock, flags);
+                       goto retry;
+               }
+               if (ret < 0) {
+                       dev_err(engine->dev, "failed to call can_queue_more\n");
+                       /* TODO */
+               }
+       }
        if (!enginectx->op.do_one_request) {
-               dev_err(engine->dev, "failed to do request\n");
-               ret = -EINVAL;
-               goto req_err;
+               return;
        }
        ret = enginectx->op.do_one_request(engine, async_req);
        if (ret) {
diff --git a/include/crypto/engine.h b/include/crypto/engine.h
index 03d9f9ec1cea..8ab9d26e30fe 100644
--- a/include/crypto/engine.h
+++ b/include/crypto/engine.h
@@ -63,14 +63,16 @@ struct crypto_engine {
  * @prepare__request: do some prepare if need before handle the current request
  * @unprepare_request: undo any work done by prepare_request()
  * @do_one_request: do encryption for current request
+ * @enqueue_request:   Enqueue the request in the hardware
+ * @can_queue_more:    if this function return > 0, it will tell the crypto
+ *     engine that more space are availlable for prepare/enqueue request
  */
 struct crypto_engine_op {
-       int (*prepare_request)(struct crypto_engine *engine,
-                              void *areq);
-       int (*unprepare_request)(struct crypto_engine *engine,
-                                void *areq);
-       int (*do_one_request)(struct crypto_engine *engine,
-                             void *areq);
+       int (*prepare_request)(struct crypto_engine *engine, void *areq);
+       int (*unprepare_request)(struct crypto_engine *engine, void *areq);
+       int (*do_one_request)(struct crypto_engine *engine, void *areq);
+       int (*enqueue_request)(struct crypto_engine *engine, void *areq);
+       int (*can_queue_more)(struct crypto_engine *engine, void *areq);
 };
 
 struct crypto_engine_ctx {
-- 
2.24.1

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
To view this discussion on the web, visit 
https://groups.google.com/d/msgid/linux-sunxi/20200122104528.30084-6-clabbe.montjoie%40gmail.com.

Reply via email to