crypto: caam - change starting entropy delay value
authorAlex Porosanu <alexandru.porosanu@freescale.com>
Mon, 11 Aug 2014 08:40:16 +0000 (11:40 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 25 Aug 2014 12:32:35 +0000 (20:32 +0800)
The entropy delay (the length in system clocks of each
entropy sample) for the RNG4 block of CAAM is dependent
on the frequency of the SoC. By elaborate methods, it
has been determined that a good starting value for all
platforms integrating the CAAM IP is 3200. Using a
higher value has additional benefit of  speeding up
the process of instantiating the RNG, since the entropy
delay will be increased and instantiation of the RNG
state handles will be reattempted by the driver. If the
starting value is low, for certain platforms, this can
lead to a quite lengthy process.
This patch changes the starting value of the length of
the entropy sample to 3200 system clocks.
In addition to this change, the attempted entropy delay
values are now printed on the console upon initialization
of the RNG block.
While here, a safeguard for yielding the processor was
added for ensuring that in very adverse cases,
the CPU isn't hogged by the instantiation loop.

Signed-off-by: Alex Porosanu <alexandru.porosanu@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/ctrl.c
drivers/crypto/caam/regs.h

index 8908d040b1f22c208e2aa0bbefe68c69cd6e7cc3..111ac1ffbc11f4de8074a821e407cb164fdf65b4 100644 (file)
@@ -544,6 +544,9 @@ static int caam_probe(struct platform_device *pdev)
                         * the TRNG parameters.
                         */
                        if (!(ctrlpriv->rng4_sh_init || inst_handles)) {
+                               dev_info(dev,
+                                        "Entropy delay = %u\n",
+                                        ent_delay);
                                kick_trng(pdev, ent_delay);
                                ent_delay += 400;
                        }
@@ -556,6 +559,12 @@ static int caam_probe(struct platform_device *pdev)
                         */
                        ret = instantiate_rng(dev, inst_handles,
                                              gen_sk);
+                       if (ret == -EAGAIN)
+                               /*
+                                * if here, the loop will rerun,
+                                * so don't hog the CPU
+                                */
+                               cpu_relax();
                } while ((ret == -EAGAIN) && (ent_delay < RTSDCTL_ENT_DLY_MAX));
                if (ret) {
                        dev_err(dev, "failed to instantiate RNG");
index b8bd980ac00ab8843ed35c054ed3111d39329795..5fa739c290a7d245ec6022fee324e2c6f5b1a1b2 100644 (file)
@@ -278,7 +278,7 @@ struct rng4tst {
        };
 #define RTSDCTL_ENT_DLY_SHIFT 16
 #define RTSDCTL_ENT_DLY_MASK (0xffff << RTSDCTL_ENT_DLY_SHIFT)
-#define RTSDCTL_ENT_DLY_MIN 1200
+#define RTSDCTL_ENT_DLY_MIN 3200
 #define RTSDCTL_ENT_DLY_MAX 12800
        u32 rtsdctl;            /* seed control register */
        union {