Lines Matching defs:hdev

84 	struct img_hash_dev	*hdev;
111 struct img_hash_dev *hdev;
148 static inline u32 img_hash_read(struct img_hash_dev *hdev, u32 offset)
150 return readl_relaxed(hdev->io_base + offset);
153 static inline void img_hash_write(struct img_hash_dev *hdev,
156 writel_relaxed(value, hdev->io_base + offset);
159 static inline u32 img_hash_read_result_queue(struct img_hash_dev *hdev)
161 return be32_to_cpu(img_hash_read(hdev, CR_RESULT_QUEUE));
164 static void img_hash_start(struct img_hash_dev *hdev, bool dma)
166 struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
177 dev_dbg(hdev->dev, "Starting hash process\n");
178 img_hash_write(hdev, CR_CONTROL, cr);
187 img_hash_read(hdev, CR_CONTROL);
190 static int img_hash_xmit_cpu(struct img_hash_dev *hdev, const u8 *buf,
196 dev_dbg(hdev->dev, "xmit_cpu: length: %zu bytes\n", length);
199 hdev->flags |= DRIVER_FLAGS_FINAL;
204 writel_relaxed(buffer[count], hdev->cpu_addr);
211 struct img_hash_dev *hdev = (struct img_hash_dev *)data;
212 struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
215 img_hash_xmit_cpu(hdev, ctx->buffer, ctx->bufcnt, 0);
219 tasklet_schedule(&hdev->dma_task);
222 static int img_hash_xmit_dma(struct img_hash_dev *hdev, struct scatterlist *sg)
225 struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
227 ctx->dma_ct = dma_map_sg(hdev->dev, sg, 1, DMA_TO_DEVICE);
229 dev_err(hdev->dev, "Invalid DMA sg\n");
230 hdev->err = -EINVAL;
234 desc = dmaengine_prep_slave_sg(hdev->dma_lch,
240 dev_err(hdev->dev, "Null DMA descriptor\n");
241 hdev->err = -EINVAL;
242 dma_unmap_sg(hdev->dev, sg, 1, DMA_TO_DEVICE);
246 desc->callback_param = hdev;
248 dma_async_issue_pending(hdev->dma_lch);
253 static int img_hash_write_via_cpu(struct img_hash_dev *hdev)
255 struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
257 ctx->bufcnt = sg_copy_to_buffer(hdev->req->src, sg_nents(ctx->sg),
258 ctx->buffer, hdev->req->nbytes);
260 ctx->total = hdev->req->nbytes;
263 hdev->flags |= (DRIVER_FLAGS_CPU | DRIVER_FLAGS_FINAL);
265 img_hash_start(hdev, false);
267 return img_hash_xmit_cpu(hdev, ctx->buffer, ctx->total, 1);
289 hash[i] = img_hash_read_result_queue(ctx->hdev);
295 struct img_hash_dev *hdev = ctx->hdev;
299 if (DRIVER_FLAGS_FINAL & hdev->flags)
302 dev_warn(hdev->dev, "Hash failed with error %d\n", err);
306 hdev->flags &= ~(DRIVER_FLAGS_DMA_READY | DRIVER_FLAGS_OUTPUT_READY |
313 static int img_hash_write_via_dma(struct img_hash_dev *hdev)
315 struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
317 img_hash_start(hdev, true);
319 dev_dbg(hdev->dev, "xmit dma size: %d\n", ctx->total);
322 hdev->flags |= DRIVER_FLAGS_FINAL;
324 hdev->flags |= DRIVER_FLAGS_DMA_ACTIVE | DRIVER_FLAGS_FINAL;
326 tasklet_schedule(&hdev->dma_task);
331 static int img_hash_dma_init(struct img_hash_dev *hdev)
336 hdev->dma_lch = dma_request_chan(hdev->dev, "tx");
337 if (IS_ERR(hdev->dma_lch)) {
338 dev_err(hdev->dev, "Couldn't acquire a slave DMA channel.\n");
339 return PTR_ERR(hdev->dma_lch);
342 dma_conf.dst_addr = hdev->bus_addr;
347 err = dmaengine_slave_config(hdev->dma_lch, &dma_conf);
349 dev_err(hdev->dev, "Couldn't configure DMA slave.\n");
350 dma_release_channel(hdev->dma_lch);
359 struct img_hash_dev *hdev = (struct img_hash_dev *)d;
365 if (!hdev->req)
368 ctx = ahash_request_ctx(hdev->req);
390 if (img_hash_xmit_dma(hdev, &tsg)) {
391 dev_err(hdev->dev, "DMA failed, falling back to CPU");
393 hdev->err = 0;
394 img_hash_xmit_cpu(hdev, addr + ctx->offset,
426 img_hash_dma_callback(hdev);
433 static int img_hash_write_via_dma_stop(struct img_hash_dev *hdev)
435 struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
438 dma_unmap_sg(hdev->dev, ctx->sg, ctx->dma_ct, DMA_TO_DEVICE);
443 static int img_hash_process_data(struct img_hash_dev *hdev)
445 struct ahash_request *req = hdev->req;
452 dev_dbg(hdev->dev, "process data request(%d bytes) using DMA\n",
454 err = img_hash_write_via_dma(hdev);
456 dev_dbg(hdev->dev, "process data request(%d bytes) using CPU\n",
458 err = img_hash_write_via_cpu(hdev);
463 static int img_hash_hw_init(struct img_hash_dev *hdev)
468 img_hash_write(hdev, CR_RESET, CR_RESET_SET);
469 img_hash_write(hdev, CR_RESET, CR_RESET_UNSET);
470 img_hash_write(hdev, CR_INTENAB, CR_INT_NEW_RESULTS_SET);
472 nbits = (u64)hdev->req->nbytes << 3;
475 img_hash_write(hdev, CR_MESSAGE_LENGTH_H, u);
476 img_hash_write(hdev, CR_MESSAGE_LENGTH_L, l);
478 if (!(DRIVER_FLAGS_INIT & hdev->flags)) {
479 hdev->flags |= DRIVER_FLAGS_INIT;
480 hdev->err = 0;
482 dev_dbg(hdev->dev, "hw initialized, nbits: %llx\n", nbits);
499 static int img_hash_handle_queue(struct img_hash_dev *hdev,
507 spin_lock_irqsave(&hdev->lock, flags);
510 res = ahash_enqueue_request(&hdev->queue, req);
512 if (DRIVER_FLAGS_BUSY & hdev->flags) {
513 spin_unlock_irqrestore(&hdev->lock, flags);
517 backlog = crypto_get_backlog(&hdev->queue);
518 async_req = crypto_dequeue_request(&hdev->queue);
520 hdev->flags |= DRIVER_FLAGS_BUSY;
522 spin_unlock_irqrestore(&hdev->lock, flags);
531 hdev->req = req;
535 dev_info(hdev->dev, "processing req, op: %lu, bytes: %d\n",
538 err = img_hash_hw_init(hdev);
541 err = img_hash_process_data(hdev);
626 struct img_hash_dev *hdev = NULL;
631 if (!tctx->hdev) {
633 hdev = tmp;
636 tctx->hdev = hdev;
639 hdev = tctx->hdev;
643 ctx->hdev = hdev;
672 err = img_hash_handle_queue(tctx->hdev, req);
729 struct img_hash_dev *hdev = dev_id;
732 reg = img_hash_read(hdev, CR_INTSTAT);
733 img_hash_write(hdev, CR_INTCLEAR, reg);
736 dev_dbg(hdev->dev, "IRQ CR_INT_NEW_RESULTS_SET\n");
737 if (DRIVER_FLAGS_BUSY & hdev->flags) {
738 hdev->flags |= DRIVER_FLAGS_OUTPUT_READY;
739 if (!(DRIVER_FLAGS_CPU & hdev->flags))
740 hdev->flags |= DRIVER_FLAGS_DMA_READY;
741 tasklet_schedule(&hdev->done_task);
743 dev_warn(hdev->dev,
747 dev_warn(hdev->dev,
750 dev_warn(hdev->dev,
753 dev_warn(hdev->dev,
866 static int img_register_algs(struct img_hash_dev *hdev)
884 static int img_unregister_algs(struct img_hash_dev *hdev)
895 struct img_hash_dev *hdev = (struct img_hash_dev *)data;
898 if (hdev->err == -EINVAL) {
899 err = hdev->err;
903 if (!(DRIVER_FLAGS_BUSY & hdev->flags)) {
904 img_hash_handle_queue(hdev, NULL);
908 if (DRIVER_FLAGS_CPU & hdev->flags) {
909 if (DRIVER_FLAGS_OUTPUT_READY & hdev->flags) {
910 hdev->flags &= ~DRIVER_FLAGS_OUTPUT_READY;
913 } else if (DRIVER_FLAGS_DMA_READY & hdev->flags) {
914 if (DRIVER_FLAGS_DMA_ACTIVE & hdev->flags) {
915 hdev->flags &= ~DRIVER_FLAGS_DMA_ACTIVE;
916 img_hash_write_via_dma_stop(hdev);
917 if (hdev->err) {
918 err = hdev->err;
922 if (DRIVER_FLAGS_OUTPUT_READY & hdev->flags) {
923 hdev->flags &= ~(DRIVER_FLAGS_DMA_READY |
931 img_hash_finish_req(hdev->req, err);
942 struct img_hash_dev *hdev;
948 hdev = devm_kzalloc(dev, sizeof(*hdev), GFP_KERNEL);
949 if (hdev == NULL)
952 spin_lock_init(&hdev->lock);
954 hdev->dev = dev;
956 platform_set_drvdata(pdev, hdev);
958 INIT_LIST_HEAD(&hdev->list);
960 tasklet_init(&hdev->done_task, img_hash_done_task, (unsigned long)hdev);
961 tasklet_init(&hdev->dma_task, img_hash_dma_task, (unsigned long)hdev);
963 crypto_init_queue(&hdev->queue, IMG_HASH_QUEUE_LENGTH);
966 hdev->io_base = devm_platform_ioremap_resource(pdev, 0);
967 if (IS_ERR(hdev->io_base)) {
968 err = PTR_ERR(hdev->io_base);
976 hdev->cpu_addr = devm_ioremap_resource(dev, hash_res);
977 if (IS_ERR(hdev->cpu_addr)) {
979 err = PTR_ERR(hdev->cpu_addr);
982 hdev->bus_addr = hash_res->start;
991 dev_name(dev), hdev);
998 hdev->hash_clk = devm_clk_get(&pdev->dev, "hash");
999 if (IS_ERR(hdev->hash_clk)) {
1001 err = PTR_ERR(hdev->hash_clk);
1005 hdev->sys_clk = devm_clk_get(&pdev->dev, "sys");
1006 if (IS_ERR(hdev->sys_clk)) {
1008 err = PTR_ERR(hdev->sys_clk);
1012 err = clk_prepare_enable(hdev->hash_clk);
1016 err = clk_prepare_enable(hdev->sys_clk);
1020 err = img_hash_dma_init(hdev);
1025 dma_chan_name(hdev->dma_lch));
1028 list_add_tail(&hdev->list, &img_hash.dev_list);
1031 err = img_register_algs(hdev);
1040 list_del(&hdev->list);
1042 dma_release_channel(hdev->dma_lch);
1044 clk_disable_unprepare(hdev->sys_clk);
1046 clk_disable_unprepare(hdev->hash_clk);
1048 tasklet_kill(&hdev->done_task);
1049 tasklet_kill(&hdev->dma_task);
1056 struct img_hash_dev *hdev;
1058 hdev = platform_get_drvdata(pdev);
1060 list_del(&hdev->list);
1063 img_unregister_algs(hdev);
1065 tasklet_kill(&hdev->done_task);
1066 tasklet_kill(&hdev->dma_task);
1068 dma_release_channel(hdev->dma_lch);
1070 clk_disable_unprepare(hdev->hash_clk);
1071 clk_disable_unprepare(hdev->sys_clk);
1079 struct img_hash_dev *hdev = dev_get_drvdata(dev);
1081 clk_disable_unprepare(hdev->hash_clk);
1082 clk_disable_unprepare(hdev->sys_clk);
1089 struct img_hash_dev *hdev = dev_get_drvdata(dev);
1092 ret = clk_prepare_enable(hdev->hash_clk);
1096 ret = clk_prepare_enable(hdev->sys_clk);
1098 clk_disable_unprepare(hdev->hash_clk);