| From 4ee4cdad368a26de3967f2975806a9ee2fa245df Mon Sep 17 00:00:00 2001 |
| From: Fabio Estevam <festevam@denx.de> |
| Date: Wed, 20 Apr 2022 09:06:01 -0300 |
| Subject: crypto: caam - fix i.MX6SX entropy delay value |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Fabio Estevam <festevam@denx.de> |
| |
| commit 4ee4cdad368a26de3967f2975806a9ee2fa245df upstream. |
| |
| 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 |
| |
| 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/20220415111049.2565744-1-gaurav.jain@nxp.com/ |
| |
| As explained in the U-Boot patch: |
| |
| "RNG self tests are run to determine the correct entropy delay. |
| Such tests are executed with different voltages and temperatures to identify |
| the worst case value for the entropy delay. For i.MX6SX, it was determined |
| that after adding a margin value of 1000 the minimum entropy delay should be |
| at least 12000." |
| |
| Cc: <stable@vger.kernel.org> |
| Fixes: 358ba762d9f1 ("crypto: caam - enable prediction resistance in HRWNG") |
| Signed-off-by: Fabio Estevam <festevam@denx.de> |
| Reviewed-by: Horia Geantă <horia.geanta@nxp.com> |
| Reviewed-by: Vabhav Sharma <vabhav.sharma@nxp.com> |
| Reviewed-by: Gaurav Jain <gaurav.jain@nxp.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/crypto/caam/ctrl.c | 18 ++++++++++++++++++ |
| 1 file changed, 18 insertions(+) |
| |
| --- a/drivers/crypto/caam/ctrl.c |
| +++ b/drivers/crypto/caam/ctrl.c |
| @@ -609,6 +609,13 @@ static bool check_version(struct fsl_mc_ |
| } |
| #endif |
| |
| +static bool needs_entropy_delay_adjustment(void) |
| +{ |
| + if (of_machine_is_compatible("fsl,imx6sx")) |
| + return true; |
| + return false; |
| +} |
| + |
| /* Probe routine for CAAM top (controller) level */ |
| static int caam_probe(struct platform_device *pdev) |
| { |
| @@ -855,6 +862,8 @@ static int caam_probe(struct platform_de |
| * Also, if a handle was instantiated, do not change |
| * the TRNG parameters. |
| */ |
| + if (needs_entropy_delay_adjustment()) |
| + ent_delay = 12000; |
| if (!(ctrlpriv->rng4_sh_init || inst_handles)) { |
| dev_info(dev, |
| "Entropy delay = %u\n", |
| @@ -871,6 +880,15 @@ static int caam_probe(struct platform_de |
| */ |
| ret = instantiate_rng(dev, inst_handles, |
| gen_sk); |
| + /* |
| + * Entropy delay is determined via TRNG characterization. |
| + * TRNG characterization 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 (needs_entropy_delay_adjustment()) |
| + break; |
| if (ret == -EAGAIN) |
| /* |
| * if here, the loop will rerun, |