aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/inside-secure/safexcel.c
diff options
context:
space:
mode:
authorPascal van Leeuwen <pascalvanl@gmail.com>2019-08-30 03:40:54 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-09-05 00:37:01 -0400
commit062b64ca6db409fd6e102aed0fa59716b5cdfd78 (patch)
tree0de1abd004dae25cdab4444ca9557b0b392784f8 /drivers/crypto/inside-secure/safexcel.c
parentc7da38a71cfbb5c0f20f84864a290b9450ad78e9 (diff)
crypto: inside-secure - Only enable algorithms advertised by the hardware
This patch probes the supported algorithms from the hardware and only registers the ones that the hardware actually supports. This is necessary because this is a generic driver supposed to run on a wide variety of engines, which may or may not implement certain algorithms. Signed-off-by: Pascal van Leeuwen <pvanleeuwen@verimatrix.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
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