]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: sun8i-ss - avoid hash and rng references
authorArnd Bergmann <arnd@arndb.de>
Thu, 23 Apr 2026 06:55:42 +0000 (08:55 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 7 May 2026 08:10:02 +0000 (16:10 +0800)
While the sun4i-ss and sun8i-ce drivers started selecting CRYPTO_RNG,
the sun8i-ss variant does not, and causes a link failure:

aarch64-linux-ld: drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.o: in function `sun8i_ss_unregister_algs':
sun8i-ss-core.c:(.text.sun8i_ss_unregister_algs+0x94): undefined reference to `crypto_unregister_rng'
aarch64-linux-ld: drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.o: in function `sun8i_ss_probe':
sun8i-ss-core.c:(.text.sun8i_ss_probe+0x40c): undefined reference to `crypto_register_rng'

Looking more closely, I see that all of the allwinner crypto drivers have the
same logic where the rng and hash parts of the driver are optional, but then the
generic code is still selected, which is a bit inconsistent, aside from the
missing CRYPTO_RNG select on sun8i-ss.

Change the approach so only the bits that are actually used are built, using
ifdef checks around the optional portions that match the optional references
to the sub-drivers.

Ideally the drivers would get reworked in a way that keeps all the bits
related to the skcipher/ahash/rng codecs in the respective sub-drivers,
rather than having a common driver that knows about all of these.

Fixes: cdadc1435937 ("crypto: cryptomgr - Select algorithm types only when CRYPTO_SELFTESTS")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/allwinner/Kconfig
drivers/crypto/allwinner/sun4i-ss/sun4i-ss-core.c
drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c
drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c

index 7270e5fbc57387fba21b214f3d6edfa7a960ee0e..b8e75210a0e3150900f2eeed78756f5c282b40b4 100644 (file)
@@ -14,7 +14,6 @@ config CRYPTO_DEV_SUN4I_SS
        select CRYPTO_SHA1
        select CRYPTO_AES
        select CRYPTO_LIB_DES
-       select CRYPTO_RNG
        select CRYPTO_SKCIPHER
        help
          Some Allwinner SoC have a crypto accelerator named
@@ -50,7 +49,6 @@ config CRYPTO_DEV_SUN8I_CE
        select CRYPTO_CBC
        select CRYPTO_AES
        select CRYPTO_DES
-       select CRYPTO_RNG
        depends on CRYPTO_DEV_ALLWINNER
        depends on PM
        help
index 58a76e2ba64e253b5e8b6e5cf984978cfa05c989..813c4bc6312a5d72bab41577d1119517c4c0953d 100644 (file)
@@ -247,12 +247,14 @@ static int sun4i_ss_debugfs_show(struct seq_file *seq, void *v)
                                   ss_algs[i].stat_req, ss_algs[i].stat_opti, ss_algs[i].stat_fb,
                                   ss_algs[i].stat_bytes);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        seq_printf(seq, "%s %s reqs=%lu tsize=%lu\n",
                                   ss_algs[i].alg.rng.base.cra_driver_name,
                                   ss_algs[i].alg.rng.base.cra_name,
                                   ss_algs[i].stat_req, ss_algs[i].stat_bytes);
                        break;
+#endif
                case CRYPTO_ALG_TYPE_AHASH:
                        seq_printf(seq, "%s %s reqs=%lu\n",
                                   ss_algs[i].alg.hash.halg.base.cra_driver_name,
@@ -471,6 +473,7 @@ static int sun4i_ss_probe(struct platform_device *pdev)
                                goto error_alg;
                        }
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        err = crypto_register_rng(&ss_algs[i].alg.rng);
                        if (err) {
@@ -478,6 +481,7 @@ static int sun4i_ss_probe(struct platform_device *pdev)
                                        ss_algs[i].alg.rng.base.cra_name);
                        }
                        break;
+#endif
                }
        }
 
@@ -497,9 +501,11 @@ error_alg:
                case CRYPTO_ALG_TYPE_AHASH:
                        crypto_unregister_ahash(&ss_algs[i].alg.hash);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        crypto_unregister_rng(&ss_algs[i].alg.rng);
                        break;
+#endif
                }
        }
 error_pm:
@@ -520,9 +526,11 @@ static void sun4i_ss_remove(struct platform_device *pdev)
                case CRYPTO_ALG_TYPE_AHASH:
                        crypto_unregister_ahash(&ss_algs[i].alg.hash);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        crypto_unregister_rng(&ss_algs[i].alg.rng);
                        break;
+#endif
                }
        }
 
index c16bb6ce6ee37609621e677f703041faa60bbac8..f3b58ed6aed0dce7f0e7084d0d21b3e9705d435e 100644 (file)
@@ -676,6 +676,7 @@ static int sun8i_ce_debugfs_show(struct seq_file *seq, void *v)
                        seq_printf(seq, "\tFallback due to SG numbers: %lu\n",
                                   ce_algs[i].stat_fb_maxsg);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_HASH
                case CRYPTO_ALG_TYPE_AHASH:
                        seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
                                   ce_algs[i].alg.hash.base.halg.base.cra_driver_name,
