2022-04-18 13:02:53

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH v3] crypto: caam - fix i.MX6SX entropy delay value

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


2022-04-21 17:20:13

by Horia Geanta

[permalink] [raw]
Subject: Re: [PATCH v3] crypto: caam - fix i.MX6SX entropy delay value

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