mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 14:25:44 +00:00
feat(mt8188): add MT8188 TRNG driver
Add MTK TRNG driver for MT8188. Change-Id: I604edd42ffce9a153e209a015ba454b51da454e1 Signed-off-by: Suyuan Su <suyuan.su@mediatek.com> Signed-off-by: Gavin Liu <gavin.liu@mediatek.com>
This commit is contained in:
parent
dddded1414
commit
b88d1f527b
5 changed files with 155 additions and 2 deletions
plat/mediatek
96
plat/mediatek/drivers/rng/mt8188/rng_plat.c
Normal file
96
plat/mediatek/drivers/rng/mt8188/rng_plat.c
Normal file
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* Copyright (c) 2024, MediaTek Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <drivers/delay_timer.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <lib/smccc.h>
|
||||
#include <plat/common/platform.h>
|
||||
#include <platform_def.h>
|
||||
#include <services/trng_svc.h>
|
||||
#include <smccc_helpers.h>
|
||||
|
||||
#include "rng_plat.h"
|
||||
|
||||
static void trng_external_swrst(void)
|
||||
{
|
||||
/* External swrst to reset whole rng module */
|
||||
mmio_setbits_32(TRNG_SWRST_SET_REG, RNG_SWRST_B);
|
||||
mmio_setbits_32(TRNG_SWRST_CLR_REG, RNG_SWRST_B);
|
||||
|
||||
/* Disable irq */
|
||||
mmio_clrbits_32(RNG_IRQ_CFG, IRQ_EN);
|
||||
/* Set default cutoff value */
|
||||
mmio_write_32(RNG_HTEST, RNG_DEFAULT_CUTOFF);
|
||||
/* Enable rng */
|
||||
mmio_setbits_32(RNG_EN, DRBG_EN | NRBG_EN);
|
||||
}
|
||||
|
||||
static bool get_entropy_32(uint32_t *out)
|
||||
{
|
||||
uint64_t time = timeout_init_us(MTK_TIMEOUT_POLL);
|
||||
int retry_times = 0;
|
||||
|
||||
while (!(mmio_read_32(RNG_STATUS) & DRBG_VALID)) {
|
||||
if (mmio_read_32(RNG_STATUS) & (RNG_ERROR | APB_ERROR)) {
|
||||
mmio_clrbits_32(RNG_EN, DRBG_EN | NRBG_EN);
|
||||
|
||||
mmio_clrbits_32(RNG_SWRST, SWRST_B);
|
||||
mmio_setbits_32(RNG_SWRST, SWRST_B);
|
||||
|
||||
mmio_setbits_32(RNG_EN, DRBG_EN | NRBG_EN);
|
||||
}
|
||||
|
||||
if (timeout_elapsed(time)) {
|
||||
trng_external_swrst();
|
||||
time = timeout_init_us(MTK_TIMEOUT_POLL);
|
||||
retry_times++;
|
||||
}
|
||||
|
||||
if (retry_times > MTK_RETRY_CNT) {
|
||||
ERROR("%s: trng NOT ready\n", __func__);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
*out = mmio_read_32(RNG_OUT);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Get random number from HWRNG and return 8 bytes of entropy.
|
||||
* Return 'true' when random value generated successfully, otherwise return
|
||||
* 'false'.
|
||||
*/
|
||||
bool plat_get_entropy(uint64_t *out)
|
||||
{
|
||||
uint32_t seed[2] = { 0 };
|
||||
int i = 0;
|
||||
|
||||
assert(out);
|
||||
assert(!check_uptr_overflow((uintptr_t)out, sizeof(*out)));
|
||||
|
||||
/* Disable interrupt mode */
|
||||
mmio_clrbits_32(RNG_IRQ_CFG, IRQ_EN);
|
||||
/* Set rng health test cutoff value */
|
||||
mmio_write_32(RNG_HTEST, RNG_DEFAULT_CUTOFF);
|
||||
/* Enable rng module */
|
||||
mmio_setbits_32(RNG_EN, DRBG_EN | NRBG_EN);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(seed); i++) {
|
||||
if (!get_entropy_32(&seed[i]))
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Output 8 bytes entropy by combining 2 32-bit random numbers. */
|
||||
*out = ((uint64_t)seed[0] << 32) | seed[1];
|
||||
|
||||
return true;
|
||||
}
|
46
plat/mediatek/drivers/rng/mt8188/rng_plat.h
Normal file
46
plat/mediatek/drivers/rng/mt8188/rng_plat.h
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2024, MediaTek Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef RNG_PLAT_H
|
||||
#define RNG_PLAT_H
|
||||
|
||||
#include <lib/utils_def.h>
|
||||
|
||||
#define MTK_TIMEOUT_POLL 1000
|
||||
|
||||
#define MTK_RETRY_CNT 10
|
||||
|
||||
#define RNG_DEFAULT_CUTOFF 0x04871C0B
|
||||
|
||||
/*******************************************************************************
|
||||
* TRNG related constants
|
||||
******************************************************************************/
|
||||
#define RNG_STATUS (TRNG_BASE + 0x0004)
|
||||
#define RNG_SWRST (TRNG_BASE + 0x0010)
|
||||
#define RNG_IRQ_CFG (TRNG_BASE + 0x0014)
|
||||
#define RNG_EN (TRNG_BASE + 0x0020)
|
||||
#define RNG_HTEST (TRNG_BASE + 0x0028)
|
||||
#define RNG_OUT (TRNG_BASE + 0x0030)
|
||||
#define RNG_RAW (TRNG_BASE + 0x0038)
|
||||
#define RNG_SRC (TRNG_BASE + 0x0050)
|
||||
|
||||
#define RAW_VALID BIT(12)
|
||||
#define DRBG_VALID BIT(4)
|
||||
#define RAW_EN BIT(8)
|
||||
#define NRBG_EN BIT(4)
|
||||
#define DRBG_EN BIT(0)
|
||||
#define IRQ_EN BIT(0)
|
||||
#define SWRST_B BIT(0)
|
||||
/* Error conditions */
|
||||
#define RNG_ERROR GENMASK_32(28, 24)
|
||||
#define APB_ERROR BIT(16)
|
||||
|
||||
/* External swrst */
|
||||
#define TRNG_SWRST_SET_REG (INFRACFG_AO_BASE + 0x150)
|
||||
#define TRNG_SWRST_CLR_REG (INFRACFG_AO_BASE + 0x154)
|
||||
#define RNG_SWRST_B BIT(13)
|
||||
|
||||
#endif /* RNG_PLAT_H */
|
|
@ -189,6 +189,11 @@
|
|||
#define EMI_MPU_BASE (IO_PHYS + 0x00226000)
|
||||
#define SUB_EMI_MPU_BASE (IO_PHYS + 0x00225000)
|
||||
|
||||
/*******************************************************************************
|
||||
* TRNG related constants
|
||||
******************************************************************************/
|
||||
#define TRNG_BASE (IO_PHYS + 0x0020F000)
|
||||
|
||||
/*******************************************************************************
|
||||
* System counter frequency related constants
|
||||
******************************************************************************/
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# Copyright (c) 2022-2023, MediaTek Inc. All rights reserved.
|
||||
# Copyright (c) 2022-2024, MediaTek Inc. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
@ -46,5 +46,8 @@ CONFIG_MTK_SUPPORT_SYSTEM_SUSPEND := y
|
|||
CPU_PM_TINYSYS_SUPPORT := y
|
||||
MTK_PUBEVENT_ENABLE := y
|
||||
|
||||
# True Random Number Generator firmware Interface
|
||||
TRNG_SUPPORT := 1
|
||||
|
||||
MACH_MT8188 := 1
|
||||
$(eval $(call add_define,MACH_MT8188))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# Copyright (c) 2022-2023, MediaTek Inc. All rights reserved.
|
||||
# Copyright (c) 2022-2024, MediaTek Inc. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
|
@ -39,6 +39,9 @@ MODULES-y += $(MTK_PLAT)/drivers/mcusys
|
|||
MODULES-y += $(MTK_PLAT)/drivers/pmic
|
||||
MODULES-y += $(MTK_PLAT)/drivers/pmic_wrap
|
||||
MODULES-y += $(MTK_PLAT)/drivers/ptp3
|
||||
ifeq (${TRNG_SUPPORT},1)
|
||||
MODULES-y += $(MTK_PLAT)/drivers/rng
|
||||
endif
|
||||
MODULES-y += $(MTK_PLAT)/drivers/rtc
|
||||
MODULES-y += $(MTK_PLAT)/drivers/spm
|
||||
MODULES-y += $(MTK_PLAT)/drivers/timer
|
||||
|
|
Loading…
Add table
Reference in a new issue