This makes FreeSync 2 work on some DisplayPort monitors that are lacking the
vsdb in DisplayID extensions.

Signed-off-by: Xaver Hugl <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 24 ++++++++++++-------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 1660169ae5aa..6597fe07e984 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -12557,9 +12557,9 @@ static int parse_amd_vsdb(struct amdgpu_dm_connector 
*aconnector,
        return false;
 }
 
-static int parse_hdmi_amd_vsdb(struct amdgpu_dm_connector *aconnector,
-                              const struct edid *edid,
-                              struct amdgpu_hdmi_vsdb_info *vsdb_info)
+static int parse_cea_amd_vsdb(struct amdgpu_dm_connector *aconnector,
+                             const struct edid *edid,
+                             struct amdgpu_hdmi_vsdb_info *vsdb_info)
 {
        u8 *edid_ext = NULL;
        int i;
@@ -12657,16 +12657,22 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
                                freesync_capable = true;
                }
 
-               parse_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
-
-               if (vsdb_info.replay_mode) {
+               i = parse_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
+               if (i <= 0) {
+                       /* Some DP monitors have the AMD VSDB in the CEA-861 
block instead */
+                       i = parse_cea_amd_vsdb(amdgpu_dm_connector, edid, 
&vsdb_info);
+               }
+               if (i >= 0) {
                        amdgpu_dm_connector->vsdb_info.replay_mode = 
vsdb_info.replay_mode;
                        amdgpu_dm_connector->vsdb_info.amd_vsdb_version = 
vsdb_info.amd_vsdb_version;
-                       amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_EDP;
+                       if (sink->sink_signal == SIGNAL_TYPE_EDP)
+                           amdgpu_dm_connector->as_type = 
ADAPTIVE_SYNC_TYPE_EDP;
+                       else
+                           amdgpu_dm_connector->as_type = 
ADAPTIVE_SYNC_TYPE_DP;
                }
 
        } else if (drm_edid && sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) {
-               i = parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
+               i = parse_cea_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
                if (i >= 0 && vsdb_info.freesync_supported) {
                        amdgpu_dm_connector->min_vfreq = 
vsdb_info.min_refresh_rate_hz;
                        amdgpu_dm_connector->max_vfreq = 
vsdb_info.max_refresh_rate_hz;
@@ -12682,7 +12688,7 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
                as_type = 
dm_get_adaptive_sync_support_type(amdgpu_dm_connector->dc_link);
 
        if (as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) {
-               i = parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
+               i = parse_cea_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
                if (i >= 0 && vsdb_info.freesync_supported && 
vsdb_info.amd_vsdb_version > 0) {
 
                        amdgpu_dm_connector->pack_sdp_v1_3 = true;
-- 
2.51.1

Reply via email to