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
