xref: /linux/arch/powerpc/platforms/pseries/rng.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2a489043fSMichael Ellerman /*
3a489043fSMichael Ellerman  * Copyright 2013, Michael Ellerman, IBM Corporation.
4a489043fSMichael Ellerman  */
5a489043fSMichael Ellerman 
6a489043fSMichael Ellerman #define pr_fmt(fmt)	"pseries-rng: " fmt
7a489043fSMichael Ellerman 
8a489043fSMichael Ellerman #include <linux/kernel.h>
9a489043fSMichael Ellerman #include <linux/of.h>
10a489043fSMichael Ellerman #include <asm/archrandom.h>
11a489043fSMichael Ellerman #include <asm/machdep.h>
12148924f7SMichael Ellerman #include <asm/plpar_wrappers.h>
13*e561e472SJason A. Donenfeld #include "pseries.h"
14a489043fSMichael Ellerman 
15a489043fSMichael Ellerman 
pseries_get_random_long(unsigned long * v)16a489043fSMichael Ellerman static int pseries_get_random_long(unsigned long *v)
17a489043fSMichael Ellerman {
18a489043fSMichael Ellerman 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
19a489043fSMichael Ellerman 
20a489043fSMichael Ellerman 	if (plpar_hcall(H_RANDOM, retbuf) == H_SUCCESS) {
21a489043fSMichael Ellerman 		*v = retbuf[0];
22a489043fSMichael Ellerman 		return 1;
23a489043fSMichael Ellerman 	}
24a489043fSMichael Ellerman 
25a489043fSMichael Ellerman 	return 0;
26a489043fSMichael Ellerman }
27a489043fSMichael Ellerman 
pseries_rng_init(void)28*e561e472SJason A. Donenfeld void __init pseries_rng_init(void)
29a489043fSMichael Ellerman {
30a489043fSMichael Ellerman 	struct device_node *dn;
31a489043fSMichael Ellerman 
32a489043fSMichael Ellerman 	dn = of_find_compatible_node(NULL, NULL, "ibm,random");
33a489043fSMichael Ellerman 	if (!dn)
34*e561e472SJason A. Donenfeld 		return;
3501c9348cSPaul Mackerras 	ppc_md.get_random_seed = pseries_get_random_long;
3667c3e594SNicholas Mc Guire 	of_node_put(dn);
37a489043fSMichael Ellerman }
38