1 /* 2 * Copyright 2013, Michael Ellerman, IBM Corporation. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 */ 9 10 #define pr_fmt(fmt) "pseries-rng: " fmt 11 12 #include <linux/kernel.h> 13 #include <linux/of.h> 14 #include <asm/archrandom.h> 15 #include <asm/machdep.h> 16 #include <asm/plpar_wrappers.h> 17 18 19 static int pseries_get_random_long(unsigned long *v) 20 { 21 unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; 22 23 if (plpar_hcall(H_RANDOM, retbuf) == H_SUCCESS) { 24 *v = retbuf[0]; 25 return 1; 26 } 27 28 return 0; 29 } 30 31 static __init int rng_init(void) 32 { 33 struct device_node *dn; 34 35 dn = of_find_compatible_node(NULL, NULL, "ibm,random"); 36 if (!dn) 37 return -ENODEV; 38 39 pr_info("Registering arch random hook.\n"); 40 41 ppc_md.get_random_long = pseries_get_random_long; 42 43 return 0; 44 } 45 machine_subsys_initcall(pseries, rng_init); 46