sandbox: rng: Add a random number generator(rng) driver

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>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Sughosh Ganu 2019-12-28 23:58:31 +05:30 committed by Heinrich Schuchardt
parent 90950eec58
commit ff0dada9b8
4 changed files with 69 additions and 0 deletions

View File

@ -630,6 +630,10 @@
reset-names = "other", "test";
};
rng {
compatible = "sandbox,sandbox-rng";
};
rproc_1: rproc@1 {
compatible = "sandbox,test-processor";
remoteproc-name = "remoteproc-test-dev1";

View File

@ -6,6 +6,14 @@ 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
select CONFIG_LIB_RAND
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

View File

@ -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

56
drivers/rng/sandbox_rng.c Normal file
View File

@ -0,0 +1,56 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2019, Linaro Limited
*/
#include <common.h>
#include <dm.h>
#include <rng.h>
#include <linux/string.h>
static int sandbox_rng_read(struct udevice *dev, void *data, size_t len)
{
unsigned int i, seed, random;
unsigned char *buf = data;
size_t nrem, nloops;
if (!len)
return 0;
nloops = len / sizeof(random);
seed = get_timer(0) ^ rand();
srand(seed);
for (i = 0, nrem = len; i < nloops; i++) {
random = rand();
memcpy(buf, &random, sizeof(random));
buf += sizeof(random);
nrem -= sizeof(random);
}
if (nrem) {
random = rand();
memcpy(buf, &random, nrem);
}
return 0;
}
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,
};