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

Reply via email to