Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: xilinx - Update probe to self discover the device

Update driver to self discover the device.

Signed-off-by: Harsh Jain <h.jain@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Harsh Jain and committed by
Herbert Xu
75578e5c 2de46852

+62 -24
+62 -24
drivers/crypto/xilinx/zynqmp-aes-gcm.c
··· 346 346 memzero_explicit(tfm_ctx, sizeof(struct zynqmp_aead_tfm_ctx)); 347 347 } 348 348 349 - static struct zynqmp_aead_drv_ctx aes_drv_ctx = { 349 + static struct zynqmp_aead_drv_ctx zynqmp_aes_drv_ctx = { 350 350 .aead.base = { 351 351 .setkey = zynqmp_aes_aead_setkey, 352 352 .setauthsize = zynqmp_aes_aead_setauthsize, ··· 375 375 }, 376 376 }; 377 377 378 + static struct xlnx_feature aes_feature_map[] = { 379 + { 380 + .family = PM_ZYNQMP_FAMILY_CODE, 381 + .feature_id = PM_SECURE_AES, 382 + .data = &zynqmp_aes_drv_ctx, 383 + }, 384 + { /* sentinel */ } 385 + }; 386 + 378 387 static int zynqmp_aes_aead_probe(struct platform_device *pdev) 379 388 { 389 + struct zynqmp_aead_drv_ctx *aes_drv_ctx; 380 390 struct device *dev = &pdev->dev; 381 391 int err; 382 392 393 + /* Verify the hardware is present */ 394 + aes_drv_ctx = xlnx_get_crypto_dev_data(aes_feature_map); 395 + if (IS_ERR(aes_drv_ctx)) { 396 + dev_err(dev, "AES is not supported on the platform\n"); 397 + return PTR_ERR(aes_drv_ctx); 398 + } 399 + 383 400 /* ZynqMP AES driver supports only one instance */ 384 - if (!aes_drv_ctx.dev) 385 - aes_drv_ctx.dev = dev; 401 + if (!aes_drv_ctx->dev) 402 + aes_drv_ctx->dev = dev; 386 403 else 387 404 return -ENODEV; 388 405 406 + platform_set_drvdata(pdev, aes_drv_ctx); 389 407 err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(ZYNQMP_DMA_BIT_MASK)); 390 408 if (err < 0) { 391 409 dev_err(dev, "No usable DMA configuration\n"); 392 410 return err; 393 411 } 394 412 395 - aes_drv_ctx.engine = crypto_engine_alloc_init(dev, 1); 396 - if (!aes_drv_ctx.engine) { 413 + aes_drv_ctx->engine = crypto_engine_alloc_init(dev, 1); 414 + if (!aes_drv_ctx->engine) { 397 415 dev_err(dev, "Cannot alloc AES engine\n"); 398 416 err = -ENOMEM; 399 417 goto err_engine; 400 418 } 401 419 402 - err = crypto_engine_start(aes_drv_ctx.engine); 420 + err = crypto_engine_start(aes_drv_ctx->engine); 403 421 if (err) { 404 422 dev_err(dev, "Cannot start AES engine\n"); 405 423 goto err_engine; 406 424 } 407 425 408 - err = crypto_engine_register_aead(&aes_drv_ctx.aead); 426 + err = crypto_engine_register_aead(&aes_drv_ctx->aead); 409 427 if (err < 0) { 410 428 dev_err(dev, "Failed to register AEAD alg.\n"); 411 - goto err_aead; 429 + goto err_engine; 412 430 } 413 431 return 0; 414 432 415 - err_aead: 416 - crypto_engine_unregister_aead(&aes_drv_ctx.aead); 417 - 418 433 err_engine: 419 - if (aes_drv_ctx.engine) 420 - crypto_engine_exit(aes_drv_ctx.engine); 434 + if (aes_drv_ctx->engine) 435 + crypto_engine_exit(aes_drv_ctx->engine); 421 436 422 437 return err; 423 438 } 424 439 425 440 static void zynqmp_aes_aead_remove(struct platform_device *pdev) 426 441 { 427 - crypto_engine_exit(aes_drv_ctx.engine); 428 - crypto_engine_unregister_aead(&aes_drv_ctx.aead); 429 - } 442 + struct zynqmp_aead_drv_ctx *aes_drv_ctx; 430 443 431 - static const struct of_device_id zynqmp_aes_dt_ids[] = { 432 - { .compatible = "xlnx,zynqmp-aes" }, 433 - { /* sentinel */ } 434 - }; 435 - MODULE_DEVICE_TABLE(of, zynqmp_aes_dt_ids); 444 + aes_drv_ctx = platform_get_drvdata(pdev); 445 + crypto_engine_exit(aes_drv_ctx->engine); 446 + crypto_engine_unregister_aead(&aes_drv_ctx->aead); 447 + } 436 448 437 449 static struct platform_driver zynqmp_aes_driver = { 438 450 .probe = zynqmp_aes_aead_probe, 439 451 .remove = zynqmp_aes_aead_remove, 440 452 .driver = { 441 453 .name = "zynqmp-aes", 442 - .of_match_table = zynqmp_aes_dt_ids, 443 454 }, 444 455 }; 445 456 446 - module_platform_driver(zynqmp_aes_driver); 447 - MODULE_DESCRIPTION("Xilinx ZynqMP AES Driver"); 457 + static struct platform_device *platform_dev; 458 + 459 + static int __init aes_driver_init(void) 460 + { 461 + int ret; 462 + 463 + ret = platform_driver_register(&zynqmp_aes_driver); 464 + if (ret) 465 + return ret; 466 + 467 + platform_dev = platform_device_register_simple(zynqmp_aes_driver.driver.name, 468 + 0, NULL, 0); 469 + if (IS_ERR(platform_dev)) { 470 + ret = PTR_ERR(platform_dev); 471 + platform_driver_unregister(&zynqmp_aes_driver); 472 + } 473 + 474 + return ret; 475 + } 476 + 477 + static void __exit aes_driver_exit(void) 478 + { 479 + platform_device_unregister(platform_dev); 480 + platform_driver_unregister(&zynqmp_aes_driver); 481 + } 482 + 483 + module_init(aes_driver_init); 484 + module_exit(aes_driver_exit); 485 + MODULE_DESCRIPTION("zynqmp aes-gcm hardware acceleration support."); 448 486 MODULE_LICENSE("GPL");