mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
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:
@@ -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) \
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user