@@ -692,12 +693,15 @@ static int sun8i_ce_debugfs_show(struct seq_file *seq, void *v)
                        seq_printf(seq, "\tFallback due to SG numbers: %lu\n",
                                   ce_algs[i].stat_fb_maxsg);
                        break;
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        seq_printf(seq, "%s %s reqs=%lu bytes=%lu\n",
                                   ce_algs[i].alg.rng.base.cra_driver_name,
                                   ce_algs[i].alg.rng.base.cra_name,
                                   ce_algs[i].stat_req, ce_algs[i].stat_bytes);
                        break;
+#endif
                }
        }
 #if defined(CONFIG_CRYPTO_DEV_SUN8I_CE_TRNG) && \
@@ -905,6 +909,7 @@ static int sun8i_ce_register_algs(struct sun8i_ce_dev *ce)
                                return err;
                        }
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_HASH
                case CRYPTO_ALG_TYPE_AHASH:
                        id = ce_algs[i].ce_algo_id;
                        ce_method = ce->variant->alg_hash[id];
@@ -925,6 +930,8 @@ static int sun8i_ce_register_algs(struct sun8i_ce_dev *ce)
                                return err;
                        }
                        break;
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        if (ce->variant->prng == CE_ID_NOTSUPP) {
                                dev_info(ce->dev,
@@ -942,6 +949,7 @@ static int sun8i_ce_register_algs(struct sun8i_ce_dev *ce)
                                ce_algs[i].ce = NULL;
                        }
                        break;
+#endif
                default:
                        ce_algs[i].ce = NULL;
                        dev_err(ce->dev, "ERROR: tried to register an unknown algo\n");
@@ -963,16 +971,20 @@ static void sun8i_ce_unregister_algs(struct sun8i_ce_dev *ce)
                                 ce_algs[i].alg.skcipher.base.base.cra_name);
                        crypto_engine_unregister_skcipher(&ce_algs[i].alg.skcipher);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_HASH
                case CRYPTO_ALG_TYPE_AHASH:
                        dev_info(ce->dev, "Unregister %d %s\n", i,
                                 ce_algs[i].alg.hash.base.halg.base.cra_name);
                        crypto_engine_unregister_ahash(&ce_algs[i].alg.hash);
                        break;
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        dev_info(ce->dev, "Unregister %d %s\n", i,
                                 ce_algs[i].alg.rng.base.cra_name);
                        crypto_unregister_rng(&ce_algs[i].alg.rng);
                        break;
+#endif
                }
        }
 }
index f45685707e0d3fde6b74be1e1535a44b1ef36fd1..59c9bc45ec0f2183c9d719313bbd5eb742e5d3d6 100644 (file)
@@ -501,12 +501,15 @@ static int sun8i_ss_debugfs_show(struct seq_file *seq, void *v)
                        seq_printf(seq, "\tFallback due to SG numbers: %lu\n",
                                   ss_algs[i].stat_fb_sgnum);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        seq_printf(seq, "%s %s reqs=%lu tsize=%lu\n",
                                   ss_algs[i].alg.rng.base.cra_driver_name,
                                   ss_algs[i].alg.rng.base.cra_name,
                                   ss_algs[i].stat_req, ss_algs[i].stat_bytes);
                        break;
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_HASH
                case CRYPTO_ALG_TYPE_AHASH:
                        seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
                                   ss_algs[i].alg.hash.base.halg.base.cra_driver_name,
@@ -523,6 +526,7 @@ static int sun8i_ss_debugfs_show(struct seq_file *seq, void *v)
                        seq_printf(seq, "\tFallback due to SG numbers: %lu\n",
                                   ss_algs[i].stat_fb_sgnum);
                        break;
+#endif
                }
        }
        return 0;
@@ -707,6 +711,7 @@ static int sun8i_ss_register_algs(struct sun8i_ss_dev *ss)
                                return err;
                        }
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        err = crypto_register_rng(&ss_algs[i].alg.rng);
                        if (err) {
@@ -715,6 +720,8 @@ static int sun8i_ss_register_algs(struct sun8i_ss_dev *ss)
                                ss_algs[i].ss = NULL;
                        }
                        break;
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_HASH
                case CRYPTO_ALG_TYPE_AHASH:
                        id = ss_algs[i].ss_algo_id;
                        ss_method = ss->variant->alg_hash[id];
@@ -735,6 +742,7 @@ static int sun8i_ss_register_algs(struct sun8i_ss_dev *ss)
                                return err;
                        }
                        break;
+#endif
                default:
                        ss_algs[i].ss = NULL;
                        dev_err(ss->dev, "ERROR: tried to register an unknown algo\n");
@@ -756,16 +764,20 @@ static void sun8i_ss_unregister_algs(struct sun8i_ss_dev *ss)
                                 ss_algs[i].alg.skcipher.base.base.cra_name);
                        crypto_engine_unregister_skcipher(&ss_algs[i].alg.skcipher);
                        break;
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_PRNG
                case CRYPTO_ALG_TYPE_RNG:
                        dev_info(ss->dev, "Unregister %d %s\n", i,
                                 ss_algs[i].alg.rng.base.cra_name);
                        crypto_unregister_rng(&ss_algs[i].alg.rng);
                        break;
+#endif
+#ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_HASH
                case CRYPTO_ALG_TYPE_AHASH:
                        dev_info(ss->dev, "Unregister %d %s\n", i,
                                 ss_algs[i].alg.hash.base.halg.base.cra_name);
                        crypto_engine_unregister_ahash(&ss_algs[i].alg.hash);
                        break;
+#endif
                }
        }
 }