Excerpts from Paul Mackerras's message of June 18, 2021 1:47 pm: > Microwatt's hardware RNG is accessed using the DARN instruction. >
I think we're getting a platforms/book3s soon with the VAS patches, might be a place to add the get_random_darn function. Huh, DARN is unprivileged right? And yet we haven't wired it up in pseries it still uses an hcall. Anyway that's all stuff to sort out later. Reviewed-by: Nicholas Piggin <npig...@gmail.com> > Signed-off-by: Paul Mackerras <pau...@ozlabs.org> > --- > arch/powerpc/platforms/microwatt/Kconfig | 1 + > arch/powerpc/platforms/microwatt/Makefile | 2 +- > arch/powerpc/platforms/microwatt/rng.c | 48 +++++++++++++++++++++++ > 3 files changed, 50 insertions(+), 1 deletion(-) > create mode 100644 arch/powerpc/platforms/microwatt/rng.c > > diff --git a/arch/powerpc/platforms/microwatt/Kconfig > b/arch/powerpc/platforms/microwatt/Kconfig > index 50ed0cedb5f1..8f6a81978461 100644 > --- a/arch/powerpc/platforms/microwatt/Kconfig > +++ b/arch/powerpc/platforms/microwatt/Kconfig > @@ -7,6 +7,7 @@ config PPC_MICROWATT > select PPC_ICP_NATIVE > select PPC_NATIVE > select PPC_UDBG_16550 > + select ARCH_RANDOM > help > This option enables support for FPGA-based Microwatt > implementations. > > diff --git a/arch/powerpc/platforms/microwatt/Makefile > b/arch/powerpc/platforms/microwatt/Makefile > index e6885b3b2ee7..116d6d3ad3f0 100644 > --- a/arch/powerpc/platforms/microwatt/Makefile > +++ b/arch/powerpc/platforms/microwatt/Makefile > @@ -1 +1 @@ > -obj-y += setup.o > +obj-y += setup.o rng.o > diff --git a/arch/powerpc/platforms/microwatt/rng.c > b/arch/powerpc/platforms/microwatt/rng.c > new file mode 100644 > index 000000000000..3d8ee6eb7dad > --- /dev/null > +++ b/arch/powerpc/platforms/microwatt/rng.c > @@ -0,0 +1,48 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Derived from arch/powerpc/platforms/powernv/rng.c, which is: > + * Copyright 2013, Michael Ellerman, IBM Corporation. > + */ > + > +#define pr_fmt(fmt) "microwatt-rng: " fmt > + > +#include <linux/kernel.h> > +#include <linux/smp.h> > +#include <asm/archrandom.h> > +#include <asm/cputable.h> > +#include <asm/machdep.h> > + > +#define DARN_ERR 0xFFFFFFFFFFFFFFFFul > + > +int microwatt_get_random_darn(unsigned long *v) > +{ > + unsigned long val; > + > + /* Using DARN with L=1 - 64-bit conditioned random number */ > + asm volatile(PPC_DARN(%0, 1) : "=r"(val)); > + > + if (val == DARN_ERR) > + return 0; > + > + *v = val; > + > + return 1; > +} > + > +static __init int rng_init(void) > +{ > + unsigned long val; > + int i; > + > + for (i = 0; i < 10; i++) { > + if (microwatt_get_random_darn(&val)) { > + ppc_md.get_random_seed = microwatt_get_random_darn; > + return 0; > + } > + } > + > + pr_warn("Unable to use DARN for get_random_seed()\n"); > + > + return -EIO; > +} > +machine_subsys_initcall(, rng_init); > -- > 2.31.1 > >