Lines Matching +full:crypto +full:- +full:engine

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Crypto acceleration support for Rockchip RK3288
7 * Author: Zain Wang <zain.wang@rock-chips.com>
9 * Some ideas are from marvell-cesa.c and s5p-sss.c driver.
13 #include <crypto/engine.h>
14 #include <crypto/internal/hash.h>
15 #include <crypto/internal/skcipher.h>
17 #include <linux/dma-mapping.h>
66 dev->num_clks = devm_clk_bulk_get_all(dev->dev, &dev->clks); in rk_crypto_get_clks()
67 if (dev->num_clks < dev->variant->num_clks) { in rk_crypto_get_clks()
68 dev_err(dev->dev, "Missing clocks, got %d instead of %d\n", in rk_crypto_get_clks()
69 dev->num_clks, dev->variant->num_clks); in rk_crypto_get_clks()
70 return -EINVAL; in rk_crypto_get_clks()
73 for (i = 0; i < dev->num_clks; i++) { in rk_crypto_get_clks()
74 cr = clk_get_rate(dev->clks[i].clk); in rk_crypto_get_clks()
75 for (j = 0; j < ARRAY_SIZE(dev->variant->rkclks); j++) { in rk_crypto_get_clks()
76 if (dev->variant->rkclks[j].max == 0) in rk_crypto_get_clks()
78 if (strcmp(dev->variant->rkclks[j].name, dev->clks[i].id)) in rk_crypto_get_clks()
80 if (cr > dev->variant->rkclks[j].max) { in rk_crypto_get_clks()
81 err = clk_set_rate(dev->clks[i].clk, in rk_crypto_get_clks()
82 dev->variant->rkclks[j].max); in rk_crypto_get_clks()
84 dev_err(dev->dev, "Fail downclocking %s from %lu to %lu\n", in rk_crypto_get_clks()
85 dev->variant->rkclks[j].name, cr, in rk_crypto_get_clks()
86 dev->variant->rkclks[j].max); in rk_crypto_get_clks()
88 dev_info(dev->dev, "Downclocking %s from %lu to %lu\n", in rk_crypto_get_clks()
89 dev->variant->rkclks[j].name, cr, in rk_crypto_get_clks()
90 dev->variant->rkclks[j].max); in rk_crypto_get_clks()
101 err = clk_bulk_prepare_enable(dev->num_clks, dev->clks); in rk_crypto_enable_clk()
103 dev_err(dev->dev, "Could not enable clock clks\n"); in rk_crypto_enable_clk()
110 clk_bulk_disable_unprepare(dev->num_clks, dev->clks); in rk_crypto_disable_clk()
122 reset_control_assert(rkdev->rst); in rk_crypto_pm_suspend()
136 reset_control_deassert(rkdev->rst); in rk_crypto_pm_resume()
149 pm_runtime_use_autosuspend(rkdev->dev); in rk_crypto_pm_init()
150 pm_runtime_set_autosuspend_delay(rkdev->dev, 2000); in rk_crypto_pm_init()
152 err = pm_runtime_set_suspended(rkdev->dev); in rk_crypto_pm_init()
155 pm_runtime_enable(rkdev->dev); in rk_crypto_pm_init()
161 pm_runtime_disable(rkdev->dev); in rk_crypto_pm_exit()
172 dev->status = 1; in rk_crypto_irq_handle()
174 dev_warn(dev->dev, "DMA Error\n"); in rk_crypto_irq_handle()
175 dev->status = 0; in rk_crypto_irq_handle()
177 complete(&dev->complete); in rk_crypto_irq_handle()
202 dev_driver_string(dd->dev), dev_name(dd->dev), in rk_crypto_debugfs_show()
203 dd->nreq); in rk_crypto_debugfs_show()
208 if (!rk_cipher_algs[i]->dev) in rk_crypto_debugfs_show()
210 switch (rk_cipher_algs[i]->type) { in rk_crypto_debugfs_show()
213 rk_cipher_algs[i]->alg.skcipher.base.base.cra_driver_name, in rk_crypto_debugfs_show()
214 rk_cipher_algs[i]->alg.skcipher.base.base.cra_name, in rk_crypto_debugfs_show()
215 rk_cipher_algs[i]->stat_req, rk_cipher_algs[i]->stat_fb); in rk_crypto_debugfs_show()
217 rk_cipher_algs[i]->stat_fb_len); in rk_crypto_debugfs_show()
219 rk_cipher_algs[i]->stat_fb_align); in rk_crypto_debugfs_show()
221 rk_cipher_algs[i]->stat_fb_sgdiff); in rk_crypto_debugfs_show()
225 rk_cipher_algs[i]->alg.hash.base.halg.base.cra_driver_name, in rk_crypto_debugfs_show()
226 rk_cipher_algs[i]->alg.hash.base.halg.base.cra_name, in rk_crypto_debugfs_show()
227 rk_cipher_algs[i]->stat_req, rk_cipher_algs[i]->stat_fb); in rk_crypto_debugfs_show()
258 rk_cipher_algs[i]->dev = crypto_info; in rk_crypto_register()
259 switch (rk_cipher_algs[i]->type) { in rk_crypto_register()
261 dev_info(crypto_info->dev, "Register %s as %s\n", in rk_crypto_register()
262 rk_cipher_algs[i]->alg.skcipher.base.base.cra_name, in rk_crypto_register()
263 rk_cipher_algs[i]->alg.skcipher.base.base.cra_driver_name); in rk_crypto_register()
264 err = crypto_engine_register_skcipher(&rk_cipher_algs[i]->alg.skcipher); in rk_crypto_register()
267 dev_info(crypto_info->dev, "Register %s as %s\n", in rk_crypto_register()
268 rk_cipher_algs[i]->alg.hash.base.halg.base.cra_name, in rk_crypto_register()
269 rk_cipher_algs[i]->alg.hash.base.halg.base.cra_driver_name); in rk_crypto_register()
270 err = crypto_engine_register_ahash(&rk_cipher_algs[i]->alg.hash); in rk_crypto_register()
273 dev_err(crypto_info->dev, "unknown algorithm\n"); in rk_crypto_register()
282 if (rk_cipher_algs[i]->type == CRYPTO_ALG_TYPE_SKCIPHER) in rk_crypto_register()
283 crypto_engine_unregister_skcipher(&rk_cipher_algs[k]->alg.skcipher); in rk_crypto_register()
285 crypto_engine_unregister_ahash(&rk_cipher_algs[i]->alg.hash); in rk_crypto_register()
295 if (rk_cipher_algs[i]->type == CRYPTO_ALG_TYPE_SKCIPHER) in rk_crypto_unregister()
296 crypto_engine_unregister_skcipher(&rk_cipher_algs[i]->alg.skcipher); in rk_crypto_unregister()
298 crypto_engine_unregister_ahash(&rk_cipher_algs[i]->alg.hash); in rk_crypto_unregister()
303 { .compatible = "rockchip,rk3288-crypto",
306 { .compatible = "rockchip,rk3328-crypto",
309 { .compatible = "rockchip,rk3399-crypto",
318 struct device *dev = &pdev->dev; in rk_crypto_probe()
322 crypto_info = devm_kzalloc(&pdev->dev, in rk_crypto_probe()
325 err = -ENOMEM; in rk_crypto_probe()
329 crypto_info->dev = &pdev->dev; in rk_crypto_probe()
332 crypto_info->variant = of_device_get_match_data(&pdev->dev); in rk_crypto_probe()
333 if (!crypto_info->variant) { in rk_crypto_probe()
334 dev_err(&pdev->dev, "Missing variant\n"); in rk_crypto_probe()
335 return -EINVAL; in rk_crypto_probe()
338 crypto_info->rst = devm_reset_control_array_get_exclusive(dev); in rk_crypto_probe()
339 if (IS_ERR(crypto_info->rst)) { in rk_crypto_probe()
340 err = PTR_ERR(crypto_info->rst); in rk_crypto_probe()
344 reset_control_assert(crypto_info->rst); in rk_crypto_probe()
346 reset_control_deassert(crypto_info->rst); in rk_crypto_probe()
348 crypto_info->reg = devm_platform_ioremap_resource(pdev, 0); in rk_crypto_probe()
349 if (IS_ERR(crypto_info->reg)) { in rk_crypto_probe()
350 err = PTR_ERR(crypto_info->reg); in rk_crypto_probe()
358 crypto_info->irq = platform_get_irq(pdev, 0); in rk_crypto_probe()
359 if (crypto_info->irq < 0) { in rk_crypto_probe()
360 err = crypto_info->irq; in rk_crypto_probe()
364 err = devm_request_irq(&pdev->dev, crypto_info->irq, in rk_crypto_probe()
366 "rk-crypto", pdev); in rk_crypto_probe()
369 dev_err(&pdev->dev, "irq request failed.\n"); in rk_crypto_probe()
373 crypto_info->engine = crypto_engine_alloc_init(&pdev->dev, true); in rk_crypto_probe()
374 if (!crypto_info->engine) { in rk_crypto_probe()
375 err = -ENOMEM; in rk_crypto_probe()
379 crypto_engine_start(crypto_info->engine); in rk_crypto_probe()
380 init_completion(&crypto_info->complete); in rk_crypto_probe()
389 list_add_tail(&crypto_info->list, &rocklist.dev_list); in rk_crypto_probe()
395 dev_err(dev, "Fail to register crypto algorithms"); in rk_crypto_probe()
407 crypto_engine_exit(crypto_info->engine); in rk_crypto_probe()
409 dev_err(dev, "Crypto Accelerator not successfully registered\n"); in rk_crypto_probe()
419 list_del(&crypto_tmp->list); in rk_crypto_remove()
431 crypto_engine_exit(crypto_tmp->engine); in rk_crypto_remove()
438 .name = "rk3288-crypto",
446 MODULE_AUTHOR("Zain Wang <zain.wang@rock-chips.com>");
447 MODULE_DESCRIPTION("Support for Rockchip's cryptographic engine");