crypto: inside-secure - enable context reuse
authorAntoine Tenart <antoine.tenart@bootlin.com>
Mon, 27 May 2019 14:50:59 +0000 (16:50 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 6 Jun 2019 06:38:56 +0000 (14:38 +0800)
The context given to the crypto engine can be reused over time. While
the driver was designed to allow this, the feature wasn't enabled in the
hardware engine. This patch enables it.

Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/inside-secure/safexcel.c
drivers/crypto/inside-secure/safexcel.h
drivers/crypto/inside-secure/safexcel_ring.c

index 316e5e4c1c74149b978dd613845581d483cd82e5..df43a2c6933b7fbba757cf2602e0001ed63d01e1 100644 (file)
@@ -398,6 +398,12 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
 
                /* Processing Engine configuration */
 
+               /* Token & context configuration */
+               val = EIP197_PE_EIP96_TOKEN_CTRL_CTX_UPDATES |
+                     EIP197_PE_EIP96_TOKEN_CTRL_REUSE_CTX |
+                     EIP197_PE_EIP96_TOKEN_CTRL_POST_REUSE_CTX;
+               writel(val, EIP197_PE(priv) + EIP197_PE_EIP96_TOKEN_CTRL(pe));
+
                /* H/W capabilities selection */
                val = EIP197_FUNCTION_RSVD;
                val |= EIP197_PROTOCOL_ENCRYPT_ONLY | EIP197_PROTOCOL_HASH_ONLY;
index 65624a81f0fd90ac82859e8d88fd258d89598a43..0bc8859f9d06f19e5c9e575c3c564b24a0030bbe 100644 (file)
 #define EIP197_PE_ICE_SCRATCH_CTRL(n)          (0x0d04 + (0x2000 * (n)))
 #define EIP197_PE_ICE_FPP_CTRL(n)              (0x0d80 + (0x2000 * (n)))
 #define EIP197_PE_ICE_RAM_CTRL(n)              (0x0ff0 + (0x2000 * (n)))
+#define EIP197_PE_EIP96_TOKEN_CTRL(n)          (0x1000 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_FUNCTION_EN(n)         (0x1004 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_CONTEXT_CTRL(n)                (0x1008 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_CONTEXT_STAT(n)                (0x100c + (0x2000 * (n)))
 #define EIP197_PE_ICE_RAM_CTRL_PUE_PROG_EN     BIT(0)
 #define EIP197_PE_ICE_RAM_CTRL_FPP_PROG_EN     BIT(1)
 
+/* EIP197_PE_EIP96_TOKEN_CTRL */
+#define EIP197_PE_EIP96_TOKEN_CTRL_CTX_UPDATES         BIT(16)
+#define EIP197_PE_EIP96_TOKEN_CTRL_REUSE_CTX           BIT(19)
+#define EIP197_PE_EIP96_TOKEN_CTRL_POST_REUSE_CTX      BIT(20)
+
 /* EIP197_PE_EIP96_FUNCTION_EN */
 #define EIP197_FUNCTION_RSVD                   (BIT(6) | BIT(15) | BIT(20) | BIT(23))
 #define EIP197_PROTOCOL_HASH_ONLY              BIT(0)
@@ -468,6 +474,7 @@ struct safexcel_control_data_desc {
 
 #define EIP197_OPTION_MAGIC_VALUE      BIT(0)
 #define EIP197_OPTION_64BIT_CTX                BIT(1)
+#define EIP197_OPTION_RC_AUTO          (0x2 << 3)
 #define EIP197_OPTION_CTX_CTRL_IN_CMD  BIT(8)
 #define EIP197_OPTION_2_TOKEN_IV_CMD   GENMASK(11, 10)
 #define EIP197_OPTION_4_TOKEN_IV_CMD   GENMASK(11, 9)
index eb75fa6848761afccf02b527472c3f7aecd07b25..142bc3f5c45c9b46498a64829daf5b578603004e 100644 (file)
@@ -145,6 +145,9 @@ struct safexcel_command_desc *safexcel_add_cdesc(struct safexcel_crypto_priv *pr
                        (lower_32_bits(context) & GENMASK(31, 2)) >> 2;
                cdesc->control_data.context_hi = upper_32_bits(context);
 
+               if (priv->version == EIP197B || priv->version == EIP197D)
+                       cdesc->control_data.options |= EIP197_OPTION_RC_AUTO;
+
                /* TODO: large xform HMAC with SHA-384/512 uses refresh = 3 */
                cdesc->control_data.refresh = 2;