drm/amdgpu: sort probed modes before adding common modes
authorYogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
Fri, 17 May 2019 10:16:58 +0000 (15:46 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 May 2019 17:46:38 +0000 (12:46 -0500)
[Why]
There are monitors which can have more than one preferred mode
set. There are chances in these monitors that if common modes are
added in function amdgpu_dm_connector_add_common_modes(), these
common modes can be calculated with different preferred mode than
the one used in function decide_crtc_timing_for_drm_display_mode().
The preferred mode can be different because after common modes
are added, the mode list is sorted and this changes the order of
preferred modes in the list. The first mode in the list with
preferred flag set is selected as preferred mode. Due to this the
preferred mode selected varies.
If same preferred mode is not selected in common mode calculation
and crtc timing, then during mode set instead of setting preferred
timing, common mode timing will be applied which can cause "out of
range" message in the monitor with monitor blanking out.

[How]
Sort the modes before adding common modes. The same sorting function
is called during common mode addition and deciding crtc timing.

Signed-off-by: Yogesh Mohan Marimuthu <yogesh.mohanmarimuthu@amd.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 340404f7803412a0d19686d6f891654c74767389..c3e78039d1e6be9e816a5e97e09cc6329694198f 100644 (file)
@@ -4588,6 +4588,15 @@ static void amdgpu_dm_connector_ddc_get_modes(struct drm_connector *connector,
                amdgpu_dm_connector->num_modes =
                                drm_add_edid_modes(connector, edid);
 
+               /* sorting the probed modes before calling function
+                * amdgpu_dm_get_native_mode() since EDID can have
+                * more than one preferred mode. The modes that are
+                * later in the probed mode list could be of higher
+                * and preferred resolution. For example, 3840x2160
+                * resolution in base EDID preferred timing and 4096x2160
+                * preferred resolution in DID extension block later.
+                */
+               drm_mode_sort(&connector->probed_modes);
                amdgpu_dm_get_native_mode(connector);
        } else {
                amdgpu_dm_connector->num_modes = 0;