Lines Matching full:cryp

120 static void mtk_desc_ring_link(struct mtk_cryp *cryp, u32 mask)  in mtk_desc_ring_link()  argument
123 writel(MTK_DFSE_THR_CTRL_EN | mask, cryp->base + DFE_THR_CTRL); in mtk_desc_ring_link()
124 writel(MTK_DFSE_THR_CTRL_EN | mask, cryp->base + DSE_THR_CTRL); in mtk_desc_ring_link()
127 static void mtk_dfe_dse_buf_setup(struct mtk_cryp *cryp, in mtk_dfe_dse_buf_setup() argument
140 cryp->base + DFE_CFG); in mtk_dfe_dse_buf_setup()
144 cryp->base + DSE_CFG); in mtk_dfe_dse_buf_setup()
148 cryp->base + PE_IN_DBUF_THRESH); in mtk_dfe_dse_buf_setup()
152 cryp->base + PE_IN_TBUF_THRESH); in mtk_dfe_dse_buf_setup()
156 cryp->base + PE_OUT_DBUF_THRESH); in mtk_dfe_dse_buf_setup()
158 writel(0, cryp->base + PE_OUT_TBUF_THRESH); in mtk_dfe_dse_buf_setup()
159 writel(0, cryp->base + PE_OUT_BUF_CTRL); in mtk_dfe_dse_buf_setup()
162 static int mtk_dfe_dse_state_check(struct mtk_cryp *cryp) in mtk_dfe_dse_state_check() argument
168 val = readl(cryp->base + DFE_THR_STAT); in mtk_dfe_dse_state_check()
170 val = readl(cryp->base + DSE_THR_STAT); in mtk_dfe_dse_state_check()
177 writel(0, cryp->base + DFE_THR_CTRL); in mtk_dfe_dse_state_check()
178 writel(0, cryp->base + DSE_THR_CTRL); in mtk_dfe_dse_state_check()
186 static int mtk_dfe_dse_reset(struct mtk_cryp *cryp) in mtk_dfe_dse_reset() argument
189 writel(MTK_DFSE_THR_CTRL_RESET, cryp->base + DFE_THR_CTRL); in mtk_dfe_dse_reset()
190 writel(0, cryp->base + DFE_PRIO_0); in mtk_dfe_dse_reset()
191 writel(0, cryp->base + DFE_PRIO_1); in mtk_dfe_dse_reset()
192 writel(0, cryp->base + DFE_PRIO_2); in mtk_dfe_dse_reset()
193 writel(0, cryp->base + DFE_PRIO_3); in mtk_dfe_dse_reset()
195 writel(MTK_DFSE_THR_CTRL_RESET, cryp->base + DSE_THR_CTRL); in mtk_dfe_dse_reset()
196 writel(0, cryp->base + DSE_PRIO_0); in mtk_dfe_dse_reset()
197 writel(0, cryp->base + DSE_PRIO_1); in mtk_dfe_dse_reset()
198 writel(0, cryp->base + DSE_PRIO_2); in mtk_dfe_dse_reset()
199 writel(0, cryp->base + DSE_PRIO_3); in mtk_dfe_dse_reset()
201 return mtk_dfe_dse_state_check(cryp); in mtk_dfe_dse_reset()
204 static void mtk_cmd_desc_ring_setup(struct mtk_cryp *cryp, in mtk_cmd_desc_ring_setup() argument
212 writel(0, cryp->base + CDR_CFG(i)); in mtk_cmd_desc_ring_setup()
215 writel(MTK_CNT_RST, cryp->base + CDR_PREP_COUNT(i)); in mtk_cmd_desc_ring_setup()
216 writel(MTK_CNT_RST, cryp->base + CDR_PROC_COUNT(i)); in mtk_cmd_desc_ring_setup()
218 writel(0, cryp->base + CDR_PREP_PNTR(i)); in mtk_cmd_desc_ring_setup()
219 writel(0, cryp->base + CDR_PROC_PNTR(i)); in mtk_cmd_desc_ring_setup()
220 writel(0, cryp->base + CDR_DMA_CFG(i)); in mtk_cmd_desc_ring_setup()
223 writel(0, cryp->base + CDR_BASE_ADDR_HI(i)); in mtk_cmd_desc_ring_setup()
224 writel(cryp->ring[i]->cmd_dma, cryp->base + CDR_BASE_ADDR_LO(i)); in mtk_cmd_desc_ring_setup()
226 writel(MTK_DESC_RING_SZ, cryp->base + CDR_RING_SIZE(i)); in mtk_cmd_desc_ring_setup()
229 writel(MTK_CDR_STAT_CLR, cryp->base + CDR_STAT(i)); in mtk_cmd_desc_ring_setup()
238 cryp->base + CDR_DESC_SIZE(i)); in mtk_cmd_desc_ring_setup()
242 cryp->base + CDR_CFG(i)); in mtk_cmd_desc_ring_setup()
245 static void mtk_res_desc_ring_setup(struct mtk_cryp *cryp, in mtk_res_desc_ring_setup() argument
252 writel(0, cryp->base + RDR_CFG(i)); in mtk_res_desc_ring_setup()
255 writel(MTK_CNT_RST, cryp->base + RDR_PREP_COUNT(i)); in mtk_res_desc_ring_setup()
256 writel(MTK_CNT_RST, cryp->base + RDR_PROC_COUNT(i)); in mtk_res_desc_ring_setup()
258 writel(0, cryp->base + RDR_PREP_PNTR(i)); in mtk_res_desc_ring_setup()
259 writel(0, cryp->base + RDR_PROC_PNTR(i)); in mtk_res_desc_ring_setup()
260 writel(0, cryp->base + RDR_DMA_CFG(i)); in mtk_res_desc_ring_setup()
263 writel(0, cryp->base + RDR_BASE_ADDR_HI(i)); in mtk_res_desc_ring_setup()
264 writel(cryp->ring[i]->res_dma, cryp->base + RDR_BASE_ADDR_LO(i)); in mtk_res_desc_ring_setup()
266 writel(MTK_DESC_RING_SZ, cryp->base + RDR_RING_SIZE(i)); in mtk_res_desc_ring_setup()
267 writel(MTK_RDR_STAT_CLR, cryp->base + RDR_STAT(i)); in mtk_res_desc_ring_setup()
275 cryp->base + RDR_THRESH(i)); in mtk_res_desc_ring_setup()
283 cryp->base + RDR_DESC_SIZE(i)); in mtk_res_desc_ring_setup()
292 cryp->base + RDR_CFG(i)); in mtk_res_desc_ring_setup()
295 static int mtk_packet_engine_setup(struct mtk_cryp *cryp) in mtk_packet_engine_setup() argument
301 cap.hia_ver = readl(cryp->base + HIA_VERSION); in mtk_packet_engine_setup()
302 cap.hia_opt = readl(cryp->base + HIA_OPTIONS); in mtk_packet_engine_setup()
303 cap.hw_opt = readl(cryp->base + EIP97_OPTIONS); in mtk_packet_engine_setup()
309 writel(0, cryp->base + EIP97_MST_CTRL); in mtk_packet_engine_setup()
312 val = readl(cryp->base + HIA_MST_CTRL); in mtk_packet_engine_setup()
315 writel(val, cryp->base + HIA_MST_CTRL); in mtk_packet_engine_setup()
317 err = mtk_dfe_dse_reset(cryp); in mtk_packet_engine_setup()
319 dev_err(cryp->dev, "Failed to reset DFE and DSE.\n"); in mtk_packet_engine_setup()
323 mtk_dfe_dse_buf_setup(cryp, &cap); in mtk_packet_engine_setup()
326 mtk_desc_ring_link(cryp, 0xf); in mtk_packet_engine_setup()
329 mtk_cmd_desc_ring_setup(cryp, i, &cap); in mtk_packet_engine_setup()
330 mtk_res_desc_ring_setup(cryp, i, &cap); in mtk_packet_engine_setup()
334 cryp->base + PE_TOKEN_CTRL_STAT); in mtk_packet_engine_setup()
337 writel(MTK_AIC_G_CLR, cryp->base + AIC_G_ACK); in mtk_packet_engine_setup()
344 cryp->base + PE_INTERRUPT_CTRL_STAT); in mtk_packet_engine_setup()
349 static int mtk_aic_cap_check(struct mtk_cryp *cryp, int hw) in mtk_aic_cap_check() argument
354 val = readl(cryp->base + AIC_G_VERSION); in mtk_aic_cap_check()
356 val = readl(cryp->base + AIC_VERSION(hw)); in mtk_aic_cap_check()
363 val = readl(cryp->base + AIC_G_OPTIONS); in mtk_aic_cap_check()
365 val = readl(cryp->base + AIC_OPTIONS(hw)); in mtk_aic_cap_check()
374 static int mtk_aic_init(struct mtk_cryp *cryp, int hw) in mtk_aic_init() argument
378 err = mtk_aic_cap_check(cryp, hw); in mtk_aic_init()
384 writel(0, cryp->base + AIC_G_ENABLE_CTRL); in mtk_aic_init()
385 writel(0, cryp->base + AIC_G_POL_CTRL); in mtk_aic_init()
386 writel(0, cryp->base + AIC_G_TYPE_CTRL); in mtk_aic_init()
387 writel(0, cryp->base + AIC_G_ENABLE_SET); in mtk_aic_init()
389 writel(0, cryp->base + AIC_ENABLE_CTRL(hw)); in mtk_aic_init()
390 writel(0, cryp->base + AIC_POL_CTRL(hw)); in mtk_aic_init()
391 writel(0, cryp->base + AIC_TYPE_CTRL(hw)); in mtk_aic_init()
392 writel(0, cryp->base + AIC_ENABLE_SET(hw)); in mtk_aic_init()
398 static int mtk_accelerator_init(struct mtk_cryp *cryp) in mtk_accelerator_init() argument
404 err = mtk_aic_init(cryp, i); in mtk_accelerator_init()
406 dev_err(cryp->dev, "Failed to initialize AIC.\n"); in mtk_accelerator_init()
412 err = mtk_packet_engine_setup(cryp); in mtk_accelerator_init()
414 dev_err(cryp->dev, "Failed to configure packet engine.\n"); in mtk_accelerator_init()
421 static void mtk_desc_dma_free(struct mtk_cryp *cryp) in mtk_desc_dma_free() argument
426 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ, in mtk_desc_dma_free()
427 cryp->ring[i]->res_base, in mtk_desc_dma_free()
428 cryp->ring[i]->res_dma); in mtk_desc_dma_free()
429 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ, in mtk_desc_dma_free()
430 cryp->ring[i]->cmd_base, in mtk_desc_dma_free()
431 cryp->ring[i]->cmd_dma); in mtk_desc_dma_free()
432 kfree(cryp->ring[i]); in mtk_desc_dma_free()
436 static int mtk_desc_ring_alloc(struct mtk_cryp *cryp) in mtk_desc_ring_alloc() argument
438 struct mtk_ring **ring = cryp->ring; in mtk_desc_ring_alloc()
446 ring[i]->cmd_base = dma_alloc_coherent(cryp->dev, in mtk_desc_ring_alloc()
453 ring[i]->res_base = dma_alloc_coherent(cryp->dev, in mtk_desc_ring_alloc()
467 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ, in mtk_desc_ring_alloc()
469 dma_free_coherent(cryp->dev, MTK_DESC_RING_SZ, in mtk_desc_ring_alloc()
478 struct mtk_cryp *cryp; in mtk_crypto_probe() local
481 cryp = devm_kzalloc(&pdev->dev, sizeof(*cryp), GFP_KERNEL); in mtk_crypto_probe()
482 if (!cryp) in mtk_crypto_probe()
485 cryp->base = devm_platform_ioremap_resource(pdev, 0); in mtk_crypto_probe()
486 if (IS_ERR(cryp->base)) in mtk_crypto_probe()
487 return PTR_ERR(cryp->base); in mtk_crypto_probe()
490 cryp->irq[i] = platform_get_irq(pdev, i); in mtk_crypto_probe()
491 if (cryp->irq[i] < 0) in mtk_crypto_probe()
492 return cryp->irq[i]; in mtk_crypto_probe()
495 cryp->clk_cryp = devm_clk_get(&pdev->dev, "cryp"); in mtk_crypto_probe()
496 if (IS_ERR(cryp->clk_cryp)) in mtk_crypto_probe()
499 cryp->dev = &pdev->dev; in mtk_crypto_probe()
500 pm_runtime_enable(cryp->dev); in mtk_crypto_probe()
501 pm_runtime_get_sync(cryp->dev); in mtk_crypto_probe()
503 err = clk_prepare_enable(cryp->clk_cryp); in mtk_crypto_probe()
508 err = mtk_desc_ring_alloc(cryp); in mtk_crypto_probe()
510 dev_err(cryp->dev, "Unable to allocate descriptor rings.\n"); in mtk_crypto_probe()
515 err = mtk_accelerator_init(cryp); in mtk_crypto_probe()
517 dev_err(cryp->dev, "Failed to initialize cryptographic engine.\n"); in mtk_crypto_probe()
521 err = mtk_cipher_alg_register(cryp); in mtk_crypto_probe()
523 dev_err(cryp->dev, "Unable to register cipher algorithm.\n"); in mtk_crypto_probe()
527 err = mtk_hash_alg_register(cryp); in mtk_crypto_probe()
529 dev_err(cryp->dev, "Unable to register hash algorithm.\n"); in mtk_crypto_probe()
533 platform_set_drvdata(pdev, cryp); in mtk_crypto_probe()
537 mtk_cipher_alg_release(cryp); in mtk_crypto_probe()
539 mtk_dfe_dse_reset(cryp); in mtk_crypto_probe()
541 mtk_desc_dma_free(cryp); in mtk_crypto_probe()
543 clk_disable_unprepare(cryp->clk_cryp); in mtk_crypto_probe()
545 pm_runtime_put_sync(cryp->dev); in mtk_crypto_probe()
546 pm_runtime_disable(cryp->dev); in mtk_crypto_probe()
553 struct mtk_cryp *cryp = platform_get_drvdata(pdev); in mtk_crypto_remove() local
555 mtk_hash_alg_release(cryp); in mtk_crypto_remove()
556 mtk_cipher_alg_release(cryp); in mtk_crypto_remove()
557 mtk_desc_dma_free(cryp); in mtk_crypto_remove()
559 clk_disable_unprepare(cryp->clk_cryp); in mtk_crypto_remove()
561 pm_runtime_put_sync(cryp->dev); in mtk_crypto_remove()
562 pm_runtime_disable(cryp->dev); in mtk_crypto_remove()