[PATCH 08/15] crypto: zynqmp-aes-gcm: Avoid submitting fallback requests to engine
Harsh Jain
h.jain at amd.com
Wed Oct 29 03:21:51 PDT 2025
Don't enqueue requests which are supposed to fallback to s/w crypto.
Signed-off-by: Harsh Jain <h.jain at amd.com>
---
drivers/crypto/xilinx/zynqmp-aes-gcm.c | 62 +++++++++++++++-----------
1 file changed, 35 insertions(+), 27 deletions(-)
diff --git a/drivers/crypto/xilinx/zynqmp-aes-gcm.c b/drivers/crypto/xilinx/zynqmp-aes-gcm.c
index 3b346a1c9f7e..9be1305b79d2 100644
--- a/drivers/crypto/xilinx/zynqmp-aes-gcm.c
+++ b/drivers/crypto/xilinx/zynqmp-aes-gcm.c
@@ -204,31 +204,9 @@ static int zynqmp_handle_aes_req(struct crypto_engine *engine,
{
struct aead_request *areq =
container_of(req, struct aead_request, base);
- struct crypto_aead *aead = crypto_aead_reqtfm(req);
- struct zynqmp_aead_tfm_ctx *tfm_ctx = crypto_aead_ctx(aead);
- struct zynqmp_aead_req_ctx *rq_ctx = aead_request_ctx(areq);
- struct aead_request *subreq = aead_request_ctx(req);
- int need_fallback;
int err;
- need_fallback = zynqmp_fallback_check(tfm_ctx, areq);
-
- if (need_fallback) {
- aead_request_set_tfm(subreq, tfm_ctx->fbk_cipher);
-
- aead_request_set_callback(subreq, areq->base.flags,
- NULL, NULL);
- aead_request_set_crypt(subreq, areq->src, areq->dst,
- areq->cryptlen, areq->iv);
- aead_request_set_ad(subreq, areq->assoclen);
- if (rq_ctx->op == ZYNQMP_AES_ENCRYPT)
- err = crypto_aead_encrypt(subreq);
- else
- err = crypto_aead_decrypt(subreq);
- } else {
- err = zynqmp_aes_aead_cipher(areq);
- }
-
+ err = zynqmp_aes_aead_cipher(areq);
local_bh_disable();
crypto_finalize_aead_request(engine, areq, err);
local_bh_enable();
@@ -281,26 +259,56 @@ static int zynqmp_aes_aead_setauthsize(struct crypto_aead *aead,
static int zynqmp_aes_aead_encrypt(struct aead_request *req)
{
- struct zynqmp_aead_drv_ctx *drv_ctx;
+ struct zynqmp_aead_req_ctx *rq_ctx = aead_request_ctx(req);
+ struct aead_request *subreq = aead_request_ctx(req);
struct crypto_aead *aead = crypto_aead_reqtfm(req);
+ struct zynqmp_aead_tfm_ctx *tfm_ctx = crypto_aead_ctx(aead);
struct aead_alg *alg = crypto_aead_alg(aead);
- struct zynqmp_aead_req_ctx *rq_ctx = aead_request_ctx(req);
+ struct zynqmp_aead_drv_ctx *drv_ctx;
+ int err;
rq_ctx->op = ZYNQMP_AES_ENCRYPT;
drv_ctx = container_of(alg, struct zynqmp_aead_drv_ctx, aead.base);
+ err = zynqmp_fallback_check(tfm_ctx, req);
+ if (err) {
+ aead_request_set_tfm(subreq, tfm_ctx->fbk_cipher);
+ aead_request_set_callback(subreq, req->base.flags,
+ NULL, NULL);
+ aead_request_set_crypt(subreq, req->src, req->dst,
+ req->cryptlen, req->iv);
+ aead_request_set_ad(subreq, req->assoclen);
+ err = crypto_aead_encrypt(subreq);
+
+ return err;
+ }
return crypto_transfer_aead_request_to_engine(drv_ctx->engine, req);
}
static int zynqmp_aes_aead_decrypt(struct aead_request *req)
{
- struct zynqmp_aead_drv_ctx *drv_ctx;
+ struct zynqmp_aead_req_ctx *rq_ctx = aead_request_ctx(req);
+ struct aead_request *subreq = aead_request_ctx(req);
struct crypto_aead *aead = crypto_aead_reqtfm(req);
+ struct zynqmp_aead_tfm_ctx *tfm_ctx = crypto_aead_ctx(aead);
struct aead_alg *alg = crypto_aead_alg(aead);
- struct zynqmp_aead_req_ctx *rq_ctx = aead_request_ctx(req);
+ struct zynqmp_aead_drv_ctx *drv_ctx;
+ int err;
rq_ctx->op = ZYNQMP_AES_DECRYPT;
drv_ctx = container_of(alg, struct zynqmp_aead_drv_ctx, aead.base);
+ err = zynqmp_fallback_check(tfm_ctx, req);
+ if (err) {
+ aead_request_set_tfm(subreq, tfm_ctx->fbk_cipher);
+ aead_request_set_callback(subreq, req->base.flags,
+ NULL, NULL);
+ aead_request_set_crypt(subreq, req->src, req->dst,
+ req->cryptlen, req->iv);
+ aead_request_set_ad(subreq, req->assoclen);
+ err = crypto_aead_decrypt(subreq);
+
+ return err;
+ }
return crypto_transfer_aead_request_to_engine(drv_ctx->engine, req);
}
--
2.49.1
More information about the linux-arm-kernel
mailing list