1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2013, Michael Ellerman, IBM Corporation. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #define pr_fmt(fmt) "pseries-rng: " fmt 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/kernel.h> 9*4882a593Smuzhiyun #include <linux/of.h> 10*4882a593Smuzhiyun #include <asm/archrandom.h> 11*4882a593Smuzhiyun #include <asm/machdep.h> 12*4882a593Smuzhiyun #include <asm/plpar_wrappers.h> 13*4882a593Smuzhiyun #include "pseries.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun pseries_get_random_long(unsigned long * v)16*4882a593Smuzhiyunstatic int pseries_get_random_long(unsigned long *v) 17*4882a593Smuzhiyun { 18*4882a593Smuzhiyun unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun if (plpar_hcall(H_RANDOM, retbuf) == H_SUCCESS) { 21*4882a593Smuzhiyun *v = retbuf[0]; 22*4882a593Smuzhiyun return 1; 23*4882a593Smuzhiyun } 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun return 0; 26*4882a593Smuzhiyun } 27*4882a593Smuzhiyun pseries_rng_init(void)28*4882a593Smuzhiyunvoid __init pseries_rng_init(void) 29*4882a593Smuzhiyun { 30*4882a593Smuzhiyun struct device_node *dn; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun dn = of_find_compatible_node(NULL, NULL, "ibm,random"); 33*4882a593Smuzhiyun if (!dn) 34*4882a593Smuzhiyun return; 35*4882a593Smuzhiyun ppc_md.get_random_seed = pseries_get_random_long; 36*4882a593Smuzhiyun of_node_put(dn); 37*4882a593Smuzhiyun } 38