aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/crypto/mxs-dcp.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c
index c7400fe9522c..7bbe0ab21eca 100644
--- a/drivers/crypto/mxs-dcp.c
+++ b/drivers/crypto/mxs-dcp.c
@@ -50,7 +50,6 @@ struct dcp_coherent_block {
50 uint8_t sha_in_buf[DCP_BUF_SZ]; 50 uint8_t sha_in_buf[DCP_BUF_SZ];
51 51
52 uint8_t aes_key[2 * AES_KEYSIZE_128]; 52 uint8_t aes_key[2 * AES_KEYSIZE_128];
53 uint8_t sha_digest[SHA256_DIGEST_SIZE];
54 53
55 struct dcp_dma_desc desc[DCP_MAX_CHANS]; 54 struct dcp_dma_desc desc[DCP_MAX_CHANS];
56}; 55};
@@ -516,13 +515,11 @@ static int mxs_dcp_run_sha(struct ahash_request *req)
516 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 515 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
517 struct dcp_async_ctx *actx = crypto_ahash_ctx(tfm); 516 struct dcp_async_ctx *actx = crypto_ahash_ctx(tfm);
518 struct dcp_sha_req_ctx *rctx = ahash_request_ctx(req); 517 struct dcp_sha_req_ctx *rctx = ahash_request_ctx(req);
518 struct hash_alg_common *halg = crypto_hash_alg_common(tfm);
519 519
520 struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan]; 520 struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];
521 dma_addr_t digest_phys = dma_map_single(sdcp->dev,
522 sdcp->coh->sha_digest,
523 SHA256_DIGEST_SIZE,
524 DMA_FROM_DEVICE);
525 521
522 dma_addr_t digest_phys = 0;
526 dma_addr_t buf_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_in_buf, 523 dma_addr_t buf_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_in_buf,
527 DCP_BUF_SZ, DMA_TO_DEVICE); 524 DCP_BUF_SZ, DMA_TO_DEVICE);
528 525
@@ -543,14 +540,18 @@ static int mxs_dcp_run_sha(struct ahash_request *req)
543 540
544 /* Set HASH_TERM bit for last transfer block. */ 541 /* Set HASH_TERM bit for last transfer block. */
545 if (rctx->fini) { 542 if (rctx->fini) {
543 digest_phys = dma_map_single(sdcp->dev, req->result,
544 halg->digestsize, DMA_FROM_DEVICE);
546 desc->control0 |= MXS_DCP_CONTROL0_HASH_TERM; 545 desc->control0 |= MXS_DCP_CONTROL0_HASH_TERM;
547 desc->payload = digest_phys; 546 desc->payload = digest_phys;
548 } 547 }
549 548
550 ret = mxs_dcp_start_dma(actx); 549 ret = mxs_dcp_start_dma(actx);
551 550
552 dma_unmap_single(sdcp->dev, digest_phys, SHA256_DIGEST_SIZE, 551 if (rctx->fini)
553 DMA_FROM_DEVICE); 552 dma_unmap_single(sdcp->dev, digest_phys, halg->digestsize,
553 DMA_FROM_DEVICE);
554
554 dma_unmap_single(sdcp->dev, buf_phys, DCP_BUF_SZ, DMA_TO_DEVICE); 555 dma_unmap_single(sdcp->dev, buf_phys, DCP_BUF_SZ, DMA_TO_DEVICE);
555 556
556 return ret; 557 return ret;
@@ -567,7 +568,6 @@ static int dcp_sha_req_to_buf(struct crypto_async_request *arq)
567 struct hash_alg_common *halg = crypto_hash_alg_common(tfm); 568 struct hash_alg_common *halg = crypto_hash_alg_common(tfm);
568 const int nents = sg_nents(req->src); 569 const int nents = sg_nents(req->src);
569 570
570 uint8_t *digest = sdcp->coh->sha_digest;
571 uint8_t *in_buf = sdcp->coh->sha_in_buf; 571 uint8_t *in_buf = sdcp->coh->sha_in_buf;
572 572
573 uint8_t *src_buf; 573 uint8_t *src_buf;
@@ -614,14 +614,20 @@ static int dcp_sha_req_to_buf(struct crypto_async_request *arq)
614 rctx->fini = 1; 614 rctx->fini = 1;
615 615
616 /* Submit whatever is left. */ 616 /* Submit whatever is left. */
617 if (!req->result)
618 return -EINVAL;
619
617 ret = mxs_dcp_run_sha(req); 620 ret = mxs_dcp_run_sha(req);
618 if (ret || !req->result) 621 if (ret)
619 return ret; 622 return ret;
623
620 actx->fill = 0; 624 actx->fill = 0;
621 625
622 /* For some reason, the result is flipped. */ 626 /* For some reason, the result is flipped. */
623 for (i = 0; i < halg->digestsize; i++) 627 for (i = 0; i < halg->digestsize / 2; i++) {
624 req->result[i] = digest[halg->digestsize - i - 1]; 628 swap(req->result[i],
629 req->result[halg->digestsize - i - 1]);
630 }
625 } 631 }
626 632
627 return 0; 633 return 0;