From 5a42488d82a8df3e22507259babfc45fd88d820a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Paku=C5=82a?= Date: Tue, 1 Sep 2026 15:12:50 -0400 Subject: [PATCH] drm/amd/display: Use passive_vrr properties in amdgpu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Fangzhi Zuo --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 1 + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c | 9 ++++++++- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_freesync.c | 7 +++++++ 3 files changed, 16 insertions(+), 1 deletion(-) 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 881c8d1c3cc0df..20095d28b21706 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -1075,6 +1075,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 36ec5b7086ea80..831bfdce20b204 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 @@ -1984,6 +1984,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; @@ -3293,6 +3294,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, if (!aconnector->mst_root) { drm_connector_attach_vrr_capable_property(&aconnector->base); + drm_connector_attach_passive_vrr_capable_property(&aconnector->base); drm_connector_attach_color_format_property(&aconnector->base, supported_colorformats); } @@ -4016,8 +4018,10 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, } 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", @@ -4033,4 +4037,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 45297ee3cf136f..db3bc37a1a7e5c 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;