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 Ellermanstatic 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. Donenfeldvoid __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