diff --git a/drivers/crypto/rockchip/rk_crypto_core.h b/drivers/crypto/rockchip/rk_crypto_core.h index b2b059e917e9..8421154bd123 100644 --- a/drivers/crypto/rockchip/rk_crypto_core.h +++ b/drivers/crypto/rockchip/rk_crypto_core.h @@ -439,6 +439,11 @@ enum rk_cipher_mode { } \ } +#define CRYPTO_MAJOR_VER(ver) ((ver) & 0x0f000000) + +#define CRYPTO_MAJOR_VER_3 0x03000000 +#define CRYPTO_MAJOR_VER_4 0x04000000 + #define IS_TYPE_HMAC(type) ((type) == ALG_TYPE_HMAC) #define CRYPTO_READ(dev, offset) \ diff --git a/drivers/crypto/rockchip/rk_crypto_v3_ahash.c b/drivers/crypto/rockchip/rk_crypto_v3_ahash.c index 0c91b45b2123..8838cc625bb4 100644 --- a/drivers/crypto/rockchip/rk_crypto_v3_ahash.c +++ b/drivers/crypto/rockchip/rk_crypto_v3_ahash.c @@ -42,6 +42,12 @@ static const u32 hash_algo2bc[] = { [HASH_ALGO_SM3] = CRYPTO_SM3, }; +static inline bool is_check_hash_valid(struct rk_crypto_dev *dev) +{ + /* crypto < v4 need to check hash valid */ + return CRYPTO_MAJOR_VER(CRYPTO_READ(dev, CRYPTO_CRYPTO_VERSION)) < CRYPTO_MAJOR_VER_4; +} + static void rk_hash_reset(struct rk_crypto_dev *rk_dev) { int ret; @@ -368,13 +374,15 @@ static int rk_ahash_get_result(struct rk_crypto_dev *rk_dev, memset(ctx->priv, 0x00, sizeof(struct rk_hash_mid_data)); - ret = read_poll_timeout_atomic(CRYPTO_READ, reg_ctrl, - reg_ctrl & CRYPTO_HASH_IS_VALID, - RK_POLL_PERIOD_US, - RK_POLL_TIMEOUT_US, false, - rk_dev, CRYPTO_HASH_VALID); - if (ret) - goto exit; + if (is_check_hash_valid(rk_dev)) { + ret = read_poll_timeout_atomic(CRYPTO_READ, reg_ctrl, + reg_ctrl & CRYPTO_HASH_IS_VALID, + RK_POLL_PERIOD_US, + RK_POLL_TIMEOUT_US, false, + rk_dev, CRYPTO_HASH_VALID); + if (ret) + goto exit; + } rk_crypto_read_regs(rk_dev, CRYPTO_HASH_DOUT_0, data, data_len); diff --git a/drivers/crypto/rockchip/rk_crypto_v3_skcipher.c b/drivers/crypto/rockchip/rk_crypto_v3_skcipher.c index 4220e6cbeb14..23563eae0aa9 100644 --- a/drivers/crypto/rockchip/rk_crypto_v3_skcipher.c +++ b/drivers/crypto/rockchip/rk_crypto_v3_skcipher.c @@ -39,6 +39,12 @@ static const u32 cipher_mode2bc[] = { [CIPHER_MODE_GCM] = CRYPTO_BC_GCM, }; +static inline bool is_check_tag_valid(struct rk_crypto_dev *dev) +{ + /* crypto < v4 need to check tag valid */ + return CRYPTO_MAJOR_VER(CRYPTO_READ(dev, CRYPTO_CRYPTO_VERSION)) < CRYPTO_MAJOR_VER_4; +} + static int rk_crypto_irq_handle(int irq, void *dev_id) { struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id); @@ -127,7 +133,7 @@ static void write_tkey_reg(struct rk_crypto_dev *rk_dev, const u8 *key, static int get_tag_reg(struct rk_crypto_dev *rk_dev, u8 *tag, u32 tag_len) { - int ret; + int ret = 0; u32 reg_ctrl = 0; CRYPTO_TRACE("tag_len = %u", tag_len); @@ -135,15 +141,17 @@ static int get_tag_reg(struct rk_crypto_dev *rk_dev, u8 *tag, u32 tag_len) if (tag_len > RK_MAX_TAG_SIZE) return -EINVAL; - ret = read_poll_timeout_atomic(CRYPTO_READ, - reg_ctrl, - reg_ctrl & CRYPTO_CH0_TAG_VALID, - 0, - RK_POLL_TIMEOUT_US, - false, - rk_dev, CRYPTO_TAG_VALID); - if (ret) - goto exit; + if (is_check_tag_valid(rk_dev)) { + ret = read_poll_timeout_atomic(CRYPTO_READ, + reg_ctrl, + reg_ctrl & CRYPTO_CH0_TAG_VALID, + 0, + RK_POLL_TIMEOUT_US, + false, + rk_dev, CRYPTO_TAG_VALID); + if (ret) + goto exit; + } rk_crypto_read_regs(rk_dev, CRYPTO_CH0_TAG_0, tag, tag_len); exit: