52 lines
1.8 KiB
Diff
52 lines
1.8 KiB
Diff
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
|
|
@@ -7642,6 +7642,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;
|
|
@@ -7708,6 +7709,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
|
|
@@ -7733,16 +7750,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);
|
|
|