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

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

powerpc/powernv: delay rng platform device creation until later in boot



commit 887502826549caa7e4215fd9e628f48f14c0825a upstream.

The platform device for the rng must be created much later in boot.
Otherwise it tries to connect to a parent that doesn't yet exist,
resulting in this splat:

  [    0.000478] kobject: '(null)' ((____ptrval____)): is not initialized, yet kobject_get() is being called.
  [    0.002925] [c000000002a0fb30] [c00000000073b0bc] kobject_get+0x8c/0x100 (unreliable)
  [    0.003071] [c000000002a0fba0] [c00000000087e464] device_add+0xf4/0xb00
  [    0.003194] [c000000002a0fc80] [c000000000a7f6e4] of_device_add+0x64/0x80
  [    0.003321] [c000000002a0fcb0] [c000000000a800d0] of_platform_device_create_pdata+0xd0/0x1b0
  [    0.003476] [c000000002a0fd00] [c00000000201fa44] pnv_get_random_long_early+0x240/0x2e4
  [    0.003623] [c000000002a0fe20] [c000000002060c38] random_init+0xc0/0x214

This patch fixes the issue by doing the platform device creation inside
of machine_subsys_initcall.

Fixes: f3eac426657d ("powerpc/powernv: wire up rng during setup_arch")
Cc: stable@vger.kernel.org
Reported-by: default avatarSachin Sant <sachinp@linux.ibm.com>
Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
Tested-by: default avatarSachin Sant <sachinp@linux.ibm.com>
[mpe: Change "of node" to "platform device" in change log]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220630121654.1939181-1-Jason@zx2c4.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 782b65ee
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -176,12 +176,8 @@ static int __init pnv_get_random_long_early(unsigned long *v)
		    NULL) != pnv_get_random_long_early)
		return 0;

	for_each_compatible_node(dn, NULL, "ibm,power-rng") {
		if (rng_create(dn))
			continue;
		/* Create devices for hwrng driver */
		of_platform_device_create(dn, NULL, NULL);
	}
	for_each_compatible_node(dn, NULL, "ibm,power-rng")
		rng_create(dn);

	if (!ppc_md.get_random_seed)
		return 0;
@@ -205,10 +201,18 @@ void __init pnv_rng_init(void)

static int __init pnv_rng_late_init(void)
{
	struct device_node *dn;
	unsigned long v;

	/* In case it wasn't called during init for some other reason. */
	if (ppc_md.get_random_seed == pnv_get_random_long_early)
		pnv_get_random_long_early(&v);

	if (ppc_md.get_random_seed == powernv_get_random_long) {
		for_each_compatible_node(dn, NULL, "ibm,power-rng")
			of_platform_device_create(dn, NULL, NULL);
	}

	return 0;
}
machine_subsys_initcall(powernv, pnv_rng_late_init);