| From e561e472a3d441753bd012333b057f48fef1045b Mon Sep 17 00:00:00 2001 |
| From: "Jason A. Donenfeld" <Jason@zx2c4.com> |
| Date: Sat, 11 Jun 2022 17:10:15 +0200 |
| Subject: powerpc/pseries: wire up rng during setup_arch() |
| |
| From: Jason A. Donenfeld <Jason@zx2c4.com> |
| |
| commit e561e472a3d441753bd012333b057f48fef1045b upstream. |
| |
| The platform's RNG must be available before random_init() in order to be |
| useful for initial seeding, which in turn means that it needs to be |
| called from setup_arch(), rather than from an init call. Fortunately, |
| each platform already has a setup_arch function pointer, which means |
| it's easy to wire this up. This commit also removes some noisy log |
| messages that don't add much. |
| |
| Fixes: a489043f4626 ("powerpc/pseries: Implement arch_get_random_long() based on H_RANDOM") |
| Cc: stable@vger.kernel.org # v3.13+ |
| Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> |
| Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20220611151015.548325-4-Jason@zx2c4.com |
| Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/powerpc/platforms/pseries/pseries.h | 2 ++ |
| arch/powerpc/platforms/pseries/rng.c | 11 +++-------- |
| arch/powerpc/platforms/pseries/setup.c | 1 + |
| 3 files changed, 6 insertions(+), 8 deletions(-) |
| |
| --- a/arch/powerpc/platforms/pseries/pseries.h |
| +++ b/arch/powerpc/platforms/pseries/pseries.h |
| @@ -81,4 +81,6 @@ unsigned long pseries_memory_block_size( |
| |
| void pseries_setup_rfi_flush(void); |
| |
| +void pseries_rng_init(void); |
| + |
| #endif /* _PSERIES_PSERIES_H */ |
| --- a/arch/powerpc/platforms/pseries/rng.c |
| +++ b/arch/powerpc/platforms/pseries/rng.c |
| @@ -14,6 +14,7 @@ |
| #include <asm/archrandom.h> |
| #include <asm/machdep.h> |
| #include <asm/plpar_wrappers.h> |
| +#include "pseries.h" |
| |
| |
| static int pseries_get_random_long(unsigned long *v) |
| @@ -28,19 +29,13 @@ static int pseries_get_random_long(unsig |
| return 0; |
| } |
| |
| -static __init int rng_init(void) |
| +void __init pseries_rng_init(void) |
| { |
| struct device_node *dn; |
| |
| dn = of_find_compatible_node(NULL, NULL, "ibm,random"); |
| if (!dn) |
| - return -ENODEV; |
| - |
| - pr_info("Registering arch random hook.\n"); |
| - |
| + return; |
| ppc_md.get_random_seed = pseries_get_random_long; |
| - |
| of_node_put(dn); |
| - return 0; |
| } |
| -machine_subsys_initcall(pseries, rng_init); |
| --- a/arch/powerpc/platforms/pseries/setup.c |
| +++ b/arch/powerpc/platforms/pseries/setup.c |
| @@ -585,6 +585,7 @@ static void __init pSeries_setup_arch(vo |
| } |
| |
| ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare; |
| + pseries_rng_init(); |
| } |
| |
| static int __init pSeries_init_panel(void) |