Lines Matching refs:ce
28 static int sl3516_ce_desc_init(struct sl3516_ce_dev *ce) in sl3516_ce_desc_init() argument
33 ce->tx = dma_alloc_coherent(ce->dev, sz, &ce->dtx, GFP_KERNEL); in sl3516_ce_desc_init()
34 if (!ce->tx) in sl3516_ce_desc_init()
36 ce->rx = dma_alloc_coherent(ce->dev, sz, &ce->drx, GFP_KERNEL); in sl3516_ce_desc_init()
37 if (!ce->rx) in sl3516_ce_desc_init()
41 ce->tx[i].frame_ctrl.bits.own = CE_CPU; in sl3516_ce_desc_init()
42 ce->tx[i].next_desc.next_descriptor = ce->dtx + (i + 1) * sizeof(struct descriptor); in sl3516_ce_desc_init()
44 ce->tx[MAXDESC - 1].next_desc.next_descriptor = ce->dtx; in sl3516_ce_desc_init()
47 ce->rx[i].frame_ctrl.bits.own = CE_CPU; in sl3516_ce_desc_init()
48 ce->rx[i].next_desc.next_descriptor = ce->drx + (i + 1) * sizeof(struct descriptor); in sl3516_ce_desc_init()
50 ce->rx[MAXDESC - 1].next_desc.next_descriptor = ce->drx; in sl3516_ce_desc_init()
52 ce->pctrl = dma_alloc_coherent(ce->dev, sizeof(struct pkt_control_ecb), in sl3516_ce_desc_init()
53 &ce->dctrl, GFP_KERNEL); in sl3516_ce_desc_init()
54 if (!ce->pctrl) in sl3516_ce_desc_init()
59 dma_free_coherent(ce->dev, sz, ce->rx, ce->drx); in sl3516_ce_desc_init()
61 dma_free_coherent(ce->dev, sz, ce->tx, ce->dtx); in sl3516_ce_desc_init()
65 static void sl3516_ce_free_descs(struct sl3516_ce_dev *ce) in sl3516_ce_free_descs() argument
69 dma_free_coherent(ce->dev, sz, ce->tx, ce->dtx); in sl3516_ce_free_descs()
70 dma_free_coherent(ce->dev, sz, ce->rx, ce->drx); in sl3516_ce_free_descs()
71 dma_free_coherent(ce->dev, sizeof(struct pkt_control_ecb), ce->pctrl, in sl3516_ce_free_descs()
72 ce->dctrl); in sl3516_ce_free_descs()
75 static void start_dma_tx(struct sl3516_ce_dev *ce) in start_dma_tx() argument
82 writel(v, ce->base + IPSEC_TXDMA_CTRL); in start_dma_tx()
85 static void start_dma_rx(struct sl3516_ce_dev *ce) in start_dma_rx() argument
94 writel(v, ce->base + IPSEC_RXDMA_CTRL); in start_dma_rx()
97 static struct descriptor *get_desc_tx(struct sl3516_ce_dev *ce) in get_desc_tx() argument
101 dd = &ce->tx[ce->ctx]; in get_desc_tx()
102 ce->ctx++; in get_desc_tx()
103 if (ce->ctx >= MAXDESC) in get_desc_tx()
104 ce->ctx = 0; in get_desc_tx()
108 static struct descriptor *get_desc_rx(struct sl3516_ce_dev *ce) in get_desc_rx() argument
112 rdd = &ce->rx[ce->crx]; in get_desc_rx()
113 ce->crx++; in get_desc_rx()
114 if (ce->crx >= MAXDESC) in get_desc_rx()
115 ce->crx = 0; in get_desc_rx()
119 int sl3516_ce_run_task(struct sl3516_ce_dev *ce, struct sl3516_ce_cipher_req_ctx *rctx, in sl3516_ce_run_task() argument
126 ce->stat_req++; in sl3516_ce_run_task()
128 reinit_completion(&ce->complete); in sl3516_ce_run_task()
129 ce->status = 0; in sl3516_ce_run_task()
132 dev_dbg(ce->dev, "%s handle DST SG %d/%d len=%d\n", __func__, in sl3516_ce_run_task()
134 rdd = get_desc_rx(ce); in sl3516_ce_run_task()
142 dev_dbg(ce->dev, "%s handle SRC SG %d/%d len=%d\n", __func__, in sl3516_ce_run_task()
146 dd = get_desc_tx(ce); in sl3516_ce_run_task()
150 dd->buf_adr = ce->dctrl; in sl3516_ce_run_task()
157 dd = get_desc_tx(ce); in sl3516_ce_run_task()
167 start_dma_tx(ce); in sl3516_ce_run_task()
168 start_dma_rx(ce); in sl3516_ce_run_task()
170 wait_for_completion_interruptible_timeout(&ce->complete, in sl3516_ce_run_task()
172 if (ce->status == 0) { in sl3516_ce_run_task()
173 dev_err(ce->dev, "DMA timeout for %s\n", name); in sl3516_ce_run_task()
176 v = readl(ce->base + IPSEC_STATUS_REG); in sl3516_ce_run_task()
178 dev_err(ce->dev, "IPSEC_STATUS_REG %x\n", v); in sl3516_ce_run_task()
187 struct sl3516_ce_dev *ce = (struct sl3516_ce_dev *)data; in ce_irq_handler() local
190 ce->stat_irq++; in ce_irq_handler()
192 v = readl(ce->base + IPSEC_DMA_STATUS); in ce_irq_handler()
193 writel(v, ce->base + IPSEC_DMA_STATUS); in ce_irq_handler()
196 dev_err(ce->dev, "AHB bus Error While Tx !!!\n"); in ce_irq_handler()
198 dev_err(ce->dev, "Tx Descriptor Protocol Error !!!\n"); in ce_irq_handler()
200 dev_err(ce->dev, "AHB bus Error While Rx !!!\n"); in ce_irq_handler()
202 dev_err(ce->dev, "Rx Descriptor Protocol Error !!!\n"); in ce_irq_handler()
205 ce->stat_irq_tx++; in ce_irq_handler()
207 ce->status = 1; in ce_irq_handler()
208 complete(&ce->complete); in ce_irq_handler()
209 ce->stat_irq_rx++; in ce_irq_handler()
246 struct sl3516_ce_dev *ce = seq->private; in sl3516_ce_debugfs_show() local
250 ce->hwrng_stat_req, ce->hwrng_stat_bytes); in sl3516_ce_debugfs_show()
251 seq_printf(seq, "IRQ %lu\n", ce->stat_irq); in sl3516_ce_debugfs_show()
252 seq_printf(seq, "IRQ TX %lu\n", ce->stat_irq_tx); in sl3516_ce_debugfs_show()
253 seq_printf(seq, "IRQ RX %lu\n", ce->stat_irq_rx); in sl3516_ce_debugfs_show()
254 seq_printf(seq, "nreq %lu\n", ce->stat_req); in sl3516_ce_debugfs_show()
255 seq_printf(seq, "fallback SG count TX %lu\n", ce->fallback_sg_count_tx); in sl3516_ce_debugfs_show()
256 seq_printf(seq, "fallback SG count RX %lu\n", ce->fallback_sg_count_rx); in sl3516_ce_debugfs_show()
257 seq_printf(seq, "fallback modulo16 %lu\n", ce->fallback_mod16); in sl3516_ce_debugfs_show()
258 seq_printf(seq, "fallback align16 %lu\n", ce->fallback_align16); in sl3516_ce_debugfs_show()
259 seq_printf(seq, "fallback not same len %lu\n", ce->fallback_not_same_len); in sl3516_ce_debugfs_show()
262 if (!ce_algs[i].ce) in sl3516_ce_debugfs_show()
279 static int sl3516_ce_register_algs(struct sl3516_ce_dev *ce) in sl3516_ce_register_algs() argument
285 ce_algs[i].ce = ce; in sl3516_ce_register_algs()
288 dev_info(ce->dev, "DEBUG: Register %s\n", in sl3516_ce_register_algs()
292 dev_err(ce->dev, "Fail to register %s\n", in sl3516_ce_register_algs()
294 ce_algs[i].ce = NULL; in sl3516_ce_register_algs()
299 ce_algs[i].ce = NULL; in sl3516_ce_register_algs()
300 dev_err(ce->dev, "ERROR: tried to register an unknown algo\n"); in sl3516_ce_register_algs()
306 static void sl3516_ce_unregister_algs(struct sl3516_ce_dev *ce) in sl3516_ce_unregister_algs() argument
311 if (!ce_algs[i].ce) in sl3516_ce_unregister_algs()
315 dev_info(ce->dev, "Unregister %d %s\n", i, in sl3516_ce_unregister_algs()
323 static void sl3516_ce_start(struct sl3516_ce_dev *ce) in sl3516_ce_start() argument
325 ce->ctx = 0; in sl3516_ce_start()
326 ce->crx = 0; in sl3516_ce_start()
327 writel(ce->dtx, ce->base + IPSEC_TXDMA_CURR_DESC); in sl3516_ce_start()
328 writel(ce->drx, ce->base + IPSEC_RXDMA_CURR_DESC); in sl3516_ce_start()
329 writel(0, ce->base + IPSEC_DMA_STATUS); in sl3516_ce_start()
338 struct sl3516_ce_dev *ce = dev_get_drvdata(dev); in sl3516_ce_pm_suspend() local
340 reset_control_assert(ce->reset); in sl3516_ce_pm_suspend()
341 clk_disable_unprepare(ce->clks); in sl3516_ce_pm_suspend()
347 struct sl3516_ce_dev *ce = dev_get_drvdata(dev); in sl3516_ce_pm_resume() local
350 err = clk_prepare_enable(ce->clks); in sl3516_ce_pm_resume()
352 dev_err(ce->dev, "Cannot prepare_enable\n"); in sl3516_ce_pm_resume()
355 err = reset_control_deassert(ce->reset); in sl3516_ce_pm_resume()
357 dev_err(ce->dev, "Cannot deassert reset control\n"); in sl3516_ce_pm_resume()
361 sl3516_ce_start(ce); in sl3516_ce_pm_resume()
373 static int sl3516_ce_pm_init(struct sl3516_ce_dev *ce) in sl3516_ce_pm_init() argument
377 pm_runtime_use_autosuspend(ce->dev); in sl3516_ce_pm_init()
378 pm_runtime_set_autosuspend_delay(ce->dev, 2000); in sl3516_ce_pm_init()
380 err = pm_runtime_set_suspended(ce->dev); in sl3516_ce_pm_init()
383 pm_runtime_enable(ce->dev); in sl3516_ce_pm_init()
387 static void sl3516_ce_pm_exit(struct sl3516_ce_dev *ce) in sl3516_ce_pm_exit() argument
389 pm_runtime_disable(ce->dev); in sl3516_ce_pm_exit()
394 struct sl3516_ce_dev *ce; in sl3516_ce_probe() local
398 ce = devm_kzalloc(&pdev->dev, sizeof(*ce), GFP_KERNEL); in sl3516_ce_probe()
399 if (!ce) in sl3516_ce_probe()
402 ce->dev = &pdev->dev; in sl3516_ce_probe()
403 platform_set_drvdata(pdev, ce); in sl3516_ce_probe()
405 ce->base = devm_platform_ioremap_resource(pdev, 0); in sl3516_ce_probe()
406 if (IS_ERR(ce->base)) in sl3516_ce_probe()
407 return PTR_ERR(ce->base); in sl3516_ce_probe()
413 err = devm_request_irq(&pdev->dev, irq, ce_irq_handler, 0, "crypto", ce); in sl3516_ce_probe()
415 dev_err(ce->dev, "Cannot request Crypto Engine IRQ (err=%d)\n", err); in sl3516_ce_probe()
419 ce->reset = devm_reset_control_get(&pdev->dev, NULL); in sl3516_ce_probe()
420 if (IS_ERR(ce->reset)) in sl3516_ce_probe()
421 return dev_err_probe(&pdev->dev, PTR_ERR(ce->reset), in sl3516_ce_probe()
423 ce->clks = devm_clk_get(ce->dev, NULL); in sl3516_ce_probe()
424 if (IS_ERR(ce->clks)) { in sl3516_ce_probe()
425 err = PTR_ERR(ce->clks); in sl3516_ce_probe()
426 dev_err(ce->dev, "Cannot get clock err=%d\n", err); in sl3516_ce_probe()
430 err = sl3516_ce_desc_init(ce); in sl3516_ce_probe()
434 err = sl3516_ce_pm_init(ce); in sl3516_ce_probe()
438 init_completion(&ce->complete); in sl3516_ce_probe()
440 ce->engine = crypto_engine_alloc_init(ce->dev, true); in sl3516_ce_probe()
441 if (!ce->engine) { in sl3516_ce_probe()
442 dev_err(ce->dev, "Cannot allocate engine\n"); in sl3516_ce_probe()
447 err = crypto_engine_start(ce->engine); in sl3516_ce_probe()
449 dev_err(ce->dev, "Cannot start engine\n"); in sl3516_ce_probe()
453 err = sl3516_ce_register_algs(ce); in sl3516_ce_probe()
457 err = sl3516_ce_rng_register(ce); in sl3516_ce_probe()
461 err = pm_runtime_resume_and_get(ce->dev); in sl3516_ce_probe()
465 v = readl(ce->base + IPSEC_ID); in sl3516_ce_probe()
466 dev_info(ce->dev, "SL3516 dev %lx rev %lx\n", in sl3516_ce_probe()
469 v = readl(ce->base + IPSEC_DMA_DEVICE_ID); in sl3516_ce_probe()
470 dev_info(ce->dev, "SL3516 DMA dev %lx rev %lx\n", in sl3516_ce_probe()
474 pm_runtime_put_sync(ce->dev); in sl3516_ce_probe()
478 ce->dbgfs_dir = debugfs_create_dir("sl3516", NULL); in sl3516_ce_probe()
479 ce->dbgfs_stats = debugfs_create_file("stats", 0444, in sl3516_ce_probe()
480 ce->dbgfs_dir, ce, in sl3516_ce_probe()
486 sl3516_ce_rng_unregister(ce); in sl3516_ce_probe()
488 sl3516_ce_unregister_algs(ce); in sl3516_ce_probe()
490 crypto_engine_exit(ce->engine); in sl3516_ce_probe()
492 sl3516_ce_pm_exit(ce); in sl3516_ce_probe()
494 sl3516_ce_free_descs(ce); in sl3516_ce_probe()
500 struct sl3516_ce_dev *ce = platform_get_drvdata(pdev); in sl3516_ce_remove() local
502 sl3516_ce_rng_unregister(ce); in sl3516_ce_remove()
503 sl3516_ce_unregister_algs(ce); in sl3516_ce_remove()
504 crypto_engine_exit(ce->engine); in sl3516_ce_remove()
505 sl3516_ce_pm_exit(ce); in sl3516_ce_remove()
506 sl3516_ce_free_descs(ce); in sl3516_ce_remove()
509 debugfs_remove_recursive(ce->dbgfs_dir); in sl3516_ce_remove()