The A33 SS has a difference with all other SS, it give SHA1 digest
directly in BE.
So this patch adds variant support in sun4i-ss.

Fixes: 6298e948215f ("crypto: sunxi-ss - Add Allwinner Security System crypto 
accelerator")
Signed-off-by: Corentin Labbe <clabbe.montj...@gmail.com>
---
 .../crypto/allwinner/sun4i-ss/sun4i-ss-core.c | 22 ++++++++++++++++++-
 .../crypto/allwinner/sun4i-ss/sun4i-ss-hash.c |  5 ++++-
 drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h  |  9 ++++++++
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c 
b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c
index 814cd12149a9..d35a05843c22 100644
--- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c
+++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c
@@ -13,6 +13,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <crypto/scatterwalk.h>
 #include <linux/scatterlist.h>
@@ -22,6 +23,14 @@
 
 #include "sun4i-ss.h"
 
+static const struct ss_variant ss_a10_variant = {
+       .sha1_in_be = false,
+};
+
+static const struct ss_variant ss_a33_variant = {
+       .sha1_in_be = true,
+};
+
 static struct sun4i_ss_alg_template ss_algs[] = {
 {       .type = CRYPTO_ALG_TYPE_AHASH,
        .mode = SS_OP_MD5,
@@ -323,6 +332,12 @@ static int sun4i_ss_probe(struct platform_device *pdev)
                return PTR_ERR(ss->base);
        }
 
+       ss->variant = of_device_get_match_data(&pdev->dev);
+       if (!ss->variant) {
+               dev_err(&pdev->dev, "Missing Security System variant\n");
+               return -EINVAL;
+       }
+
        ss->ssclk = devm_clk_get(&pdev->dev, "mod");
        if (IS_ERR(ss->ssclk)) {
                err = PTR_ERR(ss->ssclk);
@@ -484,7 +499,12 @@ static int sun4i_ss_remove(struct platform_device *pdev)
 }
 
 static const struct of_device_id a20ss_crypto_of_match_table[] = {
-       { .compatible = "allwinner,sun4i-a10-crypto" },
+       { .compatible = "allwinner,sun4i-a10-crypto",
+         .data = &ss_a10_variant
+       },
+       { .compatible = "allwinner,sun8i-a33-crypto",
+         .data = &ss_a33_variant
+       },
        {}
 };
 MODULE_DEVICE_TABLE(of, a20ss_crypto_of_match_table);
diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-hash.c 
b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-hash.c
index 91cf58db3845..c791d6935c65 100644
--- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-hash.c
+++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-hash.c
@@ -478,7 +478,10 @@ static int sun4i_hash(struct ahash_request *areq)
        /* Get the hash from the device */
        if (op->mode == SS_OP_SHA1) {
                for (i = 0; i < 5; i++) {
-                       v = cpu_to_be32(readl(ss->base + SS_MD0 + i * 4));
+                       if (ss->variant->sha1_in_be)
+                               v = cpu_to_le32(readl(ss->base + SS_MD0 + i * 
4));
+                       else
+                               v = cpu_to_be32(readl(ss->base + SS_MD0 + i * 
4));
                        memcpy(areq->result + i * 4, &v, 4);
                }
        } else {
diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h 
b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h
index 60425ac75d90..2b4c6333eb67 100644
--- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h
+++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h
@@ -131,7 +131,16 @@
 #define SS_SEED_LEN 192
 #define SS_DATA_LEN 160
 
+/*
+ * struct ss_variant - Describe SS hardware variant
+ * @sha1_in_be:                The SHA1 digest is given by SS in BE, and so 
need to be inverted.
+ */
+struct ss_variant {
+       bool sha1_in_be;
+};
+
 struct sun4i_ss_ctx {
+       const struct ss_variant *variant;
        void __iomem *base;
        int irq;
        struct clk *busclk;
-- 
2.23.0

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
To view this discussion on the web, visit 
https://groups.google.com/d/msgid/linux-sunxi/20191120152833.20443-4-clabbe.montjoie%40gmail.com.

Reply via email to