drm/dp_mst: Swap the order of checking root vs. non-root port BW limitations
authorImre Deak <imre.deak@intel.com>
Tue, 24 Oct 2023 01:09:00 +0000 (04:09 +0300)
committerImre Deak <imre.deak@intel.com>
Wed, 8 Nov 2023 15:22:07 +0000 (17:22 +0200)
drm_dp_mst_atomic_check_mgr() should check for BW limitation starting
from sink ports continuing towards the root port, so that drivers can
use the @failing_port returned to resolve a BW overallocation in an
ideal way. For instance from streams A,B,C in a topology A,B going
through @failing_port and C not going through it, a BW overallocation of
A,B due to a limit of the port must be resolved first before considering
the limits of other ports closer to the root port. This way can avoid
reducing the BW of stream C unnecessarily due to a BW limit closer to the
root port.

Based on the above swap the order of the BW check for the root port and
the check for all the ports downstream of it (the latter going through
the topology already in the sink->root port direction).

Cc: Lyude Paul <lyude@redhat.com>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231030155843.2251023-6-imre.deak@intel.com
drivers/gpu/drm/display/drm_dp_mst_topology.c

index 0fbfdd23ef4eb288ac30923ed85fff71ad9cb5ef..8433b9c59cf2b5549b391f432522ab9290ce0482 100644 (file)
@@ -5469,9 +5469,13 @@ EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc);
  *   - %-ENOSPC, if the new state is invalid, because of BW limitation
  *         @failing_port is set to:
  *         - The non-root port where a BW limit check failed
+ *           with all the ports downstream of @failing_port passing
+ *           the BW limit check.
  *           The returned port pointer is valid until at least
  *           one payload downstream of it exists.
  *         - %NULL if the BW limit check failed at the root port
+ *           with all the ports downstream of the root port passing
+ *           the BW limit check.
  *   - %-EINVAL, if the new state is invalid, because the root port has
  *     too many payloads.
  */
@@ -5487,17 +5491,16 @@ int drm_dp_mst_atomic_check_mgr(struct drm_atomic_state *state,
        if (!mgr->mst_state)
                return 0;
 
-       ret = drm_dp_mst_atomic_check_payload_alloc_limits(mgr, mst_state);
-       if (ret)
-               return ret;
-
        mutex_lock(&mgr->lock);
        ret = drm_dp_mst_atomic_check_mstb_bw_limit(mgr->mst_primary,
                                                    mst_state,
                                                    failing_port);
        mutex_unlock(&mgr->lock);
 
-       return ret < 0 ? ret : 0;
+       if (ret < 0)
+               return ret;
+
+       return drm_dp_mst_atomic_check_payload_alloc_limits(mgr, mst_state);
 }
 EXPORT_SYMBOL(drm_dp_mst_atomic_check_mgr);