diff mbox series

[2/6] hwrng: imx-rngc - use automatic seeding

Message ID 20200128110102.11522-3-martin@kaiser.cx (mailing list archive)
State New, archived
Headers show
Series imx-rngc - several small fixes | expand

Commit Message

Martin Kaiser Jan. 28, 2020, 11 a.m. UTC
The rngc requires a new seed for its prng after generating 2^20 160-bit
words of random data. At the moment, we seed the prng only once during
initalisation.

Set the rngc to auto seed mode so that it kicks off the internal
reseeding operation when a new seed is required.

Keep the manual calculation of the initial seed when the device is
probed and switch to automatic seeding afterwards.

Signed-off-by: Martin Kaiser <martin@kaiser.cx>
---
 drivers/char/hw_random/imx-rngc.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

Comments

PrasannaKumar Muralidharan Feb. 12, 2020, 4:24 p.m. UTC | #1
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser <martin@kaiser.cx> wrote:
>
> The rngc requires a new seed for its prng after generating 2^20 160-bit
> words of random data. At the moment, we seed the prng only once during
> initalisation.
>
> Set the rngc to auto seed mode so that it kicks off the internal
> reseeding operation when a new seed is required.
>
> Keep the manual calculation of the initial seed when the device is
> probed and switch to automatic seeding afterwards.
>
> Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> ---
>  drivers/char/hw_random/imx-rngc.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/char/hw_random/imx-rngc.c b/drivers/char/hw_random/imx-rngc.c
> index 0576801944fd..903894518c8d 100644
> --- a/drivers/char/hw_random/imx-rngc.c
> +++ b/drivers/char/hw_random/imx-rngc.c
> @@ -31,6 +31,7 @@
>
>  #define RNGC_CTRL_MASK_ERROR           0x00000040
>  #define RNGC_CTRL_MASK_DONE            0x00000020
> +#define RNGC_CTRL_AUTO_SEED            0x00000010
>
>  #define RNGC_STATUS_ERROR              0x00010000
>  #define RNGC_STATUS_FIFO_LEVEL_MASK    0x00000f00
> @@ -167,7 +168,7 @@ static irqreturn_t imx_rngc_irq(int irq, void *priv)
>  static int imx_rngc_init(struct hwrng *rng)
>  {
>         struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng);
> -       u32 cmd;
> +       u32 cmd, ctrl;
>         int ret;
>
>         /* clear error */
> @@ -192,7 +193,18 @@ static int imx_rngc_init(struct hwrng *rng)
>
>         } while (rngc->err_reg == RNGC_ERROR_STATUS_STAT_ERR);
>
> -       return rngc->err_reg ? -EIO : 0;
> +       if (rngc->err_reg)
> +               return -EIO;
> +
> +       /*
> +        * enable automatic seeding, the rngc creates a new seed automatically
> +        * after serving 2^20 random 160-bit words
> +        */
> +       ctrl = readl(rngc->base + RNGC_CONTROL);
> +       ctrl |= RNGC_CTRL_AUTO_SEED;
> +       writel(ctrl, rngc->base + RNGC_CONTROL);
> +
> +       return 0;
>  }
>
>  static int imx_rngc_probe(struct platform_device *pdev)
> --
> 2.20.1
>

Reviewed-by: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com>
diff mbox series

Patch

diff --git a/drivers/char/hw_random/imx-rngc.c b/drivers/char/hw_random/imx-rngc.c
index 0576801944fd..903894518c8d 100644
--- a/drivers/char/hw_random/imx-rngc.c
+++ b/drivers/char/hw_random/imx-rngc.c
@@ -31,6 +31,7 @@ 
 
 #define RNGC_CTRL_MASK_ERROR		0x00000040
 #define RNGC_CTRL_MASK_DONE		0x00000020
+#define RNGC_CTRL_AUTO_SEED		0x00000010
 
 #define RNGC_STATUS_ERROR		0x00010000
 #define RNGC_STATUS_FIFO_LEVEL_MASK	0x00000f00
@@ -167,7 +168,7 @@  static irqreturn_t imx_rngc_irq(int irq, void *priv)
 static int imx_rngc_init(struct hwrng *rng)
 {
 	struct imx_rngc *rngc = container_of(rng, struct imx_rngc, rng);
-	u32 cmd;
+	u32 cmd, ctrl;
 	int ret;
 
 	/* clear error */
@@ -192,7 +193,18 @@  static int imx_rngc_init(struct hwrng *rng)
 
 	} while (rngc->err_reg == RNGC_ERROR_STATUS_STAT_ERR);
 
-	return rngc->err_reg ? -EIO : 0;
+	if (rngc->err_reg)
+		return -EIO;
+
+	/*
+	 * enable automatic seeding, the rngc creates a new seed automatically
+	 * after serving 2^20 random 160-bit words
+	 */
+	ctrl = readl(rngc->base + RNGC_CONTROL);
+	ctrl |= RNGC_CTRL_AUTO_SEED;
+	writel(ctrl, rngc->base + RNGC_CONTROL);
+
+	return 0;
 }
 
 static int imx_rngc_probe(struct platform_device *pdev)