2018-01-29 17:08:56

by Lionel Debieve

[permalink] [raw]
Subject: [PATCH 0/5] hwrng: stm32 - Improvement for stm32-rng

This set of patches add extended functionalities for stm32 rng
driver.
Patch #1 includes a reset during probe to avoid any error status
which can occur during bootup process and keep safe rng integrity.

Patch #3 adds a new property to manage the clock error detection
feature which can be disabled on specific target.

Patch #5 rework the timeout calculation for read value that was
previously defined based on loop operation and is now based on
timer.

Lionel Debieve (5):
hwrng: stm32 - add reset during probe
dt-bindings: rng: add reset node for stm32
hwrng: stm32 - allow disable clock error detection
dt-bindings: rng: add clock detection error for stm32
hwrng: stm32 - rework read timeout calculation

.../devicetree/bindings/rng/st,stm32-rng.txt | 4 ++
drivers/char/hw_random/stm32-rng.c | 44 ++++++++++++++--------
2 files changed, 32 insertions(+), 16 deletions(-)

--
2.15.1



2018-01-29 17:08:45

by Lionel Debieve

[permalink] [raw]
Subject: [PATCH 1/5] hwrng: stm32 - add reset during probe

Avoid issue when probing the RNG without
reset if bad status has been detected previously

Signed-off-by: Lionel Debieve <[email protected]>
---
drivers/char/hw_random/stm32-rng.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c
index 63d84e6f1891..83c695938a2d 100644
--- a/drivers/char/hw_random/stm32-rng.c
+++ b/drivers/char/hw_random/stm32-rng.c
@@ -21,6 +21,7 @@
#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/pm_runtime.h>
+#include <linux/reset.h>
#include <linux/slab.h>

#define RNG_CR 0x00
@@ -46,6 +47,7 @@ struct stm32_rng_private {
struct hwrng rng;
void __iomem *base;
struct clk *clk;
+ struct reset_control *rst;
};

static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
@@ -140,6 +142,13 @@ static int stm32_rng_probe(struct platform_device *ofdev)
if (IS_ERR(priv->clk))
return PTR_ERR(priv->clk);

+ priv->rst = devm_reset_control_get(&ofdev->dev, NULL);
+ if (!IS_ERR(priv->rst)) {
+ reset_control_assert(priv->rst);
+ udelay(2);
+ reset_control_deassert(priv->rst);
+ }
+
dev_set_drvdata(dev, priv);

priv->rng.name = dev_driver_string(dev),
--
2.15.1


2018-01-29 17:09:25

by Lionel Debieve

[permalink] [raw]
Subject: [PATCH 2/5] dt-bindings: rng: add reset node for stm32

Adding optional resets property for rng.

Signed-off-by: Lionel Debieve <[email protected]>
---
Documentation/devicetree/bindings/rng/st,stm32-rng.txt | 3 +++
1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/rng/st,stm32-rng.txt b/Documentation/devicetree/bindings/rng/st,stm32-rng.txt
index 47f04176f93b..cb7ca78135ff 100644
--- a/Documentation/devicetree/bindings/rng/st,stm32-rng.txt
+++ b/Documentation/devicetree/bindings/rng/st,stm32-rng.txt
@@ -11,6 +11,9 @@ Required properties:
- interrupts : The designated IRQ line for the RNG
- clocks : The clock needed to enable the RNG

+Optional properties:
+- resets : The reset to properly start RNG
+
Example:

rng: rng@50060800 {
--
2.15.1


2018-01-29 17:09:32

by Lionel Debieve

[permalink] [raw]
Subject: [PATCH 3/5] hwrng: stm32 - allow disable clock error detection

Add a new property that allow to disable the clock error
detection which is required when the clock source selected
is out of specification (which is not mandatory).

Signed-off-by: Lionel Debieve <[email protected]>
---
drivers/char/hw_random/stm32-rng.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c
index 83c695938a2d..709a8d061be3 100644
--- a/drivers/char/hw_random/stm32-rng.c
+++ b/drivers/char/hw_random/stm32-rng.c
@@ -26,6 +26,7 @@

#define RNG_CR 0x00
#define RNG_CR_RNGEN BIT(2)
+#define RNG_CR_CED BIT(5)

#define RNG_SR 0x04
#define RNG_SR_SEIS BIT(6)
@@ -48,6 +49,7 @@ struct stm32_rng_private {
void __iomem *base;
struct clk *clk;
struct reset_control *rst;
+ bool ced;
};

static int stm32_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
@@ -101,7 +103,11 @@ static int stm32_rng_init(struct hwrng *rng)
if (err)
return err;

- writel_relaxed(RNG_CR_RNGEN, priv->base + RNG_CR);
+ if (priv->ced)
+ writel_relaxed(RNG_CR_RNGEN, priv->base + RNG_CR);
+ else
+ writel_relaxed(RNG_CR_RNGEN | RNG_CR_CED,
+ priv->base + RNG_CR);

/* clear error indicators */
writel_relaxed(0, priv->base + RNG_SR);
@@ -149,6 +155,8 @@ static int stm32_rng_probe(struct platform_device *ofdev)
reset_control_deassert(priv->rst);
}

+ priv->ced = of_property_read_bool(np, "clock-error-detect");
+
dev_set_drvdata(dev, priv);

priv->rng.name = dev_driver_string(dev),
--
2.15.1


2018-01-29 17:10:39

by Lionel Debieve

[permalink] [raw]
Subject: [PATCH 4/5] dt-bindings: rng: add clock detection error for stm32

Add optional property to enable the clock detection error
on rng block. It is used to allow slow clock source which
give correct entropy for rng.

Signed-off-by: Lionel Debieve <[email protected]>
---
Documentation/devicetree/bindings/rng/st,stm32-rng.txt | 1 +
1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/rng/st,stm32-rng.txt b/Documentation/devicetree/bindings/rng/st,stm32-rng.txt
index cb7ca78135ff..1dfa7d51e006 100644
--- a/Documentation/devicetree/bindings/rng/st,stm32-rng.txt
+++ b/Documentation/devicetree/bindings/rng/st,stm32-rng.txt
@@ -13,6 +13,7 @@ Required properties:

Optional properties:
- resets : The reset to properly start RNG
+- clock-error-detect : Enable the clock detection management

Example:

--
2.15.1


2018-02-15 08:50:30

by Herbert Xu

[permalink] [raw]
Subject: Re: [PATCH 0/5] hwrng: stm32 - Improvement for stm32-rng

On Mon, Jan 29, 2018 at 06:05:16PM +0100, Lionel Debieve wrote:
> This set of patches add extended functionalities for stm32 rng
> driver.
> Patch #1 includes a reset during probe to avoid any error status
> which can occur during bootup process and keep safe rng integrity.
>
> Patch #3 adds a new property to manage the clock error detection
> feature which can be disabled on specific target.
>
> Patch #5 rework the timeout calculation for read value that was
> previously defined based on loop operation and is now based on
> timer.
>
> Lionel Debieve (5):
> hwrng: stm32 - add reset during probe
> dt-bindings: rng: add reset node for stm32
> hwrng: stm32 - allow disable clock error detection
> dt-bindings: rng: add clock detection error for stm32
> hwrng: stm32 - rework read timeout calculation
>
> .../devicetree/bindings/rng/st,stm32-rng.txt | 4 ++
> drivers/char/hw_random/stm32-rng.c | 44 ++++++++++++++--------
> 2 files changed, 32 insertions(+), 16 deletions(-)

I never received patch 5.

Which trees are patch 2 and 4 meant to go through?

Thanks,
--
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt