diff options
author | Tom Rini <trini@konsulko.com> | 2024-01-09 09:00:39 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2024-01-09 09:00:39 -0500 |
commit | c7937a41992298752b9b424b9e4d222dfc157915 (patch) | |
tree | 5d1b7f0c0567ea34219d64b1cd76aea0b6c23d0b | |
parent | c5e461fbf7cc72f0c1c8a79226b6a5170e56cb4d (diff) | |
parent | 1351cd3b4b1b18cafa4893a44378ca6b1d091c8e (diff) |
Merge tag 'rng-2024-04-rc1' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
Pull request rng-2024-04-rc1
QEMU does not provide information in the device-tree if the ARMv8.5 RNDR
or the RISC-V Zkr RNG have been enabled on the command line.
In different parts of our code we assume that the first RNG device is the
one to be used. Therefore it is preferable to detect the availability of
said devices already in the bind method.
There has been a related discussion if the U_BOOT_DRVINFO() macro should be
used for architectural devices
(https://lore.kernel.org/u-boot/20231031125552.26698-1-heinrich.schuchardt@canonical.com/).
This aspect is not touched by this series.
-rw-r--r-- | drivers/rng/arm_rndr.c | 6 | ||||
-rw-r--r-- | drivers/rng/riscv_zkr_rng.c | 34 |
2 files changed, 29 insertions, 11 deletions
diff --git a/drivers/rng/arm_rndr.c b/drivers/rng/arm_rndr.c index 55989743ea..4512330e68 100644 --- a/drivers/rng/arm_rndr.c +++ b/drivers/rng/arm_rndr.c @@ -62,10 +62,10 @@ static const struct dm_rng_ops arm_rndr_ops = { .read = arm_rndr_read, }; -static int arm_rndr_probe(struct udevice *dev) +static int arm_rndr_bind(struct udevice *dev) { if (!cpu_has_rndr()) - return -ENODEV; + return -ENOENT; return 0; } @@ -74,7 +74,7 @@ U_BOOT_DRIVER(arm_rndr) = { .name = DRIVER_NAME, .id = UCLASS_RNG, .ops = &arm_rndr_ops, - .probe = arm_rndr_probe, + .bind = arm_rndr_bind, }; U_BOOT_DRVINFO(cpu_arm_rndr) = { diff --git a/drivers/rng/riscv_zkr_rng.c b/drivers/rng/riscv_zkr_rng.c index 8c9e111e2e..48a5251988 100644 --- a/drivers/rng/riscv_zkr_rng.c +++ b/drivers/rng/riscv_zkr_rng.c @@ -55,7 +55,7 @@ static int riscv_zkr_read(struct udevice *dev, void *data, size_t len) } break; case DEAD: - return -ENODEV; + return -ENOENT; } } @@ -63,16 +63,16 @@ static int riscv_zkr_read(struct udevice *dev, void *data, size_t len) } /** - * riscv_zkr_probe() - check if the seed register is available + * riscv_zkr_bind() - check if the seed register is available * - * If the SBI software has not set mseccfg.sseed=1 or the Zkr - * extension is not available this probe function will result - * in an exception. Currently we cannot recover from this. + * If the SBI software has not set mseccfg.sseed=1 or the Zkr extension is not + * available, reading the seed register will result in an exception from which + * this function safely resumes. * * @dev: RNG device * Return: 0 if successfully probed */ -static int riscv_zkr_probe(struct udevice *dev) +static int riscv_zkr_bind(struct udevice *dev) { struct resume_data resume; int ret; @@ -87,7 +87,24 @@ static int riscv_zkr_probe(struct udevice *dev) val = read_seed(); set_resume(NULL); if (ret) - return -ENODEV; + return -ENOENT; + + return 0; +} + +/** + * riscv_zkr_probe() - check if entropy is available + * + * The bind method already checked that the seed register can be read without + * excpetiong. Here we wait for the self test to finish and entropy becoming + * available. + * + * @dev: RNG device + * Return: 0 if successfully probed + */ +static int riscv_zkr_probe(struct udevice *dev) +{ + u32 val; do { val = read_seed(); @@ -95,7 +112,7 @@ static int riscv_zkr_probe(struct udevice *dev) } while (val == BIST || val == WAIT); if (val == DEAD) - return -ENODEV; + return -ENOENT; return 0; } @@ -108,6 +125,7 @@ U_BOOT_DRIVER(riscv_zkr) = { .name = DRIVER_NAME, .id = UCLASS_RNG, .ops = &riscv_zkr_ops, + .bind = riscv_zkr_bind, .probe = riscv_zkr_probe, }; |