aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
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
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')
-rw-r--r--drivers/crypto/mediatek/mtk-aes.c14
-rw-r--r--drivers/crypto/mediatek/mtk-platform.c3
-rw-r--r--drivers/crypto/mediatek/mtk-platform.h8
-rw-r--r--drivers/crypto/mediatek/mtk-sha.c35
4 files changed, 34 insertions, 26 deletions
diff --git a/drivers/crypto/mediatek/mtk-aes.c b/drivers/crypto/mediatek/mtk-aes.c
index b57b68f2ac93..21f3e594804b 100644
--- a/drivers/crypto/mediatek/mtk-aes.c
+++ b/drivers/crypto/mediatek/mtk-aes.c
@@ -262,7 +262,7 @@ static int mtk_aes_xmit(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
262 262
263 /* Write command descriptors */ 263 /* Write command descriptors */
264 for (nents = 0; nents < slen; ++nents, ssg = sg_next(ssg)) { 264 for (nents = 0; nents < slen; ++nents, ssg = sg_next(ssg)) {
265 cmd = ring->cmd_base + ring->cmd_pos; 265 cmd = ring->cmd_next;
266 cmd->hdr = MTK_DESC_BUF_LEN(ssg->length); 266 cmd->hdr = MTK_DESC_BUF_LEN(ssg->length);
267 cmd->buf = cpu_to_le32(sg_dma_address(ssg)); 267 cmd->buf = cpu_to_le32(sg_dma_address(ssg));
268 268
@@ -274,22 +274,24 @@ static int mtk_aes_xmit(struct mtk_cryp *cryp, struct mtk_aes_rec *aes)
274 cmd->tfm = cpu_to_le32(aes->ctx->tfm_dma); 274 cmd->tfm = cpu_to_le32(aes->ctx->tfm_dma);
275 } 275 }
276 276
277 if (++ring->cmd_pos == MTK_DESC_NUM) 277 /* Shift ring buffer and check boundary */
278 ring->cmd_pos = 0; 278 if (++ring->cmd_next == ring->cmd_base + MTK_DESC_NUM)
279 ring->cmd_next = ring->cmd_base;
279 } 280 }
280 cmd->hdr |= MTK_DESC_LAST; 281 cmd->hdr |= MTK_DESC_LAST;
281 282
282 /* Prepare result descriptors */ 283 /* Prepare result descriptors */
283 for (nents = 0; nents < dlen; ++nents, dsg = sg_next(dsg)) { 284 for (nents = 0; nents < dlen; ++nents, dsg = sg_next(dsg)) {
284 res = ring->res_base + ring->res_pos; 285 res = ring->res_next;
285 res->hdr = MTK_DESC_BUF_LEN(dsg->length); 286 res->hdr = MTK_DESC_BUF_LEN(dsg->length);
286 res->buf = cpu_to_le32(sg_dma_address(dsg)); 287 res->buf = cpu_to_le32(sg_dma_address(dsg));
287 288
288 if (nents == 0) 289 if (nents == 0)
289 res->hdr |= MTK_DESC_FIRST; 290 res->hdr |= MTK_DESC_FIRST;
290 291
291 if (++ring->res_pos == MTK_DESC_NUM) 292 /* Shift ring buffer and check boundary */
292 ring->res_pos = 0; 293 if (++ring->res_next == ring->res_base + MTK_DESC_NUM)
294 ring->res_next = ring->res_base;
293 } 295 }
294 res->hdr |= MTK_DESC_LAST; 296 res->hdr |= MTK_DESC_LAST;
295 297
diff --git a/drivers/crypto/mediatek/mtk-platform.c b/drivers/crypto/mediatek/mtk-platform.c
index 50de335ed332..b6ecc288b540 100644
--- a/drivers/crypto/mediatek/mtk-platform.c
+++ b/drivers/crypto/mediatek/mtk-platform.c
@@ -465,6 +465,9 @@ static int mtk_desc_ring_alloc(struct mtk_cryp *cryp)
465 GFP_KERNEL); 465 GFP_KERNEL);
466 if (!ring[i]->res_base) 466 if (!ring[i]->res_base)
467 goto err_cleanup; 467 goto err_cleanup;
468
469 ring[i]->cmd_next = ring[i]->cmd_base;
470 ring[i]->res_next = ring[i]->res_base;
468 } 471 }
469 return 0; 472 return 0;
470 473
diff --git a/drivers/crypto/mediatek/mtk-platform.h b/drivers/crypto/mediatek/mtk-platform.h
index 78ce54e136c5..218e30d1828a 100644
--- a/drivers/crypto/mediatek/mtk-platform.h
+++ b/drivers/crypto/mediatek/mtk-platform.h
@@ -84,11 +84,11 @@ struct mtk_desc {
84/** 84/**
85 * struct mtk_ring - Descriptor ring 85 * struct mtk_ring - Descriptor ring
86 * @cmd_base: pointer to command descriptor ring base 86 * @cmd_base: pointer to command descriptor ring base
87 * @cmd_next: pointer to the next command descriptor
87 * @cmd_dma: DMA address of command descriptor ring 88 * @cmd_dma: DMA address of command descriptor ring
88 * @cmd_pos: current position in the command descriptor ring
89 * @res_base: pointer to result descriptor ring base 89 * @res_base: pointer to result descriptor ring base
90 * @res_next: pointer to the next result descriptor
90 * @res_dma: DMA address of result descriptor ring 91 * @res_dma: DMA address of result descriptor ring
91 * @res_pos: current position in the result descriptor ring
92 * 92 *
93 * A descriptor ring is a circular buffer that is used to manage 93 * A descriptor ring is a circular buffer that is used to manage
94 * one or more descriptors. There are two type of descriptor rings; 94 * one or more descriptors. There are two type of descriptor rings;
@@ -96,11 +96,11 @@ struct mtk_desc {
96 */ 96 */
97struct mtk_ring { 97struct mtk_ring {
98 struct mtk_desc *cmd_base; 98 struct mtk_desc *cmd_base;
99 struct mtk_desc *cmd_next;
99 dma_addr_t cmd_dma; 100 dma_addr_t cmd_dma;
100 u32 cmd_pos;
101 struct mtk_desc *res_base; 101 struct mtk_desc *res_base;
102 struct mtk_desc *res_next;
102 dma_addr_t res_dma; 103 dma_addr_t res_dma;
103 u32 res_pos;
104}; 104};
105 105
106/** 106/**
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;