From: Sreedevi Joshi <sreedevi.jo...@intel.com> AXXIA AXM35xx TRNG driver support added.
Signed-off-by: Sreedevi Joshi <sreedevi.jo...@intel.com> --- arch/powerpc/boot/dts/acp35xx.dts | 10 +++++++ drivers/char/hw_random/axxia-rng.c | 56 +++++++----------------------------- 2 files changed, 20 insertions(+), 46 deletions(-) diff --git a/arch/powerpc/boot/dts/acp35xx.dts b/arch/powerpc/boot/dts/acp35xx.dts index d1f7863..71b8e98 100644 --- a/arch/powerpc/boot/dts/acp35xx.dts +++ b/arch/powerpc/boot/dts/acp35xx.dts @@ -307,6 +307,16 @@ sbb-reg = <0x00500000 0x8000>; tzc-reg = <0x00541000 0x1000>; }; + + TRNG: trng { + compatible = "lsi,trng"; + enabled = <1>; + reg = <0x00460000 0x20000>; + interrupt-parent = <&MPIC>; + interrupts = <43>; + status = "ok"; + }; + }; }; diff --git a/drivers/char/hw_random/axxia-rng.c b/drivers/char/hw_random/axxia-rng.c index b752e6b..c7ddb47 100644 --- a/drivers/char/hw_random/axxia-rng.c +++ b/drivers/char/hw_random/axxia-rng.c @@ -101,41 +101,6 @@ enum { TRNG_AXM55xx_CMD_RESET = 0x7, } ncp_trng_acp34xx_reg_cmds_t; -struct ncp_trng_axm55xx_reg_sts_t { -#ifdef NCP_BIG_ENDIAN - unsigned data_cnt:16; - unsigned prediction_resistance:1; - unsigned continuous_test_off:1; - unsigned reseed_required:1; - unsigned ro_entropy:1; - unsigned rdy:1; - unsigned err:1; - unsigned ro_test_in_progress:1; - unsigned rng_test_in_progress:1; - unsigned continuous_test_failed:1; - unsigned ro_test_failed:1; - unsigned rng_test_failed:1; - unsigned data_valid:1; - unsigned standby:1; - unsigned cmd:3; -#else - unsigned cmd:3; - unsigned standby:1; - unsigned data_valid:1; - unsigned rng_test_failed:1; - unsigned ro_test_failed:1; - unsigned continuous_test_failed:1; - unsigned rng_test_in_progress:1; - unsigned ro_test_in_progress:1; - unsigned err:1; - unsigned rdy:1; - unsigned ro_entropy:1; - unsigned reseed_required:1; - unsigned continuous_test_off:1; - unsigned prediction_resistance:1; - unsigned data_cnt:16; -#endif -} ncp_trng_axm55xx_reg_sts_t; #define TRNG_AXM55xx_STS_RDY_MSK (0x0800) #define TRNG_AXM55xx_STS_ERR_MSK (0x0400) @@ -330,10 +295,9 @@ static int axxia_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait) { static struct trng_dev *dev; unsigned int j = 0, num = 0; - u32 rword; - u32 rsts; - struct ncp_trng_axm55xx_reg_sts_t sts = {0}; - + u32 rword = 0; + u32 rsts = 0; + u32 sts = 0; if ((!rng) || (!buf)) return -EINVAL; @@ -367,6 +331,7 @@ static int axxia_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait) if (trng_test_mode != -1) return -EINVAL; + for (j = 0; j < max; ) { /* Read from STS + DOUT */ if (dev->words_avail) { @@ -396,14 +361,13 @@ static int axxia_trng_read(struct hwrng *rng, void *buf, size_t max, bool wait) TRNG_AXM55xx_SLEEP_USECS + 1); } else { /* get next data count */ - sts = *((struct ncp_trng_axm55xx_reg_sts_t *) - &(dev->regs->sts)); - - if (sts.err) + sts = readl(&dev->regs->sts); + if (sts & TRNG_AXM55xx_STS_ERR_MSK) return -EIO; - else if (sts.data_valid) - dev->words_avail = sts.data_cnt; - else if (sts.cmd != TRNG_AXM55xx_CMD_GENERATE) + else if (sts & TRNG_AXM55xx_STS_DOUT_VALID_MSK) + dev->words_avail = (sts >> 16) & 0xFFFF; + else if ((sts & TRNG_AXM55xx_STS_CMD_MSK) != + TRNG_AXM55xx_CMD_GENERATE) return -EIO; } } -- 1.7.9.5 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto