gk7205v200-uboot/product/cipher/v2/drv/rng/drv_rng.c
2025-08-07 17:13:54 +08:00

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;
}