aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-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;