]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: talitos - allocate channels with main struct
authorRosen Penev <rosenp@gmail.com>
Wed, 6 May 2026 08:56:53 +0000 (01:56 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 15 May 2026 10:08:47 +0000 (18:08 +0800)
Use a flexible array member to combine allocations.

Add __counted_by for extra runtime analysis.

Error in case of no channels as they are required.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/talitos.c
drivers/crypto/talitos.h

index bc61d0fe35140cc0970535b6ea584ecf5c768301..bd4cc06ee13c89010f22c402df3e62fc88aea45f 100644 (file)
@@ -3409,14 +3409,20 @@ static int talitos_probe(struct platform_device *ofdev)
        struct device *dev = &ofdev->dev;
        struct device_node *np = ofdev->dev.of_node;
        struct talitos_private *priv;
+       unsigned int num_channels;
        int i, err;
        int stride;
        struct resource *res;
 
-       priv = devm_kzalloc(dev, sizeof(struct talitos_private), GFP_KERNEL);
+       if (of_property_read_u32(np, "fsl,num-channels", &num_channels))
+               return -EINVAL;
+
+       priv = devm_kzalloc(dev, struct_size(priv, chan, num_channels), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
+       priv->num_channels = num_channels;
+
        INIT_LIST_HEAD(&priv->alg_list);
 
        dev_set_drvdata(dev, priv);
@@ -3436,7 +3442,6 @@ static int talitos_probe(struct platform_device *ofdev)
        }
 
        /* get SEC version capabilities from device tree */
-       of_property_read_u32(np, "fsl,num-channels", &priv->num_channels);
        of_property_read_u32(np, "fsl,channel-fifo-len", &priv->chfifo_len);
        of_property_read_u32(np, "fsl,exec-units-mask", &priv->exec_units);
        of_property_read_u32(np, "fsl,descriptor-types-mask",
@@ -3511,16 +3516,6 @@ static int talitos_probe(struct platform_device *ofdev)
                }
        }
 
-       priv->chan = devm_kcalloc(dev,
-                                 priv->num_channels,
-                                 sizeof(struct talitos_channel),
-                                 GFP_KERNEL);
-       if (!priv->chan) {
-               dev_err(dev, "failed to allocate channel management space\n");
-               err = -ENOMEM;
-               goto err_out;
-       }
-
        priv->fifo_len = roundup_pow_of_two(priv->chfifo_len);
 
        for (i = 0; i < priv->num_channels; i++) {
index 1a93ee355929d705e6e4222b53b1d0345bdf46e2..34b0b5fab7e76b335e769ddc802ffe4c5063f66b 100644 (file)
@@ -139,8 +139,6 @@ struct talitos_private {
         */
        unsigned int fifo_len;
 
-       struct talitos_channel *chan;
-
        /* next channel to be assigned next incoming descriptor */
        atomic_t last_chan ____cacheline_aligned;
 
@@ -153,6 +151,9 @@ struct talitos_private {
        /* hwrng device */
        struct hwrng rng;
        bool rng_registered;
+
+       struct talitos_channel chan[] __counted_by(num_channels);
+
 };
 
 /* .features flag */