Re: [PATCH v2 6/9] powerpc/microwatt: Add support for hardware random number generator

2021-06-20 Thread Nicholas Piggin
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

2021-06-19 Thread Segher Boessenkool
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

2021-06-18 Thread Nicholas Piggin
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

2021-06-17 Thread Paul Mackerras
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