diff options
Diffstat (limited to 'drivers/crypto/inside-secure/safexcel.c')
-rw-r--r-- | drivers/crypto/inside-secure/safexcel.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c index 9941861ae1d8..25285d664581 100644 --- a/drivers/crypto/inside-secure/safexcel.c +++ b/drivers/crypto/inside-secure/safexcel.c | |||
@@ -284,7 +284,7 @@ retry_fw: | |||
284 | ipuesz = eip197_write_firmware(priv, fw[FW_IPUE]); | 284 | ipuesz = eip197_write_firmware(priv, fw[FW_IPUE]); |
285 | 285 | ||
286 | if (eip197_start_firmware(priv, ipuesz, ifppsz, minifw)) { | 286 | if (eip197_start_firmware(priv, ipuesz, ifppsz, minifw)) { |
287 | dev_dbg(priv->dev, "Firmware loaded successfully"); | 287 | dev_dbg(priv->dev, "Firmware loaded successfully\n"); |
288 | return 0; | 288 | return 0; |
289 | } | 289 | } |
290 | 290 | ||
@@ -1014,6 +1014,12 @@ static int safexcel_register_algorithms(struct safexcel_crypto_priv *priv) | |||
1014 | for (i = 0; i < ARRAY_SIZE(safexcel_algs); i++) { | 1014 | for (i = 0; i < ARRAY_SIZE(safexcel_algs); i++) { |
1015 | safexcel_algs[i]->priv = priv; | 1015 | safexcel_algs[i]->priv = priv; |
1016 | 1016 | ||
1017 | /* Do we have all required base algorithms available? */ | ||
1018 | if ((safexcel_algs[i]->algo_mask & priv->hwconfig.algo_flags) != | ||
1019 | safexcel_algs[i]->algo_mask) | ||
1020 | /* No, so don't register this ciphersuite */ | ||
1021 | continue; | ||
1022 | |||
1017 | if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_SKCIPHER) | 1023 | if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_SKCIPHER) |
1018 | ret = crypto_register_skcipher(&safexcel_algs[i]->alg.skcipher); | 1024 | ret = crypto_register_skcipher(&safexcel_algs[i]->alg.skcipher); |
1019 | else if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_AEAD) | 1025 | else if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_AEAD) |
@@ -1029,6 +1035,12 @@ static int safexcel_register_algorithms(struct safexcel_crypto_priv *priv) | |||
1029 | 1035 | ||
1030 | fail: | 1036 | fail: |
1031 | for (j = 0; j < i; j++) { | 1037 | for (j = 0; j < i; j++) { |
1038 | /* Do we have all required base algorithms available? */ | ||
1039 | if ((safexcel_algs[j]->algo_mask & priv->hwconfig.algo_flags) != | ||
1040 | safexcel_algs[j]->algo_mask) | ||
1041 | /* No, so don't unregister this ciphersuite */ | ||
1042 | continue; | ||
1043 | |||
1032 | if (safexcel_algs[j]->type == SAFEXCEL_ALG_TYPE_SKCIPHER) | 1044 | if (safexcel_algs[j]->type == SAFEXCEL_ALG_TYPE_SKCIPHER) |
1033 | crypto_unregister_skcipher(&safexcel_algs[j]->alg.skcipher); | 1045 | crypto_unregister_skcipher(&safexcel_algs[j]->alg.skcipher); |
1034 | else if (safexcel_algs[j]->type == SAFEXCEL_ALG_TYPE_AEAD) | 1046 | else if (safexcel_algs[j]->type == SAFEXCEL_ALG_TYPE_AEAD) |
@@ -1045,6 +1057,12 @@ static void safexcel_unregister_algorithms(struct safexcel_crypto_priv *priv) | |||
1045 | int i; | 1057 | int i; |
1046 | 1058 | ||
1047 | for (i = 0; i < ARRAY_SIZE(safexcel_algs); i++) { | 1059 | for (i = 0; i < ARRAY_SIZE(safexcel_algs); i++) { |
1060 | /* Do we have all required base algorithms available? */ | ||
1061 | if ((safexcel_algs[i]->algo_mask & priv->hwconfig.algo_flags) != | ||
1062 | safexcel_algs[i]->algo_mask) | ||
1063 | /* No, so don't unregister this ciphersuite */ | ||
1064 | continue; | ||
1065 | |||
1048 | if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_SKCIPHER) | 1066 | if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_SKCIPHER) |
1049 | crypto_unregister_skcipher(&safexcel_algs[i]->alg.skcipher); | 1067 | crypto_unregister_skcipher(&safexcel_algs[i]->alg.skcipher); |
1050 | else if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_AEAD) | 1068 | else if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_AEAD) |
@@ -1123,6 +1141,7 @@ static int safexcel_probe_generic(void *pdev, | |||
1123 | int is_pci_dev) | 1141 | int is_pci_dev) |
1124 | { | 1142 | { |
1125 | struct device *dev = priv->dev; | 1143 | struct device *dev = priv->dev; |
1144 | u32 peid; | ||
1126 | int i, ret; | 1145 | int i, ret; |
1127 | 1146 | ||
1128 | priv->context_pool = dmam_pool_create("safexcel-context", dev, | 1147 | priv->context_pool = dmam_pool_create("safexcel-context", dev, |
@@ -1133,8 +1152,21 @@ static int safexcel_probe_generic(void *pdev, | |||
1133 | 1152 | ||
1134 | safexcel_init_register_offsets(priv); | 1153 | safexcel_init_register_offsets(priv); |
1135 | 1154 | ||
1136 | if (priv->version != EIP97IES_MRVL) | 1155 | /* Get supported algorithms from EIP96 transform engine */ |
1156 | priv->hwconfig.algo_flags = readl(EIP197_PE(priv) + | ||
1157 | EIP197_PE_EIP96_OPTIONS(0)); | ||
1158 | |||
1159 | if (priv->version == EIP97IES_MRVL) { | ||
1160 | peid = 97; | ||
1161 | } else { | ||
1137 | priv->flags |= EIP197_TRC_CACHE; | 1162 | priv->flags |= EIP197_TRC_CACHE; |
1163 | peid = 197; | ||
1164 | } | ||
1165 | |||
1166 | /* Dump some debug information important during development */ | ||
1167 | dev_dbg(priv->dev, "Inside Secure EIP%d packetengine\n", peid); | ||
1168 | dev_dbg(priv->dev, "Supported algorithms: %08x\n", | ||
1169 | priv->hwconfig.algo_flags); | ||
1138 | 1170 | ||
1139 | safexcel_configure(priv); | 1171 | safexcel_configure(priv); |
1140 | 1172 | ||