summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc.c24
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c3
2 files changed, 22 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 878856ee1dfe..4e3f04530013 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1341,6 +1341,7 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
struct dc_crtc_timing_adjust *adjust)
{
int i;
+ bool drr_unchanged;
/*
* Don't adjust DRR while there's bandwidth optimizations pending to
@@ -1355,6 +1356,19 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
}
}
+ /* timing_adjust_pending tracks whether stream->adjust still describes the
+ * OTG, so a cleared flag plus matching values means hw is already current.
+ */
+ drr_unchanged = !stream->adjust.timing_adjust_pending &&
+ stream->adjust.v_total_min == adjust->v_total_min &&
+ 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 &&
+ stream->adjust.allow_otg_v_count_halt == adjust->allow_otg_v_count_halt;
+
+ if (drr_unchanged)
+ return true;
+
dc_exit_ips_for_hw_access(dc);
stream->adjust.v_total_max = adjust->v_total_max;
@@ -1365,11 +1379,13 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
if (dc->caps.max_v_total != 0 &&
(adjust->v_total_max > dc->caps.max_v_total || adjust->v_total_min > dc->caps.max_v_total)) {
- stream->adjust.timing_adjust_pending = false;
- if (adjust->allow_otg_v_count_halt)
+ if (adjust->allow_otg_v_count_halt) {
+ stream->adjust.timing_adjust_pending = false;
return set_long_vtotal(dc, stream, adjust);
- else
- return false;
+ }
+ /* Nothing reached hw, so stream->adjust no longer describes the OTG. */
+ stream->adjust.timing_adjust_pending = true;
+ return false;
}
for (i = 0; i < MAX_PIPES; i++) {
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
index 21a62ca4c8dc..3d88c5c377fc 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
@@ -716,7 +716,8 @@ void set_drr_and_clear_adjust_pending(
pipe_ctx->stream_res.tg, params);
if (stream)
- stream->adjust.timing_adjust_pending = false;
+ /* A null params resets DRR in hw, leaving stream->adjust stale. */
+ stream->adjust.timing_adjust_pending = (params == NULL);
}
void get_fams2_visual_confirm_color(