[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 | 15 ++++++++++++---
 .../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, 18 insertions(+), 3 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 ab01a45aef1c..6f841c84d114 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9620,7 +9620,10 @@ static void update_freesync_state_on_stream(
 
        aconn = (struct amdgpu_dm_connector *)new_stream->dm_stream_context;
 
-       if (aconn && (aconn->as_type == ADAPTIVE_SYNC_TYPE_PCON_ALLOWED ||
+       if (aconn && aconn->as_type == ADAPTIVE_SYNC_TYPE_HDMI)
+               packet_type = PACKET_TYPE_VTEM;
+
+       else if (aconn && (aconn->as_type == ADAPTIVE_SYNC_TYPE_PCON_ALLOWED ||
                      aconn->vsdb_info.replay_mode)) {
                pack_sdp_v1_3 = aconn->pack_sdp_v1_3;
 
@@ -13380,8 +13383,14 @@ void amdgpu_dm_update_freesync_caps(struct 
drm_connector *connector,
                }
 
        /* HDMI */
-       } else if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A && 
vsdb_info.freesync_supported) {
-               monitor_range_from_vsdb(&connector->display_info, &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->display_info, 
&vsdb_info);
+               } else if (vsdb_info.freesync_supported)
+                       monitor_range_from_vsdb(&connector->display_info, 
&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 07e86b16ef77..ca7c5542620d 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
@@ -60,6 +60,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 b08b52bba574..5fd9e8aadc98 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
@@ -722,6 +722,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