aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBaolin Wang <baolin.wang@linaro.org>2016-04-28 02:11:51 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-05-03 04:08:48 -0400
commitf1b77aaca85a610948f02d11288845f4cfe7d3eb (patch)
tree84ab27a740edb9253aaf04c633d010f7a2dbbff9
parent6dd4c83ed7e28309c03b0c267f1473fc3e7db9f1 (diff)
crypto: omap-des - Integrate with the crypto engine framework
Since the crypto engine framework had been merged, thus this patch integrates with the newly added crypto engine framework to make the crypto hardware engine under utilized as each block needs to be processed before the crypto hardware can start working on the next block. The crypto engine framework can manage and process the requests automatically, so remove the 'queue' and 'queue_task' things in omap des driver. Signed-off-by: Baolin <baolin.wang@linaro.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/Kconfig1
-rw-r--r--drivers/crypto/omap-des.c97
2 files changed, 44 insertions, 54 deletions
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig
index 12fd49950f47..d77ba2f12242 100644
--- a/drivers/crypto/Kconfig
+++ b/drivers/crypto/Kconfig
@@ -314,6 +314,7 @@ config CRYPTO_DEV_OMAP_DES
314 depends on ARCH_OMAP2PLUS 314 depends on ARCH_OMAP2PLUS
315 select CRYPTO_DES 315 select CRYPTO_DES
316 select CRYPTO_BLKCIPHER 316 select CRYPTO_BLKCIPHER
317 select CRYPTO_ENGINE
317 help 318 help
318 OMAP processors have DES/3DES module accelerator. Select this if you 319 OMAP processors have DES/3DES module accelerator. Select this if you
319 want to use the OMAP module for DES and 3DES algorithms. Currently 320 want to use the OMAP module for DES and 3DES algorithms. Currently
diff --git a/drivers/crypto/omap-des.c b/drivers/crypto/omap-des.c
index dd7b93f2f94c..b9a465fc2300 100644
--- a/drivers/crypto/omap-des.c
+++ b/drivers/crypto/omap-des.c
@@ -39,6 +39,7 @@
39#include <linux/interrupt.h> 39#include <linux/interrupt.h>
40#include <crypto/scatterwalk.h> 40#include <crypto/scatterwalk.h>
41#include <crypto/des.h> 41#include <crypto/des.h>
42#include <crypto/algapi.h>
42 43
43#define DST_MAXBURST 2 44#define DST_MAXBURST 2
44 45
@@ -132,14 +133,10 @@ struct omap_des_dev {
132 unsigned long flags; 133 unsigned long flags;
133 int err; 134 int err;
134 135
135 /* spinlock used for queues */
136 spinlock_t lock;
137 struct crypto_queue queue;
138
139 struct tasklet_struct done_task; 136 struct tasklet_struct done_task;
140 struct tasklet_struct queue_task;
141 137
142 struct ablkcipher_request *req; 138 struct ablkcipher_request *req;
139 struct crypto_engine *engine;
143 /* 140 /*
144 * total is used by PIO mode for book keeping so introduce 141 * total is used by PIO mode for book keeping so introduce
145 * variable total_save as need it to calc page_order 142 * variable total_save as need it to calc page_order
@@ -520,9 +517,7 @@ static void omap_des_finish_req(struct omap_des_dev *dd, int err)
520 pr_debug("err: %d\n", err); 517 pr_debug("err: %d\n", err);
521 518
522 pm_runtime_put(dd->dev); 519 pm_runtime_put(dd->dev);
523 dd->flags &= ~FLAGS_BUSY; 520 crypto_finalize_request(dd->engine, req, err);
524
525 req->base.complete(&req->base, err);
526} 521}
527 522
528static int omap_des_crypt_dma_stop(struct omap_des_dev *dd) 523static int omap_des_crypt_dma_stop(struct omap_des_dev *dd)
@@ -585,34 +580,24 @@ static int omap_des_copy_sgs(struct omap_des_dev *dd)
585} 580}
586 581
587static int omap_des_handle_queue(struct omap_des_dev *dd, 582static int omap_des_handle_queue(struct omap_des_dev *dd,
588 struct ablkcipher_request *req) 583 struct ablkcipher_request *req)
589{ 584{
590 struct crypto_async_request *async_req, *backlog;
591 struct omap_des_ctx *ctx;
592 struct omap_des_reqctx *rctx;
593 unsigned long flags;
594 int err, ret = 0;
595
596 spin_lock_irqsave(&dd->lock, flags);
597 if (req) 585 if (req)
598 ret = ablkcipher_enqueue_request(&dd->queue, req); 586 return crypto_transfer_request_to_engine(dd->engine, req);
599 if (dd->flags & FLAGS_BUSY) {
600 spin_unlock_irqrestore(&dd->lock, flags);
601 return ret;
602 }
603 backlog = crypto_get_backlog(&dd->queue);
604 async_req = crypto_dequeue_request(&dd->queue);
605 if (async_req)
606 dd->flags |= FLAGS_BUSY;
607 spin_unlock_irqrestore(&dd->lock, flags);
608 587
609 if (!async_req) 588 return 0;
610 return ret; 589}
611 590
612 if (backlog) 591static int omap_des_prepare_req(struct crypto_engine *engine,
613 backlog->complete(backlog, -EINPROGRESS); 592 struct ablkcipher_request *req)
593{
594 struct omap_des_ctx *ctx = crypto_ablkcipher_ctx(
595 crypto_ablkcipher_reqtfm(req));
596 struct omap_des_dev *dd = omap_des_find_dev(ctx);
597 struct omap_des_reqctx *rctx;
614 598
615 req = ablkcipher_request_cast(async_req); 599 if (!dd)
600 return -ENODEV;
616 601
617 /* assign new request to device */ 602 /* assign new request to device */
618 dd->req = req; 603 dd->req = req;
@@ -642,16 +627,20 @@ static int omap_des_handle_queue(struct omap_des_dev *dd,
642 dd->ctx = ctx; 627 dd->ctx = ctx;
643 ctx->dd = dd; 628 ctx->dd = dd;
644 629
645 err = omap_des_write_ctrl(dd); 630 return omap_des_write_ctrl(dd);
646 if (!err) 631}
647 err = omap_des_crypt_dma_start(dd);
648 if (err) {
649 /* des_task will not finish it, so do it here */
650 omap_des_finish_req(dd, err);
651 tasklet_schedule(&dd->queue_task);
652 }
653 632
654 return ret; /* return ret, which is enqueue return value */ 633static int omap_des_crypt_req(struct crypto_engine *engine,
634 struct ablkcipher_request *req)
635{
636 struct omap_des_ctx *ctx = crypto_ablkcipher_ctx(
637 crypto_ablkcipher_reqtfm(req));
638 struct omap_des_dev *dd = omap_des_find_dev(ctx);
639
640 if (!dd)
641 return -ENODEV;
642
643 return omap_des_crypt_dma_start(dd);
655} 644}
656 645
657static void omap_des_done_task(unsigned long data) 646static void omap_des_done_task(unsigned long data)
@@ -683,18 +672,10 @@ static void omap_des_done_task(unsigned long data)
683 } 672 }
684 673
685 omap_des_finish_req(dd, 0); 674 omap_des_finish_req(dd, 0);
686 omap_des_handle_queue(dd, NULL);
687 675
688 pr_debug("exit\n"); 676 pr_debug("exit\n");
689} 677}
690 678
691static void omap_des_queue_task(unsigned long data)
692{
693 struct omap_des_dev *dd = (struct omap_des_dev *)data;
694
695 omap_des_handle_queue(dd, NULL);
696}
697
698static int omap_des_crypt(struct ablkcipher_request *req, unsigned long mode) 679static int omap_des_crypt(struct ablkcipher_request *req, unsigned long mode)
699{ 680{
700 struct omap_des_ctx *ctx = crypto_ablkcipher_ctx( 681 struct omap_des_ctx *ctx = crypto_ablkcipher_ctx(
@@ -1062,9 +1043,6 @@ static int omap_des_probe(struct platform_device *pdev)
1062 dd->dev = dev; 1043 dd->dev = dev;
1063 platform_set_drvdata(pdev, dd); 1044 platform_set_drvdata(pdev, dd);
1064 1045
1065 spin_lock_init(&dd->lock);
1066 crypto_init_queue(&dd->queue, OMAP_DES_QUEUE_LENGTH);
1067
1068 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1046 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1069 if (!res) { 1047 if (!res) {
1070 dev_err(dev, "no MEM resource info\n"); 1048 dev_err(dev, "no MEM resource info\n");
@@ -1103,7 +1081,6 @@ static int omap_des_probe(struct platform_device *pdev)
1103 (reg & dd->pdata->minor_mask) >> dd->pdata->minor_shift); 1081 (reg & dd->pdata->minor_mask) >> dd->pdata->minor_shift);
1104 1082
1105 tasklet_init(&dd->done_task, omap_des_done_task, (unsigned long)dd); 1083 tasklet_init(&dd->done_task, omap_des_done_task, (unsigned long)dd);
1106 tasklet_init(&dd->queue_task, omap_des_queue_task, (unsigned long)dd);
1107 1084
1108 err = omap_des_dma_init(dd); 1085 err = omap_des_dma_init(dd);
1109 if (err && DES_REG_IRQ_STATUS(dd) && DES_REG_IRQ_ENABLE(dd)) { 1086 if (err && DES_REG_IRQ_STATUS(dd) && DES_REG_IRQ_ENABLE(dd)) {
@@ -1144,7 +1121,21 @@ static int omap_des_probe(struct platform_device *pdev)
1144 } 1121 }
1145 } 1122 }
1146 1123
1124 /* Initialize des crypto engine */
1125 dd->engine = crypto_engine_alloc_init(dev, 1);
1126 if (!dd->engine)
1127 goto err_algs;
1128
1129 dd->engine->prepare_request = omap_des_prepare_req;
1130 dd->engine->crypt_one_request = omap_des_crypt_req;
1131 err = crypto_engine_start(dd->engine);
1132 if (err)
1133 goto err_engine;
1134
1147 return 0; 1135 return 0;
1136
1137err_engine:
1138 crypto_engine_exit(dd->engine);
1148err_algs: 1139err_algs:
1149 for (i = dd->pdata->algs_info_size - 1; i >= 0; i--) 1140 for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
1150 for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) 1141 for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
@@ -1154,7 +1145,6 @@ err_algs:
1154 omap_des_dma_cleanup(dd); 1145 omap_des_dma_cleanup(dd);
1155err_irq: 1146err_irq:
1156 tasklet_kill(&dd->done_task); 1147 tasklet_kill(&dd->done_task);
1157 tasklet_kill(&dd->queue_task);
1158err_get: 1148err_get:
1159 pm_runtime_disable(dev); 1149 pm_runtime_disable(dev);
1160err_res: 1150err_res:
@@ -1182,7 +1172,6 @@ static int omap_des_remove(struct platform_device *pdev)
1182 &dd->pdata->algs_info[i].algs_list[j]); 1172 &dd->pdata->algs_info[i].algs_list[j]);
1183 1173
1184 tasklet_kill(&dd->done_task); 1174 tasklet_kill(&dd->done_task);
1185 tasklet_kill(&dd->queue_task);
1186 omap_des_dma_cleanup(dd); 1175 omap_des_dma_cleanup(dd);
1187 pm_runtime_disable(dd->dev); 1176 pm_runtime_disable(dd->dev);
1188 dd = NULL; 1177 dd = NULL;