From: Muaaz Nisar <[email protected]>

[Why & How]
Adding mouse trigger in dc_stream to
recover from low refresh rate idle state
upon mouse movement without vsync interrupts.

Reviewed-by: Aric Cyr <[email protected]>
Signed-off-by: Muaaz Nisar <[email protected]>
Signed-off-by: Ray Wu <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c        |  4 ++++
 drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 15 +++++++++++++++
 drivers/gpu/drm/amd/display/dc/dc_stream.h      |  9 +++++++++
 3 files changed, 28 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 17ba7af0ddcd..6f3c283431d4 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -3369,6 +3369,10 @@ static void copy_stream_update_to_stream(struct dc *dc,
                stream->scaler_sharpener_update = 
*update->scaler_sharpener_update;
        if (update->sharpening_required)
                stream->sharpening_required = *update->sharpening_required;
+
+       if (update->drr_trigger_mode) {
+               stream->drr_trigger_mode = *update->drr_trigger_mode;
+       }
 }
 
 static void backup_planes_and_stream_state(
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 9349cccc8438..191f6435e7c6 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -515,6 +515,21 @@ bool dc_stream_program_cursor_position(
                        }
                }
 
+               if (stream->drr_trigger_mode == DRR_TRIGGER_ON_FLIP_AND_CURSOR) 
{
+                       /* apply manual trigger */
+                       int i;
+
+                       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+                               struct pipe_ctx *pipe_ctx = 
&dc->current_state->res_ctx.pipe_ctx[i];
+
+                               /* trigger event on first pipe with current 
stream */
+                               if (stream == pipe_ctx->stream) {
+                                       
pipe_ctx->stream_res.tg->funcs->program_manual_trigger(pipe_ctx->stream_res.tg);
+                                       break;
+                               }
+                       }
+               }
+
                return true;
        }
 
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h 
b/drivers/gpu/drm/amd/display/dc/dc_stream.h
index 9960494007ff..86394203cee7 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
@@ -183,6 +183,11 @@ struct luminance_data {
        int dm_max_decrease_from_nominal;
 };
 
+enum dc_drr_trigger_mode {
+       DRR_TRIGGER_ON_FLIP = 0,
+       DRR_TRIGGER_ON_FLIP_AND_CURSOR,
+};
+
 struct dc_stream_state {
        // sink is deprecated, new code should not reference
        // this pointer
@@ -316,6 +321,8 @@ struct dc_stream_state {
        bool scaler_sharpener_update;
        bool sharpening_required;
 
+       enum dc_drr_trigger_mode drr_trigger_mode;
+
        struct dc_update_scratch_space *update_scratch;
 };
 
@@ -366,6 +373,8 @@ struct dc_stream_update {
        bool *hw_cursor_req;
        bool *scaler_sharpener_update;
        bool *sharpening_required;
+
+       enum dc_drr_trigger_mode *drr_trigger_mode;
 };
 
 bool dc_is_stream_unchanged(
-- 
2.43.0

Reply via email to