crypto: rockchip: skip hash/tag valid check for V4

Signed-off-by: Lin Jinhan <troy.lin@rock-chips.com>
Change-Id: I52fb9608dfa50b5049e14397e68e8e04edab3877
This commit is contained in:
Lin Jinhan
2024-03-25 15:27:33 +08:00
committed by Tao Huang
parent 75cfb32865
commit c58b0cefaa
3 changed files with 38 additions and 17 deletions

View File

@@ -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) \

View File

@@ -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);

View File

@@ -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: