Message ID | 20220221115234.2544665-1-clabbe@baylibre.com |
---|---|
State | Accepted |
Commit | 2f5ee72ee950a677069ee8ab75af40cebba3bb3c |
Headers | show |
Series | crypto: cavium: zip: register algorithm only if hardware is present | expand |
Hi Corentin, your patch looks good to me, but I also lost access to the hardware. -- Jan Am Di., 22. Feb. 2022 um 05:34 Uhr schrieb Corentin Labbe <clabbe@baylibre.com>: > > On my renesas salavator-X, I saw some cavium driver failing crypto > self-tests. > But salvator does not have such hardware. > This is due to cavium/zip driver registering algorithms even if hardware > is not present. > The solution is to move algorithm registration in the probe function. > This permits also to simplify module init/exit by using > module_pci_driver. > > Signed-off-by: Corentin Labbe <clabbe@baylibre.com> > --- > > WARNING: this is boot tested only on salvator-X to be sure that the > cavium/zip driver no longer registers algorithms. > I do not have any cavium hardware unfortunatly. > > drivers/crypto/cavium/zip/zip_main.c | 83 ++++++++++++---------------- > 1 file changed, 35 insertions(+), 48 deletions(-) > > diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c > index 812b4ac9afd6..dc5b7bf7e1fd 100644 > --- a/drivers/crypto/cavium/zip/zip_main.c > +++ b/drivers/crypto/cavium/zip/zip_main.c > @@ -55,6 +55,11 @@ static const struct pci_device_id zip_id_table[] = { > { 0, } > }; > > +static void zip_debugfs_init(void); > +static void zip_debugfs_exit(void); > +static int zip_register_compression_device(void); > +static void zip_unregister_compression_device(void); > + > void zip_reg_write(u64 val, u64 __iomem *addr) > { > writeq(val, addr); > @@ -235,6 +240,15 @@ static int zip_init_hw(struct zip_device *zip) > return 0; > } > > +static void zip_reset(struct zip_device *zip) > +{ > + union zip_cmd_ctl cmd_ctl; > + > + cmd_ctl.u_reg64 = 0x0ull; > + cmd_ctl.s.reset = 1; /* Forces ZIP cores to do reset */ > + zip_reg_write(cmd_ctl.u_reg64, (zip->reg_base + ZIP_CMD_CTL)); > +} > + > static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > { > struct device *dev = &pdev->dev; > @@ -282,8 +296,21 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > if (err) > goto err_release_regions; > > + /* Register with the Kernel Crypto Interface */ > + err = zip_register_compression_device(); > + if (err < 0) { > + zip_err("ZIP: Kernel Crypto Registration failed\n"); > + goto err_register; > + } > + > + /* comp-decomp statistics are handled with debugfs interface */ > + zip_debugfs_init(); > + > return 0; > > +err_register: > + zip_reset(zip); > + > err_release_regions: > if (zip->reg_base) > iounmap(zip->reg_base); > @@ -305,16 +332,17 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > static void zip_remove(struct pci_dev *pdev) > { > struct zip_device *zip = pci_get_drvdata(pdev); > - union zip_cmd_ctl cmd_ctl; > int q = 0; > > if (!zip) > return; > > + zip_debugfs_exit(); > + > + zip_unregister_compression_device(); > + > if (zip->reg_base) { > - cmd_ctl.u_reg64 = 0x0ull; > - cmd_ctl.s.reset = 1; /* Forces ZIP cores to do reset */ > - zip_reg_write(cmd_ctl.u_reg64, (zip->reg_base + ZIP_CMD_CTL)); > + zip_reset(zip); > iounmap(zip->reg_base); > } > > @@ -585,7 +613,7 @@ DEFINE_SHOW_ATTRIBUTE(zip_regs); > /* Root directory for thunderx_zip debugfs entry */ > static struct dentry *zip_debugfs_root; > > -static void __init zip_debugfs_init(void) > +static void zip_debugfs_init(void) > { > if (!debugfs_initialized()) > return; > @@ -604,7 +632,7 @@ static void __init zip_debugfs_init(void) > > } > > -static void __exit zip_debugfs_exit(void) > +static void zip_debugfs_exit(void) > { > debugfs_remove_recursive(zip_debugfs_root); > } > @@ -615,48 +643,7 @@ static void __exit zip_debugfs_exit(void) { } > #endif > /* debugfs - end */ > > -static int __init zip_init_module(void) > -{ > - int ret; > - > - zip_msg("%s\n", DRV_NAME); > - > - ret = pci_register_driver(&zip_driver); > - if (ret < 0) { > - zip_err("ZIP: pci_register_driver() failed\n"); > - return ret; > - } > - > - /* Register with the Kernel Crypto Interface */ > - ret = zip_register_compression_device(); > - if (ret < 0) { > - zip_err("ZIP: Kernel Crypto Registration failed\n"); > - goto err_pci_unregister; > - } > - > - /* comp-decomp statistics are handled with debugfs interface */ > - zip_debugfs_init(); > - > - return ret; > - > -err_pci_unregister: > - pci_unregister_driver(&zip_driver); > - return ret; > -} > - > -static void __exit zip_cleanup_module(void) > -{ > - zip_debugfs_exit(); > - > - /* Unregister from the kernel crypto interface */ > - zip_unregister_compression_device(); > - > - /* Unregister this driver for pci zip devices */ > - pci_unregister_driver(&zip_driver); > -} > - > -module_init(zip_init_module); > -module_exit(zip_cleanup_module); > +module_pci_driver(zip_driver); > > MODULE_AUTHOR("Cavium Inc"); > MODULE_DESCRIPTION("Cavium Inc ThunderX ZIP Driver"); > -- > 2.34.1 >
diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c index 812b4ac9afd6..dc5b7bf7e1fd 100644 --- a/drivers/crypto/cavium/zip/zip_main.c +++ b/drivers/crypto/cavium/zip/zip_main.c @@ -55,6 +55,11 @@ static const struct pci_device_id zip_id_table[] = { { 0, } }; +static void zip_debugfs_init(void); +static void zip_debugfs_exit(void); +static int zip_register_compression_device(void); +static void zip_unregister_compression_device(void); + void zip_reg_write(u64 val, u64 __iomem *addr) { writeq(val, addr); @@ -235,6 +240,15 @@ static int zip_init_hw(struct zip_device *zip) return 0; } +static void zip_reset(struct zip_device *zip) +{ + union zip_cmd_ctl cmd_ctl; + + cmd_ctl.u_reg64 = 0x0ull; + cmd_ctl.s.reset = 1; /* Forces ZIP cores to do reset */ + zip_reg_write(cmd_ctl.u_reg64, (zip->reg_base + ZIP_CMD_CTL)); +} + static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct device *dev = &pdev->dev; @@ -282,8 +296,21 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) if (err) goto err_release_regions; + /* Register with the Kernel Crypto Interface */ + err = zip_register_compression_device(); + if (err < 0) { + zip_err("ZIP: Kernel Crypto Registration failed\n"); + goto err_register; + } + + /* comp-decomp statistics are handled with debugfs interface */ + zip_debugfs_init(); + return 0; +err_register: + zip_reset(zip); + err_release_regions: if (zip->reg_base) iounmap(zip->reg_base); @@ -305,16 +332,17 @@ static int zip_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static void zip_remove(struct pci_dev *pdev) { struct zip_device *zip = pci_get_drvdata(pdev); - union zip_cmd_ctl cmd_ctl; int q = 0; if (!zip) return; + zip_debugfs_exit(); + + zip_unregister_compression_device(); + if (zip->reg_base) { - cmd_ctl.u_reg64 = 0x0ull; - cmd_ctl.s.reset = 1; /* Forces ZIP cores to do reset */ - zip_reg_write(cmd_ctl.u_reg64, (zip->reg_base + ZIP_CMD_CTL)); + zip_reset(zip); iounmap(zip->reg_base); } @@ -585,7 +613,7 @@ DEFINE_SHOW_ATTRIBUTE(zip_regs); /* Root directory for thunderx_zip debugfs entry */ static struct dentry *zip_debugfs_root; -static void __init zip_debugfs_init(void) +static void zip_debugfs_init(void) { if (!debugfs_initialized()) return; @@ -604,7 +632,7 @@ static void __init zip_debugfs_init(void) } -static void __exit zip_debugfs_exit(void) +static void zip_debugfs_exit(void) { debugfs_remove_recursive(zip_debugfs_root); } @@ -615,48 +643,7 @@ static void __exit zip_debugfs_exit(void) { } #endif /* debugfs - end */ -static int __init zip_init_module(void) -{ - int ret; - - zip_msg("%s\n", DRV_NAME); - - ret = pci_register_driver(&zip_driver); - if (ret < 0) { - zip_err("ZIP: pci_register_driver() failed\n"); - return ret; - } - - /* Register with the Kernel Crypto Interface */ - ret = zip_register_compression_device(); - if (ret < 0) { - zip_err("ZIP: Kernel Crypto Registration failed\n"); - goto err_pci_unregister; - } - - /* comp-decomp statistics are handled with debugfs interface */ - zip_debugfs_init(); - - return ret; - -err_pci_unregister: - pci_unregister_driver(&zip_driver); - return ret; -} - -static void __exit zip_cleanup_module(void) -{ - zip_debugfs_exit(); - - /* Unregister from the kernel crypto interface */ - zip_unregister_compression_device(); - - /* Unregister this driver for pci zip devices */ - pci_unregister_driver(&zip_driver); -} - -module_init(zip_init_module); -module_exit(zip_cleanup_module); +module_pci_driver(zip_driver); MODULE_AUTHOR("Cavium Inc"); MODULE_DESCRIPTION("Cavium Inc ThunderX ZIP Driver");
On my renesas salavator-X, I saw some cavium driver failing crypto self-tests. But salvator does not have such hardware. This is due to cavium/zip driver registering algorithms even if hardware is not present. The solution is to move algorithm registration in the probe function. This permits also to simplify module init/exit by using module_pci_driver. Signed-off-by: Corentin Labbe <clabbe@baylibre.com> --- WARNING: this is boot tested only on salvator-X to be sure that the cavium/zip driver no longer registers algorithms. I do not have any cavium hardware unfortunatly. drivers/crypto/cavium/zip/zip_main.c | 83 ++++++++++++---------------- 1 file changed, 35 insertions(+), 48 deletions(-)