[PATCH 0/7] Add a random number generator uclass

Add a random number generator(rng) uclass to facilitate adding drivers for rng devices. I plan to add an implementation of the EFI_RNG_PROTOCOL, which would get the random number from the rng uclass -- the protocol would be used by the efi stub for getting a random number for the kaslr feature.
The patch series also adds a driver for the rng device found on the stm32mp1 platforms. A dummy rng driver for sandbox has also been added, along with the unit test for the rng uclass.
Sughosh Ganu (7): dm: rng: Add random number generator(rng) uclass clk: stm32mp1: Add a clock entry for RNG1 device stm32mp1: rng: Add a driver for random number generator(rng) device configs: stm32mp15: Enable random number generator(rng) device sandbox: rng: Add a random number generator(rng) driver configs: sandbox: Enable random number generator(rng) device test: rng: Add basic test for random number generator(rng) uclass
arch/sandbox/dts/test.dts | 4 + configs/sandbox64_defconfig | 2 + configs/sandbox_defconfig | 2 + configs/stm32mp15_basic_defconfig | 2 + configs/stm32mp15_optee_defconfig | 2 + configs/stm32mp15_trusted_defconfig | 2 + drivers/Kconfig | 2 + drivers/Makefile | 1 + drivers/clk/clk_stm32mp1.c | 1 + drivers/rng/Kconfig | 21 +++++ drivers/rng/Makefile | 8 ++ drivers/rng/rng-uclass.c | 23 +++++ drivers/rng/sandbox_rng.c | 36 ++++++++ drivers/rng/stm32mp1_rng.c | 164 ++++++++++++++++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/rng.h | 25 ++++++ test/dm/Makefile | 1 + test/dm/rng.c | 26 ++++++ 18 files changed, 323 insertions(+) create mode 100644 drivers/rng/Kconfig create mode 100644 drivers/rng/Makefile create mode 100644 drivers/rng/rng-uclass.c create mode 100644 drivers/rng/sandbox_rng.c create mode 100644 drivers/rng/stm32mp1_rng.c create mode 100644 include/rng.h create mode 100644 test/dm/rng.c

Add a uclass for reading a random number seed from a random number generator device.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- drivers/Kconfig | 2 ++ drivers/Makefile | 1 + drivers/rng/Kconfig | 7 +++++++ drivers/rng/Makefile | 6 ++++++ drivers/rng/rng-uclass.c | 23 +++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/rng.h | 25 +++++++++++++++++++++++++ 7 files changed, 65 insertions(+) create mode 100644 drivers/rng/Kconfig create mode 100644 drivers/rng/Makefile create mode 100644 drivers/rng/rng-uclass.c create mode 100644 include/rng.h
diff --git a/drivers/Kconfig b/drivers/Kconfig index 9d99ce0..e34a227 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -90,6 +90,8 @@ source "drivers/remoteproc/Kconfig"
source "drivers/reset/Kconfig"
+source "drivers/rng/Kconfig" + source "drivers/rtc/Kconfig"
source "drivers/scsi/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index 0befedd..0fa4413 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -117,4 +117,5 @@ obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/ obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock/ +obj-$(CONFIG_DM_RNG) += rng/ endif diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig new file mode 100644 index 0000000..dd44cc0 --- /dev/null +++ b/drivers/rng/Kconfig @@ -0,0 +1,7 @@ +config DM_RNG + bool "Driver support for Random Number Generator devices" + depends on DM + help + Enable driver model for random number generator(rng) devices. + This interface is used to initialise the rng device and to + read the random seed from the device. diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile new file mode 100644 index 0000000..311705b --- /dev/null +++ b/drivers/rng/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2019, Linaro Limited +# + +obj-$(CONFIG_DM_RNG) += rng-uclass.o diff --git a/drivers/rng/rng-uclass.c b/drivers/rng/rng-uclass.c new file mode 100644 index 0000000..de745d3 --- /dev/null +++ b/drivers/rng/rng-uclass.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2019, Linaro Limited + */ + +#include <common.h> +#include <dm.h> +#include <rng.h> + +int dm_rng_read(struct udevice *dev, void *buffer, size_t size) +{ + const struct dm_rng_ops *ops = device_get_ops(dev); + + if (!ops->read) + return -ENOSYS; + + return ops->read(dev, buffer, size); +} + +UCLASS_DRIVER(hwrng) = { + .name = "rng", + .id = UCLASS_RNG, +}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 0c563d8..192202d 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -86,6 +86,7 @@ enum uclass_id { UCLASS_REGULATOR, /* Regulator device */ UCLASS_REMOTEPROC, /* Remote Processor device */ UCLASS_RESET, /* Reset controller device */ + UCLASS_RNG, /* Random Number Generator */ UCLASS_RTC, /* Real time clock device */ UCLASS_SCSI, /* SCSI device */ UCLASS_SERIAL, /* Serial UART */ diff --git a/include/rng.h b/include/rng.h new file mode 100644 index 0000000..b5fd950 --- /dev/null +++ b/include/rng.h @@ -0,0 +1,25 @@ +#if !defined _RNG_H_ +#define _RNG_H_ + +#include <dm.h> + +/** + * dm_rng_read() - read a random number seed from the rng device + * @buffer: input buffer to put the read random seed into + * @size: number of bytes of random seed read + * + */ +int dm_rng_read(struct udevice *dev, void *buffer, size_t size); + +/* struct dm_rng_ops - Operations for the hwrng uclass */ +struct dm_rng_ops { + /** + * @read() - read a random number seed + * + * @data: input buffer to read the random seed + * @max: total number of bytes to read + */ + int (*read)(struct udevice *dev, void *data, size_t max); +}; + +#endif /* _RNG_H_ */

