diff options
author | Dan Douglass <dan.douglass@freescale.com> | 2013-11-28 01:29:05 -0600 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 08:47:25 -0500 |
commit | 0645302054cb0807232c8aa2e0740c74f3b574eb (patch) | |
tree | eadf18a6d2cda0b0a397b5dc9dd0a7a3a6ca6b83 /drivers/crypto | |
parent | 3bfc6375ebf9ab2213c0dfd25b3aa22f695d72ee (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>
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/caam/ctrl.c | 27 | ||||
-rw-r--r-- | drivers/crypto/caam/regs.h | 5 | ||||
-rw-r--r-- | drivers/crypto/caam/secvio.c | 2 |
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; |