diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/crypto/mediatek/mtk-aes.c | 14 | ||||
-rw-r--r-- | drivers/crypto/mediatek/mtk-platform.c | 3 | ||||
-rw-r--r-- | drivers/crypto/mediatek/mtk-platform.h | 8 | ||||
-rw-r--r-- | drivers/crypto/mediatek/mtk-sha.c | 35 |
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 | */ |
97 | struct mtk_ring { | 97 | struct 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 | ||
155 | static 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 | |||
155 | static struct mtk_cryp *mtk_sha_find_dev(struct mtk_sha_ctx *tctx) | 170 | static 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; |