162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2013, Michael Ellerman, IBM Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#define pr_fmt(fmt) "pseries-rng: " fmt 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/kernel.h> 962306a36Sopenharmony_ci#include <linux/of.h> 1062306a36Sopenharmony_ci#include <asm/archrandom.h> 1162306a36Sopenharmony_ci#include <asm/machdep.h> 1262306a36Sopenharmony_ci#include <asm/plpar_wrappers.h> 1362306a36Sopenharmony_ci#include "pseries.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic int pseries_get_random_long(unsigned long *v) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci if (plpar_hcall(H_RANDOM, retbuf) == H_SUCCESS) { 2162306a36Sopenharmony_ci *v = retbuf[0]; 2262306a36Sopenharmony_ci return 1; 2362306a36Sopenharmony_ci } 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci return 0; 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_civoid __init pseries_rng_init(void) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct device_node *dn; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci dn = of_find_compatible_node(NULL, NULL, "ibm,random"); 3362306a36Sopenharmony_ci if (!dn) 3462306a36Sopenharmony_ci return; 3562306a36Sopenharmony_ci ppc_md.get_random_seed = pseries_get_random_long; 3662306a36Sopenharmony_ci of_node_put(dn); 3762306a36Sopenharmony_ci} 38