Lines Matching +full:jh7110 +full:- +full:crypto

1 // SPDX-License-Identifier: GPL-2.0
9 #include <crypto/engine.h>
10 #include <crypto/internal/hash.h>
11 #include <crypto/scatterwalk.h>
12 #include "jh7110-cryp.h"
15 #include <linux/dma-direct.h>
43 return readl_relaxed_poll_timeout(cryp->base + STARFIVE_HASH_SHACSR, status, in starfive_hash_wait_busy()
51 return readl_relaxed_poll_timeout(cryp->base + STARFIVE_HASH_SHACSR, status, in starfive_hash_wait_hmac_done()
57 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_hash_wait_key_done()
60 return readl_relaxed_poll_timeout(cryp->base + STARFIVE_HASH_SHACSR, status, in starfive_hash_wait_key_done()
66 struct starfive_cryp_request_ctx *rctx = ctx->rctx; in starfive_hash_hmac_key()
67 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_hash_hmac_key()
68 int klen = ctx->keylen, loop; in starfive_hash_hmac_key()
69 unsigned int *key = (unsigned int *)ctx->key; in starfive_hash_hmac_key()
72 writel(ctx->keylen, cryp->base + STARFIVE_HASH_SHAWKLEN); in starfive_hash_hmac_key()
74 rctx->csr.hash.hmac = 1; in starfive_hash_hmac_key()
75 rctx->csr.hash.key_flag = 1; in starfive_hash_hmac_key()
77 writel(rctx->csr.hash.v, cryp->base + STARFIVE_HASH_SHACSR); in starfive_hash_hmac_key()
80 writel(*key, cryp->base + STARFIVE_HASH_SHAWKR); in starfive_hash_hmac_key()
85 writeb(*cl, cryp->base + STARFIVE_HASH_SHAWKR); in starfive_hash_hmac_key()
89 return dev_err_probe(cryp->dev, -ETIMEDOUT, "starfive_hash_wait_key_done error\n"); in starfive_hash_hmac_key()
98 csr.v = readl(cryp->base + STARFIVE_HASH_SHACSR); in starfive_hash_start()
101 writel(csr.v, cryp->base + STARFIVE_HASH_SHACSR); in starfive_hash_start()
108 complete(&cryp->dma_done); in starfive_hash_dma_callback()
113 cryp->cfg_in.src_addr_width = DMA_SLAVE_BUSWIDTH_16_BYTES; in starfive_hash_dma_init()
114 cryp->cfg_in.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in starfive_hash_dma_init()
115 cryp->cfg_in.src_maxburst = cryp->dma_maxburst; in starfive_hash_dma_init()
116 cryp->cfg_in.dst_maxburst = cryp->dma_maxburst; in starfive_hash_dma_init()
117 cryp->cfg_in.dst_addr = cryp->phys_base + STARFIVE_ALG_FIFO_OFFSET; in starfive_hash_dma_init()
119 dmaengine_slave_config(cryp->tx, &cryp->cfg_in); in starfive_hash_dma_init()
121 init_completion(&cryp->dma_done); in starfive_hash_dma_init()
134 writel(alg_cr.v, cryp->base + STARFIVE_ALG_CR_OFFSET); in starfive_hash_dma_xfer()
136 writel(sg_dma_len(sg), cryp->base + STARFIVE_DMA_IN_LEN_OFFSET); in starfive_hash_dma_xfer()
139 in_desc = dmaengine_prep_slave_sg(cryp->tx, sg, 1, DMA_MEM_TO_DEV, in starfive_hash_dma_xfer()
142 ret = -EINVAL; in starfive_hash_dma_xfer()
146 reinit_completion(&cryp->dma_done); in starfive_hash_dma_xfer()
147 in_desc->callback = starfive_hash_dma_callback; in starfive_hash_dma_xfer()
148 in_desc->callback_param = cryp; in starfive_hash_dma_xfer()
151 dma_async_issue_pending(cryp->tx); in starfive_hash_dma_xfer()
153 if (!wait_for_completion_timeout(&cryp->dma_done, in starfive_hash_dma_xfer()
155 ret = -ETIMEDOUT; in starfive_hash_dma_xfer()
160 writel(alg_cr.v, cryp->base + STARFIVE_ALG_CR_OFFSET); in starfive_hash_dma_xfer()
172 if (!req->result) in starfive_hash_copy_hash()
175 mlen = rctx->digsize / sizeof(u32); in starfive_hash_copy_hash()
176 data = (u32 *)req->result; in starfive_hash_copy_hash()
179 put_unaligned(readl(ctx->cryp->base + STARFIVE_HASH_SHARDR), in starfive_hash_copy_hash()
187 int err = cryp->err; in starfive_hash_done_task()
190 err = starfive_hash_copy_hash(cryp->req.hreq); in starfive_hash_done_task()
192 crypto_finalize_hash_request(cryp->engine, cryp->req.hreq, err); in starfive_hash_done_task()
200 struct starfive_cryp_request_ctx *rctx = ctx->rctx; in starfive_hash_one_request()
201 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_hash_one_request()
205 writel(STARFIVE_HASH_RESET, cryp->base + STARFIVE_HASH_SHACSR); in starfive_hash_one_request()
208 return dev_err_probe(cryp->dev, -ETIMEDOUT, "Error resetting hardware\n"); in starfive_hash_one_request()
210 rctx->csr.hash.v = 0; in starfive_hash_one_request()
211 rctx->csr.hash.mode = ctx->hash_mode; in starfive_hash_one_request()
213 if (ctx->is_hmac) { in starfive_hash_one_request()
218 rctx->csr.hash.start = 1; in starfive_hash_one_request()
219 rctx->csr.hash.firstb = 1; in starfive_hash_one_request()
220 writel(rctx->csr.hash.v, cryp->base + STARFIVE_HASH_SHACSR); in starfive_hash_one_request()
224 if (!rctx->total) in starfive_hash_one_request()
229 for_each_sg(rctx->in_sg, tsg, rctx->in_sg_len, i) { in starfive_hash_one_request()
230 src_nents = dma_map_sg(cryp->dev, tsg, 1, DMA_TO_DEVICE); in starfive_hash_one_request()
232 return dev_err_probe(cryp->dev, -ENOMEM, in starfive_hash_one_request()
236 dma_unmap_sg(cryp->dev, tsg, 1, DMA_TO_DEVICE); in starfive_hash_one_request()
245 return dev_err_probe(cryp->dev, -ETIMEDOUT, "Error generating digest\n"); in starfive_hash_one_request()
247 if (ctx->is_hmac) in starfive_hash_one_request()
248 cryp->err = starfive_hash_wait_hmac_done(cryp); in starfive_hash_one_request()
261 ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk); in starfive_hash_init()
262 ahash_request_set_callback(&rctx->ahash_fbk_req, in starfive_hash_init()
263 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP, in starfive_hash_init()
264 req->base.complete, req->base.data); in starfive_hash_init()
266 ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src, in starfive_hash_init()
267 req->result, req->nbytes); in starfive_hash_init()
269 return crypto_ahash_init(&rctx->ahash_fbk_req); in starfive_hash_init()
278 ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk); in starfive_hash_update()
279 ahash_request_set_callback(&rctx->ahash_fbk_req, in starfive_hash_update()
280 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP, in starfive_hash_update()
281 req->base.complete, req->base.data); in starfive_hash_update()
283 ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src, in starfive_hash_update()
284 req->result, req->nbytes); in starfive_hash_update()
286 return crypto_ahash_update(&rctx->ahash_fbk_req); in starfive_hash_update()
295 ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk); in starfive_hash_final()
296 ahash_request_set_callback(&rctx->ahash_fbk_req, in starfive_hash_final()
297 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP, in starfive_hash_final()
298 req->base.complete, req->base.data); in starfive_hash_final()
300 ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src, in starfive_hash_final()
301 req->result, req->nbytes); in starfive_hash_final()
303 return crypto_ahash_final(&rctx->ahash_fbk_req); in starfive_hash_final()
312 ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk); in starfive_hash_finup()
313 ahash_request_set_callback(&rctx->ahash_fbk_req, in starfive_hash_finup()
314 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP, in starfive_hash_finup()
315 req->base.complete, req->base.data); in starfive_hash_finup()
317 ahash_request_set_crypt(&rctx->ahash_fbk_req, req->src, in starfive_hash_finup()
318 req->result, req->nbytes); in starfive_hash_finup()
320 return crypto_ahash_finup(&rctx->ahash_fbk_req); in starfive_hash_finup()
328 struct starfive_cryp_dev *cryp = ctx->cryp; in starfive_hash_digest()
332 cryp->req.hreq = req; in starfive_hash_digest()
333 rctx->total = req->nbytes; in starfive_hash_digest()
334 rctx->in_sg = req->src; in starfive_hash_digest()
335 rctx->blksize = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm)); in starfive_hash_digest()
336 rctx->digsize = crypto_ahash_digestsize(tfm); in starfive_hash_digest()
337 rctx->in_sg_len = sg_nents_for_len(rctx->in_sg, rctx->total); in starfive_hash_digest()
338 ctx->rctx = rctx; in starfive_hash_digest()
340 return crypto_transfer_hash_request_to_engine(cryp->engine, req); in starfive_hash_digest()
349 ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk); in starfive_hash_export()
350 ahash_request_set_callback(&rctx->ahash_fbk_req, in starfive_hash_export()
351 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP, in starfive_hash_export()
352 req->base.complete, req->base.data); in starfive_hash_export()
354 return crypto_ahash_export(&rctx->ahash_fbk_req, out); in starfive_hash_export()
363 ahash_request_set_tfm(&rctx->ahash_fbk_req, ctx->ahash_fbk); in starfive_hash_import()
364 ahash_request_set_callback(&rctx->ahash_fbk_req, in starfive_hash_import()
365 req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP, in starfive_hash_import()
366 req->base.complete, req->base.data); in starfive_hash_import()
368 return crypto_ahash_import(&rctx->ahash_fbk_req, in); in starfive_hash_import()
378 ctx->cryp = starfive_cryp_find_dev(ctx); in starfive_hash_init_tfm()
380 if (!ctx->cryp) in starfive_hash_init_tfm()
381 return -ENODEV; in starfive_hash_init_tfm()
383 ctx->ahash_fbk = crypto_alloc_ahash(alg_name, 0, in starfive_hash_init_tfm()
386 if (IS_ERR(ctx->ahash_fbk)) in starfive_hash_init_tfm()
387 return dev_err_probe(ctx->cryp->dev, PTR_ERR(ctx->ahash_fbk), in starfive_hash_init_tfm()
390 crypto_ahash_set_statesize(hash, crypto_ahash_statesize(ctx->ahash_fbk)); in starfive_hash_init_tfm()
392 crypto_ahash_reqsize(ctx->ahash_fbk)); in starfive_hash_init_tfm()
394 ctx->is_hmac = is_hmac; in starfive_hash_init_tfm()
395 ctx->hash_mode = mode; in starfive_hash_init_tfm()
404 crypto_free_ahash(ctx->ahash_fbk); in starfive_hash_exit_tfm()
424 ret = -ENOMEM; in starfive_hash_long_setkey()
435 ret = -ENOMEM; in starfive_hash_long_setkey()
441 ahash_request_set_crypt(req, &sg, ctx->key, keylen); in starfive_hash_long_setkey()
461 crypto_ahash_setkey(ctx->ahash_fbk, key, keylen); in starfive_hash_setkey()
464 memcpy(ctx->key, key, keylen); in starfive_hash_setkey()
465 ctx->keylen = keylen; in starfive_hash_setkey()
469 ctx->keylen = digestsize; in starfive_hash_setkey()
473 alg_name = "sha224-starfive"; in starfive_hash_setkey()
476 if (ctx->hash_mode == STARFIVE_HASH_SM3) in starfive_hash_setkey()
477 alg_name = "sm3-starfive"; in starfive_hash_setkey()
479 alg_name = "sha256-starfive"; in starfive_hash_setkey()
482 alg_name = "sha384-starfive"; in starfive_hash_setkey()
485 alg_name = "sha512-starfive"; in starfive_hash_setkey()
488 return -EINVAL; in starfive_hash_setkey()
496 return starfive_hash_init_tfm(hash, "sha224-generic", in starfive_sha224_init_tfm()
502 return starfive_hash_init_tfm(hash, "sha256-generic", in starfive_sha256_init_tfm()
508 return starfive_hash_init_tfm(hash, "sha384-generic", in starfive_sha384_init_tfm()
514 return starfive_hash_init_tfm(hash, "sha512-generic", in starfive_sha512_init_tfm()
520 return starfive_hash_init_tfm(hash, "sm3-generic", in starfive_sm3_init_tfm()
526 return starfive_hash_init_tfm(hash, "hmac(sha224-generic)", in starfive_hmac_sha224_init_tfm()
532 return starfive_hash_init_tfm(hash, "hmac(sha256-generic)", in starfive_hmac_sha256_init_tfm()
538 return starfive_hash_init_tfm(hash, "hmac(sha384-generic)", in starfive_hmac_sha384_init_tfm()
544 return starfive_hash_init_tfm(hash, "hmac(sha512-generic)", in starfive_hmac_sha512_init_tfm()
550 return starfive_hash_init_tfm(hash, "hmac(sm3-generic)", in starfive_hmac_sm3_init_tfm()
570 .cra_driver_name = "sha224-starfive",
599 .cra_driver_name = "sha224-hmac-starfive",
627 .cra_driver_name = "sha256-starfive",
656 .cra_driver_name = "sha256-hmac-starfive",
684 .cra_driver_name = "sha384-starfive",
713 .cra_driver_name = "sha384-hmac-starfive",
741 .cra_driver_name = "sha512-starfive",
770 .cra_driver_name = "sha512-hmac-starfive",
798 .cra_driver_name = "sm3-starfive",
827 .cra_driver_name = "sm3-hmac-starfive",