summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Douglass <dan.douglass@freescale.com>2013-11-28 01:29:05 -0600
committerDan Douglass <dan.douglass@freescale.com>2013-11-29 21:05:47 -0600
commit1971b86a4fdca38f59479ee2b8ce6b2d92c05738 (patch)
tree2d17681e203729a0571b290a0bb0c1841d4a8a2e
parent23bf8b3e9650af832cbcf73f8d6e50c017476fb2 (diff)
ENGR00290021 [iMX6QDL] Skip RNG instantiation unless needed.
Adding check to skip RNG instantiation if previously performed. This will prevent CAAM from crashing when HAB instantiates the RNG at boot on a closed device. Also removed an extra printk that isn't needed in secvio initialization. Signed-off-by: Dan Douglass <b41520@freescale.com>
-rw-r--r--drivers/crypto/caam/ctrl.c27
-rw-r--r--drivers/crypto/caam/regs.h5
-rw-r--r--drivers/crypto/caam/secvio.c2
3 files changed, 25 insertions, 9 deletions
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
index 04df1863128b..3df6f232c799 100644
--- a/drivers/crypto/caam/ctrl.c
+++ b/drivers/crypto/caam/ctrl.c
@@ -81,9 +81,13 @@ static void build_instantiation_desc(u32 *desc)
*/
append_load_imm_u32(desc, 1, LDST_SRCDST_WORD_CLRW);
+}
+
+static void generate_secure_keys_desc(u32 *desc)
+{
/* generate secure keys (non-test) */
append_operation(desc, OP_TYPE_CLASS1_ALG | OP_ALG_ALGSEL_RNG |
- OP_ALG_RNG4_SK);
+ OP_ALG_RNG4_SK);
}
struct instantiate_result {
@@ -106,7 +110,7 @@ static void rng4_init_done(struct device *dev, u32 *desc, u32 err,
complete(&instantiation->completion);
}
-static int instantiate_rng(struct device *jrdev)
+static int instantiate_rng(struct device *jrdev, u32 keys_generated)
{
struct instantiate_result instantiation;
@@ -121,6 +125,11 @@ static int instantiate_rng(struct device *jrdev)
}
build_instantiation_desc(desc);
+
+ /* If keys have not been generated, add op code to generate key. */
+ if (!keys_generated)
+ generate_secure_keys_desc(desc);
+
desc_dma = dma_map_single(jrdev, desc, desc_bytes(desc), DMA_TO_DEVICE);
dma_sync_single_for_device(jrdev, desc_dma, desc_bytes(desc),
DMA_TO_DEVICE);
@@ -155,6 +164,7 @@ static void kick_trng(struct platform_device *pdev)
topregs = (struct caam_full __iomem *)ctrlpriv->ctrl;
r4tst = &topregs->ctrl.r4tst[0];
+ val = rd_reg32(&r4tst->rtmctl);
/* put RNG4 into program mode */
setbits32(&r4tst->rtmctl, RTMCTL_PRGM);
/* Set clocks per sample to the default, and divider to zero */
@@ -466,7 +476,7 @@ static int caam_probe(struct platform_device *pdev)
if ((rd_reg64(&topregs->ctrl.perfmon.cha_id) & CHA_ID_RNG_MASK)
== CHA_ID_RNG_4) {
struct rng4tst __iomem *r4tst;
- u32 rng_if;
+ u32 rdsta, rng_if, rng_skvn;
/*
* Check to see if the RNG has already been instantiated.
@@ -475,11 +485,16 @@ static int caam_probe(struct platform_device *pdev)
* again.
*/
r4tst = &topregs->ctrl.r4tst[0];
- rng_if = rd_reg32(&r4tst->rdsta);
- rng_if = rng_if & RDSTA_IF;
+ rdsta = rd_reg32(&r4tst->rdsta); /* Read RDSTA register */
+
+ /* Check IF bit for non-deterministic instantiation */
+ rng_if = rdsta & RDSTA_IF;
+
+ /* Check SKVN bit for non-deterministic key generation */
+ rng_skvn = rdsta & RDSTA_SKVN;
if (!rng_if) {
kick_trng(pdev);
- ret = instantiate_rng(ctrlpriv->jrdev[0]);
+ ret = instantiate_rng(ctrlpriv->jrdev[0], rng_skvn);
if (ret) {
caam_remove(pdev);
return -ENODEV;
diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h
index 4bfc875af0dc..85deba9898de 100644
--- a/drivers/crypto/caam/regs.h
+++ b/drivers/crypto/caam/regs.h
@@ -393,7 +393,10 @@ struct rng4tst {
u32 rtfrqcnt; /* PRGM=0: freq. count register */
};
u32 rsvd1[40];
-#define RDSTA_IF 0x00000003 /* state handle instantiated flags 0 and 1 */
+#define RDSTA_IF 0x00000003 /* state handle instantiated flags 0 and 1 */
+#define RDSTA_SKVN 0x40000000 /* Secure Key Valid Non-Test mode */
+#define RDSTA_SKVT 0x80000000 /* Secure Key Valid Test. non-test mode */
+#define RDSTA_TF 0x00000300 /* State handle instantiated Test-mode */
u32 rdsta; /* DRNG status register */
u32 rsvd2[15];
};
diff --git a/drivers/crypto/caam/secvio.c b/drivers/crypto/caam/secvio.c
index defd93cb8887..6597ff5c2c1f 100644
--- a/drivers/crypto/caam/secvio.c
+++ b/drivers/crypto/caam/secvio.c
@@ -198,8 +198,6 @@ int caam_secvio_startup(struct platform_device *pdev)
else
secvio_inten_src = HP_SECVIO_INTEN_ALL;
- printk(KERN_ERR "secvio_inten_src = %x\n", secvio_inten_src);
-
svpdev = of_platform_device_create(np, NULL, ctrldev);
if (!svpdev)
return -ENODEV;