aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/mediatek/mtk-sha.c
diff options
context:
space:
mode:
authorRyder Lee <ryder.lee@mediatek.com>2017-03-08 21:11:15 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2017-03-16 05:58:53 -0400
commit3d21c41f7e9b51c70d37b316f11cf5cce9dd3311 (patch)
tree57a1fccf9f7d5e9399a2c8af74f4b9e743795249 /drivers/crypto/mediatek/mtk-sha.c
parent82445fe995f4b1edf131157a7328796d5aec1efb (diff)
crypto: mediatek - simplify descriptor ring management
This patch replaces cmd_pos/res_pos with pointer cmd_next/res_next. In old code, we must to add one to shift ring to the next segment, and then use this value to caculate current offset from ring base for each DMA operation. Now these pointers helps us to simplify flow, so we just need to move pointers and check the boundaries of ring. Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/mediatek/mtk-sha.c')
-rw-r--r--drivers/crypto/mediatek/mtk-sha.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/crypto/mediatek/mtk-sha.c b/drivers/crypto/mediatek/mtk-sha.c
index ef6fb201f70d..0884d6243cbc 100644
--- a/drivers/crypto/mediatek/mtk-sha.c
+++ b/drivers/crypto/mediatek/mtk-sha.c
@@ -152,6 +152,21 @@ static inline void mtk_sha_write(struct mtk_cryp *cryp,
152 writel_relaxed(value, cryp->base + offset); 152 writel_relaxed(value, cryp->base + offset);
153} 153}
154 154
155static inline void mtk_sha_ring_shift(struct mtk_ring *ring,
156 struct mtk_desc **cmd_curr,
157 struct mtk_desc **res_curr,
158 int *count)
159{
160 *cmd_curr = ring->cmd_next++;
161 *res_curr = ring->res_next++;
162 (*count)++;
163
164 if (ring->cmd_next == ring->cmd_base + MTK_DESC_NUM) {
165 ring->cmd_next = ring->cmd_base;
166 ring->res_next = ring->res_base;
167 }
168}
169
155static struct mtk_cryp *mtk_sha_find_dev(struct mtk_sha_ctx *tctx) 170static struct mtk_cryp *mtk_sha_find_dev(struct mtk_sha_ctx *tctx)
156{ 171{
157 struct mtk_cryp *cryp = NULL; 172 struct mtk_cryp *cryp = NULL;
@@ -426,8 +441,7 @@ static int mtk_sha_xmit(struct mtk_cryp *cryp, struct mtk_sha_rec *sha,
426{ 441{
427 struct mtk_sha_reqctx *ctx = ahash_request_ctx(sha->req); 442 struct mtk_sha_reqctx *ctx = ahash_request_ctx(sha->req);
428 struct mtk_ring *ring = cryp->ring[sha->id]; 443 struct mtk_ring *ring = cryp->ring[sha->id];
429 struct mtk_desc *cmd = ring->cmd_base + ring->cmd_pos; 444 struct mtk_desc *cmd, *res;
430 struct mtk_desc *res = ring->res_base + ring->res_pos;
431 int err, count = 0; 445 int err, count = 0;
432 446
433 err = mtk_sha_info_update(cryp, sha, len1, len2); 447 err = mtk_sha_info_update(cryp, sha, len1, len2);
@@ -435,6 +449,8 @@ static int mtk_sha_xmit(struct mtk_cryp *cryp, struct mtk_sha_rec *sha,
435 return err; 449 return err;
436 450
437 /* Fill in the command/result descriptors */ 451 /* Fill in the command/result descriptors */
452 mtk_sha_ring_shift(ring, &cmd, &res, &count);
453
438 res->hdr = MTK_DESC_FIRST | MTK_DESC_BUF_LEN(len1); 454 res->hdr = MTK_DESC_FIRST | MTK_DESC_BUF_LEN(len1);
439 cmd->hdr = MTK_DESC_FIRST | MTK_DESC_BUF_LEN(len1) | 455 cmd->hdr = MTK_DESC_FIRST | MTK_DESC_BUF_LEN(len1) |
440 MTK_DESC_CT_LEN(ctx->ct_size); 456 MTK_DESC_CT_LEN(ctx->ct_size);
@@ -443,25 +459,12 @@ static int mtk_sha_xmit(struct mtk_cryp *cryp, struct mtk_sha_rec *sha,
443 cmd->ct_hdr = ctx->ct_hdr; 459 cmd->ct_hdr = ctx->ct_hdr;
444 cmd->tfm = cpu_to_le32(ctx->tfm_dma); 460 cmd->tfm = cpu_to_le32(ctx->tfm_dma);
445 461
446 if (++ring->cmd_pos == MTK_DESC_NUM)
447 ring->cmd_pos = 0;
448
449 ring->res_pos = ring->cmd_pos;
450 count++;
451
452 if (len2) { 462 if (len2) {
453 cmd = ring->cmd_base + ring->cmd_pos; 463 mtk_sha_ring_shift(ring, &cmd, &res, &count);
454 res = ring->res_base + ring->res_pos;
455 464
456 res->hdr = MTK_DESC_BUF_LEN(len2); 465 res->hdr = MTK_DESC_BUF_LEN(len2);
457 cmd->hdr = MTK_DESC_BUF_LEN(len2); 466 cmd->hdr = MTK_DESC_BUF_LEN(len2);
458 cmd->buf = cpu_to_le32(addr2); 467 cmd->buf = cpu_to_le32(addr2);
459
460 if (++ring->cmd_pos == MTK_DESC_NUM)
461 ring->cmd_pos = 0;
462
463 ring->res_pos = ring->cmd_pos;
464 count++;
465 } 468 }
466 469
467 cmd->hdr |= MTK_DESC_LAST; 470 cmd->hdr |= MTK_DESC_LAST;