Re: [PATCH 12/70] drm/amd/display: Refactor DPP_SET_OUTPUT_TRANSFER_FUNC to drop pipe_ctx

Timur Kristóf <[email protected]> Mon, 03 Aug 2026 14:42:34 +0200
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <[email protected]>
On Wednesday, July 15, 2026 3:37:22=E2=80=AFPM Central European Summer Time=
 Wayne Lin=20
wrote:
> From: Tomasz Siemek <[email protected]>
>=20
> [why]
> Pipe_ctx shouldn't be passed as block sequence block parameter.
>=20
> [how]
> Adjust arguments for set_output_transfer_func and implementations.

Hi,

This commit regresses all Vega and older GPUs.
I've just submitted a fix here:
https://lists.freedesktop.org/archives/amd-gfx/2026-August/149757.html
Please review.

Thanks & best regards,
Timur

>=20
> Reviewed-by: Alvin Lee <[email protected]>
> Signed-off-by: Tomasz Siemek <[email protected]>
> Signed-off-by: Wayne Lin <[email protected]>
> ---
>  .../drm/amd/display/dc/core/dc_hw_sequencer.c | 50 ++++++++++++++-----
>  .../amd/display/dc/hwss/dce110/dce110_hwseq.c |  9 ++--
>  .../amd/display/dc/hwss/dce60/dce60_hwseq.c   |  2 +-
>  .../amd/display/dc/hwss/dcn10/dcn10_hwseq.c   | 11 ++--
>  .../amd/display/dc/hwss/dcn10/dcn10_hwseq.h   |  3 +-
>  .../amd/display/dc/hwss/dcn20/dcn20_hwseq.c   | 20 +++++---
>  .../amd/display/dc/hwss/dcn20/dcn20_hwseq.h   |  3 +-
>  .../amd/display/dc/hwss/dcn30/dcn30_hwseq.c   | 31 ++++++------
>  .../amd/display/dc/hwss/dcn30/dcn30_hwseq.h   |  4 +-
>  .../amd/display/dc/hwss/dcn32/dcn32_hwseq.c   | 31 ++++++------
>  .../amd/display/dc/hwss/dcn32/dcn32_hwseq.h   |  8 ++-
>  .../amd/display/dc/hwss/dcn401/dcn401_hwseq.c | 22 ++++----
>  .../amd/display/dc/hwss/dcn401/dcn401_hwseq.h |  4 +-
>  .../drm/amd/display/dc/hwss/hw_sequencer.h    | 11 ++--
>  .../display/dc/hwss/hw_sequencer_private.h    |  6 +--
>  15 files changed, 119 insertions(+), 96 deletions(-)
>=20
> 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
> 4f30d9ac4a0d..6002175420a0 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
> @@ -1111,10 +1111,16 @@ void hwss_build_fast_sequence(struct dc *dc,
>  					(*num_steps)++;
>  				}
>  			}
> -			if (hws->funcs.set_output_transfer_func &&
> current_mpc_pipe->stream->update_flags.bits.out_tf) {
> -			=09
block_sequence[*num_steps].params.set_output_transfer_func_params.dc =3D
> dc;
> -			=09
block_sequence[*num_steps].params.set_output_transfer_func_params.pipe
> _ctx =3D current_mpc_pipe;
> -			=09
block_sequence[*num_steps].params.set_output_transfer_func_params.stre
> am =3D current_mpc_pipe->stream; +			if
> (current_mpc_pipe->stream->update_flags.bits.out_tf) {
> +				struct=20
set_output_transfer_func_params *otf_params =3D
> +				=09
&block_sequence[*num_steps].params.set_output_transfer_func_params;
> +
> +				otf_params->dpp =3D=20
current_mpc_pipe->plane_res.dpp;
> +				otf_params->xfm =3D=20
current_mpc_pipe->plane_res.xfm;
> +				otf_params->mpc =3D dc->res_pool-
>mpc;
> +				otf_params->mpcc_id =3D=20
current_mpc_pipe->plane_res.hubp->inst;
> +				otf_params->is_top_pipe =3D=20
resource_is_pipe_type(pipe_ctx, OPP_HEAD);
> +				otf_params->stream =3D=20
current_mpc_pipe->stream;
>  				block_sequence[*num_steps].func =3D=20
DPP_SET_OUTPUT_TRANSFER_FUNC;
>  				(*num_steps)++;
>  			}
> @@ -1271,9 +1277,7 @@ void hwss_execute_sequence(struct dc *dc,
>  			hwss_program_manual_trigger(params);
>  			break;
>  		case DPP_SET_OUTPUT_TRANSFER_FUNC:
> -			hws->funcs.set_output_transfer_func(params-
>set_output_transfer_func_par
> ams.dc, -					params-
>set_output_transfer_func_params.pipe_ctx,
> -					params-
>set_output_transfer_func_params.stream);
> +			hws->funcs.set_output_transfer_func(&params-
>set_output_transfer_func_pa
> rams); break;
>  		case MPC_UPDATE_VISUAL_CONFIRM:
>  			dc->hwss.update_visual_confirm_color(params-
>update_visual_confirm_param
> s.dc, @@ -1829,19 +1833,39 @@ void
> hwss_add_optc_program_manual_trigger(struct block_sequence_state *seq_sta=
te
> * Helper function to add DPP set output transfer function to block sequen=
ce
> */
>  void hwss_add_dpp_set_output_transfer_func(struct block_sequence_state
> *seq_state, -		struct dc *dc,
> -		struct pipe_ctx *pipe_ctx,
> -		struct dc_stream_state *stream)
> +		struct dc *dc, struct pipe_ctx *pipe_ctx)
>  {
>  	if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
> -		seq_state->steps[*seq_state-
>num_steps].params.set_output_transfer_func_p
> arams.dc =3D dc;
> -		seq_state->steps[*seq_state-
>num_steps].params.set_output_transfer_func_
> params.pipe_ctx =3D pipe_ctx;
> -		seq_state->steps[*seq_state-
>num_steps].params.set_output_transfer_func_
> params.stream =3D stream;
> +		seq_state->steps[*seq_state-
>num_steps].params.set_output_transfer_func_
> params =3D +		(struct set_output_transfer_func_params) {
> +			.xfm =3D pipe_ctx->plane_res.xfm,
> +			.dpp =3D pipe_ctx->plane_res.dpp,
> +			.mpc =3D dc->res_pool->mpc,
> +			.mpcc_id =3D pipe_ctx->plane_res.hubp->inst,
> +			.is_top_pipe =3D=20
resource_is_pipe_type(pipe_ctx, OPP_HEAD),
> +			.stream =3D pipe_ctx->stream,
> +		};
>  		seq_state->steps[*seq_state->num_steps].func =3D
> DPP_SET_OUTPUT_TRANSFER_FUNC; (*seq_state->num_steps)++;
>  	}
>  }
>=20
> +void hwss_set_output_transfer_func(struct dc *dc, struct pipe_ctx
> *pipe_ctx) +{
> +	if (dc->hwseq->funcs.set_output_transfer_func) {
> +		dc->hwseq->funcs.set_output_transfer_func(
> +			&(struct set_output_transfer_func_params) {
> +				.xfm =3D pipe_ctx->plane_res.xfm,
> +				.dpp =3D pipe_ctx->plane_res.dpp,
> +				.mpc =3D dc->res_pool->mpc,
> +				.mpcc_id =3D pipe_ctx-
>plane_res.hubp->inst,
> +				.is_top_pipe =3D=20
resource_is_pipe_type(pipe_ctx, OPP_HEAD),
> +				.stream =3D pipe_ctx->stream,
> +			}
> +		);
> +	}
> +}
> +
>  /*
>   * Helper function to add MPC update visual confirm to block sequence
>   */
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
> b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c index
> 74b046ab3bc3..4830a0d94177 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
> @@ -607,11 +607,10 @@ dce110_translate_regamma_to_hw_format(const struct
> dc_transfer_func *output_tf, }
>=20
>  static bool
> -dce110_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream)
> +dce110_set_output_transfer_func(struct set_output_transfer_func_params
> *params) {
> -	(void)dc;
> -	struct transform *xfm =3D pipe_ctx->plane_res.xfm;
> +	struct transform *xfm =3D params->xfm;
> +	const struct dc_stream_state *stream =3D params->stream;
>=20
>  	xfm->funcs->opp_power_on_regamma_lut(xfm, true);
>  	xfm->regamma_params.hw_points_num =3D GAMMA_HW_POINTS_NUM;
> @@ -3181,7 +3180,7 @@ static void dce110_program_front_end_for_pipe(
>  		hws->funcs.set_input_transfer_func(dc, pipe_ctx,=20
pipe_ctx->plane_state);
>=20
>  	if (pipe_ctx->plane_state->update_bits.full_update)
> -		hws->funcs.set_output_transfer_func(dc, pipe_ctx,=20
pipe_ctx->stream);
> +		hwss_set_output_transfer_func(dc, pipe_ctx);
>=20
>  	DC_LOG_SURFACE(
>  			"Pipe:%d %p: addr hi:0x%x, "
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dce60/dce60_hwseq.c
> b/drivers/gpu/drm/amd/display/dc/hwss/dce60/dce60_hwseq.c index
> 26aa303b8237..221996b348ab 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dce60/dce60_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dce60/dce60_hwseq.c
> @@ -338,7 +338,7 @@ dce60_program_front_end_for_pipe(
>  		hws->funcs.set_input_transfer_func(dc, pipe_ctx,=20
pipe_ctx->plane_state);
>=20
>  	if (pipe_ctx->plane_state->update_bits.full_update)
> -		hws->funcs.set_output_transfer_func(dc, pipe_ctx,=20
pipe_ctx->stream);
> +		hwss_set_output_transfer_func(dc, pipe_ctx);
>=20
>  	DC_LOG_SURFACE(
>  			"Pipe:%d %p: addr hi:0x%x, "
> 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
> 8c636698d6d4..3be0bde5aea1 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
> @@ -2154,10 +2154,11 @@ static void log_tf(struct dc_context *ctx,
>  	}
>  }
>=20
> -bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx
> *pipe_ctx, -				const struct dc_stream_state=20
*stream)
> +bool dcn10_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *params) {
> -	struct dpp *dpp =3D pipe_ctx->plane_res.dpp;
> +	struct dpp *dpp =3D params->dpp;
> +	const struct dc_stream_state *stream =3D params->stream;
> +	struct dc *dc;
>=20
>  	if (!stream)
>  		return false;
> @@ -2165,6 +2166,8 @@ bool dcn10_set_output_transfer_func(struct dc *dc,
> struct pipe_ctx *pipe_ctx, if (dpp =3D=3D NULL)
>  		return false;
>=20
> +	dc =3D dpp->ctx->dc;
> +
>  	dpp->regamma_params.hw_points_num =3D GAMMA_HW_POINTS_NUM;
>=20
>  	if (stream->out_transfer_func.type =3D=3D TF_TYPE_PREDEFINED &&
> @@ -3301,7 +3304,7 @@ void dcn10_program_pipe(
>  	 * doing heavy calculation and programming
>  	 */
>  	if (pipe_ctx->plane_state->update_bits.full_update)
> -		hws->funcs.set_output_transfer_func(dc, pipe_ctx,=20
pipe_ctx->stream);
> +		hwss_set_output_transfer_func(dc, pipe_ctx);
>  }
>=20
>  void dcn10_wait_for_pending_cleared(struct dc *dc,
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.h
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.h index
> 162972dfdbe8..2cb674ba54e1 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.h
> @@ -73,8 +73,7 @@ void dcn10_program_output_csc(struct dc *dc,
>  		enum dc_color_space colorspace,
>  		uint16_t *matrix,
>  		int opp_id);
> -bool dcn10_set_output_transfer_func(struct dc *dc, struct pipe_ctx
> *pipe_ctx, -				const struct dc_stream_state=20
*stream);
> +bool dcn10_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *params); bool dcn10_set_input_transfer_func(struct dc *dc, struct pipe_c=
tx
> *pipe_ctx, const struct dc_plane_state *plane_state);
>  void dcn10_update_plane_addr(const struct dc *dc, struct pipe_ctx
> *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
> 83794d5b838c..98778d5e114e 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
> @@ -1019,26 +1019,30 @@ void dcn20_program_output_csc(struct dc *dc,
>  	}
>  }
>=20
> -bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx
> *pipe_ctx, -				const struct dc_stream_state=20
*stream)
> +bool dcn20_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *otf_params) {
> -	int mpcc_id =3D pipe_ctx->plane_res.hubp->inst;
> -	struct mpc *mpc =3D pipe_ctx->stream_res.opp->ctx->dc->res_pool-
>mpc;
> +	struct dpp *dpp =3D otf_params->dpp;
> +	struct mpc *mpc =3D otf_params->mpc;
> +	int mpcc_id =3D otf_params->mpcc_id;
> +	bool is_top_pipe =3D otf_params->is_top_pipe;
> +	const struct dc_stream_state *stream =3D otf_params->stream;
> +	struct dc *dc =3D dpp->ctx->dc;
>  	const struct pwl_params *params =3D NULL;
> +
>  	/*
>  	 * program OGAM only for the top pipe
>  	 * if there is a pipe split then fix diagnostic is required:
>  	 * how to pass OGAM parameter for stream.
>  	 * if programming for all pipes is required then remove condition
> -	 * pipe_ctx->top_pipe =3D=3D NULL ,but then fix the diagnostic.
> +	 * is_top_pipe ,but then fix the diagnostic.
>  	 */
>  	if (mpc->funcs->power_on_mpc_mem_pwr)
>  		mpc->funcs->power_on_mpc_mem_pwr(mpc, mpcc_id, true);
> -	if (pipe_ctx->top_pipe =3D=3D NULL
> +	if (is_top_pipe
>  			&& mpc->funcs->set_output_gamma) {
>  		if (stream->out_transfer_func.type =3D=3D TF_TYPE_HWPWL)
>  			params =3D &stream->out_transfer_func.pwl;
> -		else if (pipe_ctx->stream->out_transfer_func.type =3D=3D
> +		else if (stream->out_transfer_func.type =3D=3D
>  			TF_TYPE_DISTRIBUTED_POINTS &&
>  			cm_helper_translate_curve_to_hw_format(dc-
>ctx,
>  			&stream->out_transfer_func,
> @@ -1991,7 +1995,7 @@ static void dcn20_program_pipe(
>  	if (pipe_ctx->update_flags.bits.enable ||
>  	    pipe_ctx->update_flags.bits.plane_changed ||
>  	    pipe_ctx->stream->update_flags.bits.out_tf)
> -		hws->funcs.set_output_transfer_func(dc, pipe_ctx,=20
pipe_ctx->stream);
> +		hwss_set_output_transfer_func(dc, pipe_ctx);
>=20
>  	/* If the pipe has been enabled or has a different opp, we
>  	 * should reprogram the fmt. This deals with cases where
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.h
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.h index
> 9d1ad3b29ca5..749348d3c793 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.h
> @@ -44,8 +44,7 @@ void dcn20_update_plane_addr(const struct dc *dc, struct
> pipe_ctx *pipe_ctx); void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx
> *pipe_ctx); bool dcn20_set_input_transfer_func(struct dc *dc, struct
> pipe_ctx *pipe_ctx, const struct dc_plane_state *plane_state);
> -bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx
> *pipe_ctx, -			const struct dc_stream_state *stream);
> +bool dcn20_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *params); void dcn20_program_output_csc(struct dc *dc,
>  		struct pipe_ctx *pipe_ctx,
>  		enum dc_color_space colorspace,
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c index
> 82a662efa49f..59184e146fc9 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
> @@ -256,13 +256,10 @@ bool dcn30_set_blend_lut(
>  	return result;
>  }
>=20
> -static bool dcn30_set_mpc_shaper_3dlut(struct pipe_ctx *pipe_ctx,
> -				       const struct=20
dc_stream_state *stream)
> +static bool dcn30_set_mpc_shaper_3dlut(struct dpp *dpp, struct mpc *mpc,
> +				       int mpcc_id, const struct=20
dc_stream_state *stream)
>  {
> -	struct dpp *dpp_base =3D pipe_ctx->plane_res.dpp;
> -	int mpcc_id =3D pipe_ctx->plane_res.hubp->inst;
> -	struct dc *dc =3D pipe_ctx->stream->ctx->dc;
> -	struct mpc *mpc =3D pipe_ctx->stream_res.opp->ctx->dc->res_pool-
>mpc;
> +	struct dc *dc =3D dpp->ctx->dc;
>  	bool result =3D false;
>  	uint32_t acquired_rmu =3D 0;
>  	int mpcc_id_projected =3D 0;
> @@ -274,8 +271,8 @@ static bool dcn30_set_mpc_shaper_3dlut(struct pipe_ctx
> *pipe_ctx, shaper_lut =3D &stream->func_shaper->pwl;
>  		} else if (stream->func_shaper->type =3D=3D=20
TF_TYPE_DISTRIBUTED_POINTS) {
>  		=09
cm_helper_translate_curve_to_hw_format(stream->ctx, stream->func_shaper,
> -							      =20
&dpp_base->shaper_params, true);
> -			shaper_lut =3D &dpp_base->shaper_params;
> +							      =20
&dpp->shaper_params, true);
> +			shaper_lut =3D &dpp->shaper_params;
>  		}
>  	}
>=20
> @@ -398,23 +395,25 @@ void dcn30_program_gamut_remap(struct
> program_gamut_remap_params *params) mpc->funcs->set_gamut_remap(mpc,
> mpcc_id, &mpc_adjust);
>  }
>=20
> -bool dcn30_set_output_transfer_func(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream)
> +bool dcn30_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *otf_params) {
> -	int mpcc_id =3D pipe_ctx->plane_res.hubp->inst;
> -	struct mpc *mpc =3D pipe_ctx->stream_res.opp->ctx->dc->res_pool-
>mpc;
> +	struct dpp *dpp =3D otf_params->dpp;
> +	struct mpc *mpc =3D otf_params->mpc;
> +	int mpcc_id =3D otf_params->mpcc_id;
> +	bool is_top_pipe =3D otf_params->is_top_pipe;
> +	const struct dc_stream_state *stream =3D otf_params->stream;
> +	struct dc *dc =3D dpp->ctx->dc;
>  	const struct pwl_params *params =3D NULL;
>  	bool ret =3D false;
>=20
>  	/* program OGAM or 3DLUT only for the top pipe*/
> -	if (pipe_ctx->top_pipe =3D=3D NULL) {
> +	if (is_top_pipe) {
>  		/*program rmu shaper and 3dlut in MPC*/
> -		ret =3D dcn30_set_mpc_shaper_3dlut(pipe_ctx, stream);
> +		ret =3D dcn30_set_mpc_shaper_3dlut(dpp, mpc, mpcc_id,=20
stream);
>  		if (ret =3D=3D false && mpc->funcs->set_output_gamma) {
>  			if (stream->out_transfer_func.type =3D=3D=20
TF_TYPE_HWPWL)
>  				params =3D &stream-
>out_transfer_func.pwl;
> -			else if (pipe_ctx->stream-
>out_transfer_func.type =3D=3D
> +			else if (stream->out_transfer_func.type =3D=3D
>  				=09
TF_TYPE_DISTRIBUTED_POINTS &&
>  				=09
cm3_helper_translate_curve_to_hw_format(stream->ctx,
>  					&stream-
>out_transfer_func,
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.h
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.h index
> 4182cf399424..0399642076eb 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.h
> @@ -65,9 +65,7 @@ bool dcn30_set_input_transfer_func(struct dc *dc,
>=20
>  void dcn30_program_gamut_remap(struct program_gamut_remap_params *params=
);
>=20
> -bool dcn30_set_output_transfer_func(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream);
> +bool dcn30_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *params); void dcn30_set_avmute(struct pipe_ctx *pipe_ctx, bool enable);
>  void dcn30_update_info_frame(struct pipe_ctx *pipe_ctx);
>  void dcn30_program_dmdata_engine(struct pipe_ctx *pipe_ctx);
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c index
> c2ea25927765..c5f6eb482f07 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
> @@ -443,13 +443,10 @@ void dcn32_subvp_pipe_control_lock_fast(union
> block_sequence_params *params) }
>  }
>=20
> -bool dcn32_set_mpc_shaper_3dlut(
> -	struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream)
> +bool dcn32_set_mpc_shaper_3dlut(struct dpp *dpp, struct mpc *mpc,
> +	int mpcc_id, const struct dc_stream_state *stream)
>  {
> -	struct dpp *dpp_base =3D pipe_ctx->plane_res.dpp;
> -	int mpcc_id =3D pipe_ctx->plane_res.hubp->inst;
> -	struct dc *dc =3D pipe_ctx->stream->ctx->dc;
> -	struct mpc *mpc =3D pipe_ctx->stream_res.opp->ctx->dc->res_pool-
>mpc;
> +	struct dc *dc =3D dpp->ctx->dc;
>  	bool result =3D false;
>=20
>  	const struct pwl_params *shaper_lut =3D NULL;
> @@ -460,8 +457,8 @@ bool dcn32_set_mpc_shaper_3dlut(
>  		else if (stream->func_shaper->type =3D=3D=20
TF_TYPE_DISTRIBUTED_POINTS) {
>  		=09
cm_helper_translate_curve_to_hw_format(stream->ctx,
>  					stream->func_shaper,
> -					&dpp_base-
>shaper_params, true);
> -			shaper_lut =3D &dpp_base->shaper_params;
> +					&dpp->shaper_params,=20
true);
> +			shaper_lut =3D &dpp->shaper_params;
>  		}
>  	}
>=20
> @@ -566,24 +563,24 @@ bool dcn32_set_input_transfer_func(struct dc *dc,
>  	return result;
>  }
>=20
> -bool dcn32_set_output_transfer_func(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream)
> +bool dcn32_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *otf_params) {
> -	(void)dc;
> -	int mpcc_id =3D pipe_ctx->plane_res.hubp->inst;
> -	struct mpc *mpc =3D pipe_ctx->stream_res.opp->ctx->dc->res_pool-
>mpc;
> +	struct dpp *dpp =3D otf_params->dpp;
> +	struct mpc *mpc =3D otf_params->mpc;
> +	int mpcc_id =3D otf_params->mpcc_id;
> +	bool is_top_pipe =3D otf_params->is_top_pipe;
> +	const struct dc_stream_state *stream =3D otf_params->stream;
>  	const struct pwl_params *params =3D NULL;
>  	bool ret =3D false;
>=20
>  	/* program OGAM or 3DLUT only for the top pipe*/
> -	if (resource_is_pipe_type(pipe_ctx, OPP_HEAD)) {
> +	if (is_top_pipe) {
>  		/*program shaper and 3dlut in MPC*/
> -		ret =3D dcn32_set_mpc_shaper_3dlut(pipe_ctx, stream);
> +		ret =3D dcn32_set_mpc_shaper_3dlut(dpp, mpc, mpcc_id,=20
stream);
>  		if (ret =3D=3D false && mpc->funcs->set_output_gamma) {
>  			if (stream->out_transfer_func.type =3D=3D=20
TF_TYPE_HWPWL)
>  				params =3D &stream-
>out_transfer_func.pwl;
> -			else if (pipe_ctx->stream-
>out_transfer_func.type =3D=3D
> +			else if (stream->out_transfer_func.type =3D=3D
>  				=09
TF_TYPE_DISTRIBUTED_POINTS &&
>  				=09
cm3_helper_translate_curve_to_hw_format(stream->ctx,
>  					&stream-
>out_transfer_func,
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h index
> 0303a5953673..090d94d38343 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h
> @@ -54,12 +54,10 @@ bool dcn32_set_input_transfer_func(struct dc *dc,
>  				struct pipe_ctx *pipe_ctx,
>  				const struct dc_plane_state=20
*plane_state);
>=20
> -bool dcn32_set_mpc_shaper_3dlut(
> -	struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream);
> +bool dcn32_set_mpc_shaper_3dlut(struct dpp *dpp_base, struct mpc *mpc,
> +	int mpcc_id, const struct dc_stream_state *stream);
>=20
> -bool dcn32_set_output_transfer_func(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream);
> +bool dcn32_set_output_transfer_func(struct set_output_transfer_func_para=
ms
> *params);
>=20
>  void dcn32_init_hw(struct dc *dc);
>=20
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c index
> 5c1ba5d88c7a..161ef57ebce1 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
> @@ -696,24 +696,24 @@ bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
>  	return result;
>  }
>=20
> -bool dcn401_set_output_transfer_func(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream)
> +bool dcn401_set_output_transfer_func(struct set_output_transfer_func_par=
ams
> *otf_params) {
> -	(void)dc;
> -	int mpcc_id =3D pipe_ctx->plane_res.hubp->inst;
> -	struct mpc *mpc =3D pipe_ctx->stream_res.opp->ctx->dc->res_pool-
>mpc;
> +	struct dpp *dpp =3D otf_params->dpp;
> +	struct mpc *mpc =3D otf_params->mpc;
> +	int mpcc_id =3D otf_params->mpcc_id;
> +	bool is_top_pipe =3D otf_params->is_top_pipe;
> +	const struct dc_stream_state *stream =3D otf_params->stream;
>  	const struct pwl_params *params =3D NULL;
>  	bool ret =3D false;
>=20
>  	/* program OGAM or 3DLUT only for the top pipe*/
> -	if (resource_is_pipe_type(pipe_ctx, OPP_HEAD)) {
> +	if (is_top_pipe) {
>  		/*program shaper and 3dlut in MPC*/
> -		ret =3D dcn32_set_mpc_shaper_3dlut(pipe_ctx, stream);
> +		ret =3D dcn32_set_mpc_shaper_3dlut(dpp, mpc, mpcc_id,=20
stream);
>  		if (ret =3D=3D false && mpc->funcs->set_output_gamma) {
>  			if (stream->out_transfer_func.type =3D=3D=20
TF_TYPE_HWPWL)
>  				params =3D &stream-
>out_transfer_func.pwl;
> -			else if (pipe_ctx->stream-
>out_transfer_func.type =3D=3D
> +			else if (stream->out_transfer_func.type =3D=3D
>  				=09
TF_TYPE_DISTRIBUTED_POINTS &&
>  				=09
cm3_helper_translate_curve_to_hw_format(stream->ctx,
>  					&stream-
>out_transfer_func,
> @@ -2397,7 +2397,7 @@ void dcn401_program_pipe(
>  	if (pipe_ctx->update_flags.bits.enable ||
>  	    pipe_ctx->update_flags.bits.plane_changed ||
>  	    pipe_ctx->stream->update_flags.bits.out_tf)
> -		hws->funcs.set_output_transfer_func(dc, pipe_ctx,=20
pipe_ctx->stream);
> +		hwss_set_output_transfer_func(dc, pipe_ctx);
>=20
>  	/* If the pipe has been enabled or has a different opp, we
>  	 * should reprogram the fmt. This deals with cases where
> @@ -2555,7 +2555,7 @@ void dcn401_program_pipe_sequence(
>  	if (pipe_ctx->update_flags.bits.enable ||
>  			pipe_ctx->update_flags.bits.plane_changed ||
>  			pipe_ctx->stream->update_flags.bits.out_tf) {
> -		hwss_add_dpp_set_output_transfer_func(seq_state, dc,=20
pipe_ctx,
> pipe_ctx->stream); +	=09
hwss_add_dpp_set_output_transfer_func(seq_state, dc,
> pipe_ctx); }
>=20
>  	/* If the pipe has been enabled or has a different opp, we
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h
> b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h index
> 6d2e93149811..f90e25243ead 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h
> @@ -38,9 +38,7 @@ void dcn401_init_hw(struct dc *dc);
>=20
>  bool dcn401_set_mcm_luts(struct pipe_ctx *pipe_ctx,
>  				const struct dc_plane_state=20
*plane_state);
> -bool dcn401_set_output_transfer_func(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream);
> +bool dcn401_set_output_transfer_func(struct set_output_transfer_func_par=
ams
> *params); void dcn401_trigger_3dlut_dma_load(struct dc *dc,
>  				struct pipe_ctx *pipe_ctx);
>  void dcn401_calculate_dccg_tmds_div_value(struct pipe_ctx *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
> d8398b39a119..e8bf96a7d63a 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
> @@ -138,8 +138,11 @@ struct program_bias_and_scale_params {
>  };
>=20
>  struct set_output_transfer_func_params {
> -	struct dc *dc;
> -	struct pipe_ctx *pipe_ctx;
> +	struct transform *xfm;
> +	struct dpp *dpp;
> +	struct mpc *mpc;
> +	int mpcc_id;
> +	bool is_top_pipe;
>  	const struct dc_stream_state *stream;
>  };
>=20
> @@ -1993,7 +1996,9 @@ void hwss_add_optc_program_manual_trigger(struct
> block_sequence_state *seq_state struct pipe_ctx *pipe_ctx);
>=20
>  void hwss_add_dpp_set_output_transfer_func(struct block_sequence_state
> *seq_state, -		struct dc *dc, struct pipe_ctx *pipe_ctx,=20
struct
> dc_stream_state *stream); +		struct dc *dc, struct pipe_ctx=20
*pipe_ctx);
> +
> +void hwss_set_output_transfer_func(struct dc *dc, struct pipe_ctx
> *pipe_ctx);
>=20
>  void hwss_add_mpc_update_visual_confirm(struct block_sequence_state
> *seq_state, struct dc *dc, struct pipe_ctx *pipe_ctx, int mpcc_id);
> diff --git a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h
> b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h index
> b4956893ae9a..31ace62a37d9 100644
> --- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h
> +++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h
> @@ -67,6 +67,8 @@ struct dc_phy_addr_space_config;
>  struct dc_virtual_addr_space_config;
>  struct hubp;
>  struct dpp;
> +struct transform;
> +struct mpc;
>  struct dce_hwseq;
>  struct timing_generator;
>  struct tg_color;
> @@ -92,9 +94,7 @@ struct hwseq_private_funcs {
>  	bool (*set_input_transfer_func)(struct dc *dc,
>  				struct pipe_ctx *pipe_ctx,
>  				const struct dc_plane_state=20
*plane_state);
> -	bool (*set_output_transfer_func)(struct dc *dc,
> -				struct pipe_ctx *pipe_ctx,
> -				const struct dc_stream_state=20
*stream);
> +	bool (*set_output_transfer_func)(struct=20
set_output_transfer_func_params
> *params); void (*power_down)(struct dc *dc);
>  	void (*enable_display_pipe_clock_gating)(struct dc_context *ctx,
>  					bool clock_gating);