Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2f8cfa6 authored by Jason A. Donenfeld's avatar Jason A. Donenfeld Committed by Greg Kroah-Hartman
Browse files

powerpc/pseries: wire up rng during setup_arch()



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: a489043f ("powerpc/pseries: Implement arch_get_random_long() based on H_RANDOM")
Cc: stable@vger.kernel.org # v3.13+
Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220611151015.548325-4-Jason@zx2c4.com


Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1b9980fb
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -81,4 +81,6 @@ unsigned long pseries_memory_block_size(void);

void pseries_setup_rfi_flush(void);

void pseries_rng_init(void);

#endif /* _PSERIES_PSERIES_H */
+3 −8
Original line number Diff line number Diff line
@@ -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(unsigned long *v)
	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);
+1 −0
Original line number Diff line number Diff line
@@ -585,6 +585,7 @@ static void __init pSeries_setup_arch(void)
	}

	ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
	pseries_rng_init();
}

static int __init pSeries_init_panel(void)