Re: [PATCH v2 6/9] powerpc/microwatt: Add support for hardware random number generator
Excerpts from Segher Boessenkool's message of June 20, 2021 12:36 am: > On Sat, Jun 19, 2021 at 01:08:51PM +1000, Nicholas Piggin wrote: >> 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? > > It is, that's the whole point: to make it very very cheap for user > software it has to be an unprivileged instruction. Right, I was just doing a double-take. In that case we should enable it in the pseries random number code as well, so it really would be a generic isa 3.0 function that all (microwatt, powernv, pseries) could use AFAIKS. Thanks, Nick
Re: [PATCH v2 6/9] powerpc/microwatt: Add support for hardware random number generator
On Sat, Jun 19, 2021 at 01:08:51PM +1000, Nicholas Piggin wrote: > 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? It is, that's the whole point: to make it very very cheap for user software it has to be an unprivileged instruction. Segher
Re: [PATCH v2 6/9] powerpc/microwatt: Add support for hardware random number generator
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 > Signed-off-by: Paul Mackerras > --- > 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 ..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 > +#include > +#include > +#include > +#include > + > +#define DARN_ERR 0xul > + > +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()) { > + 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 > >
[PATCH v2 6/9] powerpc/microwatt: Add support for hardware random number generator
Microwatt's hardware RNG is accessed using the DARN instruction. Signed-off-by: Paul Mackerras --- 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 ..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 +#include +#include +#include +#include + +#define DARN_ERR 0xul + +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()) { + 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