Hi Sughosh
On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add a uclass for reading a random number seed from a random number generator device.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
drivers/Kconfig | 2 ++ drivers/Makefile | 1 + drivers/rng/Kconfig | 7 +++++++ drivers/rng/Makefile | 6 ++++++ drivers/rng/rng-uclass.c | 23 +++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/rng.h | 25 +++++++++++++++++++++++++ 7 files changed, 65 insertions(+) create mode 100644 drivers/rng/Kconfig create mode 100644 drivers/rng/Makefile create mode 100644 drivers/rng/rng-uclass.c create mode 100644 include/rng.h
diff --git a/drivers/Kconfig b/drivers/Kconfig index 9d99ce0..e34a227 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -90,6 +90,8 @@ source "drivers/remoteproc/Kconfig"
source "drivers/reset/Kconfig"
+source "drivers/rng/Kconfig"
source "drivers/rtc/Kconfig"
source "drivers/scsi/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index 0befedd..0fa4413 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -117,4 +117,5 @@ obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/ obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock/ +obj-$(CONFIG_DM_RNG) += rng/ endif diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig new file mode 100644 index 0000000..dd44cc0 --- /dev/null +++ b/drivers/rng/Kconfig @@ -0,0 +1,7 @@ +config DM_RNG
- bool "Driver support for Random Number Generator devices"
- depends on DM
- help
Enable driver model for random number generator(rng) devices.
This interface is used to initialise the rng device and to
read the random seed from the device.
diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile new file mode 100644 index 0000000..311705b --- /dev/null +++ b/drivers/rng/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2019, Linaro Limited +#
+obj-$(CONFIG_DM_RNG) += rng-uclass.o diff --git a/drivers/rng/rng-uclass.c b/drivers/rng/rng-uclass.c new file mode 100644 index 0000000..de745d3 --- /dev/null +++ b/drivers/rng/rng-uclass.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright (c) 2019, Linaro Limited
- */
+#include <common.h> +#include <dm.h> +#include <rng.h>
+int dm_rng_read(struct udevice *dev, void *buffer, size_t size) +{
- const struct dm_rng_ops *ops = device_get_ops(dev);
- if (!ops->read)
return -ENOSYS;
- return ops->read(dev, buffer, size);
+}
+UCLASS_DRIVER(hwrng) = {
- .name = "rng",
- .id = UCLASS_RNG,
+}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 0c563d8..192202d 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -86,6 +86,7 @@ enum uclass_id { UCLASS_REGULATOR, /* Regulator device */ UCLASS_REMOTEPROC, /* Remote Processor device */ UCLASS_RESET, /* Reset controller device */
- UCLASS_RNG, /* Random Number Generator */ UCLASS_RTC, /* Real time clock device */ UCLASS_SCSI, /* SCSI device */ UCLASS_SERIAL, /* Serial UART */
diff --git a/include/rng.h b/include/rng.h new file mode 100644 index 0000000..b5fd950 --- /dev/null +++ b/include/rng.h @@ -0,0 +1,25 @@ +#if !defined _RNG_H_ +#define _RNG_H_
+#include <dm.h>
+/**
- dm_rng_read() - read a random number seed from the rng device
- @buffer: input buffer to put the read random seed into
- @size: number of bytes of random seed read
- */
+int dm_rng_read(struct udevice *dev, void *buffer, size_t size);
+/* struct dm_rng_ops - Operations for the hwrng uclass */ +struct dm_rng_ops {
- /**
* @read() - read a random number seed
*
* @data: input buffer to read the random seed
* @max: total number of bytes to read
*/
- int (*read)(struct udevice *dev, void *data, size_t max);
+};
+#endif /* _RNG_H_ */
Reviewed-by: Patrice Chotard patrice.chotard@st.com
Thanks

On Wed, 4 Dec 2019 at 04:54, Sughosh Ganu sughosh.ganu@linaro.org wrote:
Add a uclass for reading a random number seed from a random number generator device.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
drivers/Kconfig | 2 ++ drivers/Makefile | 1 + drivers/rng/Kconfig | 7 +++++++ drivers/rng/Makefile | 6 ++++++ drivers/rng/rng-uclass.c | 23 +++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/rng.h | 25 +++++++++++++++++++++++++ 7 files changed, 65 insertions(+) create mode 100644 drivers/rng/Kconfig create mode 100644 drivers/rng/Makefile create mode 100644 drivers/rng/rng-uclass.c create mode 100644 include/rng.h
Reviewed-by: Simon Glass sjg@chromium.org
nits below
diff --git a/drivers/Kconfig b/drivers/Kconfig index 9d99ce0..e34a227 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -90,6 +90,8 @@ source "drivers/remoteproc/Kconfig"
source "drivers/reset/Kconfig"
+source "drivers/rng/Kconfig"
source "drivers/rtc/Kconfig"
source "drivers/scsi/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index 0befedd..0fa4413 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -117,4 +117,5 @@ obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/ obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock/ +obj-$(CONFIG_DM_RNG) += rng/ endif diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig new file mode 100644 index 0000000..dd44cc0 --- /dev/null +++ b/drivers/rng/Kconfig @@ -0,0 +1,7 @@ +config DM_RNG
bool "Driver support for Random Number Generator devices"
depends on DM
help
Enable driver model for random number generator(rng) devices.
This interface is used to initialise the rng device and to
read the random seed from the device.
diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile new file mode 100644 index 0000000..311705b --- /dev/null +++ b/drivers/rng/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2019, Linaro Limited +#
+obj-$(CONFIG_DM_RNG) += rng-uclass.o diff --git a/drivers/rng/rng-uclass.c b/drivers/rng/rng-uclass.c new file mode 100644 index 0000000..de745d3 --- /dev/null +++ b/drivers/rng/rng-uclass.c @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright (c) 2019, Linaro Limited
- */
+#include <common.h> +#include <dm.h> +#include <rng.h>
+int dm_rng_read(struct udevice *dev, void *buffer, size_t size) +{
const struct dm_rng_ops *ops = device_get_ops(dev);
if (!ops->read)
return -ENOSYS;
return ops->read(dev, buffer, size);
+}
+UCLASS_DRIVER(hwrng) = {
.name = "rng",
.id = UCLASS_RNG,
+}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 0c563d8..192202d 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -86,6 +86,7 @@ enum uclass_id { UCLASS_REGULATOR, /* Regulator device */ UCLASS_REMOTEPROC, /* Remote Processor device */ UCLASS_RESET, /* Reset controller device */
UCLASS_RNG, /* Random Number Generator */ UCLASS_RTC, /* Real time clock device */ UCLASS_SCSI, /* SCSI device */ UCLASS_SERIAL, /* Serial UART */
diff --git a/include/rng.h b/include/rng.h new file mode 100644 index 0000000..b5fd950 --- /dev/null +++ b/include/rng.h @@ -0,0 +1,25 @@ +#if !defined _RNG_H_ +#define _RNG_H_
+#include <dm.h>
Please don't include this in the header...just
struct udevice;
should do it.
+/**
- dm_rng_read() - read a random number seed from the rng device
@dev
- @buffer: input buffer to put the read random seed into
- @size: number of bytes of random seed read
@return
- */
+int dm_rng_read(struct udevice *dev, void *buffer, size_t size);
+/* struct dm_rng_ops - Operations for the hwrng uclass */ +struct dm_rng_ops {
/**
* @read() - read a random number seed
*
@dev
* @data: input buffer to read the random seed
* @max: total number of bytes to read
@return
*/
int (*read)(struct udevice *dev, void *data, size_t max);
+};
+#endif /* _RNG_H_ */
2.7.4
Regards, Simon

Add an entry for allowing clock enablement for the random number generator peripheral, RNG1.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- drivers/clk/clk_stm32mp1.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/drivers/clk/clk_stm32mp1.c b/drivers/clk/clk_stm32mp1.c index 3718970..da66bde 100644 --- a/drivers/clk/clk_stm32mp1.c +++ b/drivers/clk/clk_stm32mp1.c @@ -563,6 +563,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = { STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 10, GPIOK, _UNKNOWN_SEL),
STM32MP1_CLK_SET_CLR(RCC_MP_AHB5ENSETR, 0, GPIOZ, _UNKNOWN_SEL), + STM32MP1_CLK_SET_CLR(RCC_MP_AHB5ENSETR, 6, RNG1_K, _UNKNOWN_SEL),
STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 7, ETHCK_K, _ETH_SEL), STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 8, ETHTX, _UNKNOWN_SEL),

