Michal Suchanek 6f6e6c
From e561e472a3d441753bd012333b057f48fef1045b Mon Sep 17 00:00:00 2001
Michal Suchanek 6f6e6c
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
Michal Suchanek 6f6e6c
Date: Sat, 11 Jun 2022 17:10:15 +0200
Michal Suchanek 6f6e6c
Subject: [PATCH] powerpc/pseries: wire up rng during setup_arch()
Michal Suchanek 6f6e6c
Michal Suchanek 6f6e6c
References: bsc#1065729
Michal Suchanek 6f6e6c
Patch-mainline: v5.19-rc4
Michal Suchanek 6f6e6c
Git-commit: e561e472a3d441753bd012333b057f48fef1045b
Michal Suchanek 6f6e6c
Michal Suchanek 6f6e6c
The platform's RNG must be available before random_init() in order to be
Michal Suchanek 6f6e6c
useful for initial seeding, which in turn means that it needs to be
Michal Suchanek 6f6e6c
called from setup_arch(), rather than from an init call. Fortunately,
Michal Suchanek 6f6e6c
each platform already has a setup_arch function pointer, which means
Michal Suchanek 6f6e6c
it's easy to wire this up. This commit also removes some noisy log
Michal Suchanek 6f6e6c
messages that don't add much.
Michal Suchanek 6f6e6c
Michal Suchanek 6f6e6c
Fixes: a489043f4626 ("powerpc/pseries: Implement arch_get_random_long() based on H_RANDOM")
Michal Suchanek 6f6e6c
Cc: stable@vger.kernel.org # v3.13+
Michal Suchanek 6f6e6c
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Michal Suchanek 6f6e6c
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Michal Suchanek 6f6e6c
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek 6f6e6c
Link: https://lore.kernel.org/r/20220611151015.548325-4-Jason@zx2c4.com
Michal Suchanek 6f6e6c
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek 6f6e6c
---
Michal Suchanek 6f6e6c
 arch/powerpc/platforms/pseries/pseries.h |  2 ++
Michal Suchanek 6f6e6c
 arch/powerpc/platforms/pseries/rng.c     | 11 +++--------
Michal Suchanek 6f6e6c
 arch/powerpc/platforms/pseries/setup.c   |  1 +
Michal Suchanek 6f6e6c
 3 files changed, 6 insertions(+), 8 deletions(-)
Michal Suchanek 6f6e6c
Michal Suchanek 6f6e6c
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
Michal Suchanek 6f6e6c
--- a/arch/powerpc/platforms/pseries/pseries.h
Michal Suchanek 6f6e6c
+++ b/arch/powerpc/platforms/pseries/pseries.h
Michal Suchanek 6f6e6c
@@ -122,4 +122,6 @@ void pseries_lpar_read_hblkrm_characteristics(void);
Michal Suchanek 6f6e6c
 void pseries_setup_rfi_flush(void);
Michal Suchanek 6f6e6c
 void pseries_lpar_read_hblkrm_characteristics(void);
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
+void pseries_rng_init(void);
Michal Suchanek 6f6e6c
+
Michal Suchanek 6f6e6c
 #endif /* _PSERIES_PSERIES_H */
Michal Suchanek 6f6e6c
diff --git a/arch/powerpc/platforms/pseries/rng.c b/arch/powerpc/platforms/pseries/rng.c
Michal Suchanek 6f6e6c
index 6268545947b8..6ddfdeaace9e 100644
Michal Suchanek 6f6e6c
--- a/arch/powerpc/platforms/pseries/rng.c
Michal Suchanek 6f6e6c
+++ b/arch/powerpc/platforms/pseries/rng.c
Michal Suchanek 6f6e6c
@@ -10,6 +10,7 @@
Michal Suchanek 6f6e6c
 #include <asm/archrandom.h>
Michal Suchanek 6f6e6c
 #include <asm/machdep.h>
Michal Suchanek 6f6e6c
 #include <asm/plpar_wrappers.h>
Michal Suchanek 6f6e6c
+#include "pseries.h"
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
 static int pseries_get_random_long(unsigned long *v)
Michal Suchanek 6f6e6c
@@ -24,19 +25,13 @@ static int pseries_get_random_long(unsigned long *v)
Michal Suchanek 6f6e6c
 	return 0;
Michal Suchanek 6f6e6c
 }
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
-static __init int rng_init(void)
Michal Suchanek 6f6e6c
+void __init pseries_rng_init(void)
Michal Suchanek 6f6e6c
 {
Michal Suchanek 6f6e6c
 	struct device_node *dn;
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
 	dn = of_find_compatible_node(NULL, NULL, "ibm,random");
Michal Suchanek 6f6e6c
 	if (!dn)
Michal Suchanek 6f6e6c
-		return -ENODEV;
Michal Suchanek 6f6e6c
-
Michal Suchanek 6f6e6c
-	pr_info("Registering arch random hook.\n");
Michal Suchanek 6f6e6c
-
Michal Suchanek 6f6e6c
+		return;
Michal Suchanek 6f6e6c
 	ppc_md.get_random_seed = pseries_get_random_long;
Michal Suchanek 6f6e6c
-
Michal Suchanek 6f6e6c
 	of_node_put(dn);
Michal Suchanek 6f6e6c
-	return 0;
Michal Suchanek 6f6e6c
 }
Michal Suchanek 6f6e6c
-machine_subsys_initcall(pseries, rng_init);
Michal Suchanek 6f6e6c
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
Michal Suchanek 6f6e6c
index afb074269b42..ee4f1db49515 100644
Michal Suchanek 6f6e6c
--- a/arch/powerpc/platforms/pseries/setup.c
Michal Suchanek 6f6e6c
+++ b/arch/powerpc/platforms/pseries/setup.c
Michal Suchanek 6f6e6c
@@ -839,6 +839,7 @@ static void __init pSeries_setup_arch(void)
Michal Suchanek 6f6e6c
 	}
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
 	ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
Michal Suchanek 6f6e6c
+	pseries_rng_init();
Michal Suchanek 6f6e6c
 }
Michal Suchanek 6f6e6c
 
Michal Suchanek 6f6e6c
 static void pseries_panic(char *str)
Michal Suchanek 6f6e6c
-- 
Michal Suchanek 6f6e6c
2.35.3
Michal Suchanek 6f6e6c