From: Tomasz Pakuła <[email protected]> Backport of upstream (Tomasz Pakula) amd-gfx v4 27-patch series patch 26/27, adapted to the split amdgpu_dm sources on amd-staging-drm-next.
Wire the passive_vrr DRM properties into amdgpu for HDMI/DP/eDP sinks: - Add dm_connector_state.freesync_on_desktop_capable and copy it in amdgpu_dm_connector_atomic_duplicate_state(). - Attach the passive_vrr_capable connector property alongside vrr_capable for non-MST connectors. - In amdgpu_dm_update_freesync_caps(), record freesync_on_desktop_capable and update the passive_vrr_capable property from freesync_capable. - In amdgpu_dm_get_freesync_config_for_crtc(), drive stream->freesync_on_desktop from the inverse of passive_vrr_disabled when capable, hooking into the existing DC freesync_on_desktop logic that keeps the FreeSync-Active bit set during fixed-refresh (desktop) use. Signed-off-by: Tomasz Pakuła <[email protected]> Signed-off-by: Fangzhi Zuo <[email protected]> --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 + .../drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c | 12 ++++++++++-- .../drm/amd/display/amdgpu_dm/amdgpu_dm_freesync.c | 7 +++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index 089741ba0619..0b0ab7b2aa43 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -1064,6 +1064,7 @@ struct dm_connector_state { uint8_t underscan_hborder; bool underscan_enable; bool freesync_capable; + bool freesync_on_desktop_capable; bool update_hdcp; bool abm_sysfs_forbidden; uint8_t abm_level; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c index 0e71ba498e8a..8b2eec1a683d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c @@ -1982,6 +1982,7 @@ amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector) __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base); new_state->freesync_capable = state->freesync_capable; + new_state->freesync_on_desktop_capable = state->freesync_on_desktop_capable; new_state->abm_level = state->abm_level; new_state->scaling = state->scaling; new_state->underscan_enable = state->underscan_enable; @@ -3241,8 +3242,10 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, connector_type == DRM_MODE_CONNECTOR_eDP) { drm_connector_attach_hdr_output_metadata_property(&aconnector->base); - if (!aconnector->mst_root) + if (!aconnector->mst_root) { drm_connector_attach_vrr_capable_property(&aconnector->base); + drm_connector_attach_passive_vrr_capable_property(&aconnector->base); + } if (adev->dm.hdcp_workqueue) @@ -3978,8 +3981,10 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, dm_helpers_mccs_vcp_set(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink); update: - if (dm_con_state) + if (dm_con_state) { dm_con_state->freesync_capable = freesync_capable; + dm_con_state->freesync_on_desktop_capable = freesync_capable; + } drm_dbg_driver(adev_to_drm(adev), "VRR: caps result: freesync_capable=%d min_vfreq=%d max_vfreq=%d\n", @@ -3995,4 +4000,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, if (connector->vrr_capable_property) drm_connector_set_vrr_capable_property(connector, freesync_capable); + + if (connector->passive_vrr_capable_property) + drm_connector_set_passive_vrr_capable_property(connector, freesync_capable); } diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_freesync.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_freesync.c index 281c6cec9f4b..903d5ab387d4 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_freesync.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_freesync.c @@ -138,6 +138,12 @@ void amdgpu_dm_get_freesync_config_for_crtc( config.vsif_supported = true; config.btr = true; + if (new_con_state->freesync_on_desktop_capable) + new_crtc_state->stream->freesync_on_desktop = + !new_crtc_state->base.passive_vrr_disabled; + else + new_crtc_state->stream->freesync_on_desktop = false; + if (fs_vid_mode) { config.state = VRR_STATE_ACTIVE_FIXED; config.fixed_refresh_in_uhz = new_crtc_state->freesync_config.fixed_refresh_in_uhz; @@ -149,6 +155,7 @@ void amdgpu_dm_get_freesync_config_for_crtc( } } else { config.state = VRR_STATE_UNSUPPORTED; + new_crtc_state->stream->freesync_on_desktop = false; } out: new_crtc_state->freesync_config = config; -- 2.53.0
