From: Harsh Jain <h.jain@amd.com>
To: <herbert@gondor.apana.org.au>, <davem@davemloft.net>,
<linux-crypto@vger.kernel.org>, <mounika.botcha@amd.com>,
<sarat.chand.savitala@amd.com>, <michal.simek@amd.com>
Cc: Harsh Jain <h.jain@amd.com>
Subject: [PATCH 6/6] crypto: zynqmp-sha: Add sha3-384 support for AMD/Xilinx Versal device
Date: Tue, 3 Mar 2026 12:49:53 +0530 [thread overview]
Message-ID: <20260303071953.149252-7-h.jain@amd.com> (raw)
In-Reply-To: <20260303071953.149252-1-h.jain@amd.com>
Adds SHA3 driver support for the Xilinx Versal SoC.
Versal SoC SHA3 engine does not support context export, Accordingly cannot
handle parallel request. For unsupported cases it is using fallback.
For digest, the calculation of SHA3 hash is done by the hardened
SHA3 accelerator in Versal.
Signed-off-by: Harsh Jain <h.jain@amd.com>
---
drivers/crypto/xilinx/zynqmp-sha.c | 119 ++++++++++++++++++++++++++++-
1 file changed, 118 insertions(+), 1 deletion(-)
diff --git a/drivers/crypto/xilinx/zynqmp-sha.c b/drivers/crypto/xilinx/zynqmp-sha.c
index 72b405758200..b418c917ab02 100644
--- a/drivers/crypto/xilinx/zynqmp-sha.c
+++ b/drivers/crypto/xilinx/zynqmp-sha.c
@@ -18,8 +18,17 @@
#include <linux/module.h>
#include <linux/platform_device.h>
+#define CONTINUE_PACKET BIT(31)
+#define FIRST_PACKET BIT(30)
+#define FINAL_PACKET 0
+#define RESET 0
#define ZYNQMP_DMA_BIT_MASK 32U
+#define VERSAL_DMA_BIT_MASK 64U
#define ZYNQMP_DMA_ALLOC_FIXED_SIZE 0x1000U
+#define VERSAL_SHA3_INVALID_PARAM 0x08U
+#define VERSAL_SHA3_STATE_MISMATCH_ERROR 0x0AU
+#define VERSAL_SHA3_FINISH_ERROR 0x07U
+#define VERSAL_SHA3_PMC_DMA_UPDATE_ERROR 0x04U
enum zynqmp_sha_op {
ZYNQMP_SHA3_INIT = 1,
@@ -209,6 +218,67 @@ static int zynqmp_sha_digest(struct ahash_request *req)
return ret;
}
+static int versal_sha_fw_error_decode(int status)
+{
+ switch (status) {
+ case VERSAL_SHA3_INVALID_PARAM:
+ pr_err("ERROR: On invalid parameter\n");
+ return -EINVAL;
+ case VERSAL_SHA3_STATE_MISMATCH_ERROR:
+ pr_err("ERROR: SHA3 state mismatch error\n");
+ return -EINVAL;
+ case VERSAL_SHA3_FINISH_ERROR:
+ pr_err("ERROR: SHA3 finish error\n");
+ return -EIO;
+ case VERSAL_SHA3_PMC_DMA_UPDATE_ERROR:
+ pr_err("ERROR: SHA3 PMC DMA update error\n");
+ return -EIO;
+ default:
+ pr_err("ERROR: Unknown SHA3 FW error code: %u\n", status);
+ return -EIO;
+ }
+}
+
+static int versal_sha_digest(struct ahash_request *req)
+{
+ int update_size, ret, flag = FIRST_PACKET;
+ unsigned int processed = 0;
+ unsigned int remaining_len;
+ unsigned int fw_status = 0;
+
+ remaining_len = req->nbytes;
+ while (remaining_len) {
+ if (remaining_len >= ZYNQMP_DMA_ALLOC_FIXED_SIZE)
+ update_size = ZYNQMP_DMA_ALLOC_FIXED_SIZE;
+ else
+ update_size = remaining_len;
+
+ sg_pcopy_to_buffer(req->src, sg_nents(req->src), ubuf, update_size, processed);
+ flush_icache_range((unsigned long)ubuf,
+ (unsigned long)ubuf + update_size);
+
+ flag |= CONTINUE_PACKET;
+ ret = versal_pm_sha_hash(update_dma_addr, 0,
+ update_size | flag, &fw_status);
+ if (ret)
+ return versal_sha_fw_error_decode(fw_status);
+
+ remaining_len -= update_size;
+ processed += update_size;
+ flag = RESET;
+ }
+
+ flag |= FINAL_PACKET;
+ ret = versal_pm_sha_hash(0, final_dma_addr, flag, &fw_status);
+ if (ret)
+ return versal_sha_fw_error_decode(fw_status);
+
+ memcpy(req->result, fbuf, SHA3_384_DIGEST_SIZE);
+ memzero_explicit(fbuf, SHA3_384_DIGEST_SIZE);
+
+ return 0;
+}
+
static int handle_zynqmp_sha_engine_req(struct crypto_engine *engine, void *req)
{
int err;
@@ -221,6 +291,18 @@ static int handle_zynqmp_sha_engine_req(struct crypto_engine *engine, void *req)
return 0;
}
+static int handle_versal_sha_engine_req(struct crypto_engine *engine, void *req)
+{
+ int err;
+
+ err = versal_sha_digest(req);
+ local_bh_disable();
+ crypto_finalize_hash_request(engine, req, err);
+ local_bh_enable();
+
+ return 0;
+}
+
static struct xilinx_sha_drv_ctx zynqmp_sha3_drv_ctx = {
.sha3_384.base = {
.init = zynqmp_sha_init,
@@ -252,7 +334,36 @@ static struct xilinx_sha_drv_ctx zynqmp_sha3_drv_ctx = {
.dma_addr_size = ZYNQMP_DMA_BIT_MASK,
};
-
+static struct xilinx_sha_drv_ctx versal_sha3_drv_ctx = {
+ .sha3_384.base = {
+ .init = zynqmp_sha_init,
+ .update = zynqmp_sha_update,
+ .final = zynqmp_sha_final,
+ .finup = zynqmp_sha_finup,
+ .digest = sha_digest,
+ .export = zynqmp_sha_export,
+ .import = zynqmp_sha_import,
+ .halg = {
+ .base.cra_init = zynqmp_sha_init_tfm,
+ .base.cra_exit = zynqmp_sha_exit_tfm,
+ .base.cra_name = "sha3-384",
+ .base.cra_driver_name = "versal-sha3-384",
+ .base.cra_priority = 300,
+ .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |
+ CRYPTO_ALG_ALLOCATES_MEMORY |
+ CRYPTO_ALG_NEED_FALLBACK,
+ .base.cra_blocksize = SHA3_384_BLOCK_SIZE,
+ .base.cra_ctxsize = sizeof(struct xilinx_sha_tfm_ctx),
+ .base.cra_module = THIS_MODULE,
+ .statesize = sizeof(struct sha3_state),
+ .digestsize = SHA3_384_DIGEST_SIZE,
+ }
+ },
+ .sha3_384.op = {
+ .do_one_request = handle_versal_sha_engine_req,
+ },
+ .dma_addr_size = VERSAL_DMA_BIT_MASK,
+};
static struct xlnx_feature sha_feature_map[] = {
{
@@ -260,6 +371,12 @@ static struct xlnx_feature sha_feature_map[] = {
.feature_id = PM_SECURE_SHA,
.data = &zynqmp_sha3_drv_ctx,
},
+ {
+ .family = PM_VERSAL_FAMILY_CODE,
+ .feature_id = XSECURE_API_SHA3_UPDATE,
+ .data = &versal_sha3_drv_ctx,
+ },
+ { /* sentinel */ }
};
static int zynqmp_sha_probe(struct platform_device *pdev)
--
2.34.1
prev parent reply other threads:[~2026-03-03 7:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-03 7:19 [PATCH 0/6] crypto: zynqmp-aes-gcm: Bug fixes and sha3-384 support Harsh Jain
2026-03-03 7:19 ` [PATCH 1/6] crypto: xilinx: zynamp-sha: Update the driver to make it as self discoverable Harsh Jain
2026-03-03 7:19 ` [PATCH 2/6] crypto: zynqmp-sha: Change algo type from shash to ahash Harsh Jain
2026-03-14 4:43 ` Herbert Xu
2026-03-14 4:46 ` Herbert Xu
2026-03-03 7:19 ` [PATCH 3/6] crypto: zynqmp-sha: Replace zynqmp prefix with xilinx Harsh Jain
2026-03-03 7:19 ` [PATCH 4/6] firmware: xilinx: Add firmware API's to support sha3-384 in Versal device Harsh Jain
2026-03-03 7:19 ` [PATCH 5/6] crypto: zynqmp-sha: Save dma bit mask value in driver context Harsh Jain
2026-03-03 7:19 ` Harsh Jain [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260303071953.149252-7-h.jain@amd.com \
--to=h.jain@amd.com \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=linux-crypto@vger.kernel.org \
--cc=michal.simek@amd.com \
--cc=mounika.botcha@amd.com \
--cc=sarat.chand.savitala@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox