aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2024-01-09 09:00:39 -0500
committerTom Rini <trini@konsulko.com>2024-01-09 09:00:39 -0500
commitc7937a41992298752b9b424b9e4d222dfc157915 (patch)
tree5d1b7f0c0567ea34219d64b1cd76aea0b6c23d0b
parentc5e461fbf7cc72f0c1c8a79226b6a5170e56cb4d (diff)
parent1351cd3b4b1b18cafa4893a44378ca6b1d091c8e (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.c6
-rw-r--r--drivers/rng/riscv_zkr_rng.c34
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,
};