aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/inside-secure/safexcel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/crypto/inside-secure/safexcel.c')
-rw-r--r--drivers/crypto/inside-secure/safexcel.c36
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
1030fail: 1036fail:
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