crypto: nx - Migrate to scomp API
authorArd Biesheuvel <ardb@kernel.org>
Sun, 16 Mar 2025 01:21:04 +0000 (09:21 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 21 Mar 2025 09:39:06 +0000 (17:39 +0800)
The only remaining user of 842 compression has been migrated to the
acomp compression API, and so the NX hardware driver has to follow suit,
given that no users of the obsolete 'comp' API remain, and it is going
to be removed.

So migrate the NX driver code to scomp. These will be wrapped and
exposed as acomp implementation via the crypto subsystem's
acomp-to-scomp adaptation layer.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/nx/nx-842.c
drivers/crypto/nx/nx-842.h
drivers/crypto/nx/nx-common-powernv.c
drivers/crypto/nx/nx-common-pseries.c

index 82214cde2bcd965b74111cc948a6afc9361227cd..b950fcce8a9be33cdf0f5713f798c0c5dd374e7a 100644 (file)
@@ -101,9 +101,13 @@ static int update_param(struct nx842_crypto_param *p,
        return 0;
 }
 
-int nx842_crypto_init(struct crypto_tfm *tfm, struct nx842_driver *driver)
+void *nx842_crypto_alloc_ctx(struct nx842_driver *driver)
 {
-       struct nx842_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct nx842_crypto_ctx *ctx;
+
+       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       if (!ctx)
+               return ERR_PTR(-ENOMEM);
 
        spin_lock_init(&ctx->lock);
        ctx->driver = driver;
@@ -114,22 +118,23 @@ int nx842_crypto_init(struct crypto_tfm *tfm, struct nx842_driver *driver)
                kfree(ctx->wmem);
                free_page((unsigned long)ctx->sbounce);
                free_page((unsigned long)ctx->dbounce);
-               return -ENOMEM;
+               kfree(ctx);
+               return ERR_PTR(-ENOMEM);
        }
 
-       return 0;
+       return ctx;
 }
-EXPORT_SYMBOL_GPL(nx842_crypto_init);
+EXPORT_SYMBOL_GPL(nx842_crypto_alloc_ctx);
 
-void nx842_crypto_exit(struct crypto_tfm *tfm)
+void nx842_crypto_free_ctx(void *p)
 {
-       struct nx842_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct nx842_crypto_ctx *ctx = p;
 
        kfree(ctx->wmem);
        free_page((unsigned long)ctx->sbounce);
        free_page((unsigned long)ctx->dbounce);
 }
-EXPORT_SYMBOL_GPL(nx842_crypto_exit);
+EXPORT_SYMBOL_GPL(nx842_crypto_free_ctx);
 
 static void check_constraints(struct nx842_constraints *c)
 {
@@ -246,11 +251,11 @@ nospc:
        return update_param(p, slen, dskip + dlen);
 }
 
-int nx842_crypto_compress(struct crypto_tfm *tfm,
+int nx842_crypto_compress(struct crypto_scomp *tfm,
                          const u8 *src, unsigned int slen,
-                         u8 *dst, unsigned int *dlen)
+                         u8 *dst, unsigned int *dlen, void *pctx)
 {
-       struct nx842_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct nx842_crypto_ctx *ctx = pctx;
        struct nx842_crypto_header *hdr =
                                container_of(&ctx->header,
                                             struct nx842_crypto_header, hdr);
@@ -431,11 +436,11 @@ usesw:
        return update_param(p, slen + padding, dlen);
 }
 
