crypto: inside-secure - eip197d support
authorAntoine Tenart <antoine.tenart@bootlin.com>
Thu, 28 Jun 2018 15:15:38 +0000 (17:15 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 8 Jul 2018 16:30:13 +0000 (00:30 +0800)
This patch adds support for the eip197d engine to the Inside Secure
SafeXcel cryptographic driver. This new engine is similar to the eip197b
and reuse most of its code.

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_cipher.c
drivers/crypto/inside-secure/safexcel_hash.c

index eefa622..4ad1bfd 100644 (file)
@@ -132,15 +132,32 @@ static int eip197_load_firmwares(struct safexcel_crypto_priv *priv)
 {
        const char *fw_name[] = {"ifpp.bin", "ipue.bin"};
        const struct firmware *fw[FW_NB];
-       char fw_path[31];
+       char fw_path[31], *dir = NULL;
        int i, j, ret = 0, pe;
        u32 val;
 
+       switch (priv->version) {
+       case EIP197B:
+               dir = "eip197b";
+               break;
+       case EIP197D:
+               dir = "eip197d";
+               break;
+       default:
+               /* No firmware is required */
+               return 0;
+       }
+
        for (i = 0; i < FW_NB; i++) {
-               snprintf(fw_path, 31, "inside-secure/eip197b/%s", fw_name[i]);
+               snprintf(fw_path, 31, "inside-secure/%s/%s", dir, fw_name[i]);
                ret = request_firmware(&fw[i], fw_path, priv->dev);
                if (ret) {
-                       /* Fallback to the old firmware location. */
+                       if (priv->version != EIP197B)
+                               goto release_fw;
+
+                       /* Fallback to the old firmware location for the
+                        * EIP197b.
+                        */
                        ret = request_firmware(&fw[i], fw_name[i], priv->dev);
                        if (ret) {
                                dev_err(priv->dev,
@@ -300,7 +317,7 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
                writel(EIP197_DxE_THR_CTRL_RESET_PE,
                       EIP197_HIA_DFE_THR(priv) + EIP197_HIA_DFE_THR_CTRL(pe));
 
-               if (priv->version == EIP197B) {
+               if (priv->version == EIP197B || priv->version == EIP197D) {
                        /* Reset HIA input interface arbiter */
                        writel(EIP197_HIA_RA_PE_CTRL_RESET,
                               EIP197_HIA_AIC(priv) + EIP197_HIA_RA_PE_CTRL(pe));
@@ -327,7 +344,7 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
                       EIP197_PE_IN_xBUF_THRES_MAX(7),
                       EIP197_PE(priv) + EIP197_PE_IN_TBUF_THRES(pe));
 
-               if (priv->version == EIP197B) {
+               if (priv->version == EIP197B || priv->version == EIP197D) {
                        /* enable HIA input interface arbiter and rings */
                        writel(EIP197_HIA_RA_PE_CTRL_EN |
                               GENMASK(priv->config.rings - 1, 0),
@@ -354,7 +371,7 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
                /* FIXME: instability issues can occur for EIP97 but disabling it impact
                 * performances.
                 */
-               if (priv->version == EIP197B)
+               if (priv->version == EIP197B || priv->version == EIP197D)
                        val |= EIP197_HIA_DSE_CFG_EN_SINGLE_WR;
                writel(val, EIP197_HIA_DSE(priv) + EIP197_HIA_DSE_CFG(pe));
 
@@ -440,7 +457,7 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
        /* Clear any HIA interrupt */
        writel(GENMASK(30, 20), EIP197_HIA_AIC_G(priv) + EIP197_HIA_AIC_G_ACK);
 
-       if (priv->version == EIP197B) {
+       if (priv->version == EIP197B || priv->version == EIP197D) {
                eip197_trc_cache_init(priv);
 
                ret = eip197_load_firmwares(priv);
@@ -890,6 +907,7 @@ static void safexcel_configure(struct safexcel_crypto_priv *priv)
        /* Read number of PEs from the engine */
        switch (priv->version) {
        case EIP197B:
+       case EIP197D:
                mask = EIP197_N_PES_MASK;
                break;
        default:
@@ -914,7 +932,9 @@ static void safexcel_init_register_offsets(struct safexcel_crypto_priv *priv)
 {
        struct safexcel_register_offsets *offsets = &priv->offsets;
 
-       if (priv->version == EIP197B) {
+       switch (priv->version) {
+       case EIP197B:
+       case EIP197D:
                offsets->hia_aic        = EIP197_HIA_AIC_BASE;
                offsets->hia_aic_g      = EIP197_HIA_AIC_G_BASE;
                offsets->hia_aic_r      = EIP197_HIA_AIC_R_BASE;
@@ -925,7 +945,8 @@ static void safexcel_init_register_offsets(struct safexcel_crypto_priv *priv)
                offsets->hia_dse_thr    = EIP197_HIA_DSE_THR_BASE;
                offsets->hia_gen_cfg    = EIP197_HIA_GEN_CFG_BASE;
                offsets->pe             = EIP197_PE_BASE;
-       } else {
+               break;
+       case EIP97IES:
                offsets->hia_aic        = EIP97_HIA_AIC_BASE;
                offsets->hia_aic_g      = EIP97_HIA_AIC_G_BASE;
                offsets->hia_aic_r      = EIP97_HIA_AIC_R_BASE;
@@ -936,6 +957,7 @@ static void safexcel_init_register_offsets(struct safexcel_crypto_priv *priv)
                offsets->hia_dse_thr    = EIP97_HIA_DSE_THR_BASE;
                offsets->hia_gen_cfg    = EIP97_HIA_GEN_CFG_BASE;
                offsets->pe             = EIP97_PE_BASE;
+               break;
        }
 }
 
@@ -953,7 +975,7 @@ static int safexcel_probe(struct platform_device *pdev)
        priv->dev = dev;
        priv->version = (enum safexcel_eip_version)of_device_get_match_data(dev);
 
-       if (priv->version == EIP197B)
+       if (priv->version == EIP197B || priv->version == EIP197D)
                priv->flags |= EIP197_TRC_CACHE;
 
        safexcel_init_register_offsets(priv);
@@ -1115,6 +1137,10 @@ static const struct of_device_id safexcel_of_match_table[] = {
                .compatible = "inside-secure,safexcel-eip197b",
                .data = (void *)EIP197B,
        },
+       {
+               .compatible = "inside-secure,safexcel-eip197d",
+               .data = (void *)EIP197D,
+       },
        {
                /* Deprecated. Kept for backward compatibility. */
                .compatible = "inside-secure,safexcel-eip97",
index 4b7445b..46c7230 100644 (file)
@@ -566,6 +566,7 @@ struct safexcel_ring {
 enum safexcel_eip_version {
        EIP97IES = BIT(0),
        EIP197B  = BIT(1),
+       EIP197D  = BIT(2),
 };
 
 struct safexcel_register_offsets {
index 566c972..7dbe991 100644 (file)
@@ -835,7 +835,7 @@ static void safexcel_aead_cra_exit(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_ecb_aes = {
        .type = SAFEXCEL_ALG_TYPE_SKCIPHER,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.skcipher = {
                .setkey = safexcel_skcipher_aes_setkey,
                .encrypt = safexcel_ecb_aes_encrypt,
@@ -872,7 +872,7 @@ static int safexcel_cbc_aes_decrypt(struct skcipher_request *req)
 
 struct safexcel_alg_template safexcel_alg_cbc_aes = {
        .type = SAFEXCEL_ALG_TYPE_SKCIPHER,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.skcipher = {
                .setkey = safexcel_skcipher_aes_setkey,
                .encrypt = safexcel_cbc_aes_encrypt,
@@ -942,7 +942,7 @@ static int safexcel_aead_sha1_cra_init(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_authenc_hmac_sha1_cbc_aes = {
        .type = SAFEXCEL_ALG_TYPE_AEAD,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.aead = {
                .setkey = safexcel_aead_aes_setkey,
                .encrypt = safexcel_aead_encrypt,
@@ -977,7 +977,7 @@ static int safexcel_aead_sha256_cra_init(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_authenc_hmac_sha256_cbc_aes = {
        .type = SAFEXCEL_ALG_TYPE_AEAD,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.aead = {
                .setkey = safexcel_aead_aes_setkey,
                .encrypt = safexcel_aead_encrypt,
@@ -1012,7 +1012,7 @@ static int safexcel_aead_sha224_cra_init(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_authenc_hmac_sha224_cbc_aes = {
        .type = SAFEXCEL_ALG_TYPE_AEAD,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.aead = {
                .setkey = safexcel_aead_aes_setkey,
                .encrypt = safexcel_aead_encrypt,
@@ -1047,7 +1047,7 @@ static int safexcel_aead_sha512_cra_init(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_authenc_hmac_sha512_cbc_aes = {
        .type = SAFEXCEL_ALG_TYPE_AEAD,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.aead = {
                .setkey = safexcel_aead_aes_setkey,
                .encrypt = safexcel_aead_encrypt,
@@ -1082,7 +1082,7 @@ static int safexcel_aead_sha384_cra_init(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_authenc_hmac_sha384_cbc_aes = {
        .type = SAFEXCEL_ALG_TYPE_AEAD,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.aead = {
                .setkey = safexcel_aead_aes_setkey,
                .encrypt = safexcel_aead_encrypt,
index 94841df..c266398 100644 (file)
@@ -796,7 +796,7 @@ static void safexcel_ahash_cra_exit(struct crypto_tfm *tfm)
 
 struct safexcel_alg_template safexcel_alg_sha1 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_sha1_init,
                .update = safexcel_ahash_update,
@@ -1030,7 +1030,7 @@ static int safexcel_hmac_sha1_setkey(struct crypto_ahash *tfm, const u8 *key,
 
 struct safexcel_alg_template safexcel_alg_hmac_sha1 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_hmac_sha1_init,
                .update = safexcel_ahash_update,
@@ -1094,7 +1094,7 @@ static int safexcel_sha256_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_sha256 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_sha256_init,
                .update = safexcel_ahash_update,
@@ -1157,7 +1157,7 @@ static int safexcel_sha224_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_sha224 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_sha224_init,
                .update = safexcel_ahash_update,
@@ -1213,7 +1213,7 @@ static int safexcel_hmac_sha224_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_hmac_sha224 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_hmac_sha224_init,
                .update = safexcel_ahash_update,
@@ -1270,7 +1270,7 @@ static int safexcel_hmac_sha256_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_hmac_sha256 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_hmac_sha256_init,
                .update = safexcel_ahash_update,
@@ -1342,7 +1342,7 @@ static int safexcel_sha512_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_sha512 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_sha512_init,
                .update = safexcel_ahash_update,
@@ -1413,7 +1413,7 @@ static int safexcel_sha384_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_sha384 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_sha384_init,
                .update = safexcel_ahash_update,
@@ -1469,7 +1469,7 @@ static int safexcel_hmac_sha512_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_hmac_sha512 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_hmac_sha512_init,
                .update = safexcel_ahash_update,
@@ -1526,7 +1526,7 @@ static int safexcel_hmac_sha384_digest(struct ahash_request *areq)
 
 struct safexcel_alg_template safexcel_alg_hmac_sha384 = {
        .type = SAFEXCEL_ALG_TYPE_AHASH,
-       .engines = EIP97IES | EIP197B,
+       .engines = EIP97IES | EIP197B | EIP197D,
        .alg.ahash = {
                .init = safexcel_hmac_sha384_init,
                .update = safexcel_ahash_update,