From: Aric Cyr <aric....@amd.com>

[why]
While bandwidth optimizations are pending, it's possible a pstate change
will occur.  During this time, VSYNC handler should not also try to update
DRR parameters causing pstate hang

[how]
Do not adjust DRR if optimize bandwidth is set.

Reviewed-by: Aric Cyr <aric....@amd.com>
Acked-by: Qingqing Zhuo <qingqing.z...@amd.com>
Signed-off-by: Aric Cyr <aric....@amd.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 48 ++++++++++++++----------
 1 file changed, 29 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 1c218c526650..cfb6f4eefce9 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -399,6 +399,13 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc,
 {
        int i;
 
+       /*
+        * Don't adjust DRR while there's bandwidth optimizations pending to
+        * avoid conflicting with firmware updates.
+        */
+       if (dc->optimized_required || dc->wm_optimized_required)
+               return false;
+
        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;
@@ -2134,27 +2141,33 @@ void dc_post_update_surfaces_to_stream(struct dc *dc)
 
        post_surface_trace(dc);
 
-       if (dc->ctx->dce_version >= DCE_VERSION_MAX)
-               TRACE_DCN_CLOCK_STATE(&context->bw_ctx.bw.dcn.clk);
-       else
+       /*
+        * Only relevant for DCN behavior where we can guarantee the 
optimization
+        * is safe to apply - retain the legacy behavior for DCE.
+        */
+
+       if (dc->ctx->dce_version < DCE_VERSION_MAX)
                TRACE_DCE_CLOCK_STATE(&context->bw_ctx.bw.dce);
+       else {
+               TRACE_DCN_CLOCK_STATE(&context->bw_ctx.bw.dcn.clk);
 
-       if (is_flip_pending_in_pipes(dc, context))
-               return;
+               if (is_flip_pending_in_pipes(dc, context))
+                       return;
 
-       for (i = 0; i < dc->res_pool->pipe_count; i++)
-               if (context->res_ctx.pipe_ctx[i].stream == NULL ||
-                   context->res_ctx.pipe_ctx[i].plane_state == NULL) {
-                       context->res_ctx.pipe_ctx[i].pipe_idx = i;
-                       dc->hwss.disable_plane(dc, 
&context->res_ctx.pipe_ctx[i]);
-               }
+               for (i = 0; i < dc->res_pool->pipe_count; i++)
+                       if (context->res_ctx.pipe_ctx[i].stream == NULL ||
+                                       
context->res_ctx.pipe_ctx[i].plane_state == NULL) {
+                               context->res_ctx.pipe_ctx[i].pipe_idx = i;
+                               dc->hwss.disable_plane(dc, 
&context->res_ctx.pipe_ctx[i]);
+                       }
 
-       process_deferred_updates(dc);
+               process_deferred_updates(dc);
 
-       dc->hwss.optimize_bandwidth(dc, context);
+               dc->hwss.optimize_bandwidth(dc, context);
 
-       if (dc->debug.enable_double_buffered_dsc_pg_support)
-               dc->hwss.update_dsc_pg(dc, context, true);
+               if (dc->debug.enable_double_buffered_dsc_pg_support)
+                       dc->hwss.update_dsc_pg(dc, context, true);
+       }
 
        dc->optimized_required = false;
        dc->wm_optimized_required = false;
@@ -4123,12 +4136,9 @@ void dc_commit_updates_for_stream(struct dc *dc,
                        if (new_pipe->plane_state && new_pipe->plane_state != 
old_pipe->plane_state)
                                new_pipe->plane_state->force_full_update = true;
                }
-       } else if (update_type == UPDATE_TYPE_FAST && dc_ctx->dce_version >= 
DCE_VERSION_MAX) {
+       } else if (update_type == UPDATE_TYPE_FAST) {
                /*
                 * Previous frame finished and HW is ready for optimization.
-                *
-                * Only relevant for DCN behavior where we can guarantee the 
optimization
-                * is safe to apply - retain the legacy behavior for DCE.
                 */
                dc_post_update_surfaces_to_stream(dc);
        }
-- 
2.34.1

Reply via email to