crypto: caam - ERA retrieval and printing for SEC device
authorAlex Porosanu <alexandru.porosanu@freescale.com>
Wed, 11 Jul 2012 03:06:11 +0000 (11:06 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 11 Jul 2012 03:06:11 +0000 (11:06 +0800)
This patch adds support for retrieving and printing of
SEC ERA information. It is useful for knowing beforehand
what features exist from the SEC point of view on a
certain SoC. Only era-s 1 to 4 are currently supported;
other eras will appear as unknown.

Signed-off-by: Alex Porosanu <alexandru.porosanu@freescale.com>
- rebased onto current cryptodev master
- made caam_eras static

Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/ctrl.c
drivers/crypto/caam/ctrl.h [new file with mode: 0644]
drivers/crypto/caam/regs.h

index ac6abb375c8d29b1523738f33de932443fe79540..414ba20c05a13f5265944a2ada5d0da97c6e447f 100644 (file)
@@ -11,6 +11,7 @@
 #include "jr.h"
 #include "desc_constr.h"
 #include "error.h"
+#include "ctrl.h"
 
 static int caam_remove(struct platform_device *pdev)
 {
@@ -155,10 +156,44 @@ static void kick_trng(struct platform_device *pdev)
        clrbits32(&r4tst->rtmctl, RTMCTL_PRGM);
 }
 
+/**
+ * caam_get_era() - Return the ERA of the SEC on SoC, based
+ * on the SEC_VID register.
+ * Returns the ERA number (1..4) or -ENOTSUPP if the ERA is unknown.
+ * @caam_id - the value of the SEC_VID register
+ **/
+int caam_get_era(u64 caam_id)
+{
+       struct sec_vid *sec_vid = (struct sec_vid *)&caam_id;
+       static const struct {
+               u16 ip_id;
+               u8 maj_rev;
+               u8 era;
+       } caam_eras[] = {
+               {0x0A10, 1, 1},
+               {0x0A10, 2, 2},
+               {0x0A12, 1, 3},
+               {0x0A14, 1, 3},
+               {0x0A14, 2, 4},
+               {0x0A16, 1, 4},
+               {0x0A11, 1, 4}
+       };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(caam_eras); i++)
+               if (caam_eras[i].ip_id == sec_vid->ip_id &&
+                       caam_eras[i].maj_rev == sec_vid->maj_rev)
+                               return caam_eras[i].era;
+
+       return -ENOTSUPP;
+}
+EXPORT_SYMBOL(caam_get_era);
+
 /* Probe routine for CAAM top (controller) level */
 static int caam_probe(struct platform_device *pdev)
 {
        int ret, ring, rspec;
+       u64 caam_id;
        struct device *dev;
        struct device_node *nprop, *np;
        struct caam_ctrl __iomem *ctrl;
@@ -276,9 +311,11 @@ static int caam_probe(struct platform_device *pdev)
        /* Initialize queue allocator lock */
        spin_lock_init(&ctrlpriv->jr_alloc_lock);
 
+       caam_id = rd_reg64(&topregs->ctrl.perfmon.caam_id);
+
        /* Report "alive" for developer to see */
-       dev_info(dev, "device ID = 0x%016llx\n",
-                rd_reg64(&topregs->ctrl.perfmon.caam_id));
+       dev_info(dev, "device ID = 0x%016llx (Era %d)\n", caam_id,
+                caam_get_era(caam_id));
        dev_info(dev, "job rings = %d, qi = %d\n",
                 ctrlpriv->total_jobrs, ctrlpriv->qi_present);
 
diff --git a/drivers/crypto/caam/ctrl.h b/drivers/crypto/caam/ctrl.h
new file mode 100644 (file)
index 0000000..980d44e
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * CAAM control-plane driver backend public-level include definitions
+ *
+ * Copyright 2012 Freescale Semiconductor, Inc.
+ */
+
+#ifndef CTRL_H
+#define CTRL_H
+
+/* Prototypes for backend-level services exposed to APIs */
+int caam_get_era(u64 caam_id);
+
+#endif /* CTRL_H */
index 6d9f1d982970c634ccb76a875efcb823e5851986..3223fc6d647cd55c0367b5ee1f6b003bc8029080 100644 (file)
@@ -117,6 +117,12 @@ struct jr_outentry {
 #define CHA_NUM_DECONUM_SHIFT  56
 #define CHA_NUM_DECONUM_MASK   (0xfull << CHA_NUM_DECONUM_SHIFT)
 
+struct sec_vid {
+       u16 ip_id;
+       u8 maj_rev;
+       u8 min_rev;
+};
+
 struct caam_perfmon {
        /* Performance Monitor Registers                        f00-f9f */
        u64 req_dequeued;       /* PC_REQ_DEQ - Dequeued Requests            */