[Why]
We'd like to expose VRR functionality to end user if HDMI sink is
advertising it's support.

[How]
VTEM info frame is used to signal HDMI sink that VRR is active.
Use VTEM info packet as vrr_infopacket

Signed-off-by: Tomasz Pakuła <[email protected]>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 13 +++++++++++--
 .../gpu/drm/amd/display/modules/freesync/freesync.c |  4 ++++
 .../drm/amd/display/modules/inc/mod_info_packet.h   |  1 +
 .../amd/display/modules/info_packet/info_packet.c   |  1 +
 4 files changed, 17 insertions(+), 2 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 ef7e02ebda41..75c3c8ad07e5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9612,6 +9612,9 @@ static void update_freesync_state_on_stream(
                                        &new_stream->adaptive_sync_infopacket);
        }
 
+       if (aconn && aconn->as_type == ADAPTIVE_SYNC_TYPE_HDMI)
+               packet_type = PACKET_TYPE_VTEM;
+
        mod_freesync_build_vrr_infopacket(
                dm->freesync_module,
                new_stream,
@@ -13347,8 +13350,14 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
                }
 
        /* HDMI */
-       } else if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A && 
vsdb_freesync) {
-               monitor_range_from_vsdb(connector, &vsdb_info);
+       } else if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) {
+               /* Prefer HDMI VRR */
+               if (hdmi_vrr->supported) {
+                       amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_HDMI;
+                       monitor_range_from_hdmi(connector, valid_vsdb_cea ? 
&vsdb_info : NULL);
+               } else if (vsdb_freesync)
+                       monitor_range_from_vsdb(connector, &vsdb_info);
+
                freesync_capable = copy_range_to_amdgpu_connector(connector);
 
        /* DP -> HDMI PCON */
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c 
b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index 1aae46d703ba..db197cf048e1 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -27,6 +27,7 @@
 #include "dc.h"
 #include "mod_freesync.h"
 #include "core_types.h"
+#include "mod_info_packet.h"
 
 #define MOD_FREESYNC_MAX_CONCURRENT_STREAMS  32
 
@@ -955,6 +956,9 @@ void mod_freesync_build_vrr_infopacket(struct mod_freesync 
*mod_freesync,
                return;
 
        switch (packet_type) {
+       case PACKET_TYPE_VTEM:
+               mod_build_vtem_infopacket(stream, vrr, infopacket);
+               break;
        case PACKET_TYPE_FS_V3:
                build_vrr_infopacket_v3(stream->signal, vrr, app_tf, 
infopacket, stream->freesync_on_desktop);
                break;
diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h 
b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
index 7bca0541443c..3fef1890a3fa 100644
--- a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
+++ b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h
@@ -59,6 +59,7 @@ enum adaptive_sync_type {
        ADAPTIVE_SYNC_TYPE_PCON_ALLOWED     = 2,
        ADAPTIVE_SYNC_TYPE_PCON_NOT_ALLOWED = 3,
        ADAPTIVE_SYNC_TYPE_EDP              = 4,
+       ADAPTIVE_SYNC_TYPE_HDMI             = 5,
 };
 
 enum adaptive_sync_sdp_version {
diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c 
b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
index 42a736a5509a..e6d3398046d5 100644
--- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
+++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
@@ -686,6 +686,7 @@ void mod_build_adaptive_sync_infopacket(const struct 
dc_stream_state *stream,
                break;
        case ADAPTIVE_SYNC_TYPE_NONE:
        case ADAPTIVE_SYNC_TYPE_PCON_NOT_ALLOWED:
+       case ADAPTIVE_SYNC_TYPE_HDMI:
        default:
                break;
        }
-- 
2.52.0

Reply via email to