summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMuaaz Nisar <muaaz.nisar@amd.com>2026-02-04 03:08:01 -0500
committerAlex Deucher <alexander.deucher@amd.com>2026-02-19 12:16:10 -0500
commit63b7f5826508a2b81e3010200d13ce92f0b2311d (patch)
tree3618dd16a8a182be53f35c280f85d4c28d638dc7 /drivers/gpu
parentc6e2639cdcf07810dcd56c64ab1aeccaa5877035 (diff)
drm/amd/display: Implementing ramless idle mouse trigger
[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 <aric.cyr@amd.com> Signed-off-by: Muaaz Nisar <muaaz.nisar@amd.com> Signed-off-by: Ray Wu <ray.wu@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc.c4
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_stream.c15
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_stream.h9
3 files changed, 28 insertions, 0 deletions
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(