rockchip: board: Increase rng-seed size to make it sufficient for modern Linux

Increase rng-seed size to make Linux happy and initialize rng pool instantly.
Linux 5.19+ requires 32 bytes of entropy to initialize random pool, but u-boot
currently provides only 8 bytes.
Linux 5.18 and probably some versions before it used to require 64 bytes.
Bump min value to 64 bytes to be on a safe side.

Boot with 8 byte rng-seed (Linux 6.11):
    # dmesg | grep crng
    [   12.089286] random: crng init done
Boot with 32 byte rng-seed (Linux 6.11):
    # dmesg | grep crng
    [    0.000000] random: crng init done

Linux source references:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/char/random.c?h=v5.19#n551
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/char/random.c?h=v5.18#n236

Signed-off-by: Alex Shumsky <alexthreed@gmail.com>
Fixes: d2048bafae ("rockchip: board: Add board_rng_seed() for all Rockchip devices")
Reviewed-by: Dragan Simic <dsimic@manjaro.org>
Reviewed-by: Marek Vasut <marex@denx.de>
Reviewed-by: Quentin Schulz <quentin.schulz@cherry.de>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
This commit is contained in:
Alex Shumsky 2024-10-16 13:02:03 +03:00 committed by Kever Yang
parent 352cec9a05
commit ed4ae73862
4 changed files with 20 additions and 2 deletions

View file

@ -472,9 +472,18 @@ __weak int misc_init_r(void)
__weak int board_rng_seed(struct abuf *buf)
{
struct udevice *dev;
size_t len = 0x8;
ulong len = env_get_ulong("rng_seed_size", 10, 64);
u64 *data;
if (len < 64) {
/*
* rng_seed_size should be at least 32 bytes for Linux 5.19+,
* or 64 for older Linux kernel versions
*/
log_warning("Value for rng_seed_size (%lu) too low, Linux kernel RNG may fail to initialize early\n",
len);
}
data = malloc(len);
if (!data) {
printf("Out of memory\n");

View file

@ -928,6 +928,9 @@ config BOARD_RNG_SEED
new seed for use on subsequent boots, and whether or not the
kernel should account any entropy from the given seed.
Default seed size (64 bytes) can be overridden by a decimal
environment variable rng_seed_size.
endmenu
menu "Update support"

View file

@ -323,6 +323,11 @@ netretry
Useful on scripts which control the retry operation
themselves.
rng_seed_size
Size of random value added to device-tree node /chosen/rng-seed.
This variable is given as a decimal number.
If unset, 64 bytes is used as the default.
silent_linux
If set then Linux will be told to boot silently, by
adding 'console=' to its command line. If "yes" it will be

View file

@ -202,7 +202,8 @@ int ft_board_setup(void *blob, struct bd_info *bd);
*
* This function is called if CONFIG_BOARD_RNG_SEED is set, and must
* be provided by the board. It should return, via @buf, some suitable
* seed value to pass to the kernel.
* seed value to pass to the kernel. Seed size could be set in a decimal
* environment variable rng_seed_size and it defaults to 64 bytes.
*
* @param buf A struct abuf for returning the seed and its size.
* @return 0 if ok, negative on error.