From b21ab65f3af57868a593be97d1ad70a8cdba4e6a Mon Sep 17 00:00:00 2001 From: Troy Lin Date: Tue, 16 Jul 2024 16:09:24 +0800 Subject: [PATCH] crypto: rockchip: Configure reserve block size based on CRYPTO version CRYPTO_V2 : rk_hash_reserve_block = 128 CRYPTO_V3/V4 : rk_hash_reserve_block = 64 Signed-off-by: Troy Lin Change-Id: I2a22d6084cb0f111f54c73939180fa7bbed29ef0 --- drivers/crypto/rockchip/rk_crypto_ahash_utils.c | 14 ++++++++------ drivers/crypto/rockchip/rk_crypto_ahash_utils.h | 2 ++ drivers/crypto/rockchip/rk_crypto_core.h | 5 +++-- drivers/crypto/rockchip/rk_crypto_v2_ahash.c | 8 +++++--- drivers/crypto/rockchip/rk_crypto_v3_ahash.c | 8 +++++--- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/drivers/crypto/rockchip/rk_crypto_ahash_utils.c b/drivers/crypto/rockchip/rk_crypto_ahash_utils.c index 495c55485f14..29873554c05c 100644 --- a/drivers/crypto/rockchip/rk_crypto_ahash_utils.c +++ b/drivers/crypto/rockchip/rk_crypto_ahash_utils.c @@ -11,6 +11,8 @@ #include "rk_crypto_core.h" #include "rk_crypto_ahash_utils.h" +uint32_t rk_hash_reserve_block = RK_HASH_RESERVE_BLOCK; + static const char * const hash_algo2name[] = { [HASH_ALGO_MD5] = "md5", [HASH_ALGO_SHA1] = "sha1", @@ -35,7 +37,7 @@ static void rk_ahash_ctx_clear(struct rk_ahash_ctx *ctx) { rk_alg_ctx_clear(&ctx->algs_ctx); - memset(ctx->hash_tmp, 0x00, RK_DMA_ALIGNMENT); + memset(ctx->hash_tmp, 0x00, RK_HASH_RESERVE_BLOCK); memset(ctx->lastc, 0x00, sizeof(ctx->lastc)); ctx->hash_tmp_len = 0; @@ -81,13 +83,13 @@ static u32 rk_calc_lastc_new_len(u32 nbytes, u32 old_len) { u32 total_len = nbytes + old_len; - if (total_len <= RK_DMA_ALIGNMENT) + if (total_len <= rk_hash_reserve_block) return nbytes; - if (total_len % RK_DMA_ALIGNMENT) - return total_len % RK_DMA_ALIGNMENT; + if (total_len % rk_hash_reserve_block) + return total_len % rk_hash_reserve_block; - return RK_DMA_ALIGNMENT; + return rk_hash_reserve_block; } static int rk_ahash_fallback_digest(const char *alg_name, bool is_hmac, @@ -326,7 +328,7 @@ int rk_ahash_start(struct rk_crypto_dev *rk_dev) nbytes = ctx->hash_tmp_len + req->nbytes - ctx->lastc_len; /* not enough data */ - if (nbytes < RK_DMA_ALIGNMENT) { + if (nbytes < rk_hash_reserve_block) { CRYPTO_TRACE("nbytes = %u, not enough data", nbytes); memcpy(ctx->hash_tmp + ctx->hash_tmp_len, ctx->lastc, ctx->lastc_len); diff --git a/drivers/crypto/rockchip/rk_crypto_ahash_utils.h b/drivers/crypto/rockchip/rk_crypto_ahash_utils.h index 46afd98a0252..6110bd97bc43 100644 --- a/drivers/crypto/rockchip/rk_crypto_ahash_utils.h +++ b/drivers/crypto/rockchip/rk_crypto_ahash_utils.h @@ -10,6 +10,8 @@ #include "rk_crypto_core.h" #include "rk_crypto_utils.h" +extern uint32_t rk_hash_reserve_block; + struct rk_alg_ctx *rk_ahash_alg_ctx(struct rk_crypto_dev *rk_dev); struct rk_crypto_algt *rk_ahash_get_algt(struct crypto_ahash *tfm); diff --git a/drivers/crypto/rockchip/rk_crypto_core.h b/drivers/crypto/rockchip/rk_crypto_core.h index aba37a9cc1b0..a793cf87457d 100644 --- a/drivers/crypto/rockchip/rk_crypto_core.h +++ b/drivers/crypto/rockchip/rk_crypto_core.h @@ -42,7 +42,8 @@ #define RK_BUFFER_ORDER 3 #define RK_BUFFER_SIZE (PAGE_SIZE << RK_BUFFER_ORDER) -#define RK_DMA_ALIGNMENT 128 +#define RK_HASH_RESERVE_BLOCK 128 + #define sha384_state sha512_state #define sha224_state sha256_state @@ -175,7 +176,7 @@ struct rk_ahash_ctx { bool hash_tmp_mapped; u32 calc_cnt; - u8 lastc[RK_DMA_ALIGNMENT]; + u8 lastc[RK_HASH_RESERVE_BLOCK]; u32 lastc_len; void *priv; diff --git a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c index d9c1f1a46c45..b189fcb30bbf 100644 --- a/drivers/crypto/rockchip/rk_crypto_v2_ahash.c +++ b/drivers/crypto/rockchip/rk_crypto_v2_ahash.c @@ -220,9 +220,9 @@ static int rk_ahash_dma_start(struct rk_crypto_dev *rk_dev, uint32_t flag) CRYPTO_TRACE("ctx->calc_cnt = %u, count %u Byte, is_final = %d", ctx->calc_cnt, alg_ctx->count, is_final); - if (alg_ctx->count % RK_DMA_ALIGNMENT && !is_final) { + if (alg_ctx->count % rk_hash_reserve_block && !is_final) { dev_err(rk_dev->dev, "count = %u is not aligned with [%u]\n", - alg_ctx->count, RK_DMA_ALIGNMENT); + alg_ctx->count, rk_hash_reserve_block); return -EINVAL; } @@ -313,12 +313,14 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm) CRYPTO_TRACE(); + rk_hash_reserve_block = RK_HASH_RESERVE_BLOCK; + memset(ctx, 0x00, sizeof(*ctx)); if (!rk_dev->request_crypto) return -EFAULT; - alg_ctx->align_size = RK_DMA_ALIGNMENT; + alg_ctx->align_size = 64; alg_ctx->ops.start = rk_ahash_start; alg_ctx->ops.update = rk_ahash_crypto_rx; diff --git a/drivers/crypto/rockchip/rk_crypto_v3_ahash.c b/drivers/crypto/rockchip/rk_crypto_v3_ahash.c index eb524cfee4e8..1a49e989f915 100644 --- a/drivers/crypto/rockchip/rk_crypto_v3_ahash.c +++ b/drivers/crypto/rockchip/rk_crypto_v3_ahash.c @@ -300,9 +300,9 @@ static int rk_ahash_dma_start(struct rk_crypto_dev *rk_dev, uint32_t flag) CRYPTO_TRACE("ctx->calc_cnt = %u, count %u Byte, is_final = %d", ctx->calc_cnt, alg_ctx->count, is_final); - if (alg_ctx->count % RK_DMA_ALIGNMENT && !is_final) { + if (alg_ctx->count % rk_hash_reserve_block && !is_final) { dev_err(rk_dev->dev, "count = %u is not aligned with [%u]\n", - alg_ctx->count, RK_DMA_ALIGNMENT); + alg_ctx->count, rk_hash_reserve_block); return -EINVAL; } @@ -400,12 +400,14 @@ static int rk_cra_hash_init(struct crypto_tfm *tfm) CRYPTO_TRACE(); + rk_hash_reserve_block = 64; + memset(ctx, 0x00, sizeof(*ctx)); if (!rk_dev->request_crypto) return -EFAULT; - alg_ctx->align_size = RK_DMA_ALIGNMENT; + alg_ctx->align_size = 64; alg_ctx->ops.start = rk_ahash_start; alg_ctx->ops.update = rk_ahash_crypto_rx;