+++ /dev/null
-From stable+bounces-244893-greg=kroah.com@vger.kernel.org Sat May 9 05:16:46 2026
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 8 May 2026 23:16:38 -0400
-Subject: crypto: nx - Migrate to scomp API
-To: stable@vger.kernel.org
-Cc: Ard Biesheuvel <ardb@kernel.org>, Herbert Xu <herbert@gondor.apana.org.au>, Sasha Levin <sashal@kernel.org>
-Message-ID: <20260509031639.3054679-1-sashal@kernel.org>
-
-From: Ard Biesheuvel <ardb@kernel.org>
-
-[ Upstream commit 980b5705f4e73f567e405cd18337cc32fd51cf79 ]
-
-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>
-Stable-dep-of: adb3faf2db1a ("crypto: nx - fix bounce buffer leaks in nx842_crypto_{alloc,free}_ctx")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/crypto/nx/nx-842.c | 33 +++++++++++++++++++--------------
- drivers/crypto/nx/nx-842.h | 15 ++++++++-------
- drivers/crypto/nx/nx-common-powernv.c | 31 +++++++++++++++----------------
- drivers/crypto/nx/nx-common-pseries.c | 33 ++++++++++++++++-----------------
- 4 files changed, 58 insertions(+), 54 deletions(-)
-
---- a/drivers/crypto/nx/nx-842.c
-+++ b/drivers/crypto/nx/nx-842.c
-@@ -101,9 +101,13 @@ static int update_param(struct nx842_cry
- 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
- 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;
---- a/drivers/crypto/nx/nx-842.h
-+++ b/drivers/crypto/nx/nx-842.h
-@@ -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>
-@@ -101,6 +100,8 @@
- #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__ */
---- a/drivers/crypto/nx/nx-common-powernv.c
-+++ b/drivers/crypto/nx/nx-common-powernv.c
-@@ -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
- .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_in
- 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_e
- if (!nx842_ct)
- vas_unregister_api_powernv();
-
-- crypto_unregister_alg(&nx842_powernv_alg);
-+ crypto_unregister_scomp(&nx842_powernv_alg);
-
- nx_delete_coprocs();
- }
---- a/drivers/crypto/nx/nx-common-pseries.c
-+++ b/drivers/crypto/nx/nx-common-pseries.c
-@@ -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
- .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 *v
- 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
- 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);
-
- spin_lock_irqsave(&devdata_mutex, flags);
- old_devdata = rcu_dereference_check(devdata,
-@@ -1252,7 +1251,7 @@ static void __exit nx842_pseries_exit(vo
-
- vas_unregister_api_pseries();
-
-- crypto_unregister_alg(&nx842_pseries_alg);
-+ crypto_unregister_scomp(&nx842_pseries_alg);
-
- spin_lock_irqsave(&devdata_mutex, flags);
- old_devdata = rcu_dereference_check(devdata,