89 lines
2.3 KiB
C
Executable File
89 lines
2.3 KiB
C
Executable File
/*
|
|
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
|
|
*/
|
|
|
|
#include "cipher_adapt.h"
|
|
|
|
static gk_void *g_rng_reg_base;
|
|
|
|
#define REG_RNG_BASE_ADDR g_rng_reg_base
|
|
#define SEC_COM_TRNG_CTRL (REG_RNG_BASE_ADDR + 0x200)
|
|
#define SEC_COM_TRNG_FIFO_DATA (REG_RNG_BASE_ADDR + 0x204)
|
|
#define SEC_COM_TRNG_DATA_ST (REG_RNG_BASE_ADDR + 0x208)
|
|
|
|
gk_s32 drv_rng_init(gk_void)
|
|
{
|
|
gk_u32 rng_stat = 0;
|
|
|
|
g_rng_reg_base = cipher_ioremap_nocache(CIPHER_RNG_REG_BASE_ADDR_PHY, 0x1000);
|
|
if (g_rng_reg_base == GK_NULL) {
|
|
gk_err_cipher("ioremap_nocache sha2 Reg failed\n");
|
|
return GK_FAILURE;
|
|
}
|
|
|
|
hal_cipher_read_reg(CIPHER_RNG_CRG_ADDR_PHY, &rng_stat);
|
|
rng_stat |= RNG_CRG_CLOCK_BIT;
|
|
rng_stat &= ~RNG_CRG_RESET_BIT;
|
|
hal_cipher_write_reg(CIPHER_RNG_CRG_ADDR_PHY, rng_stat);
|
|
|
|
return GK_SUCCESS;
|
|
}
|
|
|
|
gk_void drv_rng_deinit(gk_void)
|
|
{
|
|
cipher_iounmap(g_rng_reg_base);
|
|
}
|
|
|
|
static gk_s32 drv_cipher_get_random_number(cipher_rng_s *rng)
|
|
{
|
|
gk_u32 rng_stat = 0;
|
|
gk_u32 time_out = 0;
|
|
|
|
if (rng->time_out_us == 0) {
|
|
/* low 3bit(RNG_data_count[2:0]), indicate how many RNGs in the fifo is available now */
|
|
hal_cipher_read_reg(SEC_COM_TRNG_DATA_ST, &rng_stat);
|
|
if (((rng_stat >> 8) & 0x3F) <= 0) /* 8 right shift */
|
|
return GK_ERR_CIPHER_NO_AVAILABLE_RNG;
|
|
} else {
|
|
while (time_out++ < rng->time_out_us) {
|
|
/* low 3bit(RNG_data_count[2:0]), indicate how many RNGs in the fifo is available now */
|
|
hal_cipher_read_reg(SEC_COM_TRNG_DATA_ST, &rng_stat);
|
|
if (((rng_stat >> 8) & 0x3F) > 0) /* 8 right shift */
|
|
break;
|
|
}
|
|
|
|
if (time_out >= rng->time_out_us)
|
|
return GK_ERR_CIPHER_NO_AVAILABLE_RNG;
|
|
}
|
|
|
|
hal_cipher_read_reg(SEC_COM_TRNG_FIFO_DATA, &rng->ci_rng);
|
|
|
|
return GK_SUCCESS;
|
|
}
|
|
|
|
gk_u32 drv_cipher_rand(gk_void)
|
|
{
|
|
cipher_rng_s rng;
|
|
|
|
rng.time_out_us = -1;
|
|
if (drv_cipher_get_random_number(&rng) != GK_SUCCESS)
|
|
gk_err_cipher("Get random number failed!\n");
|
|
|
|
return rng.ci_rng;
|
|
}
|
|
|
|
gk_s32 gk_drv_cipher_get_random_number(cipher_rng_s *rng)
|
|
{
|
|
gk_s32 ret;
|
|
|
|
if (rng == NULL) {
|
|
gk_err_cipher("Invalid params!\n");
|
|
return GK_FAILURE;
|
|
}
|
|
|
|
ret = drv_cipher_get_random_number(rng);
|
|
|
|
return ret;
|
|
}
|
|
|