]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
7.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 Jul 2026 10:01:25 +0000 (12:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 Jul 2026 10:01:25 +0000 (12:01 +0200)
added patches:
crypto-xilinx-trng-remove-crypto_rng-interface.patch

queue-7.1/crypto-xilinx-trng-remove-crypto_rng-interface.patch [new file with mode: 0644]
queue-7.1/series

diff --git a/queue-7.1/crypto-xilinx-trng-remove-crypto_rng-interface.patch b/queue-7.1/crypto-xilinx-trng-remove-crypto_rng-interface.patch
new file mode 100644 (file)
index 0000000..58ce487
--- /dev/null
@@ -0,0 +1,213 @@
+From 32b4d29280ed2a991dc196d5845b892acedc63b8 Mon Sep 17 00:00:00 2001
+From: Eric Biggers <ebiggers@kernel.org>
+Date: Sun, 31 May 2026 12:17:35 -0700
+Subject: crypto: xilinx-trng - Remove crypto_rng interface
+
+From: Eric Biggers <ebiggers@kernel.org>
+
+commit 32b4d29280ed2a991dc196d5845b892acedc63b8 upstream.
+
+Implementing the crypto_rng interface has no purpose, as it isn't used
+in practice.  It's being removed from other drivers too.  Just remove
+it.  This leaves hwrng, which is actually used.
+
+Tagging with 'Cc stable' due to the bugs that this removes:
+
+  - xtrng_trng_generate() sometimes returned success even when it didn't
+    fill in all the bytes.
+
+  - It was possible for xtrng_trng_generate() and
+    xtrng_hwrng_trng_read() to run concurrently and interfere with each
+    other, as the locking code in xtrng_hwrng_trng_read() was broken.
+
+Fixes: 8979744aca80 ("crypto: xilinx - Add TRNG driver for Versal")
+Cc: stable@vger.kernel.org
+Signed-off-by: Eric Biggers <ebiggers@kernel.org>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/crypto/Kconfig              |    1 
+ drivers/crypto/xilinx/xilinx-trng.c |   85 +-----------------------------------
+ 2 files changed, 4 insertions(+), 82 deletions(-)
+
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -721,7 +721,6 @@ config CRYPTO_DEV_XILINX_TRNG
+       tristate "Support for Xilinx True Random Generator"
+       depends on ZYNQMP_FIRMWARE || COMPILE_TEST
+       select CRYPTO_DF80090A
+-      select CRYPTO_RNG
+       select HW_RANDOM
+       help
+         Xilinx Versal SoC driver provides kernel-side support for True Random Number
+--- a/drivers/crypto/xilinx/xilinx-trng.c
++++ b/drivers/crypto/xilinx/xilinx-trng.c
+@@ -6,7 +6,6 @@
+ #include <linux/bitfield.h>
+ #include <linux/clk.h>
+-#include <linux/crypto.h>
+ #include <linux/delay.h>
+ #include <linux/firmware/xlnx-zynqmp.h>
+ #include <linux/hw_random.h>
+@@ -14,14 +13,12 @@
+ #include <linux/iopoll.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+-#include <linux/mutex.h>
+ #include <linux/mod_devicetable.h>
+ #include <linux/platform_device.h>
+ #include <crypto/aes.h>
+ #include <crypto/df_sp80090a.h>
+ #include <crypto/internal/drbg.h>
+ #include <crypto/internal/cipher.h>
+-#include <crypto/internal/rng.h>
+ /* TRNG Registers Offsets */
+ #define TRNG_STATUS_OFFSET                    0x4U
+@@ -61,16 +58,9 @@ struct xilinx_rng {
+       struct device *dev;
+       unsigned char *scratchpadbuf;
+       struct aes_enckey *aeskey;
+-      struct mutex lock;      /* Protect access to TRNG device */
+       struct hwrng trng;
+ };
+-struct xilinx_rng_ctx {
+-      struct xilinx_rng *rng;
+-};
+-
+-static struct xilinx_rng *xilinx_rng_dev;
+-
+ static void xtrng_readwrite32(void __iomem *addr, u32 mask, u8 value)
+ {
+       u32 val;
+@@ -246,47 +236,6 @@ static int xtrng_random_bytes_generate(s
+       return nbytes;
+ }
+-static int xtrng_trng_generate(struct crypto_rng *tfm, const u8 *src, u32 slen,
+-                             u8 *dst, u32 dlen)
+-{
+-      struct xilinx_rng_ctx *ctx = crypto_rng_ctx(tfm);
+-      int ret;
+-
+-      mutex_lock(&ctx->rng->lock);
+-      ret = xtrng_random_bytes_generate(ctx->rng, dst, dlen, true);
+-      mutex_unlock(&ctx->rng->lock);
+-
+-      return ret < 0 ? ret : 0;
+-}
+-
+-static int xtrng_trng_seed(struct crypto_rng *tfm, const u8 *seed, unsigned int slen)
+-{
+-      return 0;
+-}
+-
+-static int xtrng_trng_init(struct crypto_tfm *rtfm)
+-{
+-      struct xilinx_rng_ctx *ctx = crypto_tfm_ctx(rtfm);
+-
+-      ctx->rng = xilinx_rng_dev;
+-
+-      return 0;
+-}
+-
+-static struct rng_alg xtrng_trng_alg = {
+-      .generate = xtrng_trng_generate,
+-      .seed = xtrng_trng_seed,
+-      .seedsize = 0,
+-      .base = {
+-              .cra_name = "stdrng",
+-              .cra_driver_name = "xilinx-trng",
+-              .cra_priority = 300,
+-              .cra_ctxsize = sizeof(struct xilinx_rng_ctx),
+-              .cra_module = THIS_MODULE,
+-              .cra_init = xtrng_trng_init,
+-      },
+-};
+-
+ static int xtrng_hwrng_trng_read(struct hwrng *hwrng, void *data, size_t max, bool wait)
+ {
+       u8 buf[TRNG_SEC_STRENGTH_BYTES];
+@@ -294,12 +243,6 @@ static int xtrng_hwrng_trng_read(struct
+       int ret = -EINVAL, i = 0;
+       rng = container_of(hwrng, struct xilinx_rng, trng);
+-      /* Return in case wait not set and lock not available. */
+-      if (!mutex_trylock(&rng->lock) && !wait)
+-              return 0;
+-      else if (!mutex_is_locked(&rng->lock) && wait)
+-              mutex_lock(&rng->lock);
+-
+       while (i < max) {
+               ret = xtrng_random_bytes_generate(rng, buf, TRNG_SEC_STRENGTH_BYTES, wait);
+               if (ret < 0)
+@@ -308,8 +251,6 @@ static int xtrng_hwrng_trng_read(struct
+               memcpy(data + i, buf, min_t(int, ret, (max - i)));
+               i += min_t(int, ret, (max - i));
+       }
+-      mutex_unlock(&rng->lock);
+-
+       return ret;
+ }
+@@ -355,40 +296,24 @@ static int xtrng_probe(struct platform_d
+       sb_size = crypto_drbg_ctr_df_datalen(TRNG_SEED_LEN_BYTES, AES_BLOCK_SIZE);
+       rng->scratchpadbuf = devm_kzalloc(&pdev->dev, sb_size, GFP_KERNEL);
+-      if (!rng->scratchpadbuf) {
+-              ret = -ENOMEM;
+-              goto end;
+-      }
++      if (!rng->scratchpadbuf)
++              return -ENOMEM;
+       xtrng_trng_reset(rng->rng_base);
+       ret = xtrng_reseed_internal(rng);
+       if (ret) {
+               dev_err(&pdev->dev, "TRNG Seed fail\n");
+-              goto end;
+-      }
+-
+-      xilinx_rng_dev = rng;
+-      mutex_init(&rng->lock);
+-      ret = crypto_register_rng(&xtrng_trng_alg);
+-      if (ret) {
+-              dev_err(&pdev->dev, "Crypto Random device registration failed: %d\n", ret);
+-              goto end;
++              return ret;
+       }
+       ret = xtrng_hwrng_register(&rng->trng);
+       if (ret) {
+               dev_err(&pdev->dev, "HWRNG device registration failed: %d\n", ret);
+-              goto crypto_rng_free;
++              return ret;
+       }
+       platform_set_drvdata(pdev, rng);
+       return 0;
+-
+-crypto_rng_free:
+-      crypto_unregister_rng(&xtrng_trng_alg);
+-
+-end:
+-      return ret;
+ }
+ static void xtrng_remove(struct platform_device *pdev)
+@@ -398,13 +323,11 @@ static void xtrng_remove(struct platform
+       rng = platform_get_drvdata(pdev);
+       xtrng_hwrng_unregister(&rng->trng);
+-      crypto_unregister_rng(&xtrng_trng_alg);
+       xtrng_write_multiple_registers(rng->rng_base + TRNG_EXT_SEED_OFFSET, zero,
+                                      TRNG_NUM_INIT_REGS);
+       xtrng_write_multiple_registers(rng->rng_base + TRNG_PER_STRNG_OFFSET, zero,
+                                      TRNG_NUM_INIT_REGS);
+       xtrng_hold_reset(rng->rng_base);
+-      xilinx_rng_dev = NULL;
+ }
+ static const struct of_device_id xtrng_of_match[] = {
index 6db93ab7296f91c47d024dfe164e0ddf03e58c6f..e550e42976a2315484dba74f73146cba8b1762e4 100644 (file)
@@ -2078,3 +2078,4 @@ usb-atm-ueagle-atm-use-dev_dbg-for-device-found-message.patch
 usb-atm-ueagle-atm-remove-function-entry-exit-debug-messages.patch
 usb-atm-ueagle-atm-wait-for-pre-firmware-load-in-.disconnect.patch
 liveupdate-validate-session-type-before-performing-operation.patch
+crypto-xilinx-trng-remove-crypto_rng-interface.patch