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.cior...@nxp.com>
Cc: sta...@vger.kernel.org
---
 drivers/bus/fsl-mc/mc-io.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/bus/fsl-mc/mc-io.c b/drivers/bus/fsl-mc/mc-io.c
index a0ad7866cbfc..cd8754763f40 100644
--- a/drivers/bus/fsl-mc/mc-io.c
+++ b/drivers/bus/fsl-mc/mc-io.c
@@ -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;
-- 
2.34.1


Reply via email to