提交 bdfd1909 编写于 作者: A Antoine Tenart 提交者: Herbert Xu

crypto: inside-secure - improve error reporting

This patch improves the error reporting from the Inside Secure driver to
the upper layers and crypto consumers. All errors reported by the engine
aren't fatal, and some may be genuine.
Signed-off-by: NAntoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
上级 8a21f067
...@@ -537,6 +537,27 @@ void safexcel_dequeue(struct safexcel_crypto_priv *priv, int ring) ...@@ -537,6 +537,27 @@ void safexcel_dequeue(struct safexcel_crypto_priv *priv, int ring)
EIP197_HIA_CDR(priv, ring) + EIP197_HIA_xDR_PREP_COUNT); EIP197_HIA_CDR(priv, ring) + EIP197_HIA_xDR_PREP_COUNT);
} }
inline int safexcel_rdesc_check_errors(struct safexcel_crypto_priv *priv,
struct safexcel_result_desc *rdesc)
{
if (likely(!rdesc->result_data.error_code))
return 0;
if (rdesc->result_data.error_code & 0x407f) {
/* Fatal error (bits 0-7, 14) */
dev_err(priv->dev,
"cipher: result: result descriptor error (%d)\n",
rdesc->result_data.error_code);
return -EIO;
} else if (rdesc->result_data.error_code == BIT(9)) {
/* Authentication failed */
return -EBADMSG;
}
/* All other non-fatal errors */
return -EINVAL;
}
void safexcel_complete(struct safexcel_crypto_priv *priv, int ring) void safexcel_complete(struct safexcel_crypto_priv *priv, int ring)
{ {
struct safexcel_command_desc *cdesc; struct safexcel_command_desc *cdesc;
......
...@@ -610,6 +610,8 @@ struct safexcel_inv_result { ...@@ -610,6 +610,8 @@ struct safexcel_inv_result {
}; };
void safexcel_dequeue(struct safexcel_crypto_priv *priv, int ring); void safexcel_dequeue(struct safexcel_crypto_priv *priv, int ring);
int safexcel_rdesc_check_errors(struct safexcel_crypto_priv *priv,
struct safexcel_result_desc *rdesc);
void safexcel_complete(struct safexcel_crypto_priv *priv, int ring); void safexcel_complete(struct safexcel_crypto_priv *priv, int ring);
int safexcel_invalidate_cache(struct crypto_async_request *async, int safexcel_invalidate_cache(struct crypto_async_request *async,
struct safexcel_crypto_priv *priv, struct safexcel_crypto_priv *priv,
......
...@@ -160,12 +160,8 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin ...@@ -160,12 +160,8 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin
break; break;
} }
if (rdesc->result_data.error_code) { if (likely(!*ret))
dev_err(priv->dev, *ret = safexcel_rdesc_check_errors(priv, rdesc);
"cipher: result: result descriptor error (%d)\n",
rdesc->result_data.error_code);
*ret = -EIO;
}
ndesc++; ndesc++;
} while (!rdesc->last_seg); } while (!rdesc->last_seg);
......
...@@ -146,11 +146,8 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin ...@@ -146,11 +146,8 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin
dev_err(priv->dev, dev_err(priv->dev,
"hash: result: could not retrieve the result descriptor\n"); "hash: result: could not retrieve the result descriptor\n");
*ret = PTR_ERR(rdesc); *ret = PTR_ERR(rdesc);
} else if (rdesc->result_data.error_code) { } else {
dev_err(priv->dev, *ret = safexcel_rdesc_check_errors(priv, rdesc);
"hash: result: result descriptor error (%d)\n",
rdesc->result_data.error_code);
*ret = -EINVAL;
} }
safexcel_complete(priv, ring); safexcel_complete(priv, ring);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册