From: Fabio Estevam <[email protected]>
Since commit 358ba762d9f1 ("crypto: caam - enable prediction resistance
in HRWNG") the following CAAM errors can be seen on i.MX6SX:
caam_jr 2101000.jr: 20003c5b: CCB: desc idx 60: RNG: Hardware error
hwrng: no data available
caam_jr 2101000.jr: 20003c5b: CCB: desc idx 60: RNG: Hardware error
This error is due to an incorrect entropy delay for i.MX6SX.
Fix it by increasing the minimum entropy delay for i.MX6SX
as done in U-Boot:
https://patchwork.ozlabs.org/project/uboot/patch/[email protected]/
Fixes: 358ba762d9f1 ("crypto: caam - enable prediction resistance in HRWNG")
Signed-off-by: Fabio Estevam <[email protected]>
---
Changes since v2:
- Added Fixes tag. (Horia)
Change since v1:
- Align the fix with U-Boot.
drivers/crypto/caam/ctrl.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
index ca0361b2dbb0..c515c20442d5 100644
--- a/drivers/crypto/caam/ctrl.c
+++ b/drivers/crypto/caam/ctrl.c
@@ -648,6 +648,8 @@ static int caam_probe(struct platform_device *pdev)
return ret;
}
+ if (of_machine_is_compatible("fsl,imx6sx"))
+ ent_delay = 12000;
/* Get configuration properties from device tree */
/* First, get register page */
@@ -871,6 +873,15 @@ static int caam_probe(struct platform_device *pdev)
*/
ret = instantiate_rng(dev, inst_handles,
gen_sk);
+ /*
+ * Entropy delay is calculated via self-test method.
+ * Self-test is run across different voltages and
+ * temperatures.
+ * If worst case value for ent_dly is identified,
+ * the loop can be skipped for that platform.
+ */
+ if (of_machine_is_compatible("fsl,imx6sx"))
+ break;
if (ret == -EAGAIN)
/*
* if here, the loop will rerun,
--
2.25.1
On 4/18/2022 3:27 PM, Fabio Estevam wrote:
> From: Fabio Estevam <[email protected]>
>
> Since commit 358ba762d9f1 ("crypto: caam - enable prediction resistance
> in HRWNG") the following CAAM errors can be seen on i.MX6SX:
>
> caam_jr 2101000.jr: 20003c5b: CCB: desc idx 60: RNG: Hardware error
> hwrng: no data available
> caam_jr 2101000.jr: 20003c5b: CCB: desc idx 60: RNG: Hardware error
>
> This error is due to an incorrect entropy delay for i.MX6SX.
>
> Fix it by increasing the minimum entropy delay for i.MX6SX
> as done in U-Boot:
> https://patchwork.ozlabs.org/project/uboot/patch/[email protected]/
>
> Fixes: 358ba762d9f1 ("crypto: caam - enable prediction resistance in HRWNG")
> Signed-off-by: Fabio Estevam <[email protected]>
> ---
> Changes since v2:
> - Added Fixes tag. (Horia)
>
> Change since v1:
> - Align the fix with U-Boot.
>
> drivers/crypto/caam/ctrl.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
> index ca0361b2dbb0..c515c20442d5 100644
> --- a/drivers/crypto/caam/ctrl.c
> +++ b/drivers/crypto/caam/ctrl.c
> @@ -648,6 +648,8 @@ static int caam_probe(struct platform_device *pdev)
> return ret;
> }
>
> + if (of_machine_is_compatible("fsl,imx6sx"))
> + ent_delay = 12000;
>
This looks rather randomly placed in the probe() function.
I'd suggest moving it into the RNG initialization area.
Another benefit would be calling of_machine_is_compatible() only once.
> /* Get configuration properties from device tree */
> /* First, get register page */
> @@ -871,6 +873,15 @@ static int caam_probe(struct platform_device *pdev)
> */
> ret = instantiate_rng(dev, inst_handles,
> gen_sk);
> + /*
> + * Entropy delay is calculated via self-test method.
> + * Self-test is run across different voltages and
> + * temperatures.
A clarification wrt. terminology:
-"self-tests" refer to HW checks done when initializing the RNG
(instantiating the RNG state handle), they are statistical tests to check
the quality of the entropy
-"TRNG characterization" is the offline process of determining the entropy delay
values that are "suitable" - i.e. allowing TRNG to work correctly across
ranges of temperature, voltage and clock frequency
> + * If worst case value for ent_dly is identified,
> + * the loop can be skipped for that platform.
> + */
> + if (of_machine_is_compatible("fsl,imx6sx"))
> + break;
> if (ret == -EAGAIN)
> /*
> * if here, the loop will rerun,
Thanks,
Horia