From 16b6c0f6066f4b4036581bc7bd04508251a5bfb0 Mon Sep 17 00:00:00 2001 From: Sandeep Tripathy Date: Fri, 12 Apr 2019 21:21:45 +0530 Subject: drivers: bcm_hwrng: add HWRNG driver low level driver for Broadcom random number generator IP. Acked-by: Jens Wiklander Signed-off-by: Bharat Kumar Reddy Gooty Signed-off-by: Sandeep Tripathy --- core/drivers/bcm_hwrng.c | 82 ++++++++++++++++++++++++++++++++++++++++ core/drivers/sub.mk | 1 + core/include/drivers/bcm_hwrng.h | 13 +++++++ 3 files changed, 96 insertions(+) create mode 100644 core/drivers/bcm_hwrng.c create mode 100644 core/include/drivers/bcm_hwrng.h diff --git a/core/drivers/bcm_hwrng.c b/core/drivers/bcm_hwrng.c new file mode 100644 index 00000000..75fda00a --- /dev/null +++ b/core/drivers/bcm_hwrng.c @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: BSD-2-Clause +/* + * Copyright 2019 Broadcom. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* Registers */ +#define RNG_CTRL_OFFSET 0x00 +#define RNG_CTRL_MASK 0x00001fff +#define RNG_CTRL_DISABLE 0x00000000 +#define RNG_CTRL_ENABLE 0x00000001 + +#define RNG_SOFT_RESET_OFFSET 0x04 +#define RNG_SOFT_RESET_MASK 0x00000001 + +#define RNG_FIFO_DATA_OFFSET 0x20 + +#define RNG_FIFO_COUNT_OFFSET 0x24 + +#define RNG_FIFO_COUNT_MASK 0x000000ff +#define RNG_TIMEOUT_US 10000 + +static vaddr_t bcm_hwrng_base; + +static void bcm_hwrng_reset(void) +{ + /* Disable RBG */ + io_clrsetbits32(bcm_hwrng_base + RNG_CTRL_OFFSET, + RNG_CTRL_MASK, RNG_CTRL_DISABLE); + /* Reset RNG and RBG */ + io_setbits32(bcm_hwrng_base + + RNG_SOFT_RESET_OFFSET, RNG_SOFT_RESET_MASK); + io_clrbits32(bcm_hwrng_base + + RNG_SOFT_RESET_OFFSET, RNG_SOFT_RESET_MASK); + /* Enable RBG */ + io_clrsetbits32(bcm_hwrng_base + RNG_CTRL_OFFSET, + RNG_CTRL_MASK, RNG_CTRL_ENABLE); +} + +uint32_t bcm_hwrng_read_rng(uint32_t *p_out, uint32_t words_to_read) +{ + uint32_t available_words = 0; + uint32_t num_words = 0; + uint32_t i = 0; + uint64_t timeout = timeout_init_us(RNG_TIMEOUT_US); + + assert(bcm_hwrng_base); + + do { + available_words = io_read32(bcm_hwrng_base + + RNG_FIFO_COUNT_OFFSET); + available_words = available_words & RNG_FIFO_COUNT_MASK; + } while (!available_words && !timeout_elapsed(timeout)); + + if ((available_words > 0) && (words_to_read > 0)) { + num_words = MIN(available_words, words_to_read); + for (i = 0; i < num_words; i++) + p_out[i] = io_read32(bcm_hwrng_base + + RNG_FIFO_DATA_OFFSET); + } + + return num_words; +} + +static TEE_Result bcm_hwrng_init(void) +{ + bcm_hwrng_base = (vaddr_t)phys_to_virt(HWRNG_BASE, MEM_AREA_IO_SEC); + + bcm_hwrng_reset(); + + DMSG("bcm_hwrng init done\n"); + return TEE_SUCCESS; +} + +driver_init(bcm_hwrng_init); diff --git a/core/drivers/sub.mk b/core/drivers/sub.mk index eaf0e570..e0cf05ae 100644 --- a/core/drivers/sub.mk +++ b/core/drivers/sub.mk @@ -25,3 +25,4 @@ srcs-$(CFG_STM32_GPIO) += stm32_gpio.c srcs-$(CFG_STM32_RNG) += stm32_rng.c srcs-$(CFG_STM32_UART) += stm32_uart.c srcs-$(CFG_STM32_I2C) += stm32_i2c.c +srcs-$(CFG_BCM_HWRNG) += bcm_hwrng.c diff --git a/core/include/drivers/bcm_hwrng.h b/core/include/drivers/bcm_hwrng.h new file mode 100644 index 00000000..abf213df --- /dev/null +++ b/core/include/drivers/bcm_hwrng.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright 2019 Broadcom. + */ + +#ifndef BCM_HWRNG_H +#define BCM_HWRNG_H + +#include + +uint32_t bcm_hwrng_read_rng(uint32_t *p_out, uint32_t words_to_read); + +#endif /* BCM_HWRNG_H */ -- cgit v1.2.3