Hi Sughosh
On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add an entry for allowing clock enablement for the random number generator peripheral, RNG1.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
drivers/clk/clk_stm32mp1.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/drivers/clk/clk_stm32mp1.c b/drivers/clk/clk_stm32mp1.c index 3718970..da66bde 100644 --- a/drivers/clk/clk_stm32mp1.c +++ b/drivers/clk/clk_stm32mp1.c @@ -563,6 +563,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = { STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 10, GPIOK, _UNKNOWN_SEL),
STM32MP1_CLK_SET_CLR(RCC_MP_AHB5ENSETR, 0, GPIOZ, _UNKNOWN_SEL),
STM32MP1_CLK_SET_CLR(RCC_MP_AHB5ENSETR, 6, RNG1_K, _UNKNOWN_SEL),
STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 7, ETHCK_K, _ETH_SEL), STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 8, ETHTX, _UNKNOWN_SEL),
Reviewed-by: Patrice Chotard patrice.chotard@st.com
Thanks

Add a driver for the rng device found on stm32mp1 platforms. The driver provides a routine for reading the random number seed from the hardware device.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- drivers/rng/Kconfig | 7 ++ drivers/rng/Makefile | 1 + drivers/rng/stm32mp1_rng.c | 164 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 drivers/rng/stm32mp1_rng.c
diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index dd44cc0..5fc11db 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -5,3 +5,10 @@ config DM_RNG Enable driver model for random number generator(rng) devices. This interface is used to initialise the rng device and to read the random seed from the device. + +config RNG_STM32MP1 + bool "Enable random number generator for STM32MP1" + depends on ARCH_STM32MP && DM_RNG + default n + help + Enable STM32MP1 rng driver. diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 311705b..699beb3 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,3 +4,4 @@ #
obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/stm32mp1_rng.c b/drivers/rng/stm32mp1_rng.c new file mode 100644 index 0000000..f5ee084 --- /dev/null +++ b/drivers/rng/stm32mp1_rng.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2019, Linaro Limited + */ + +#include <common.h> +#include <clk.h> +#include <dm.h> +#include <reset.h> +#include <rng.h> + +#include <asm/io.h> +#include <linux/iopoll.h> +#include <linux/kernel.h> + +#define RNG_CR 0x00 +#define RNG_CR_RNGEN BIT(2) +#define RNG_CR_CED BIT(5) + +#define RNG_SR 0x04 +#define RNG_SR_SEIS BIT(6) +#define RNG_SR_CEIS BIT(5) +#define RNG_SR_SECS BIT(2) +#define RNG_SR_DRDY BIT(0) + +#define RNG_DR 0x08 + +struct stm32_rng_platdata { + fdt_addr_t base; + struct clk clk; + struct reset_ctl rst; + bool inited; +}; + +static int stm32_rng_read(struct udevice *dev, void *data, size_t len) +{ + int retval = 0, i; + u32 sr, count, reg; + size_t increment; + struct stm32_rng_platdata *pdata = dev_get_platdata(dev); + + while (len > 0) { + retval = readl_poll_timeout(pdata->base + RNG_SR, sr, + sr & RNG_SR_DRDY, 10000); + if (retval) + return retval; + + if (sr & (RNG_SR_SEIS | RNG_SR_SECS)) { + /* As per SoC TRM */ + clrbits_le32(pdata->base + RNG_SR, RNG_SR_SEIS); + for (i = 0; i < 12; i++) + readl(pdata->base + RNG_DR); + if (readl(pdata->base + RNG_SR) & RNG_SR_SEIS) { + printf("RNG Noise"); + return -EIO; + } + /* start again */ + continue; + } + + count = 4; + while (len && count) { + reg = readl(pdata->base + RNG_DR); + memcpy(data, ®, min(len, sizeof(u32))); + increment = min(len, sizeof(u32)); + data += increment; + retval += increment; + len -= increment; + count--; + } + } + + return retval; +} + +static int stm32_rng_init(struct stm32_rng_platdata *pdata) +{ + int err; + + err = clk_enable(&pdata->clk); + if (err) + return err; + + /* Disable CED */ + writel(RNG_CR_RNGEN | RNG_CR_CED, pdata->base + RNG_CR); + + /* clear error indicators */ + writel(0, pdata->base + RNG_SR); + + pdata->inited = 1; + + return 0; +} + +static int stm32_rng_cleanup(struct stm32_rng_platdata *pdata) +{ + + writel(0, pdata->base + RNG_CR); + + return clk_disable(&pdata->clk); +} + +static int stm32_rng_probe(struct udevice *dev) +{ + struct stm32_rng_platdata *pdata = dev_get_platdata(dev); + + if (pdata->inited) + return 0; + + reset_assert(&pdata->rst); + udelay(20); + reset_deassert(&pdata->rst); + + return stm32_rng_init(pdata); +} + +static int stm32_rng_remove(struct udevice *dev) +{ + struct stm32_rng_platdata *pdata = dev_get_platdata(dev); + + return stm32_rng_cleanup(pdata); +} + +static int stm32_rng_ofdata_to_platdata(struct udevice *dev) +{ + struct stm32_rng_platdata *pdata = dev_get_platdata(dev); + int err; + + pdata->base = dev_read_addr(dev); + if (!pdata->base) + return -ENOMEM; + + err = clk_get_by_index(dev, 0, &pdata->clk); + if (err) + return err; + + err = reset_get_by_index(dev, 0, &pdata->rst); + if (err) + return err; + + return 0; +} + +static const struct dm_rng_ops stm32_rng_ops = { + .read = stm32_rng_read, +}; + +static const struct udevice_id stm32_rng_match[] = { + { + .compatible = "st,stm32-rng", + }, + {}, +}; + +U_BOOT_DRIVER(stm32_rng) = { + .name = "stm32-rng", + .id = UCLASS_RNG, + .of_match = stm32_rng_match, + .ops = &stm32_rng_ops, + .probe = stm32_rng_probe, + .remove = stm32_rng_remove, + .platdata_auto_alloc_size = sizeof(struct stm32_rng_platdata), + .ofdata_to_platdata = stm32_rng_ofdata_to_platdata, +};

