summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Cornelius <steve.cornelius@freescale.com>2012-08-09 15:26:33 -0700
committerJason Liu <r64343@freescale.com>2012-08-12 14:59:35 +0800
commit1f4aead453351d7d9658f6ebb31f6deaea3262b6 (patch)
treed89a0ef9d22cd21f8d95d4ddb061ea97af97cb83
parent9aaf25ca1749d42da5919c729d3a798800f3012e (diff)
ENGR00216259 caam: improve RNG4 initialization process
Early versions of this driver used a set of entropy generation parameters inherited from QorIQ devices. Those parameters were a hardcoded set based upon internally-suggested values, and worked well on QorIQ. However, for certain mx6 devices, oscillator values were found to be exceeding the upper limit, and so RNG instantiation was failing in those cases. This code improves initialization by (a) making sure the oscillator divider is set to a known value, and (b) converting the parameter selection to a symbolic compiler-generated form, instead of using embedded magic number constants. The calculation is now based on the definition of RNG4_ENT_CLOCKS_SAMPLE, which defaults to 1600 unless overridden by something. The lower limit is then set as /4, and the upper limit set to *8. Tested-by: Minnick Michael-B21710 <b21710@freescale.com> Signed-off-by: Steve Cornelius <steve.cornelius@freescale.com> Signed-off-by: Jason Liu <r64343@freescale.com>
-rw-r--r--drivers/crypto/caam/ctrl.c10
-rw-r--r--drivers/crypto/caam/intern.h3
-rw-r--r--drivers/crypto/caam/regs.h1
3 files changed, 10 insertions, 4 deletions
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
index f2c8595ccb9b..c47e25eee926 100644
--- a/drivers/crypto/caam/ctrl.c
+++ b/drivers/crypto/caam/ctrl.c
@@ -163,14 +163,16 @@ static void kick_trng(struct platform_device *pdev)
/* put RNG4 into program mode */
setbits32(&r4tst->rtmctl, RTMCTL_PRGM);
- /* 1600 clocks per sample */
+ /* Set clocks per sample to the default, and divider to zero */
val = rd_reg32(&r4tst->rtsdctl);
- val = (val & ~RTSDCTL_ENT_DLY_MASK) | (1600 << RTSDCTL_ENT_DLY_SHIFT);
+ val = ((val & ~RTSDCTL_ENT_DLY_MASK) |
+ (RNG4_ENT_CLOCKS_SAMPLE << RTSDCTL_ENT_DLY_SHIFT)) &
+ ~RTMCTL_OSC_DIV_MASK;
wr_reg32(&r4tst->rtsdctl, val);
/* min. freq. count */
- wr_reg32(&r4tst->rtfrqmin, 400);
+ wr_reg32(&r4tst->rtfrqmin, RNG4_ENT_CLOCKS_SAMPLE / 4);
/* max. freq. count */
- wr_reg32(&r4tst->rtfrqmax, 6400);
+ wr_reg32(&r4tst->rtfrqmax, RNG4_ENT_CLOCKS_SAMPLE * 8);
/* put RNG4 into run mode */
clrbits32(&r4tst->rtmctl, RTMCTL_PRGM);
}
diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h
index 18e7385fb2d8..1f818ffb831a 100644
--- a/drivers/crypto/caam/intern.h
+++ b/drivers/crypto/caam/intern.h
@@ -12,6 +12,9 @@
#define JOBR_UNASSIGNED 0
#define JOBR_ASSIGNED 1
+/* Default clock/sample settings for an RNG4 entropy source */
+#define RNG4_ENT_CLOCKS_SAMPLE 1600
+
/* Currently comes from Kconfig param as a ^2 (driver-required) */
#define JOBR_DEPTH (1 << CONFIG_CRYPTO_DEV_FSL_CAAM_RINGSIZE)
diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h
index fd8a2a251b8a..04ae9d4167b0 100644
--- a/drivers/crypto/caam/regs.h
+++ b/drivers/crypto/caam/regs.h
@@ -297,6 +297,7 @@ struct rngtst {
/* RNG4 TRNG test registers */
struct rng4tst {
#define RTMCTL_PRGM 0x00010000 /* 1 -> program mode, 0 -> run mode */
+#define RTMCTL_OSC_DIV_MASK 0xc /* select oscillator divider value */
u32 rtmctl; /* misc. control register */
u32 rtscmisc; /* statistical check misc. register */
u32 rtpkrrng; /* poker range register */