]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bus: fsl-mc: do not add a device-link for the UAPI used DPMCP device
authorIoana Ciornei <ioana.ciornei@nxp.com>
Tue, 8 Apr 2025 10:58:10 +0000 (13:58 +0300)
committerChristophe Leroy <christophe.leroy@csgroup.eu>
Mon, 12 May 2025 23:34:57 +0000 (01:34 +0200)
The fsl-mc bus associated to the root DPRC in a DPAA2 system exports a
device file for userspace access to the MC firmware. In case the DPRC's
local MC portal (DPMCP) is currently in use, a new DPMCP device is
allocated through the fsl_mc_portal_allocate() function.

In this case, the call to fsl_mc_portal_allocate() will fail with -EINVAL
when trying to add a device link between the root DPRC (consumer) and
the newly allocated DPMCP device (supplier). This is because the DPMCP
is a dependent of the DPRC device (the bus).

Fix this by not adding a device link in case the DPMCP is allocated for
the root DPRC's usage.

Fixes: afb77422819f ("bus: fsl-mc: automatically add a device_link on fsl_mc_[portal,object]_allocate")
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20250408105814.2837951-3-ioana.ciornei@nxp.com
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
drivers/bus/fsl-mc/mc-io.c

index a0ad7866cbfcbab8981bc87287dba9b2fe3e2452..cd8754763f40a271f4c28d5f8167653cf02e3d39 100644 (file)
@@ -214,12 +214,19 @@ int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev,
        if (error < 0)
                goto error_cleanup_resource;
 
-       dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev,
-                                                  &dpmcp_dev->dev,
-                                                  DL_FLAG_AUTOREMOVE_CONSUMER);
-       if (!dpmcp_dev->consumer_link) {
-               error = -EINVAL;
-               goto error_cleanup_mc_io;
+       /* If the DPRC device itself tries to allocate a portal (usually for
+        * UAPI interaction), don't add a device link between them since the
+        * DPMCP device is an actual child device of the DPRC and a reverse
+        * dependency is not allowed.
+        */
+       if (mc_dev != mc_bus_dev) {
+               dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev,
+                                                          &dpmcp_dev->dev,
+                                                          DL_FLAG_AUTOREMOVE_CONSUMER);
+               if (!dpmcp_dev->consumer_link) {
+                       error = -EINVAL;
+                       goto error_cleanup_mc_io;
+               }
        }
 
        *new_mc_io = mc_io;