diff options
| -rw-r--r-- | drivers/crypto/mxs-dcp.c | 28 |
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; |