Hi Sughosh
On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add a driver for the rng device found on stm32mp1 platforms. The driver provides a routine for reading the random number seed from the hardware device.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
drivers/rng/Kconfig | 7 ++ drivers/rng/Makefile | 1 + drivers/rng/stm32mp1_rng.c | 164 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 drivers/rng/stm32mp1_rng.c
diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index dd44cc0..5fc11db 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -5,3 +5,10 @@ config DM_RNG Enable driver model for random number generator(rng) devices. This interface is used to initialise the rng device and to read the random seed from the device.
+config RNG_STM32MP1
bool "Enable random number generator for STM32MP1"
depends on ARCH_STM32MP && DM_RNG
default n
help
Enable STM32MP1 rng driver.
diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 311705b..699beb3 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,3 +4,4 @@ #
obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/stm32mp1_rng.c b/drivers/rng/stm32mp1_rng.c new file mode 100644 index 0000000..f5ee084 --- /dev/null +++ b/drivers/rng/stm32mp1_rng.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/*
- Copyright (c) 2019, Linaro Limited
- */
+#include <common.h> +#include <clk.h> +#include <dm.h> +#include <reset.h> +#include <rng.h>
+#include <asm/io.h> +#include <linux/iopoll.h> +#include <linux/kernel.h>
+#define RNG_CR 0x00 +#define RNG_CR_RNGEN BIT(2) +#define RNG_CR_CED BIT(5)
+#define RNG_SR 0x04 +#define RNG_SR_SEIS BIT(6) +#define RNG_SR_CEIS BIT(5) +#define RNG_SR_SECS BIT(2) +#define RNG_SR_DRDY BIT(0)
+#define RNG_DR 0x08
+struct stm32_rng_platdata {
- fdt_addr_t base;
- struct clk clk;
- struct reset_ctl rst;
- bool inited;
+};
+static int stm32_rng_read(struct udevice *dev, void *data, size_t len) +{
- int retval = 0, i;
- u32 sr, count, reg;
- size_t increment;
- struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
- while (len > 0) {
retval = readl_poll_timeout(pdata->base + RNG_SR, sr,
sr & RNG_SR_DRDY, 10000);
if (retval)
return retval;
if (sr & (RNG_SR_SEIS | RNG_SR_SECS)) {
/* As per SoC TRM */
clrbits_le32(pdata->base + RNG_SR, RNG_SR_SEIS);
for (i = 0; i < 12; i++)
readl(pdata->base + RNG_DR);
if (readl(pdata->base + RNG_SR) & RNG_SR_SEIS) {
printf("RNG Noise");
return -EIO;
}
/* start again */
continue;
}
count = 4;
while (len && count) {
reg = readl(pdata->base + RNG_DR);
memcpy(data, ®, min(len, sizeof(u32)));
increment = min(len, sizeof(u32));
data += increment;
retval += increment;
len -= increment;
count--;
}
- }
- return retval;
+}
+static int stm32_rng_init(struct stm32_rng_platdata *pdata) +{
- int err;
- err = clk_enable(&pdata->clk);
- if (err)
return err;
- /* Disable CED */
- writel(RNG_CR_RNGEN | RNG_CR_CED, pdata->base + RNG_CR);
- /* clear error indicators */
- writel(0, pdata->base + RNG_SR);
- pdata->inited = 1;
- return 0;
+}
+static int stm32_rng_cleanup(struct stm32_rng_platdata *pdata) +{
- writel(0, pdata->base + RNG_CR);
- return clk_disable(&pdata->clk);
+}
+static int stm32_rng_probe(struct udevice *dev) +{
- struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
- if (pdata->inited)
return 0;
No need to protect stm32_rng_probe() for re-entrance, DM is taking care of that, so pdata->inited field can be removed.
Thanks
- reset_assert(&pdata->rst);
- udelay(20);
- reset_deassert(&pdata->rst);
- return stm32_rng_init(pdata);
+}
+static int stm32_rng_remove(struct udevice *dev) +{
- struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
- return stm32_rng_cleanup(pdata);
+}
+static int stm32_rng_ofdata_to_platdata(struct udevice *dev) +{
- struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
- int err;
- pdata->base = dev_read_addr(dev);
- if (!pdata->base)
return -ENOMEM;
- err = clk_get_by_index(dev, 0, &pdata->clk);
- if (err)
return err;
- err = reset_get_by_index(dev, 0, &pdata->rst);
- if (err)
return err;
- return 0;
+}
+static const struct dm_rng_ops stm32_rng_ops = {
- .read = stm32_rng_read,
+};
+static const struct udevice_id stm32_rng_match[] = {
- {
.compatible = "st,stm32-rng",
- },
- {},
+};
+U_BOOT_DRIVER(stm32_rng) = {
- .name = "stm32-rng",
- .id = UCLASS_RNG,
- .of_match = stm32_rng_match,
- .ops = &stm32_rng_ops,
- .probe = stm32_rng_probe,
- .remove = stm32_rng_remove,
- .platdata_auto_alloc_size = sizeof(struct stm32_rng_platdata),
- .ofdata_to_platdata = stm32_rng_ofdata_to_platdata,
+};

