Atm, the MST topology state for modesetted CRTCs may get added only in
the encoder's compute config function. To make this more consistent with
other encoders add these states already earlier in the connector atomic
check function and just get the new MST state in the encoder's compute
config function which shouldn't fail.

Signed-off-by: Imre Deak <imre.d...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 23 ++++++++++++++-------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 5790fabc39e7e..6726fd36723d7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -66,9 +66,9 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct 
intel_encoder *encoder,
        int bpp, slots = -EINVAL;
        int ret = 0;
 
-       mst_state = drm_atomic_get_mst_topology_state(state, 
&intel_dp->mst_mgr);
-       if (IS_ERR(mst_state))
-               return PTR_ERR(mst_state);
+       mst_state = drm_atomic_get_new_mst_topology_state(state, 
&intel_dp->mst_mgr);
+       if (drm_WARN_ON(&i915->drm, !mst_state))
+               return -EINVAL;
 
        crtc_state->lane_count = limits->max_lane_count;
        crtc_state->port_clock = limits->max_rate;
@@ -254,11 +254,9 @@ static int intel_dp_mst_update_slots(struct intel_encoder 
*encoder,
        u8 link_coding_cap = intel_dp_is_uhbr(crtc_state) ?
                DP_CAP_ANSI_128B132B : DP_CAP_ANSI_8B10B;
 
-       topology_state = drm_atomic_get_mst_topology_state(conn_state->state, 
mgr);
-       if (IS_ERR(topology_state)) {
-               drm_dbg_kms(&i915->drm, "slot update failed\n");
-               return PTR_ERR(topology_state);
-       }
+       topology_state = 
drm_atomic_get_new_mst_topology_state(conn_state->state, mgr);
+       if (drm_WARN_ON(&i915->drm, !topology_state))
+               return -EINVAL;
 
        drm_dp_mst_update_slots(topology_state, link_coding_cap);
 
@@ -465,6 +463,15 @@ intel_dp_mst_atomic_check(struct drm_connector *connector,
        if (ret)
                return ret;
 
+       if (intel_connector_needs_modeset(state, &intel_connector->base)) {
+               struct drm_dp_mst_topology_state *mst_state;
+
+               mst_state = drm_atomic_get_mst_topology_state(&state->base,
+                                                             
&intel_connector->mst_port->mst_mgr);
+               if (IS_ERR(mst_state))
+                       return PTR_ERR(mst_state);
+       }
+
        return drm_dp_atomic_release_time_slots(&state->base,
                                                
&intel_connector->mst_port->mst_mgr,
                                                intel_connector->port);
-- 
2.37.1

Reply via email to