drm/amd/display: Refactor DPP_PROGRAM_GAMUT_REMAP to drop pipe_ctx param

[why]
Pipe_ctx shouldn't be passed as block sequence block parameter.

[how]
- Adjust program_gamut_remap_params struct.
- Adjust program_gamut_remap interface and implementations.
- Adjust program_gamut_remap callsites to match new signature.

Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Signed-off-by: Tomasz Siemek <tomasz.siemek@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Tomasz Siemek 2026-07-07 12:43:43 +02:00 committed by Alex Deucher
parent 1eefee5466
commit d5622bd3a7
11 changed files with 99 additions and 48 deletions

View File

@ -831,7 +831,15 @@ bool dc_stream_set_gamut_remap(struct dc *dc, const struct dc_stream_state *stre
for (i = 0; i < MAX_PIPES; i++) {
if (dc->current_state->res_ctx.pipe_ctx[i].stream == stream) {
pipes = &dc->current_state->res_ctx.pipe_ctx[i];
dc->hwss.program_gamut_remap(pipes);
dc->hwss.program_gamut_remap(&(struct program_gamut_remap_params) {
.xfm = pipes->plane_res.xfm,
.dpp = pipes->plane_res.dpp,
.mpc = dc->res_pool->mpc,
.mpcc_id = pipes->plane_res.mpcc_inst,
.stream = pipes->stream,
.plane = pipes->plane_state,
.is_top_pipe = pipes->top_pipe == NULL,
});
ret = true;
}
}

View File

@ -1069,7 +1069,14 @@ void hwss_build_fast_sequence(struct dc *dc,
if (dc->hwss.program_gamut_remap &&
(current_mpc_pipe->plane_state->update_bits.gamut_remap_change ||
current_mpc_pipe->stream->update_flags.bits.gamut_remap)) {
block_sequence[*num_steps].params.program_gamut_remap_params.pipe_ctx = current_mpc_pipe;
struct program_gamut_remap_params *params = &block_sequence[*num_steps].params.program_gamut_remap_params;
params->dpp = current_mpc_pipe->plane_res.dpp;
params->mpc = dc->res_pool->mpc;
params->xfm = current_mpc_pipe->plane_res.xfm;
params->mpcc_id = current_mpc_pipe->plane_res.hubp->inst;
params->plane = current_mpc_pipe->plane_state;
params->stream = current_mpc_pipe->stream;
params->is_top_pipe = current_mpc_pipe->top_pipe == NULL;
block_sequence[*num_steps].func = DPP_PROGRAM_GAMUT_REMAP;
(*num_steps)++;
}
@ -1236,7 +1243,8 @@ void hwss_execute_sequence(struct dc *dc,
params->set_input_transfer_func_params.plane_state);
break;
case DPP_PROGRAM_GAMUT_REMAP:
hwss_program_gamut_remap(params);
if (dc->hwss.program_gamut_remap)
dc->hwss.program_gamut_remap(&params->program_gamut_remap_params);
break;
case HUBP_ENABLE_3DLUT_FL:
hwss_hubp_enable_3dlut_fl(params);
@ -1779,7 +1787,14 @@ void hwss_add_dpp_program_gamut_remap(struct block_sequence_state *seq_state,
struct pipe_ctx *pipe_ctx)
{
if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
seq_state->steps[*seq_state->num_steps].params.program_gamut_remap_params.pipe_ctx = pipe_ctx;
struct program_gamut_remap_params *params = &seq_state->steps[*seq_state->num_steps].params.program_gamut_remap_params;
params->xfm = pipe_ctx->plane_res.xfm;
params->dpp = pipe_ctx->plane_res.dpp;
params->mpc = pipe_ctx->stream->ctx->dc->res_pool->mpc;
params->mpcc_id = pipe_ctx->plane_res.hubp->inst;
params->plane = pipe_ctx->plane_state;
params->stream = pipe_ctx->stream;
params->is_top_pipe = pipe_ctx->top_pipe == NULL;
seq_state->steps[*seq_state->num_steps].func = DPP_PROGRAM_GAMUT_REMAP;
(*seq_state->num_steps)++;
}
@ -3617,12 +3632,20 @@ void hwss_set_cursor_sdr_white_level(union block_sequence_params *params)
dc->hwss.set_cursor_sdr_white_level(pipe_ctx);
}
void hwss_program_gamut_remap(union block_sequence_params *params)
void hwss_program_gamut_remap(struct pipe_ctx *pipe_ctx)
{
struct dc *dc = params->program_gamut_remap_params.pipe_ctx->stream->ctx->dc;
struct dc *dc = pipe_ctx->stream->ctx->dc;
if (dc && dc->hwss.program_gamut_remap)
dc->hwss.program_gamut_remap(params->program_gamut_remap_params.pipe_ctx);
if (dc->hwss.program_gamut_remap)
dc->hwss.program_gamut_remap(&(struct program_gamut_remap_params) {
.xfm = pipe_ctx->plane_res.xfm,
.dpp = pipe_ctx->plane_res.dpp,
.mpc = dc->res_pool->mpc,
.mpcc_id = pipe_ctx->plane_res.hubp->inst,
.stream = pipe_ctx->stream,
.plane = pipe_ctx->plane_state,
.is_top_pipe = pipe_ctx->top_pipe == NULL,
});
}
void hwss_program_output_csc(union block_sequence_params *params)

View File

@ -2810,23 +2810,26 @@ static void program_surface_visibility(const struct dc *dc,
}
static void program_gamut_remap(struct pipe_ctx *pipe_ctx)
static void program_gamut_remap(struct program_gamut_remap_params *params)
{
struct transform *xfm = params->xfm;
const struct dc_stream_state *stream = params->stream;
int i = 0;
struct xfm_grph_csc_adjustment adjust;
memset(&adjust, 0, sizeof(adjust));
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
if (pipe_ctx->stream->gamut_remap_matrix.enable_remap == true) {
if (stream->gamut_remap_matrix.enable_remap == true) {
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
adjust.temperature_matrix[i] =
pipe_ctx->stream->gamut_remap_matrix.matrix[i];
stream->gamut_remap_matrix.matrix[i];
}
pipe_ctx->plane_res.xfm->funcs->transform_set_gamut_remap(pipe_ctx->plane_res.xfm, &adjust);
xfm->funcs->transform_set_gamut_remap(xfm, &adjust);
}
static void update_plane_addr(const struct dc *dc,
struct pipe_ctx *pipe_ctx)

View File

@ -2814,28 +2814,32 @@ static void dcn10_enable_plane(
}
void dcn10_program_gamut_remap(struct pipe_ctx *pipe_ctx)
void dcn10_program_gamut_remap(struct program_gamut_remap_params *params)
{
struct dpp *dpp = params->dpp;
const struct dc_stream_state *stream = params->stream;
const struct dc_plane_state *plane = params->plane;
int i = 0;
struct dpp_grph_csc_adjustment adjust;
memset(&adjust, 0, sizeof(adjust));
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
if (pipe_ctx->stream->gamut_remap_matrix.enable_remap == true) {
if (stream->gamut_remap_matrix.enable_remap == true) {
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
adjust.temperature_matrix[i] =
pipe_ctx->stream->gamut_remap_matrix.matrix[i];
} else if (pipe_ctx->plane_state &&
pipe_ctx->plane_state->gamut_remap_matrix.enable_remap == true) {
stream->gamut_remap_matrix.matrix[i];
} else if (plane &&
plane->gamut_remap_matrix.enable_remap == true) {
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
adjust.temperature_matrix[i] =
pipe_ctx->plane_state->gamut_remap_matrix.matrix[i];
plane->gamut_remap_matrix.matrix[i];
}
pipe_ctx->plane_res.dpp->funcs->dpp_set_gamut_remap(pipe_ctx->plane_res.dpp, &adjust);
dpp->funcs->dpp_set_gamut_remap(dpp, &adjust);
}
@ -3152,7 +3156,7 @@ static void dcn10_update_dchubp_dpp(
if (plane_state->update_bits.full_update) {
/*gamut remap*/
dc->hwss.program_gamut_remap(pipe_ctx);
hwss_program_gamut_remap(pipe_ctx);
dc->hwss.program_output_csc(dc,
pipe_ctx,

View File

@ -108,7 +108,7 @@ void dcn10_program_pipe(
struct dc *dc,
struct pipe_ctx *pipe_ctx,
struct dc_state *context);
void dcn10_program_gamut_remap(struct pipe_ctx *pipe_ctx);
void dcn10_program_gamut_remap(struct program_gamut_remap_params *params);
void dcn10_init_hw(struct dc *dc);
void dcn10_init_pipes(struct dc *dc, struct dc_state *context);
void dcn10_power_down_on_boot(struct dc *dc);

View File

@ -1815,7 +1815,7 @@ void dcn20_update_dchubp_dpp(
|| plane_state->update_bits.gamut_remap_change
|| pipe_ctx->stream->update_flags.bits.out_csc) {
/* dpp/cm gamut remap*/
dc->hwss.program_gamut_remap(pipe_ctx);
hwss_program_gamut_remap(pipe_ctx);
/*call the dcn2 method which uses mpc csc*/
dc->hwss.program_output_csc(dc,

View File

@ -357,37 +357,41 @@ bool dcn30_set_input_transfer_func(struct dc *dc,
return result;
}
void dcn30_program_gamut_remap(struct pipe_ctx *pipe_ctx)
void dcn30_program_gamut_remap(struct program_gamut_remap_params *params)
{
struct dpp *dpp = params->dpp;
struct mpc *mpc = params->mpc;
int mpcc_id = params->mpcc_id;
const struct dc_stream_state *stream = params->stream;
const struct dc_plane_state *plane = params->plane;
bool is_top_pipe = params->is_top_pipe;
int i = 0;
struct dpp_grph_csc_adjustment dpp_adjust;
struct mpc_grph_gamut_adjustment mpc_adjust;
int mpcc_id = pipe_ctx->plane_res.hubp->inst;
struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
memset(&dpp_adjust, 0, sizeof(dpp_adjust));
dpp_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
if (pipe_ctx->plane_state &&
pipe_ctx->plane_state->gamut_remap_matrix.enable_remap == true) {
if (plane &&
plane->gamut_remap_matrix.enable_remap == true) {
dpp_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
dpp_adjust.temperature_matrix[i] =
pipe_ctx->plane_state->gamut_remap_matrix.matrix[i];
plane->gamut_remap_matrix.matrix[i];
}
pipe_ctx->plane_res.dpp->funcs->dpp_set_gamut_remap(pipe_ctx->plane_res.dpp,
dpp->funcs->dpp_set_gamut_remap(dpp,
&dpp_adjust);
memset(&mpc_adjust, 0, sizeof(mpc_adjust));
mpc_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
if (pipe_ctx->top_pipe == NULL) {
if (pipe_ctx->stream->gamut_remap_matrix.enable_remap == true) {
if (is_top_pipe) {
if (stream->gamut_remap_matrix.enable_remap == true) {
mpc_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
mpc_adjust.temperature_matrix[i] =
pipe_ctx->stream->gamut_remap_matrix.matrix[i];
stream->gamut_remap_matrix.matrix[i];
}
}

View File

@ -63,7 +63,7 @@ bool dcn30_set_input_transfer_func(struct dc *dc,
struct pipe_ctx *pipe_ctx,
const struct dc_plane_state *plane_state);
void dcn30_program_gamut_remap(struct pipe_ctx *pipe_ctx);
void dcn30_program_gamut_remap(struct program_gamut_remap_params *params);
bool dcn30_set_output_transfer_func(struct dc *dc,
struct pipe_ctx *pipe_ctx,

View File

@ -89,28 +89,31 @@ void dcn401_initialize_min_clocks(struct dc *dc)
true);
}
void dcn401_program_gamut_remap(struct pipe_ctx *pipe_ctx)
void dcn401_program_gamut_remap(struct program_gamut_remap_params *params)
{
struct mpc *mpc = params->mpc;
int mpcc_id = params->mpcc_id;
const struct dc_stream_state *stream = params->stream;
const struct dc_plane_state *plane = params->plane;
bool is_top_pipe = params->is_top_pipe;
unsigned int i = 0;
struct mpc_grph_gamut_adjustment mpc_adjust;
unsigned int mpcc_id = pipe_ctx->plane_res.mpcc_inst;
struct mpc *mpc = pipe_ctx->stream_res.opp->ctx->dc->res_pool->mpc;
//For now assert if location is not pre-blend
if (pipe_ctx->plane_state)
ASSERT(pipe_ctx->plane_state->mcm_location == MPCC_MOVABLE_CM_LOCATION_BEFORE);
if (plane)
ASSERT(plane->mcm_location == MPCC_MOVABLE_CM_LOCATION_BEFORE);
// program MPCC_MCM_FIRST_GAMUT_REMAP
memset(&mpc_adjust, 0, sizeof(mpc_adjust));
mpc_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
mpc_adjust.mpcc_gamut_remap_block_id = MPCC_MCM_FIRST_GAMUT_REMAP;
if (pipe_ctx->plane_state &&
pipe_ctx->plane_state->gamut_remap_matrix.enable_remap == true) {
if (plane &&
plane->gamut_remap_matrix.enable_remap == true) {
mpc_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
mpc_adjust.temperature_matrix[i] =
pipe_ctx->plane_state->gamut_remap_matrix.matrix[i];
plane->gamut_remap_matrix.matrix[i];
}
mpc->funcs->set_gamut_remap(mpc, mpcc_id, &mpc_adjust);
@ -126,12 +129,12 @@ void dcn401_program_gamut_remap(struct pipe_ctx *pipe_ctx)
mpc_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
mpc_adjust.mpcc_gamut_remap_block_id = MPCC_OGAM_GAMUT_REMAP;
if (pipe_ctx->top_pipe == NULL) {
if (pipe_ctx->stream->gamut_remap_matrix.enable_remap == true) {
if (is_top_pipe) {
if (stream->gamut_remap_matrix.enable_remap == true) {
mpc_adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
mpc_adjust.temperature_matrix[i] =
pipe_ctx->stream->gamut_remap_matrix.matrix[i];
stream->gamut_remap_matrix.matrix[i];
}
}

View File

@ -32,7 +32,7 @@ struct ips_ono_region_state {
uint32_t current_pwr_state;
};
void dcn401_program_gamut_remap(struct pipe_ctx *pipe_ctx);
void dcn401_program_gamut_remap(struct program_gamut_remap_params *params);
void dcn401_init_hw(struct dc *dc);

View File

@ -95,7 +95,13 @@ struct set_input_transfer_func_params {
};
struct program_gamut_remap_params {
struct pipe_ctx *pipe_ctx;
struct transform *xfm;
struct dpp *dpp;
struct mpc *mpc;
int mpcc_id;
const struct dc_stream_state *stream;
const struct dc_plane_state *plane;
bool is_top_pipe;
};
struct hubp_enable_3dlut_fl_params {
@ -1389,7 +1395,7 @@ struct hw_sequencer_funcs {
void (*program_cursor_offload_now)(struct dc *dc, const struct pipe_ctx *pipe);
/* Colour Related */
void (*program_gamut_remap)(struct pipe_ctx *pipe_ctx);
void (*program_gamut_remap)(struct program_gamut_remap_params *params);
void (*program_output_csc)(struct dc *dc, struct pipe_ctx *pipe_ctx,
enum dc_color_space colorspace,
uint16_t *matrix, int opp_id);
@ -1940,7 +1946,7 @@ void hwss_set_cursor_position(union block_sequence_params *params);
void hwss_set_cursor_sdr_white_level(union block_sequence_params *params);
void hwss_program_gamut_remap(union block_sequence_params *params);
void hwss_program_gamut_remap(struct pipe_ctx *pipe_ctx);
void hwss_program_output_csc(union block_sequence_params *params);