aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandeep Tripathy <sandeep.tripathy@broadcom.com>2019-04-12 21:21:45 +0530
committerJérôme Forissier <jerome.forissier@linaro.org>2019-04-13 12:13:53 +0200
commit16b6c0f6066f4b4036581bc7bd04508251a5bfb0 (patch)
tree5837583aa11f3ea7872ae957f446f933ae88e0a4
parent4e7f52fc5c54b2c62c4219b0830a1d484410aea7 (diff)
drivers: bcm_hwrng: add HWRNG driver
low level driver for Broadcom random number generator IP. Acked-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Bharat Kumar Reddy Gooty <bharat.gooty@broadcom.com> Signed-off-by: Sandeep Tripathy <sandeep.tripathy@broadcom.com>
-rw-r--r--core/drivers/bcm_hwrng.c82
-rw-r--r--core/drivers/sub.mk1
-rw-r--r--core/include/drivers/bcm_hwrng.h13
3 files changed, 96 insertions, 0 deletions
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 <drivers/bcm_hwrng.h>
+#include <initcall.h>
+#include <io.h>
+#include <kernel/delay.h>
+#include <mm/core_memprot.h>
+#include <platform_config.h>
+#include <trace.h>
+
+/* 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 <stdlib.h>
+
+uint32_t bcm_hwrng_read_rng(uint32_t *p_out, uint32_t words_to_read);
+
+#endif /* BCM_HWRNG_H */