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. Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Signed-off-by: Imre Deak <imre.deak@xxxxxxxxx> --- 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 ca55b87bd8f3a..421a0f8c28229 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