drm/amd/display: Don't adjust VRR unnecessarily
authorAric Cyr <aric.cyr@amd.com>
Fri, 26 Aug 2022 21:53:34 +0000 (17:53 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 13 Sep 2022 18:33:00 +0000 (14:33 -0400)
[why]
Do not need to spend time reprogramming DRR if there were no updates to
the parameters.

[how]
Compare the current stream state to the requested one to determine if an
update is required.

In amdgpu_dm the timing_changed flag is set but never used so can remove it.
Similarly, the stream update for VRR is done after dc_commit and should
not update its adjust field until after the update is completed.  The
adjust field is managed by dc_stream_adjust_vmin_vmax and should not be
manually updated in amdgpu_dm.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Pavle Kotarac <Pavle.Kotarac@amd.com>
Signed-off-by: Aric Cyr <aric.cyr@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/dc/core/dc.c

index 7a93162..819d61f 100644 (file)
@@ -7370,11 +7370,6 @@ static void update_freesync_state_on_stream(
                &vrr_infopacket,
                pack_sdp_v1_3);
 
-       new_crtc_state->freesync_timing_changed |=
-               (memcmp(&acrtc->dm_irq_params.vrr_params.adjust,
-                       &vrr_params.adjust,
-                       sizeof(vrr_params.adjust)) != 0);
-
        new_crtc_state->freesync_vrr_info_changed |=
                (memcmp(&new_crtc_state->vrr_infopacket,
                        &vrr_infopacket,
@@ -7383,7 +7378,6 @@ static void update_freesync_state_on_stream(
        acrtc->dm_irq_params.vrr_params = vrr_params;
        new_crtc_state->vrr_infopacket = vrr_infopacket;
 
-       new_stream->adjust = acrtc->dm_irq_params.vrr_params.adjust;
        new_stream->vrr_infopacket = vrr_infopacket;
 
        if (new_crtc_state->freesync_vrr_info_changed)
@@ -7446,10 +7440,6 @@ static void update_stream_irq_parameters(
                                      new_stream,
                                      &config, &vrr_params);
 
-       new_crtc_state->freesync_timing_changed |=
-               (memcmp(&acrtc->dm_irq_params.vrr_params.adjust,
-                       &vrr_params.adjust, sizeof(vrr_params.adjust)) != 0);
-
        new_crtc_state->freesync_config = config;
        /* Copy state for access from DM IRQ handler */
        acrtc->dm_irq_params.freesync_config = config;
index b44faaa..b5ce15c 100644 (file)
@@ -681,7 +681,6 @@ struct dm_crtc_state {
 
        int crc_skip_count;
 
-       bool freesync_timing_changed;
        bool freesync_vrr_info_changed;
 
        bool dsc_force_changed;
index 9860bf3..7481801 100644 (file)
@@ -401,6 +401,9 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
 {
        int i;
 
+       if (memcmp(adjust, &stream->adjust, sizeof(struct dc_crtc_timing_adjust)) == 0)
+               return true;
+
        stream->adjust.v_total_max = adjust->v_total_max;
        stream->adjust.v_total_mid = adjust->v_total_mid;
        stream->adjust.v_total_mid_frame_num = adjust->v_total_mid_frame_num;