-int nx842_crypto_decompress(struct crypto_tfm *tfm,
+int nx842_crypto_decompress(struct crypto_scomp *tfm,
                            const u8 *src, unsigned int slen,
-                           u8 *dst, unsigned int *dlen)
+                           u8 *dst, unsigned int *dlen, void *pctx)
 {
-       struct nx842_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct nx842_crypto_ctx *ctx = pctx;
        struct nx842_crypto_header *hdr;
        struct nx842_crypto_param p;
        struct nx842_constraints c = *ctx->driver->constraints;
index 887d4ce3cb49b10707f8d4ef7b0498cede8638b6..f5e2c82ba8768381e8d4efa9b15f63524f112257 100644 (file)
@@ -3,7 +3,6 @@
 #ifndef __NX_842_H__
 #define __NX_842_H__
 
-#include <crypto/algapi.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #define LEN_ON_SIZE(pa, size)  ((size) - ((pa) & ((size) - 1)))
 #define LEN_ON_PAGE(pa)                LEN_ON_SIZE(pa, PAGE_SIZE)
 
+struct crypto_scomp;
+
 static inline unsigned long nx842_get_pa(void *addr)
 {
        if (!is_vmalloc_addr(addr))
@@ -182,13 +183,13 @@ struct nx842_crypto_ctx {
        struct nx842_driver *driver;
 };
 
-int nx842_crypto_init(struct crypto_tfm *tfm, struct nx842_driver *driver);
-void nx842_crypto_exit(struct crypto_tfm *tfm);
-int nx842_crypto_compress(struct crypto_tfm *tfm,
+void *nx842_crypto_alloc_ctx(struct nx842_driver *driver);
+void nx842_crypto_free_ctx(void *ctx);
+int nx842_crypto_compress(struct crypto_scomp *tfm,
                          const u8 *src, unsigned int slen,
-                         u8 *dst, unsigned int *dlen);
-int nx842_crypto_decompress(struct crypto_tfm *tfm,
+                         u8 *dst, unsigned int *dlen, void *ctx);
+int nx842_crypto_decompress(struct crypto_scomp *tfm,
                            const u8 *src, unsigned int slen,
-                           u8 *dst, unsigned int *dlen);
+                           u8 *dst, unsigned int *dlen, void *ctx);
 
 #endif /* __NX_842_H__ */
index 8c859872c1839ecaecce615a8e24d6b048e9c889..fd0a98b2fb1b250139dde5e5eb359113b9c35f00 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "nx-842.h"
 
+#include <crypto/internal/scompress.h>
 #include <linux/timer.h>
 
 #include <asm/prom.h>
@@ -1031,23 +1032,21 @@ static struct nx842_driver nx842_powernv_driver = {
        .decompress =   nx842_powernv_decompress,
 };
 
-static int nx842_powernv_crypto_init(struct crypto_tfm *tfm)
+static void *nx842_powernv_crypto_alloc_ctx(void)
 {
-       return nx842_crypto_init(tfm, &nx842_powernv_driver);
+       return nx842_crypto_alloc_ctx(&nx842_powernv_driver);
 }
 
-static struct crypto_alg nx842_powernv_alg = {
-       .cra_name               = "842",
-       .cra_driver_name        = "842-nx",
-       .cra_priority           = 300,
-       .cra_flags              = CRYPTO_ALG_TYPE_COMPRESS,
-       .cra_ctxsize            = sizeof(struct nx842_crypto_ctx),
-       .cra_module             = THIS_MODULE,
-       .cra_init               = nx842_powernv_crypto_init,
-       .cra_exit               = nx842_crypto_exit,
-       .cra_u                  = { .compress = {
-       .coa_compress           = nx842_crypto_compress,
-       .coa_decompress         = nx842_crypto_decompress } }
+static struct scomp_alg nx842_powernv_alg = {
+       .base.cra_name          = "842",
+       .base.cra_driver_name   = "842-nx",
+       .base.cra_priority      = 300,
+       .base.cra_module        = THIS_MODULE,
+
+       .alloc_ctx              = nx842_powernv_crypto_alloc_ctx,
+       .free_ctx               = nx842_crypto_free_ctx,
+       .compress               = nx842_crypto_compress,
+       .decompress             = nx842_crypto_decompress,
 };
 
 static __init int nx_compress_powernv_init(void)
@@ -1107,7 +1106,7 @@ static __init int nx_compress_powernv_init(void)
                nx842_powernv_exec = nx842_exec_vas;
        }
 
-       ret = crypto_register_alg(&nx842_powernv_alg);
+       ret = crypto_register_scomp(&nx842_powernv_alg);
        if (ret) {
                nx_delete_coprocs();
                return ret;
@@ -1128,7 +1127,7 @@ static void __exit nx_compress_powernv_exit(void)
        if (!nx842_ct)
                vas_unregister_api_powernv();
 
-       crypto_unregister_alg(&nx842_powernv_alg);
+       crypto_unregister_scomp(&nx842_powernv_alg);
 
        nx_delete_coprocs();
 }
index 56129bdf53ab03cbbefa8f2042b7b53388404dcd..f528e072494a2eacb6c2f5bbceec447d0b718f4b 100644 (file)
@@ -11,6 +11,7 @@
 #include <asm/vio.h>
 #include <asm/hvcall.h>
 #include <asm/vas.h>
+#include <crypto/internal/scompress.h>
 
 #include "nx-842.h"
 #include "nx_csbcpb.h" /* struct nx_csbcpb */
@@ -1008,23 +1009,21 @@ static struct nx842_driver nx842_pseries_driver = {
        .decompress =   nx842_pseries_decompress,
 };
 
-static int nx842_pseries_crypto_init(struct crypto_tfm *tfm)
+static void *nx842_pseries_crypto_alloc_ctx(void)
 {
-       return nx842_crypto_init(tfm, &nx842_pseries_driver);
+       return nx842_crypto_alloc_ctx(&nx842_pseries_driver);
 }
 
-static struct crypto_alg nx842_pseries_alg = {
-       .cra_name               = "842",
-       .cra_driver_name        = "842-nx",
-       .cra_priority           = 300,
-       .cra_flags              = CRYPTO_ALG_TYPE_COMPRESS,
-       .cra_ctxsize            = sizeof(struct nx842_crypto_ctx),
-       .cra_module             = THIS_MODULE,
-       .cra_init               = nx842_pseries_crypto_init,
-       .cra_exit               = nx842_crypto_exit,
-       .cra_u                  = { .compress = {
-       .coa_compress           = nx842_crypto_compress,
-       .coa_decompress         = nx842_crypto_decompress } }
+static struct scomp_alg nx842_pseries_alg = {
+       .base.cra_name          = "842",
+       .base.cra_driver_name   = "842-nx",
+       .base.cra_priority      = 300,
+       .base.cra_module        = THIS_MODULE,
+
+       .alloc_ctx              = nx842_pseries_crypto_alloc_ctx,
+       .free_ctx               = nx842_crypto_free_ctx,
+       .compress               = nx842_crypto_compress,
+       .decompress             = nx842_crypto_decompress,
 };
 
 static int nx842_probe(struct vio_dev *viodev,
@@ -1072,7 +1071,7 @@ static int nx842_probe(struct vio_dev *viodev,
        if (ret)
                goto error;
 
-       ret = crypto_register_alg(&nx842_pseries_alg);
+       ret = crypto_register_scomp(&nx842_pseries_alg);
        if (ret) {
                dev_err(&viodev->dev, "could not register comp alg: %d\n", ret);
                goto error;
@@ -1120,7 +1119,7 @@ static void nx842_remove(struct vio_dev *viodev)
        if (caps_feat)
                sysfs_remove_group(&viodev->dev.kobj, &nxcop_caps_attr_group);
 
-       crypto_unregister_alg(&nx842_pseries_alg);
+       crypto_unregister_scomp(&nx842_pseries_alg);
 
        of_reconfig_notifier_unregister(&nx842_of_nb);
 
@@ -1253,7 +1252,7 @@ static void __exit nx842_pseries_exit(void)
 
        vas_unregister_api_pseries();
 
-       crypto_unregister_alg(&nx842_pseries_alg);
+       crypto_unregister_scomp(&nx842_pseries_alg);
 
        spin_lock_irqsave(&devdata_spinlock, flags);
        old_devdata = rcu_dereference_check(devdata,