From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:17
This is a set of small fixes for the imx-rngc driver.
I tried to clarify the approach for masking/unmasking the interrupt from
the rngc.
The rngc should be set to auto-seed mode, where it creates a new seed
when required.
In the probe function, we should check that the rng type is supported by
this driver.
Thanks for reviewing the patches,
Martin
Martin Kaiser (6):
hwrng: imx-rngc - fix an error path
hwrng: imx-rngc - use automatic seeding
hwrng: imx-rngc - use devres for registration
hwrng: imx-rngc - (trivial) simplify error prints
hwrng: imx-rngc - check the rng type
hwrng: imx-rngc - simplify interrupt mask/unmask
drivers/char/hw_random/imx-rngc.c | 89 ++++++++++++++++++++++++-------
1 file changed, 70 insertions(+), 19 deletions(-)
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:10
Use a simpler approach for masking / unmasking the rngc interrupt:
The interrupt is unmasked while self-test is running and when the rngc
driver is used by the hwrng core.
Mask the interrupt again when self test is finished, regardless of
self test success or failure.
Unmask the interrupt in the init function. Add a cleanup function where
the rngc interrupt is masked again.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 43 ++++++++++++++++++++-----------
1 file changed, 28 insertions(+), 15 deletions(-)
@@ -111,17 +111,11 @@ static int imx_rngc_self_test(struct imx_rngc *rngc)writel(cmd|RNGC_CMD_SELF_TEST,rngc->base+RNGC_COMMAND);ret=wait_for_completion_timeout(&rngc->rng_op_done,RNGC_TIMEOUT);-if(!ret){-imx_rngc_irq_mask_clear(rngc);+imx_rngc_irq_mask_clear(rngc);+if(!ret)return-ETIMEDOUT;-}--if(rngc->err_reg!=0){-imx_rngc_irq_mask_clear(rngc);-return-EIO;-}-return0;+returnrngc->err_reg?-EIO:0;}staticintimx_rngc_read(structhwrng*rng,void*data,size_tmax,boolwait)
@@ -185,10 +179,10 @@ static int imx_rngc_init(struct hwrng *rng)cmd=readl(rngc->base+RNGC_COMMAND);writel(cmd|RNGC_CMD_CLR_ERR,rngc->base+RNGC_COMMAND);+imx_rngc_irq_unmask(rngc);+/* create seed, repeat while there is some statistical error */do{-imx_rngc_irq_unmask(rngc);-/* seed creation */cmd=readl(rngc->base+RNGC_COMMAND);writel(cmd|RNGC_CMD_SEED,rngc->base+RNGC_COMMAND);
@@ -197,14 +191,16 @@ static int imx_rngc_init(struct hwrng *rng)RNGC_TIMEOUT);if(!ret){-imx_rngc_irq_mask_clear(rngc);-return-ETIMEDOUT;+ret=-ETIMEDOUT;+gotoerr;}}while(rngc->err_reg==RNGC_ERROR_STATUS_STAT_ERR);-if(rngc->err_reg)-return-EIO;+if(rngc->err_reg){+ret=-EIO;+gotoerr;+}/**enableautomaticseeding,therngccreatesanewseedautomatically
@@ -214,7 +210,23 @@ static int imx_rngc_init(struct hwrng *rng)ctrl|=RNGC_CTRL_AUTO_SEED;writel(ctrl,rngc->base+RNGC_CONTROL);+/*+*ifinitialisationwassuccessful,wekeeptheinterrupt+*unmaskeduntilimx_rngc_cleanupiscalled+*wemasktheinterruptourselvesifwereturnanerror+*/return0;++err:+imx_rngc_irq_mask_clear(rngc);+returnret;+}++staticvoidimx_rngc_cleanup(structhwrng*rng)+{+structimx_rngc*rngc=container_of(rng,structimx_rngc,rng);++imx_rngc_irq_mask_clear(rngc);}staticintimx_rngc_probe(structplatform_device*pdev)
@@ -272,6 +284,7 @@ static int imx_rngc_probe(struct platform_device *pdev)rngc->rng.name=pdev->name;rngc->rng.init=imx_rngc_init;rngc->rng.read=imx_rngc_read;+rngc->rng.cleanup=imx_rngc_cleanup;rngc->dev=&pdev->dev;platform_set_drvdata(pdev,rngc);
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:14
Use devres to register the rngc with the hwrng core. Drop the explicit
deregistration.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:21
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 <redacted>
---
drivers/char/hw_random/imx-rngc.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:24
Make sure that the rngc interrupt is masked if the rngc self test fails.
Self test failure means that probe fails as well. Interrupts should be
masked in this case, regardless of the error.
Cc: stable@vger.kernel.org
Fixes: 1d5449445bd0 ("hwrng: mx-rngc - add a driver for Freescale RNGC")
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:31
Remove the device name, it is added by the dev_...() routines.
Drop the error code as well. It will be shown by the driver core when
the probe operation failed.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Martin Kaiser <hidden> Date: 2020-01-28 11:43:34
Read the rng type and hardware revision during probe. Fail the probe
operation if the type is not one of rngc or rngb.
(There's also an rnga type, which needs a different driver.)
Display the type and revision in a debug print if probe was successful.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
Hi Martin,
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser [off-list ref] wrote:
quoted hunk
Use devres to register the rngc with the hwrng core. Drop the explicit
deregistration.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
@@ -282,8 +282,6 @@ static int __exit imx_rngc_remove(struct platform_device *pdev){structimx_rngc*rngc=platform_get_drvdata(pdev);-hwrng_unregister(&rngc->rng);-clk_disable_unprepare(rngc->clk);return0;--
2.20.1
After imx_rngc_remove function hwrng_unregister will get called. This
leaves a window where the clock to rng hardware block is disabled but
still user space can access it via /dev/hwrng. This does not look
right, please revisit the patch.
Regards,
PrasannaKumar
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Hi Martin,
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser [off-list ref] wrote:
quoted hunk
Make sure that the rngc interrupt is masked if the rngc self test fails.
Self test failure means that probe fails as well. Interrupts should be
masked in this case, regardless of the error.
Cc: stable@vger.kernel.org
Fixes: 1d5449445bd0 ("hwrng: mx-rngc - add a driver for Freescale RNGC")
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
@@ -105,8 +105,10 @@ static int imx_rngc_self_test(struct imx_rngc *rngc)return-ETIMEDOUT;}-if(rngc->err_reg!=0)+if(rngc->err_reg!=0){+imx_rngc_irq_mask_clear(rngc);return-EIO;+}return0;}--
2.20.1
Looks good to me. You can add
Reviewed-by: PrasannaKumar Muralidharan <redacted>
Regards,
PrasannaKumar
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser [off-list ref] wrote:
quoted hunk
Read the rng type and hardware revision during probe. Fail the probe
operation if the type is not one of rngc or rngb.
(There's also an rnga type, which needs a different driver.)
Display the type and revision in a debug print if probe was successful.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser [off-list ref] wrote:
quoted hunk
Remove the device name, it is added by the dev_...() routines.
Drop the error code as well. It will be shown by the driver core when
the probe operation failed.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
On Tue, 28 Jan 2020 at 16:31, Martin Kaiser [off-list ref] wrote:
quoted hunk
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 <redacted>
---
drivers/char/hw_random/imx-rngc.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
From: Martin Kaiser <hidden> Date: 2020-02-17 09:35:57
Hi PrasannaKumar,
Thus wrote PrasannaKumar Muralidharan (prasannatsmkumar@gmail.com):
After imx_rngc_remove function hwrng_unregister will get called. This
leaves a window where the clock to rng hardware block is disabled but
still user space can access it via /dev/hwrng.
thanks for spotting this issue. I see that in __device_release_driver,
the driver's remove function is called before the devres cleanup.
This does not look right, please revisit the patch.
I checked again how other hwrng drivers use devres. Some don't have to
disable a clock and need no remove function at all. Others enable the
clock in the hwrng init routine and disable it in the cleanup routine.
Both of these approaches don't work here. I should disable the clock
eventually and I need it in the probe function to run the selftest
before hwrng init is called.
Therefore, I suggest to drop this patch, at least for the moment.
Herbert, should I resend the series without this patch or is it ok for
you to take the remaining patches as-is?
BTW, 3e75241be808 ("hwrng: drivers - Use device-managed registration
API") makes the same change that I proposed here for a couple of other
hwrng drivers and seems to introduce the same race condition in som
drivers e.g. drivers/char/hw_random/exynos-trng.c. Should we try to fix
this?
Thanks,
Martin
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Martin Kaiser <hidden> Date: 2020-03-05 20:59:27
This is a set of small fixes for the imx-rngc driver.
I tried to clarify the approach for masking/unmasking the interrupt from
the rngc.
The rngc should be set to auto-seed mode, where it creates a new seed
when required.
In the probe function, we should check that the rng type is supported by
this driver.
Thanks for reviewing the patches,
Martin
changes in v2:
- remove the contentious devres patch
- add PrasannaKumar's tags
Martin Kaiser (5):
hwrng: imx-rngc - fix an error path
hwrng: imx-rngc - use automatic seeding
hwrng: imx-rngc - (trivial) simplify error prints
hwrng: imx-rngc - check the rng type
hwrng: imx-rngc - simplify interrupt mask/unmask
drivers/char/hw_random/imx-rngc.c | 85 +++++++++++++++++++++++++------
1 file changed, 69 insertions(+), 16 deletions(-)
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Martin Kaiser <hidden> Date: 2020-03-05 20:59:29
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.
Reviewed-by: PrasannaKumar Muralidharan <redacted>
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
From: Martin Kaiser <hidden> Date: 2020-03-05 20:59:32
Read the rng type and hardware revision during probe. Fail the probe
operation if the type is not one of rngc or rngb.
(There's also an rnga type, which needs a different driver.)
Display the type and revision in a debug print if probe was successful.
Reviewed-by: PrasannaKumar Muralidharan <redacted>
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
From: Martin Kaiser <hidden> Date: 2020-03-05 20:59:36
Use a simpler approach for masking / unmasking the rngc interrupt:
The interrupt is unmasked while self-test is running and when the rngc
driver is used by the hwrng core.
Mask the interrupt again when self test is finished, regardless of
self test success or failure.
Unmask the interrupt in the init function. Add a cleanup function where
the rngc interrupt is masked again.
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 43 ++++++++++++++++++++-----------
1 file changed, 28 insertions(+), 15 deletions(-)
@@ -111,17 +111,11 @@ static int imx_rngc_self_test(struct imx_rngc *rngc)writel(cmd|RNGC_CMD_SELF_TEST,rngc->base+RNGC_COMMAND);ret=wait_for_completion_timeout(&rngc->rng_op_done,RNGC_TIMEOUT);-if(!ret){-imx_rngc_irq_mask_clear(rngc);+imx_rngc_irq_mask_clear(rngc);+if(!ret)return-ETIMEDOUT;-}--if(rngc->err_reg!=0){-imx_rngc_irq_mask_clear(rngc);-return-EIO;-}-return0;+returnrngc->err_reg?-EIO:0;}staticintimx_rngc_read(structhwrng*rng,void*data,size_tmax,boolwait)
@@ -185,10 +179,10 @@ static int imx_rngc_init(struct hwrng *rng)cmd=readl(rngc->base+RNGC_COMMAND);writel(cmd|RNGC_CMD_CLR_ERR,rngc->base+RNGC_COMMAND);+imx_rngc_irq_unmask(rngc);+/* create seed, repeat while there is some statistical error */do{-imx_rngc_irq_unmask(rngc);-/* seed creation */cmd=readl(rngc->base+RNGC_COMMAND);writel(cmd|RNGC_CMD_SEED,rngc->base+RNGC_COMMAND);
@@ -197,14 +191,16 @@ static int imx_rngc_init(struct hwrng *rng)RNGC_TIMEOUT);if(!ret){-imx_rngc_irq_mask_clear(rngc);-return-ETIMEDOUT;+ret=-ETIMEDOUT;+gotoerr;}}while(rngc->err_reg==RNGC_ERROR_STATUS_STAT_ERR);-if(rngc->err_reg)-return-EIO;+if(rngc->err_reg){+ret=-EIO;+gotoerr;+}/**enableautomaticseeding,therngccreatesanewseedautomatically
@@ -214,7 +210,23 @@ static int imx_rngc_init(struct hwrng *rng)ctrl|=RNGC_CTRL_AUTO_SEED;writel(ctrl,rngc->base+RNGC_CONTROL);+/*+*ifinitialisationwassuccessful,wekeeptheinterrupt+*unmaskeduntilimx_rngc_cleanupiscalled+*wemasktheinterruptourselvesifwereturnanerror+*/return0;++err:+imx_rngc_irq_mask_clear(rngc);+returnret;+}++staticvoidimx_rngc_cleanup(structhwrng*rng)+{+structimx_rngc*rngc=container_of(rng,structimx_rngc,rng);++imx_rngc_irq_mask_clear(rngc);}staticintimx_rngc_probe(structplatform_device*pdev)
@@ -272,6 +284,7 @@ static int imx_rngc_probe(struct platform_device *pdev)rngc->rng.name=pdev->name;rngc->rng.init=imx_rngc_init;rngc->rng.read=imx_rngc_read;+rngc->rng.cleanup=imx_rngc_cleanup;rngc->dev=&pdev->dev;platform_set_drvdata(pdev,rngc);
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
From: Martin Kaiser <hidden> Date: 2020-03-05 20:59:37
Remove the device name, it is added by the dev_...() routines.
Drop the error code as well. It will be shown by the driver core when
the probe operation failed.
Reviewed-by: PrasannaKumar Muralidharan <redacted>
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Martin Kaiser <hidden> Date: 2020-03-05 20:59:43
Make sure that the rngc interrupt is masked if the rngc self test fails.
Self test failure means that probe fails as well. Interrupts should be
masked in this case, regardless of the error.
Cc: stable@vger.kernel.org
Fixes: 1d5449445bd0 ("hwrng: mx-rngc - add a driver for Freescale RNGC")
Reviewed-by: PrasannaKumar Muralidharan <redacted>
Signed-off-by: Martin Kaiser <redacted>
---
drivers/char/hw_random/imx-rngc.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
From: Herbert Xu <herbert@gondor.apana.org.au> Date: 2020-03-12 12:40:04
On Thu, Mar 05, 2020 at 09:58:19PM +0100, Martin Kaiser wrote:
This is a set of small fixes for the imx-rngc driver.
I tried to clarify the approach for masking/unmasking the interrupt from
the rngc.
The rngc should be set to auto-seed mode, where it creates a new seed
when required.
In the probe function, we should check that the rng type is supported by
this driver.
Thanks for reviewing the patches,
Martin
changes in v2:
- remove the contentious devres patch
- add PrasannaKumar's tags
Martin Kaiser (5):
hwrng: imx-rngc - fix an error path
hwrng: imx-rngc - use automatic seeding
hwrng: imx-rngc - (trivial) simplify error prints
hwrng: imx-rngc - check the rng type
hwrng: imx-rngc - simplify interrupt mask/unmask
drivers/char/hw_random/imx-rngc.c | 85 +++++++++++++++++++++++++------
1 file changed, 69 insertions(+), 16 deletions(-)