hi Patrice,
On Wed, 4 Dec 2019 at 18:54, Patrice CHOTARD patrice.chotard@st.com wrote:
Hi Sughosh
On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add a driver for the rng device found on stm32mp1 platforms. The driver provides a routine for reading the random number seed from the hardware device.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
drivers/rng/Kconfig | 7 ++ drivers/rng/Makefile | 1 + drivers/rng/stm32mp1_rng.c | 164
+++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 172 insertions(+) create mode 100644 drivers/rng/stm32mp1_rng.c
<snip>
+static int stm32_rng_init(struct stm32_rng_platdata *pdata) +{
int err;
err = clk_enable(&pdata->clk);
if (err)
return err;
/* Disable CED */
writel(RNG_CR_RNGEN | RNG_CR_CED, pdata->base + RNG_CR);
/* clear error indicators */
writel(0, pdata->base + RNG_SR);
pdata->inited = 1;
return 0;
+}
+static int stm32_rng_cleanup(struct stm32_rng_platdata *pdata) +{
writel(0, pdata->base + RNG_CR);
return clk_disable(&pdata->clk);
+}
+static int stm32_rng_probe(struct udevice *dev) +{
struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
if (pdata->inited)
return 0;
No need to protect stm32_rng_probe() for re-entrance, DM is taking care of that, so pdata->inited field can be removed.
Thanks for your review. I will remove the member in the next version of the patchset. Will wait for some time before posting v2, to see if I get any other review comments.
-sughosh

Enable support for the rng device on the stm32mp15 configs.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- configs/stm32mp15_basic_defconfig | 2 ++ configs/stm32mp15_optee_defconfig | 2 ++ configs/stm32mp15_trusted_defconfig | 2 ++ 3 files changed, 6 insertions(+)
diff --git a/configs/stm32mp15_basic_defconfig b/configs/stm32mp15_basic_defconfig index ae3ee5a..99ec7a4 100644 --- a/configs/stm32mp15_basic_defconfig +++ b/configs/stm32mp15_basic_defconfig @@ -139,3 +139,5 @@ CONFIG_VIDEO_STM32_DSI=y CONFIG_VIDEO_STM32_MAX_XRES=1280 CONFIG_VIDEO_STM32_MAX_YRES=800 CONFIG_FDT_FIXUP_PARTITIONS=y +CONFIG_DM_RNG=y +CONFIG_RNG_STM32MP1=y diff --git a/configs/stm32mp15_optee_defconfig b/configs/stm32mp15_optee_defconfig index e8620d6..adad0cf 100644 --- a/configs/stm32mp15_optee_defconfig +++ b/configs/stm32mp15_optee_defconfig @@ -123,3 +123,5 @@ CONFIG_VIDEO_STM32_DSI=y CONFIG_VIDEO_STM32_MAX_XRES=1280 CONFIG_VIDEO_STM32_MAX_YRES=800 CONFIG_FDT_FIXUP_PARTITIONS=y +CONFIG_DM_RNG=y +CONFIG_RNG_STM32MP1=y diff --git a/configs/stm32mp15_trusted_defconfig b/configs/stm32mp15_trusted_defconfig index 2d937e6..859fd52 100644 --- a/configs/stm32mp15_trusted_defconfig +++ b/configs/stm32mp15_trusted_defconfig @@ -122,3 +122,5 @@ CONFIG_VIDEO_STM32_DSI=y CONFIG_VIDEO_STM32_MAX_XRES=1280 CONFIG_VIDEO_STM32_MAX_YRES=800 CONFIG_FDT_FIXUP_PARTITIONS=y +CONFIG_DM_RNG=y +CONFIG_RNG_STM32MP1=y

On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Enable support for the rng device on the stm32mp15 configs.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
configs/stm32mp15_basic_defconfig | 2 ++ configs/stm32mp15_optee_defconfig | 2 ++ configs/stm32mp15_trusted_defconfig | 2 ++ 3 files changed, 6 insertions(+)
diff --git a/configs/stm32mp15_basic_defconfig b/configs/stm32mp15_basic_defconfig index ae3ee5a..99ec7a4 100644 --- a/configs/stm32mp15_basic_defconfig +++ b/configs/stm32mp15_basic_defconfig @@ -139,3 +139,5 @@ CONFIG_VIDEO_STM32_DSI=y CONFIG_VIDEO_STM32_MAX_XRES=1280 CONFIG_VIDEO_STM32_MAX_YRES=800 CONFIG_FDT_FIXUP_PARTITIONS=y +CONFIG_DM_RNG=y +CONFIG_RNG_STM32MP1=y diff --git a/configs/stm32mp15_optee_defconfig b/configs/stm32mp15_optee_defconfig index e8620d6..adad0cf 100644 --- a/configs/stm32mp15_optee_defconfig +++ b/configs/stm32mp15_optee_defconfig @@ -123,3 +123,5 @@ CONFIG_VIDEO_STM32_DSI=y CONFIG_VIDEO_STM32_MAX_XRES=1280 CONFIG_VIDEO_STM32_MAX_YRES=800 CONFIG_FDT_FIXUP_PARTITIONS=y +CONFIG_DM_RNG=y +CONFIG_RNG_STM32MP1=y diff --git a/configs/stm32mp15_trusted_defconfig b/configs/stm32mp15_trusted_defconfig index 2d937e6..859fd52 100644 --- a/configs/stm32mp15_trusted_defconfig +++ b/configs/stm32mp15_trusted_defconfig @@ -122,3 +122,5 @@ CONFIG_VIDEO_STM32_DSI=y CONFIG_VIDEO_STM32_MAX_XRES=1280 CONFIG_VIDEO_STM32_MAX_YRES=800 CONFIG_FDT_FIXUP_PARTITIONS=y +CONFIG_DM_RNG=y +CONFIG_RNG_STM32MP1=y
Reviewed-by: Patrice Chotard patrice.chotard@st.com
Thanks

Add a sandbox driver for random number generation. Mostly aimed at providing a unit test for rng uclass.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- arch/sandbox/dts/test.dts | 4 ++++ drivers/rng/Kconfig | 7 +++++++ drivers/rng/Makefile | 1 + drivers/rng/sandbox_rng.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 drivers/rng/sandbox_rng.c
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index fdb08f2..2c85540 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -599,6 +599,10 @@ reset-names = "other", "test"; };
+ rng@0 { + compatible = "sandbox,sandbox-rng"; + }; + rproc_1: rproc@1 { compatible = "sandbox,test-processor"; remoteproc-name = "remoteproc-test-dev1"; diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index 5fc11db..3a1d3f0 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -6,6 +6,13 @@ config DM_RNG This interface is used to initialise the rng device and to read the random seed from the device.
+config RNG_SANDBOX + bool "Sandbox random number generator" + depends on SANDBOX && DM_RNG + help + Enable random number generator for sandbox. This is an + emulation of a rng device. + config RNG_STM32MP1 bool "Enable random number generator for STM32MP1" depends on ARCH_STM32MP && DM_RNG diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 699beb3..3517005 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,4 +4,5 @@ #
obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_SANDBOX) += sandbox_rng.o obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/sandbox_rng.c b/drivers/rng/sandbox_rng.c new file mode 100644 index 0000000..c5be552 --- /dev/null +++ b/drivers/rng/sandbox_rng.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2019, Linaro Limited + */ + +#include <common.h> +#include <dm.h> +#include <rng.h> + +static unsigned long random = 0xdeadbeef; + +static int sandbox_rng_read(struct udevice *dev, void *data, size_t len) +{ + random ^= ~0UL; + *(unsigned long *)data = random; + + return sizeof(random); +} + +static const struct dm_rng_ops sandbox_rng_ops = { + .read = sandbox_rng_read, +}; + +static const struct udevice_id sandbox_rng_match[] = { + { + .compatible = "sandbox,sandbox-rng", + }, + {}, +}; + +U_BOOT_DRIVER(sandbox_rng) = { + .name = "sandbox-rng", + .id = UCLASS_RNG, + .of_match = sandbox_rng_match, + .ops = &sandbox_rng_ops, +};

On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add a sandbox driver for random number generation. Mostly aimed at providing a unit test for rng uclass.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
arch/sandbox/dts/test.dts | 4 ++++ drivers/rng/Kconfig | 7 +++++++ drivers/rng/Makefile | 1 + drivers/rng/sandbox_rng.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 drivers/rng/sandbox_rng.c
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index fdb08f2..2c85540 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -599,6 +599,10 @@ reset-names = "other", "test"; };
- rng@0 {
compatible = "sandbox,sandbox-rng";
- };
- rproc_1: rproc@1 { compatible = "sandbox,test-processor"; remoteproc-name = "remoteproc-test-dev1";
diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index 5fc11db..3a1d3f0 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -6,6 +6,13 @@ config DM_RNG This interface is used to initialise the rng device and to read the random seed from the device.
+config RNG_SANDBOX
bool "Sandbox random number generator"
depends on SANDBOX && DM_RNG
help
Enable random number generator for sandbox. This is an
emulation of a rng device.
config RNG_STM32MP1 bool "Enable random number generator for STM32MP1" depends on ARCH_STM32MP && DM_RNG diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 699beb3..3517005 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,4 +4,5 @@ #
obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_SANDBOX) += sandbox_rng.o obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/sandbox_rng.c b/drivers/rng/sandbox_rng.c new file mode 100644 index 0000000..c5be552 --- /dev/null +++ b/drivers/rng/sandbox_rng.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/*
- Copyright (c) 2019, Linaro Limited
- */
+#include <common.h> +#include <dm.h> +#include <rng.h>
+static unsigned long random = 0xdeadbeef;
+static int sandbox_rng_read(struct udevice *dev, void *data, size_t len) +{
- random ^= ~0UL;
- *(unsigned long *)data = random;
- return sizeof(random);
+}
+static const struct dm_rng_ops sandbox_rng_ops = {
- .read = sandbox_rng_read,
+};
+static const struct udevice_id sandbox_rng_match[] = {
- {
.compatible = "sandbox,sandbox-rng",
- },
- {},
+};
+U_BOOT_DRIVER(sandbox_rng) = {
- .name = "sandbox-rng",
- .id = UCLASS_RNG,
- .of_match = sandbox_rng_match,
- .ops = &sandbox_rng_ops,
+};
Reviewed-by: Patrice Chotard patrice.chotard@st.com
Thanks

On Wed, 4 Dec 2019 at 04:54, Sughosh Ganu sughosh.ganu@linaro.org wrote:
Add a sandbox driver for random number generation. Mostly aimed at providing a unit test for rng uclass.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
arch/sandbox/dts/test.dts | 4 ++++ drivers/rng/Kconfig | 7 +++++++ drivers/rng/Makefile | 1 + drivers/rng/sandbox_rng.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 drivers/rng/sandbox_rng.c
Reviewed-by: Simon Glass sjg@chromium.org

Enable support for random number generator on sandbox configs. This is aimed primarily at adding unit test support for rng uclass.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- configs/sandbox64_defconfig | 2 ++ configs/sandbox_defconfig | 2 ++ 2 files changed, 4 insertions(+)
diff --git a/configs/sandbox64_defconfig b/configs/sandbox64_defconfig index be1e103..b6596c4 100644 --- a/configs/sandbox64_defconfig +++ b/configs/sandbox64_defconfig @@ -157,6 +157,8 @@ CONFIG_REGULATOR_RK8XX=y CONFIG_REGULATOR_S5M8767=y CONFIG_DM_REGULATOR_SANDBOX=y CONFIG_REGULATOR_TPS65090=y +CONFIG_DM_RNG=y +CONFIG_RNG_SANDBOX=y CONFIG_DM_PWM=y CONFIG_PWM_SANDBOX=y CONFIG_RAM=y diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index eda595f..6fb3f00 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -178,6 +178,8 @@ CONFIG_REGULATOR_RK8XX=y CONFIG_REGULATOR_S5M8767=y CONFIG_DM_REGULATOR_SANDBOX=y CONFIG_REGULATOR_TPS65090=y +CONFIG_DM_RNG=y +CONFIG_RNG_SANDBOX=y CONFIG_DM_PWM=y CONFIG_PWM_SANDBOX=y CONFIG_RAM=y

On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Enable support for random number generator on sandbox configs. This is aimed primarily at adding unit test support for rng uclass.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
configs/sandbox64_defconfig | 2 ++ configs/sandbox_defconfig | 2 ++ 2 files changed, 4 insertions(+)
diff --git a/configs/sandbox64_defconfig b/configs/sandbox64_defconfig index be1e103..b6596c4 100644 --- a/configs/sandbox64_defconfig +++ b/configs/sandbox64_defconfig @@ -157,6 +157,8 @@ CONFIG_REGULATOR_RK8XX=y CONFIG_REGULATOR_S5M8767=y CONFIG_DM_REGULATOR_SANDBOX=y CONFIG_REGULATOR_TPS65090=y +CONFIG_DM_RNG=y +CONFIG_RNG_SANDBOX=y CONFIG_DM_PWM=y CONFIG_PWM_SANDBOX=y CONFIG_RAM=y diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index eda595f..6fb3f00 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -178,6 +178,8 @@ CONFIG_REGULATOR_RK8XX=y CONFIG_REGULATOR_S5M8767=y CONFIG_DM_REGULATOR_SANDBOX=y CONFIG_REGULATOR_TPS65090=y +CONFIG_DM_RNG=y +CONFIG_RNG_SANDBOX=y CONFIG_DM_PWM=y CONFIG_PWM_SANDBOX=y CONFIG_RAM=y
Reviewed-by: Patrice Chotard patrice.chotard@st.com
Thanks

On Wed, 4 Dec 2019 at 08:12, Patrice CHOTARD patrice.chotard@st.com wrote:
On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Enable support for random number generator on sandbox configs. This is aimed primarily at adding unit test support for rng uclass.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
configs/sandbox64_defconfig | 2 ++ configs/sandbox_defconfig | 2 ++ 2 files changed, 4 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org

Add a unit test for testing the rng uclass functionality using the sandbox rng driver.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org --- test/dm/Makefile | 1 + test/dm/rng.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/dm/rng.c
diff --git a/test/dm/Makefile b/test/dm/Makefile index 0c2fd5c..f61bf65 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -65,4 +65,5 @@ obj-$(CONFIG_VIRTIO_SANDBOX) += virtio.o obj-$(CONFIG_DMA) += dma.o obj-$(CONFIG_DM_MDIO) += mdio.o obj-$(CONFIG_DM_MDIO_MUX) += mdio_mux.o +obj-$(CONFIG_DM_RNG) += rng.o endif diff --git a/test/dm/rng.c b/test/dm/rng.c new file mode 100644 index 0000000..879e80a --- /dev/null +++ b/test/dm/rng.c @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2019, Linaro Limited + */ + +#include <common.h> +#include <dm.h> +#include <rng.h> +#include <dm/test.h> +#include <test/ut.h> + +/* Basic test of the rng uclass */ +static int dm_test_rng_read(struct unit_test_state *uts) +{ + unsigned long val1 = 0, val2 = 0; + struct udevice *dev; + + ut_assertok(uclass_get_device(UCLASS_RNG, 0, &dev)); + ut_assertnonnull(dev); + dm_rng_read(dev, &val1, sizeof(val1)); + dm_rng_read(dev, &val2, sizeof(val2)); + ut_assert(val1 != val2); + + return 0; +} +DM_TEST(dm_test_rng_read, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);

On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add a unit test for testing the rng uclass functionality using the sandbox rng driver.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
test/dm/Makefile | 1 + test/dm/rng.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/dm/rng.c
diff --git a/test/dm/Makefile b/test/dm/Makefile index 0c2fd5c..f61bf65 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -65,4 +65,5 @@ obj-$(CONFIG_VIRTIO_SANDBOX) += virtio.o obj-$(CONFIG_DMA) += dma.o obj-$(CONFIG_DM_MDIO) += mdio.o obj-$(CONFIG_DM_MDIO_MUX) += mdio_mux.o +obj-$(CONFIG_DM_RNG) += rng.o endif diff --git a/test/dm/rng.c b/test/dm/rng.c new file mode 100644 index 0000000..879e80a --- /dev/null +++ b/test/dm/rng.c @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/*
- Copyright (c) 2019, Linaro Limited
- */
+#include <common.h> +#include <dm.h> +#include <rng.h> +#include <dm/test.h> +#include <test/ut.h>
+/* Basic test of the rng uclass */ +static int dm_test_rng_read(struct unit_test_state *uts) +{
- unsigned long val1 = 0, val2 = 0;
- struct udevice *dev;
- ut_assertok(uclass_get_device(UCLASS_RNG, 0, &dev));
- ut_assertnonnull(dev);
- dm_rng_read(dev, &val1, sizeof(val1));
- dm_rng_read(dev, &val2, sizeof(val2));
- ut_assert(val1 != val2);
- return 0;
+} +DM_TEST(dm_test_rng_read, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
Reviewed-by: Patrice Chotard patrice.chotard@st.com
Thanks

On Wed, 4 Dec 2019 at 08:12, Patrice CHOTARD patrice.chotard@st.com wrote:
On 12/4/19 12:53 PM, Sughosh Ganu wrote:
Add a unit test for testing the rng uclass functionality using the sandbox rng driver.
Signed-off-by: Sughosh Ganu sughosh.ganu@linaro.org
test/dm/Makefile | 1 + test/dm/rng.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/dm/rng.c
Reviewed-by: Simon Glass sjg@chromium.org
participants (3)
-
Patrice CHOTARD
-
Simon Glass
-
Sughosh Ganu