diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -7622,6 +7622,7 @@ create_stream_for_sink(struct drm_connector *connector, struct drm_display_mode saved_mode; struct drm_display_mode *freesync_mode = NULL; struct drm_display_mode *dsc_passthru_mode = NULL; + unsigned int dsc_passthru_match_flags; bool native_mode_found = false; bool recalculate_timing = false; bool scale = dm_state->scaling != RMX_OFF; @@ -7688,6 +7689,22 @@ create_stream_for_sink(struct drm_connector *connector, mode_refresh = drm_mode_vrefresh(&mode); + dsc_passthru_match_flags = DRM_MODE_MATCH_TIMINGS | + DRM_MODE_MATCH_CLOCK | + DRM_MODE_MATCH_FLAGS | + DRM_MODE_MATCH_3D_FLAGS; + if (mode.picture_aspect_ratio) + dsc_passthru_match_flags |= DRM_MODE_MATCH_ASPECT_RATIO; + + list_for_each_entry(dsc_passthru_mode, &connector->modes, head) { + if (drm_mode_match(dsc_passthru_mode, &mode, + dsc_passthru_match_flags)) { + mode.dsc_passthrough_timings_support = + dsc_passthru_mode->dsc_passthrough_timings_support; + break; + } + } + if (preferred_mode == NULL) { /* * This may not be an error, the use case is when we have no @@ -7713,16 +7730,6 @@ create_stream_for_sink(struct drm_connector *connector, } } - list_for_each_entry(dsc_passthru_mode, &connector->modes, head) { - if (dsc_passthru_mode->hdisplay == mode.hdisplay && - dsc_passthru_mode->vdisplay == mode.vdisplay && - drm_mode_vrefresh(dsc_passthru_mode) == mode_refresh) { - mode.dsc_passthrough_timings_support = - dsc_passthru_mode->dsc_passthrough_timings_support; - break; - } - } - if (recalculate_timing) drm_mode_set_crtcinfo(&saved_mode, 0);