From: <Roman.Li@amd.com>
To: <amd-gfx@lists.freedesktop.org>
Cc: Harry Wentland <harry.wentland@amd.com>,
Leo Li <sunpeng.li@amd.com>, Roman Li <roman.li@amd.com>,
Wayne Lin <wayne.lin@amd.com>,
Tom Chung <chiahsuan.chung@amd.com>,
Fangzhi Zuo <jerry.zuo@amd.com>,
Dan Wheeler <daniel.wheeler@amd.com>, Ray Wu <Ray.Wu@amd.com>,
Ivan Lipski <ivan.lipski@amd.com>, Alex Hung <alex.hung@amd.com>,
James Lin <PingLei.Lin@amd.com>,
Chenyu Chen <Chen-Yu.Chen@amd.com>,
Alvin Lee <Alvin.Lee2@amd.com>,
Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Subject: [PATCH 05/17] drm/amd/display: Set cursor_offload for all pipes for a given stream
Date: Fri, 2 Oct 2026 15:32:28 -0400 [thread overview]
Message-ID: <20261002193240.3441018-6-Roman.Li@amd.com> (raw)
In-Reply-To: <20261002193240.3441018-1-Roman.Li@amd.com>
From: Alvin Lee <Alvin.Lee2@amd.com>
[Description]
- When using the cursor offload path, the cursor_offload flag must
be set for each DPP and HUBP driving the stream
- Previous implementation only sets the flag in the DPP and HUBP for
the OTG master pipe
- Add helper function to populate an array of DPP's and HUBP's that need
to have the cursor_offload flag set
- This is to avoid passing in pipe_ctx to hwss execution params
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com>
Signed-off-by: Roman Li <roman.li@amd.com>
---
.../drm/amd/display/dc/core/dc_hw_sequencer.c | 67 ++++++++++++-------
.../gpu/drm/amd/display/dc/core/dc_stream.c | 36 ++++++----
.../amd/display/dc/hwss/dcn10/dcn10_hwseq.c | 11 ++-
.../amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 11 ++-
.../amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 57 ++++++++++------
.../amd/display/dc/hwss/dcn35/dcn35_hwseq.h | 10 +--
.../amd/display/dc/hwss/dcn50/dcn50_hwseq.c | 11 ++-
.../drm/amd/display/dc/hwss/hw_sequencer.h | 31 +++++----
8 files changed, 153 insertions(+), 81 deletions(-)
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 3d88c5c377fc..4e75eb3e3dab 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
@@ -4242,6 +4242,7 @@ void hwss_begin_cursor_offload_update(struct dc *dc, union block_sequence_params
params->begin_cursor_offload_update_params.dmub,
params->begin_cursor_offload_update_params.dpp,
params->begin_cursor_offload_update_params.hubp,
+ params->begin_cursor_offload_update_params.pipe_count,
params->begin_cursor_offload_update_params.stream_idx);
}
@@ -4252,6 +4253,7 @@ void hwss_commit_cursor_offload_update(struct dc *dc, union block_sequence_param
params->commit_cursor_offload_update_params.dmub,
params->commit_cursor_offload_update_params.dpp,
params->commit_cursor_offload_update_params.hubp,
+ params->commit_cursor_offload_update_params.pipe_count,
params->commit_cursor_offload_update_params.stream_idx);
}
@@ -4273,6 +4275,7 @@ void hwss_abort_cursor_offload_update(struct dc *dc, union block_sequence_params
params->abort_cursor_offload_update_params.dmub,
params->abort_cursor_offload_update_params.dpp,
params->abort_cursor_offload_update_params.hubp,
+ params->abort_cursor_offload_update_params.pipe_count,
params->abort_cursor_offload_update_params.stream_idx);
}
@@ -5912,25 +5915,47 @@ void hwss_add_update_cursor_offload_pipe(struct block_sequence_state *seq_state,
}
}
+uint8_t hwss_build_cursor_offload_pipe_list(struct pipe_ctx *pipe_ctx,
+ struct dpp **dpp,
+ struct hubp **hubp)
+{
+ struct pipe_ctx *otg_master = resource_get_otg_master(pipe_ctx);
+ struct pipe_ctx *odm_pipe;
+ struct pipe_ctx *mpc_pipe;
+ uint8_t count = 0;
+
+ if (!otg_master)
+ return 0;
+
+ for (odm_pipe = otg_master; odm_pipe != NULL; odm_pipe = odm_pipe->next_odm_pipe) {
+ for (mpc_pipe = odm_pipe; mpc_pipe != NULL; mpc_pipe = mpc_pipe->bottom_pipe) {
+ if (count >= MAX_PIPES)
+ return count;
+ dpp[count] = mpc_pipe->plane_res.dpp;
+ hubp[count] = mpc_pipe->plane_res.hubp;
+ count++;
+ }
+ }
+
+ return count;
+}
+
void hwss_add_commit_cursor_offload_update(struct block_sequence_state *seq_state,
struct dc *dc,
struct pipe_ctx *pipe_ctx)
{
const struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
+ struct commit_cursor_offload_update_params *p;
if (!top_pipe)
return;
if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
seq_state->steps[*seq_state->num_steps].func = HWSS_COMMIT_CURSOR_OFFLOAD_UPDATE;
- seq_state->steps[*seq_state->num_steps].params.commit_cursor_offload_update_params.dmub =
- dc->ctx->dmub_srv->dmub;
- seq_state->steps[*seq_state->num_steps].params.commit_cursor_offload_update_params.stream_idx =
- top_pipe->pipe_idx;
- seq_state->steps[*seq_state->num_steps].params.commit_cursor_offload_update_params.dpp =
- pipe_ctx->plane_res.dpp;
- seq_state->steps[*seq_state->num_steps].params.commit_cursor_offload_update_params.hubp =
- pipe_ctx->plane_res.hubp;
+ p = &seq_state->steps[*seq_state->num_steps].params.commit_cursor_offload_update_params;
+ p->dmub = dc->ctx->dmub_srv->dmub;
+ p->stream_idx = top_pipe->pipe_idx;
+ p->pipe_count = hwss_build_cursor_offload_pipe_list(pipe_ctx, p->dpp, p->hubp);
(*seq_state->num_steps)++;
}
}
@@ -5940,20 +5965,17 @@ void hwss_add_begin_cursor_offload_update(struct block_sequence_state *seq_state
struct pipe_ctx *pipe_ctx)
{
const struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
+ struct begin_cursor_offload_update_params *p;
if (!top_pipe)
return;
if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
seq_state->steps[*seq_state->num_steps].func = HWSS_BEGIN_CURSOR_OFFLOAD_UPDATE;
- seq_state->steps[*seq_state->num_steps].params.begin_cursor_offload_update_params.dmub =
- dc->ctx->dmub_srv->dmub;
- seq_state->steps[*seq_state->num_steps].params.begin_cursor_offload_update_params.stream_idx =
- top_pipe->pipe_idx;
- seq_state->steps[*seq_state->num_steps].params.begin_cursor_offload_update_params.dpp =
- pipe_ctx->plane_res.dpp;
- seq_state->steps[*seq_state->num_steps].params.begin_cursor_offload_update_params.hubp =
- pipe_ctx->plane_res.hubp;
+ p = &seq_state->steps[*seq_state->num_steps].params.begin_cursor_offload_update_params;
+ p->dmub = dc->ctx->dmub_srv->dmub;
+ p->stream_idx = top_pipe->pipe_idx;
+ p->pipe_count = hwss_build_cursor_offload_pipe_list(pipe_ctx, p->dpp, p->hubp);
(*seq_state->num_steps)++;
}
}
@@ -5963,20 +5985,17 @@ void hwss_add_abort_cursor_offload_update(struct block_sequence_state *seq_state
struct pipe_ctx *pipe_ctx)
{
const struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
+ struct abort_cursor_offload_update_params *p;
if (!top_pipe)
return;
if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
seq_state->steps[*seq_state->num_steps].func = ABORT_CURSOR_OFFLOAD_UPDATE;
- seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.dmub =
- dc->ctx->dmub_srv->dmub;
- seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.stream_idx =
- top_pipe->pipe_idx;
- seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.dpp =
- pipe_ctx->plane_res.dpp;
- seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.hubp =
- pipe_ctx->plane_res.hubp;
+ p = &seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params;
+ p->dmub = dc->ctx->dmub_srv->dmub;
+ p->stream_idx = top_pipe->pipe_idx;
+ p->pipe_count = hwss_build_cursor_offload_pipe_list(pipe_ctx, p->dpp, p->hubp);
(*seq_state->num_steps)++;
}
}
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 6b01db8b32d0..d92c51b01272 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -309,6 +309,9 @@ void program_cursor_attributes(
struct pipe_ctx *pipe_to_program = NULL;
bool enable_cursor_offload = dc_dmub_srv_is_cursor_offload_enabled(dc);
bool unlock_dmub = false;
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+ uint8_t pipe_count = 0;
if (!stream)
return;
@@ -327,10 +330,13 @@ void program_cursor_attributes(
if (enable_cursor_offload && dc->hwss.begin_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
- if (top_pipe)
+ if (top_pipe) {
+ pipe_count =
+ hwss_build_cursor_offload_pipe_list(pipe_ctx, dpp, hubp);
+
dc->hwss.begin_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_ctx->plane_res.dpp, pipe_ctx->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
} else {
if (dc->hwss.dmub_hw_control_lock && pipe_ctx->stream &&
should_use_dmub_inbox0_lock_for_link(dc, pipe_ctx->stream->link)) {
@@ -362,10 +368,10 @@ void program_cursor_attributes(
if (enable_cursor_offload && dc->hwss.commit_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_to_program);
- if (top_pipe)
+ if (top_pipe) {
dc->hwss.commit_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_to_program->plane_res.dpp, pipe_to_program->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
} else {
dc->hwss.cursor_lock(dc, pipe_to_program, false);
if (pipe_to_program->next_odm_pipe)
@@ -493,6 +499,9 @@ void program_cursor_position(
struct pipe_ctx *pipe_to_program = NULL;
bool enable_cursor_offload = dc_dmub_srv_is_cursor_offload_enabled(dc);
bool unlock_dmub = false;
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+ uint8_t pipe_count = 0;
if (!stream)
return;
@@ -515,10 +524,13 @@ void program_cursor_position(
if (enable_cursor_offload && dc->hwss.begin_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
- if (top_pipe)
+ if (top_pipe) {
+ pipe_count =
+ hwss_build_cursor_offload_pipe_list(pipe_ctx, dpp, hubp);
+
dc->hwss.begin_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_ctx->plane_res.dpp, pipe_ctx->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
} else {
if (dc->hwss.dmub_hw_control_lock && pipe_ctx->stream &&
should_use_dmub_inbox0_lock_for_link(dc, pipe_ctx->stream->link)) {
@@ -547,10 +559,10 @@ void program_cursor_position(
if (enable_cursor_offload && dc->hwss.commit_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_to_program);
- if (top_pipe)
+ if (top_pipe) {
dc->hwss.commit_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_to_program->plane_res.dpp, pipe_to_program->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
} else {
dc->hwss.cursor_lock(dc, pipe_to_program, false);
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c
index 33f7ab4c6c15..771555ec1431 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c
@@ -3168,11 +3168,16 @@ static void dcn10_update_dchubp_dpp(
if (pipe_ctx->stream->cursor_attributes.address.quad_part != 0) {
if (dc_dmub_srv_is_cursor_offload_enabled(dc) && dc->hwss.abort_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+
+ if (top_pipe) {
+ uint8_t pipe_count =
+ hwss_build_cursor_offload_pipe_list(pipe_ctx, dpp, hubp);
- if (top_pipe)
dc->hwss.abort_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_ctx->plane_res.dpp, pipe_ctx->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
}
dc->hwss.set_cursor_attribute(pipe_ctx);
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
index f408589072d7..e8b9495c799f 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
@@ -1840,11 +1840,16 @@ void dcn20_update_dchubp_dpp(
pipe_ctx->stream->cursor_attributes.address.quad_part != 0) {
if (dc_dmub_srv_is_cursor_offload_enabled(dc) && dc->hwss.abort_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+
+ if (top_pipe) {
+ uint8_t pipe_count =
+ hwss_build_cursor_offload_pipe_list(pipe_ctx, dpp, hubp);
- if (top_pipe)
dc->hwss.abort_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_ctx->plane_res.dpp, pipe_ctx->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
}
dc->hwss.set_cursor_attribute(pipe_ctx);
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
index a959d8c37b6a..41abfff6cf47 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c
@@ -1646,9 +1646,30 @@ void dcn35_hardware_release(struct dc *dc)
dc->hwss.hw_block_power_up(dc, &pg_update_state);
}
-void dcn35_abort_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, struct hubp *hubp, uint32_t stream_idx)
+/* Set the cursor offload flag on every resolved hubp/dpp in the pipe tree. */
+static void dcn35_set_cursor_offload(struct dpp **dpp, struct hubp **hubp,
+ uint8_t pipe_count, bool enable)
{
- struct dc *dc = dpp->ctx->dc;
+ uint8_t i;
+
+ for (i = 0; i < pipe_count; i++) {
+ if (hubp[i])
+ hubp[i]->cursor_offload = enable;
+ if (dpp[i])
+ dpp[i]->cursor_offload = enable;
+ }
+}
+
+void dcn35_abort_cursor_offload_update(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx)
+{
+ struct dc *dc;
+ uint8_t i;
+
+ if (pipe_count == 0 || dpp[0] == NULL)
+ return;
+
+ dc = dpp[0]->ctx->dc;
/*
* Insert a blank update to modify the write index and set pipe_mask to 0.
@@ -1667,10 +1688,10 @@ void dcn35_abort_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, s
*/
if (dc->hwss.begin_cursor_offload_update)
- dc->hwss.begin_cursor_offload_update(dmub, dpp, hubp, stream_idx);
+ dc->hwss.begin_cursor_offload_update(dmub, dpp, hubp, pipe_count, stream_idx);
if (dc->hwss.commit_cursor_offload_update)
- dc->hwss.commit_cursor_offload_update(dmub, dpp, hubp, stream_idx);
+ dc->hwss.commit_cursor_offload_update(dmub, dpp, hubp, pipe_count, stream_idx);
/*
* The aborted payload is dropped by firmware, so resync the SW cursor
@@ -1678,13 +1699,16 @@ void dcn35_abort_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, s
* set_cursor_position re-program CURSOR_ENABLE instead of skipping it
* because of a stale cache.
*/
- if (dpp->funcs->refresh_cursor_state)
- dpp->funcs->refresh_cursor_state(dpp);
- if (hubp && hubp->funcs->refresh_cursor_state)
- hubp->funcs->refresh_cursor_state(hubp);
+ for (i = 0; i < pipe_count; i++) {
+ if (dpp[i] && dpp[i]->funcs->refresh_cursor_state)
+ dpp[i]->funcs->refresh_cursor_state(dpp[i]);
+ if (hubp[i] && hubp[i]->funcs->refresh_cursor_state)
+ hubp[i]->funcs->refresh_cursor_state(hubp[i]);
+ }
}
-void dcn35_begin_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, struct hubp *hubp, uint32_t stream_idx)
+void dcn35_begin_cursor_offload_update(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx)
{
volatile struct dmub_cursor_offload_v1 *cs = dmub->cursor_offload_v1;
uint32_t write_idx, payload_idx;
@@ -1695,24 +1719,17 @@ void dcn35_begin_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, s
cs->offload_streams[stream_idx].payloads[payload_idx].write_idx_start = write_idx;
cs->offload_streams[stream_idx].payloads[payload_idx].pipe_mask = 0;
- if (hubp)
- hubp->cursor_offload = true;
-
- if (dpp)
- dpp->cursor_offload = true;
+ dcn35_set_cursor_offload(dpp, hubp, pipe_count, true);
}
-void dcn35_commit_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, struct hubp *hubp, uint32_t stream_idx)
+void dcn35_commit_cursor_offload_update(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx)
{
volatile struct dmub_cursor_offload_v1 *cs = dmub->cursor_offload_v1;
volatile struct dmub_shared_state_cursor_offload_stream_v1 *shared_stream;
uint32_t write_idx, payload_idx;
- if (hubp)
- hubp->cursor_offload = false;
-
- if (dpp)
- dpp->cursor_offload = false;
+ dcn35_set_cursor_offload(dpp, hubp, pipe_count, false);
write_idx = cs->offload_streams[stream_idx].write_idx + 1; /* new payload (+1) */
payload_idx = write_idx % ARRAY_SIZE(cs->offload_streams[stream_idx].payloads);
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h
index 9f779e408ec6..d47f7232f863 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.h
@@ -105,10 +105,12 @@ bool dcn35_is_dp_dig_pixel_rate_div_policy(struct pipe_ctx *pipe_ctx);
void dcn35_hardware_release(struct dc *dc);
-void dcn35_abort_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, struct hubp *hubp, uint32_t stream_idx);
-void dcn35_begin_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp, struct hubp *hubp, uint32_t stream_idx);
-void dcn35_commit_cursor_offload_update(struct dmub_srv *dmub, struct dpp *dpp,
- struct hubp *hubp, uint32_t stream_idx);
+void dcn35_abort_cursor_offload_update(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx);
+void dcn35_begin_cursor_offload_update(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx);
+void dcn35_commit_cursor_offload_update(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx);
void dcn35_update_cursor_offload_pipe(struct dmub_srv *dmub, uint32_t stream_idx,
uint8_t pipe_idx, const struct dpp *dpp, const struct hubp *hubp);
void dcn35_notify_cursor_offload_drr_update(struct dc *dc, struct dc_state *context,
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn50/dcn50_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn50/dcn50_hwseq.c
index 0361c520b7d9..7a82aaa6d1d6 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn50/dcn50_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn50/dcn50_hwseq.c
@@ -204,11 +204,16 @@ void dcn50_update_dchubp_dpp(
pipe_ctx->stream->cursor_attributes.address.quad_part != 0) {
if (dc_dmub_srv_is_cursor_offload_enabled(dc) && dc->hwss.abort_cursor_offload_update) {
struct pipe_ctx *top_pipe = resource_get_otg_master(pipe_ctx);
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+
+ if (top_pipe) {
+ uint8_t pipe_count =
+ hwss_build_cursor_offload_pipe_list(pipe_ctx, dpp, hubp);
- if (top_pipe)
dc->hwss.abort_cursor_offload_update(dc->ctx->dmub_srv->dmub,
- pipe_ctx->plane_res.dpp, pipe_ctx->plane_res.hubp,
- top_pipe->pipe_idx);
+ dpp, hubp, pipe_count, top_pipe->pipe_idx);
+ }
}
dc->hwss.set_cursor_attribute(pipe_ctx);
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
index c0c098b5bcaa..de7a12c706ac 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
@@ -887,8 +887,9 @@ struct phantom_hubp_post_enable_params {
struct begin_cursor_offload_update_params {
struct dmub_srv *dmub;
- struct dpp *dpp;
- struct hubp *hubp;
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+ uint8_t pipe_count;
uint32_t stream_idx;
};
@@ -902,15 +903,17 @@ struct update_cursor_offload_pipe_params {
struct commit_cursor_offload_update_params {
struct dmub_srv *dmub;
- struct dpp *dpp;
- struct hubp *hubp;
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+ uint8_t pipe_count;
uint32_t stream_idx;
};
struct abort_cursor_offload_update_params {
struct dmub_srv *dmub;
- struct dpp *dpp;
- struct hubp *hubp;
+ struct dpp *dpp[MAX_PIPES];
+ struct hubp *hubp[MAX_PIPES];
+ uint8_t pipe_count;
uint32_t stream_idx;
};
@@ -1526,12 +1529,12 @@ struct hw_sequencer_funcs {
void (*set_cursor_position_legacy)(struct pipe_ctx *pipe);
void (*set_cursor_attribute)(struct pipe_ctx *pipe);
void (*set_cursor_sdr_white_level)(struct pipe_ctx *pipe);
- void (*abort_cursor_offload_update)(struct dmub_srv *dmub, struct dpp *dpp,
- struct hubp *hubp, uint32_t stream_idx);
- void (*begin_cursor_offload_update)(struct dmub_srv *dmub, struct dpp *dpp,
- struct hubp *hubp, uint32_t stream_idx);
- void (*commit_cursor_offload_update)(struct dmub_srv *dmub, struct dpp *dpp,
- struct hubp *hubp, uint32_t stream_idx);
+ void (*abort_cursor_offload_update)(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx);
+ void (*begin_cursor_offload_update)(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx);
+ void (*commit_cursor_offload_update)(struct dmub_srv *dmub, struct dpp **dpp,
+ struct hubp **hubp, uint8_t pipe_count, uint32_t stream_idx);
void (*update_cursor_offload_pipe)(struct dmub_srv *dmub,
uint32_t stream_idx,
uint8_t pipe_idx,
@@ -2655,6 +2658,10 @@ void hwss_add_opp_program_left_edge_extra_pixel(struct block_sequence_state *seq
void hwss_add_hubp_enable_3dlut_fl(struct block_sequence_state *seq_state,
struct hubp *hubp);
+uint8_t hwss_build_cursor_offload_pipe_list(struct pipe_ctx *pipe_ctx,
+ struct dpp **dpp,
+ struct hubp **hubp);
+
void hwss_add_begin_cursor_offload_update(struct block_sequence_state *seq_state,
struct dc *dc,
struct pipe_ctx *pipe_ctx);
--
2.34.1
next prev parent reply other threads:[~2026-10-02 19:33 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-02 19:32 [PATCH 00/17] DC Patches October 2, 2026 Roman.Li
2026-10-02 19:32 ` [PATCH 01/17] drm/amd/display: enable shaper when programming 3DLUT Roman.Li
2026-10-02 19:32 ` [PATCH 02/17] drm/amd/display: log MCM shaper and 3D LUT mode in the DTN log Roman.Li
2026-10-02 19:32 ` [PATCH 03/17] drm/amd/display: only reprogram DRR when v_total values change Roman.Li
2026-10-20 0:37 ` Bruno
2026-10-02 19:32 ` [PATCH 04/17] drm/amd/display: Add HDMI RR and SCDC skips Roman.Li
2026-10-02 19:32 ` Roman.Li [this message]
2026-10-02 19:32 ` [PATCH 06/17] drm/amd/display: Refactor DMUB fast lock sequencing Roman.Li
2026-10-20 13:22 ` Melissa Wen
2026-10-02 19:32 ` [PATCH 07/17] drm/amd/display: Skip link off frame count for general UI Roman.Li
2026-10-02 19:32 ` [PATCH 08/17] drm/amd/display: allow skipping link bandwidth clear Roman.Li
2026-10-02 19:32 ` [PATCH 09/17] drm/amd/display: Prepare DSC configuration before BLS execution Roman.Li
2026-10-02 19:32 ` [PATCH 10/17] drm/amd/display: Assign alt wa bit in fams2 cmd Roman.Li
2026-10-02 19:32 ` [PATCH 11/17] drm/amd/display: Update link training no timeout behaviour on HDMI Roman.Li
2026-10-02 19:32 ` [PATCH 12/17] drm/amd/display: Revert "avoid to write signal specific for tmds" Roman.Li
2026-10-02 19:32 ` [PATCH 13/17] drm/amd/display: Handle virtual link encoder Roman.Li
2026-10-02 19:32 ` [PATCH 14/17] drm/amd/display: Add dcn42b project id Roman.Li
2026-10-02 19:32 ` [PATCH 15/17] drm/amd/display: Add debug option to override low power SR latencies Roman.Li
2026-10-02 19:32 ` [PATCH 16/17] drm/amd/display: Send HDMI VRR metadata in VTEM info packet slot Roman.Li
2026-10-02 19:32 ` [PATCH 17/17] drm/amd/display: Promote DC to 3.2.401 Roman.Li
2026-10-05 13:30 ` [PATCH 00/17] DC Patches October 2, 2026 Wheeler, Daniel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261002193240.3441018-6-Roman.Li@amd.com \
--to=roman.li@amd.com \
--cc=Alvin.Lee2@amd.com \
--cc=Chen-Yu.Chen@amd.com \
--cc=PingLei.Lin@amd.com \
--cc=Ray.Wu@amd.com \
--cc=alex.hung@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=chiahsuan.chung@amd.com \
--cc=daniel.wheeler@amd.com \
--cc=harry.wentland@amd.com \
--cc=ivan.lipski@amd.com \
--cc=jerry.zuo@amd.com \
--cc=nicholas.kazlauskas@amd.com \
--cc=sunpeng.li@amd.com \
--cc=wayne.lin@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.