[PATCH v4 04/19] crypto: talitos/hwrng - Move into separate file
Paul Louvel <[email protected]>
| Newsgroups | org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Move the hardware random number generator implementation from talitos.c into a dedicated talitos-rng.c file. Signed-off-by: Paul Louvel <[email protected]> --- drivers/crypto/talitos/Makefile | 2 + drivers/crypto/talitos/talitos-rng.c | 93 ++++++++++++++++++++++++++++++++++++ drivers/crypto/talitos/talitos.c | 83 -------------------------------- drivers/crypto/talitos/talitos.h | 5 ++ 4 files changed, 100 insertions(+), 83 deletions(-) diff --git a/drivers/crypto/talitos/Makefile b/drivers/crypto/talitos/Makefile index fcc5db5e63c2..901ec681f010 100644 --- a/drivers/crypto/talitos/Makefile +++ b/drivers/crypto/talitos/Makefile @@ -1 +1,3 @@ obj-$(CONFIG_CRYPTO_DEV_TALITOS) += talitos.o + +talitos-y := talitos.o talitos-rng.o diff --git a/drivers/crypto/talitos/talitos-rng.c b/drivers/crypto/talitos/talitos-rng.c new file mode 100644 index 000000000000..3aa00de33b25 --- /dev/null +++ b/drivers/crypto/talitos/talitos-rng.c @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Freescale SEC (talitos) device hardware random number generator implementation + * + * Copyright (c) 2006-2011 Freescale Semiconductor, Inc. + */ + +#include <linux/delay.h> +#include <linux/io.h> + +#include "talitos.h" + +static int talitos_rng_data_present(struct hwrng *rng, int wait) +{ + struct device *dev = (struct device *)rng->priv; + struct talitos_private *priv = dev_get_drvdata(dev); + u32 ofl; + int i; + + for (i = 0; i < 20; i++) { + ofl = in_be32(priv->reg_rngu + TALITOS_EUSR_LO) & + TALITOS_RNGUSR_LO_OFL; + if (ofl || !wait) + break; + udelay(10); + } + + return !!ofl; +} + +static int talitos_rng_data_read(struct hwrng *rng, u32 *data) +{ + struct device *dev = (struct device *)rng->priv; + struct talitos_private *priv = dev_get_drvdata(dev); + + /* rng fifo requires 64-bit accesses */ + *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO); + *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO); + + return sizeof(u32); +} + +static int talitos_rng_init(struct hwrng *rng) +{ + struct device *dev = (struct device *)rng->priv; + struct talitos_private *priv = dev_get_drvdata(dev); + unsigned int timeout = TALITOS_TIMEOUT; + + setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR); + while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO) + & TALITOS_RNGUSR_LO_RD) + && --timeout) + cpu_relax(); + if (timeout == 0) { + dev_err(dev, "failed to reset rng hw\n"); + return -ENODEV; + } + + /* start generating */ + setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0); + + return 0; +} + +int talitos_register_rng(struct device *dev) +{ + struct talitos_private *priv = dev_get_drvdata(dev); + int err; + + priv->rng.name = dev_driver_string(dev); + priv->rng.init = talitos_rng_init; + priv->rng.data_present = talitos_rng_data_present; + priv->rng.data_read = talitos_rng_data_read; + priv->rng.priv = (unsigned long)dev; + + err = hwrng_register(&priv->rng); + if (!err) + priv->rng_registered = true; + + return err; +} + +void talitos_unregister_rng(struct device *dev) +{ + struct talitos_private *priv = dev_get_drvdata(dev); + + if (!priv->rng_registered) + return; + + hwrng_unregister(&priv->rng); + priv->rng_registered = false; +} diff --git a/drivers/crypto/talitos/talitos.c b/drivers/crypto/talitos/talitos.c index 64b95c7c5eda..c6124f984089 100644 --- a/drivers/crypto/talitos/talitos.c +++ b/drivers/crypto/talitos/talitos.c @@ -820,89 +820,6 @@ DEF_TALITOS2_INTERRUPT(ch0_2, TALITOS2_ISR_CH_0_2_DONE, TALITOS2_ISR_CH_0_2_ERR, DEF_TALITOS2_INTERRUPT(ch1_3, TALITOS2_ISR_CH_1_3_DONE, TALITOS2_ISR_CH_1_3_ERR, 1) -/* - * hwrng - */ -static int talitos_rng_data_present(struct hwrng *rng, int wait) -{ - struct device *dev = (struct device *)rng->priv; - struct talitos_private *priv = dev_get_drvdata(dev); - u32 ofl; - int i; - - for (i = 0; i < 20; i++) { - ofl = in_be32(priv->reg_rngu + TALITOS_EUSR_LO) & - TALITOS_RNGUSR_LO_OFL; - if (ofl || !wait) - break; - udelay(10); - } - - return !!ofl; -} - -static int talitos_rng_data_read(struct hwrng *rng, u32 *data) -{ - struct device *dev = (struct device *)rng->priv; - struct talitos_private *priv = dev_get_drvdata(dev); - - /* rng fifo requires 64-bit accesses */ - *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO); - *data = in_be32(priv->reg_rngu + TALITOS_EU_FIFO_LO); - - return sizeof(u32); -} - -static int talitos_rng_init(struct hwrng *rng) -{ - struct device *dev = (struct device *)rng->priv; - struct talitos_private *priv = dev_get_drvdata(dev); - unsigned int timeout = TALITOS_TIMEOUT; - - setbits32(priv->reg_rngu + TALITOS_EURCR_LO, TALITOS_RNGURCR_LO_SR); - while (!(in_be32(priv->reg_rngu + TALITOS_EUSR_LO) - & TALITOS_RNGUSR_LO_RD) - && --timeout) - cpu_relax(); - if (timeout == 0) { - dev_err(dev, "failed to reset rng hw\n"); - return -ENODEV; - } - - /* start generating */ - setbits32(priv->reg_rngu + TALITOS_EUDSR_LO, 0); - - return 0; -} - -static int talitos_register_rng(struct device *dev) -{ - struct talitos_private *priv = dev_get_drvdata(dev); - int err; - - priv->rng.name = dev_driver_string(dev); - priv->rng.init = talitos_rng_init; - priv->rng.data_present = talitos_rng_data_present; - priv->rng.data_read = talitos_rng_data_read; - priv->rng.priv = (unsigned long)dev; - - err = hwrng_register(&priv->rng); - if (!err) - priv->rng_registered = true; - - return err; -} - -static void talitos_unregister_rng(struct device *dev) -{ - struct talitos_private *priv = dev_get_drvdata(dev); - - if (!priv->rng_registered) - return; - - hwrng_unregister(&priv->rng); - priv->rng_registered = false; -} /* * crypto alg diff --git a/drivers/crypto/talitos/talitos.h b/drivers/crypto/talitos/talitos.h index 56e36a65ddcc..fa8c71b1f90f 100644 --- a/drivers/crypto/talitos/talitos.h +++ b/drivers/crypto/talitos/talitos.h @@ -431,3 +431,8 @@ static inline bool has_ftr_sec1(struct talitos_private *priv) #define DESC_PTR_LNKTBL_JUMP 0x80 #define DESC_PTR_LNKTBL_RET 0x02 #define DESC_PTR_LNKTBL_NEXT 0x01 + +/* Hardware RNG */ + +int talitos_register_rng(struct device *dev); +void talitos_unregister_rng(struct device *dev); -- 2.55.0