
Hi,
Le 24/02/2020 à 23:21, Heinrich Schuchardt a écrit :
Add support for the hardware random number generator of Amlogic SOCs.
Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
drivers/rng/Kconfig | 8 +++ drivers/rng/Makefile | 1 + drivers/rng/meson-rng.c | 120 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 drivers/rng/meson-rng.c
diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index c1aa43b823..edb6152bb9 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -8,6 +8,14 @@ config DM_RNG
if DM_RNG
+config RNG_MESON
- bool "Amlogic Meson Random Number Generator support"
- depends on ARCH_MESON
- default y
- help
Enable support for hardware random number generator
of Amlogic Meson SoCs.
config RNG_SANDBOX bool "Sandbox random number generator" depends on SANDBOX diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 3517005541..6a8a66779b 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,5 +4,6 @@ #
obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_MESON) += meson-rng.o obj-$(CONFIG_RNG_SANDBOX) += sandbox_rng.o obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/meson-rng.c b/drivers/rng/meson-rng.c new file mode 100644 index 0000000000..4b81a62353 --- /dev/null +++ b/drivers/rng/meson-rng.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/*
- Copyright 2020, Heinrich Schuchardt xypron.glpk@gmx.de
- Driver for Amlogic hardware random number generator
- */
+#include <common.h> +#include <clk.h> +#include <dm.h> +#include <rng.h> +#include <asm/io.h>
+struct meson_rng_platdata {
- fdt_addr_t base;
- struct clk clk;
+};
+/**
- meson_rng_read() - fill buffer with random bytes
- @buffer: buffer to receive data
- @size: size of buffer
- Return: 0
- */
+static int meson_rng_read(struct udevice *dev, void *data, size_t len) +{
- struct meson_rng_platdata *pdata = dev_get_platdata(dev);
- char *buffer = (char *)data;
- while (len) {
u32 rand = readl(pdata->base);
size_t step;
if (len >= 4)
step = 4;
else
step = len;
memcpy(buffer, &rand, step);
buffer += step;
len -= step;
- }
- return 0;
+}
+/**
- meson_rng_probe() - probe rng device
- @dev: device
- Return: 0 if ok
- */
+static int meson_rng_probe(struct udevice *dev) +{
- struct meson_rng_platdata *pdata = dev_get_platdata(dev);
- int err;
- err = clk_enable(&pdata->clk);
- if (err)
return err;
- return 0;
+}
+/**
- meson_rng_remove() - deinitialize rng device
- @dev: device
- Return: 0 if ok
- */
+static int meson_rng_remove(struct udevice *dev) +{
- struct meson_rng_platdata *pdata = dev_get_platdata(dev);
- return clk_disable(&pdata->clk);
+}
+/**
- meson_rng_ofdata_to_platdata() - transfer device tree data to plaform data
- @dev: device
- Return: 0 if ok
- */
+static int meson_rng_ofdata_to_platdata(struct udevice *dev) +{
- struct meson_rng_platdata *pdata = dev_get_platdata(dev);
- int err;
- pdata->base = dev_read_addr(dev);
- if (!pdata->base)
return -ENODEV;
- err = clk_get_by_name(dev, "core", &pdata->clk);
- if (err)
return err;
- return 0;
+}
+static const struct dm_rng_ops meson_rng_ops = {
- .read = meson_rng_read,
+};
+static const struct udevice_id meson_rng_match[] = {
- {
.compatible = "amlogic,meson-rng",
- },
- {},
+};
+U_BOOT_DRIVER(meson_rng) = {
- .name = "meson-rng",
- .id = UCLASS_RNG,
- .of_match = meson_rng_match,
- .ops = &meson_rng_ops,
- .probe = meson_rng_probe,
- .remove = meson_rng_remove,
- .platdata_auto_alloc_size = sizeof(struct meson_rng_platdata),
- .ofdata_to_platdata = meson_rng_ofdata_to_platdata,
+};
2.20.1
Reviewed-by: Neil Armstrong narmstrong@baylibre.com
Thanks, looks fine.
I suspect this will help adding EFI RNG data for Linux early random seed, right ?
Is there a RNG maintainer or should I apply it myself ?
Neil