drm/amd/display: disable desktop VRR when using older flip model
authorhvanzyll <hvanzyll@amd.com>
Sun, 9 May 2021 00:50:05 +0000 (20:50 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 May 2021 16:24:34 +0000 (12:24 -0400)
[WHY]
OS uses older flip model which does not work with desktop
VRR causing memory allocations at the wrong IRQ level.

[HOW]
Checks added to flip model to verify model is 2.2 or greater when
doing any of the desktop VRR checks for full updates. This
prevents full updates when VRR changes until a mode change.

Signed-off-by: Harry VanZyllDeJong <hvanzyll@amd.com>
Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_stream.h
drivers/gpu/drm/amd/display/modules/freesync/freesync.c

index 13dae7238a58cf0a128fa68202c4c28c9131b364..0ab1a33dae84966c0adb1f202a711fc1987c5397 100644 (file)
@@ -179,6 +179,9 @@ struct dc_stream_state {
 
        bool use_vsc_sdp_for_colorimetry;
        bool ignore_msa_timing_param;
+
+       bool freesync_on_desktop;
+
        bool converter_disable_audio;
        uint8_t qs_bit;
        uint8_t qy_bit;
index 3f4f44b44e6a9a9174bb4fbcdfed72043affa0c0..b99aa232bd8b1670498122287f21d20d5c874cf7 100644 (file)
@@ -516,7 +516,8 @@ bool mod_freesync_get_v_position(struct mod_freesync *mod_freesync,
 }
 
 static void build_vrr_infopacket_data_v1(const struct mod_vrr_params *vrr,
-               struct dc_info_packet *infopacket)
+               struct dc_info_packet *infopacket,
+               bool freesync_on_desktop)
 {
        /* PB1 = 0x1A (24bit AMD IEEE OUI (0x00001A) - Byte 0) */
        infopacket->sb[1] = 0x1A;
@@ -542,10 +543,16 @@ static void build_vrr_infopacket_data_v1(const struct mod_vrr_params *vrr,
                        vrr->state != VRR_STATE_UNSUPPORTED)
                infopacket->sb[6] |= 0x02;
 
-       /* PB6 = [Bit 2 = FreeSync Active] */
-       if (vrr->state != VRR_STATE_DISABLED &&
+       if (freesync_on_desktop) {
+               /* PB6 = [Bit 2 = FreeSync Active] */
+               if (vrr->state != VRR_STATE_DISABLED &&
                        vrr->state != VRR_STATE_UNSUPPORTED)
-               infopacket->sb[6] |= 0x04;
+                       infopacket->sb[6] |= 0x04;
+       } else {
+               if (vrr->state == VRR_STATE_ACTIVE_VARIABLE ||
+                       vrr->state == VRR_STATE_ACTIVE_FIXED)
+                       infopacket->sb[6] |= 0x04;
+       }
 
        // For v1 & 2 infoframes program nominal if non-fs mode, otherwise full range
        /* PB7 = FreeSync Minimum refresh rate (Hz) */
@@ -824,13 +831,14 @@ static void build_vrr_infopacket_checksum(unsigned int *payload_size,
 
 static void build_vrr_infopacket_v1(enum signal_type signal,
                const struct mod_vrr_params *vrr,
-               struct dc_info_packet *infopacket)
+               struct dc_info_packet *infopacket,
+               bool freesync_on_desktop)
 {
        /* SPD info packet for FreeSync */
        unsigned int payload_size = 0;
 
        build_vrr_infopacket_header_v1(signal, infopacket, &payload_size);
-       build_vrr_infopacket_data_v1(vrr, infopacket);
+       build_vrr_infopacket_data_v1(vrr, infopacket, freesync_on_desktop);
        build_vrr_infopacket_checksum(&payload_size, infopacket);
 
        infopacket->valid = true;
@@ -839,12 +847,13 @@ static void build_vrr_infopacket_v1(enum signal_type signal,
 static void build_vrr_infopacket_v2(enum signal_type signal,
                const struct mod_vrr_params *vrr,
                enum color_transfer_func app_tf,
-               struct dc_info_packet *infopacket)
+               struct dc_info_packet *infopacket,
+               bool freesync_on_desktop)
 {
        unsigned int payload_size = 0;
 
        build_vrr_infopacket_header_v2(signal, infopacket, &payload_size);
-       build_vrr_infopacket_data_v1(vrr, infopacket);
+       build_vrr_infopacket_data_v1(vrr, infopacket, freesync_on_desktop);
 
        build_vrr_infopacket_fs2_data(app_tf, infopacket);
 
@@ -953,12 +962,12 @@ void mod_freesync_build_vrr_infopacket(struct mod_freesync *mod_freesync,
 #endif
                break;
        case PACKET_TYPE_FS_V2:
-               build_vrr_infopacket_v2(stream->signal, vrr, app_tf, infopacket);
+               build_vrr_infopacket_v2(stream->signal, vrr, app_tf, infopacket, stream->freesync_on_desktop);
                break;
        case PACKET_TYPE_VRR:
        case PACKET_TYPE_FS_V1:
        default:
-               build_vrr_infopacket_v1(stream->signal, vrr, infopacket);
+               build_vrr_infopacket_v1(stream->signal, vrr, infopacket, stream->freesync_on_desktop);
        }
 
        if (true == pack_sdp_v1_3 &&