crypto: caam - FIX RNG init for RNG greater than equal to 4
authorRuchika Gupta <ruchika.gupta@freescale.com>
Fri, 26 Apr 2013 10:14:54 +0000 (15:44 +0530)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 14 May 2013 02:14:51 +0000 (10:14 +0800)
For SEC including a RNG block version >= 4, special initialization
must occur before any descriptor that uses RNG block can be
submitted. This initialization is required not only for SEC
with version greater than 5.0, but for SEC with RNG version >=4.
There may be a case where RNG has already been instantiated by
u-boot or boot ROM code.In such SoCs, if RNG is initialized again
SEC would returns "Instantiation error". Hence, the initialization
status of RNG4 should be also checked before doing RNG init.

Signed-off-by: Ruchika Gupta <ruchika.gupta@freescale.com>
Signed-off-by: Alex Porosanu <alexandru.porosanu@freescale.com>
Signed-off-by: Andy Fleming <afleming@freescale.com>
Reviewed-by: Vakul Garg <vakul@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/ctrl.c
drivers/crypto/caam/regs.h

index 6e94bcd946786167bf74de6c42e5b52951880ab5..f5d6deced1cbaac0b00702e60aabdf0a9598c3b7 100644 (file)
@@ -202,6 +202,7 @@ static int caam_probe(struct platform_device *pdev)
 #ifdef CONFIG_DEBUG_FS
        struct caam_perfmon *perfmon;
 #endif
+       u64 cha_vid;
 
        ctrlpriv = kzalloc(sizeof(struct caam_drv_private), GFP_KERNEL);
        if (!ctrlpriv)
@@ -293,11 +294,14 @@ static int caam_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
+       cha_vid = rd_reg64(&topregs->ctrl.perfmon.cha_id);
+
        /*
-        * RNG4 based SECs (v5+) need special initialization prior
-        * to executing any descriptors
+        * If SEC has RNG version >= 4 and RNG state handle has not been
+        * already instantiated ,do RNG instantiation
         */
-       if (of_device_is_compatible(nprop, "fsl,sec-v5.0")) {
+       if ((cha_vid & CHA_ID_RNG_MASK) >> CHA_ID_RNG_SHIFT >= 4 &&
+           !(rd_reg32(&topregs->ctrl.r4tst[0].rdsta) & RDSTA_IF0)) {
                kick_trng(pdev);
                ret = instantiate_rng(ctrlpriv->jrdev[0]);
                if (ret) {
index cd6fedad9935983191217f227b11fa496dccc715..c09142fc13e372171fe6093b45bdd6a3121f65f1 100644 (file)
@@ -117,6 +117,43 @@ struct jr_outentry {
 #define CHA_NUM_DECONUM_SHIFT  56
 #define CHA_NUM_DECONUM_MASK   (0xfull << CHA_NUM_DECONUM_SHIFT)
 
+/* CHA Version IDs */
+#define CHA_ID_AES_SHIFT       0
+#define CHA_ID_AES_MASK                (0xfull << CHA_ID_AES_SHIFT)
+
+#define CHA_ID_DES_SHIFT       4
+#define CHA_ID_DES_MASK                (0xfull << CHA_ID_DES_SHIFT)
+
+#define CHA_ID_ARC4_SHIFT      8
+#define CHA_ID_ARC4_MASK       (0xfull << CHA_ID_ARC4_SHIFT)
+
+#define CHA_ID_MD_SHIFT                12
+#define CHA_ID_MD_MASK         (0xfull << CHA_ID_MD_SHIFT)
+
+#define CHA_ID_RNG_SHIFT       16
+#define CHA_ID_RNG_MASK                (0xfull << CHA_ID_RNG_SHIFT)
+
+#define CHA_ID_SNW8_SHIFT      20
+#define CHA_ID_SNW8_MASK       (0xfull << CHA_ID_SNW8_SHIFT)
+
+#define CHA_ID_KAS_SHIFT       24
+#define CHA_ID_KAS_MASK                (0xfull << CHA_ID_KAS_SHIFT)
+
+#define CHA_ID_PK_SHIFT                28
+#define CHA_ID_PK_MASK         (0xfull << CHA_ID_PK_SHIFT)
+
+#define CHA_ID_CRC_SHIFT       32
+#define CHA_ID_CRC_MASK                (0xfull << CHA_ID_CRC_SHIFT)
+
+#define CHA_ID_SNW9_SHIFT      36
+#define CHA_ID_SNW9_MASK       (0xfull << CHA_ID_SNW9_SHIFT)
+
+#define CHA_ID_DECO_SHIFT      56
+#define CHA_ID_DECO_MASK       (0xfull << CHA_ID_DECO_SHIFT)
+
+#define CHA_ID_JR_SHIFT                60
+#define CHA_ID_JR_MASK         (0xfull << CHA_ID_JR_SHIFT)
+
 struct sec_vid {
        u16 ip_id;
        u8 maj_rev;
@@ -228,7 +265,10 @@ struct rng4tst {
                u32 rtfrqmax;   /* PRGM=1: freq. count max. limit register */
                u32 rtfrqcnt;   /* PRGM=0: freq. count register */
        };
-       u32 rsvd1[56];
+       u32 rsvd1[40];
+#define RDSTA_IF0 0x00000001
+       u32 rdsta;
+       u32 rsvd2[15];
 };
 
 /*