Skip to content

Commit

Permalink
drm/amd/display: Add ODM check during pipe split/merge validation
Browse files Browse the repository at this point in the history
[ Upstream commit dd2c5fa ]

[why]
When querying DML for a vlevel after pipes have been split or merged the
ODM policy would revert to a default policy, which could cause the query
to use the incorrect ODM status. In this case ODM 2to1 was validated,
but the last DML query would assume no ODM and return the incorrect
vlevel.

[how]
Added ODM check to apply the correct ODM policy before querying DML.

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: Relja Vojvodic <relja.vojvodic@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Stable-dep-of: 26fbcb3 ("drm/amd/display: Override min required DCFCLK in dml1_validate")
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Relja Vojvodic authored and gregkh committed Apr 3, 2024
1 parent 6ebe80c commit eec6662
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
2 changes: 2 additions & 0 deletions drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h
Expand Up @@ -183,6 +183,8 @@ bool dcn32_subvp_drr_admissable(struct dc *dc, struct dc_state *context);

bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int vlevel);

void dcn32_update_dml_pipes_odm_policy_based_on_context(struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes);

/* definitions for run time init of reg offsets */

/* CLK SRC */
Expand Down
26 changes: 26 additions & 0 deletions drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c
Expand Up @@ -778,3 +778,29 @@ bool dcn32_subvp_vblank_admissable(struct dc *dc, struct dc_state *context, int

return result;
}

void dcn32_update_dml_pipes_odm_policy_based_on_context(struct dc *dc, struct dc_state *context,
display_e2e_pipe_params_st *pipes)
{
int i, pipe_cnt;
struct resource_context *res_ctx = &context->res_ctx;
struct pipe_ctx *pipe = NULL;

for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
int odm_slice_count = 0;

if (!res_ctx->pipe_ctx[i].stream)
continue;
pipe = &res_ctx->pipe_ctx[i];
odm_slice_count = resource_get_odm_slice_count(pipe);

if (odm_slice_count == 1)
pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_dal;
else if (odm_slice_count == 2)
pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_2to1;
else if (odm_slice_count == 4)
pipes[pipe_cnt].pipe.dest.odm_combine_policy = dm_odm_combine_policy_4to1;

pipe_cnt++;
}
}
3 changes: 3 additions & 0 deletions drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
Expand Up @@ -2178,6 +2178,7 @@ bool dcn32_internal_validate_bw(struct dc *dc,
int i;

pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
dcn32_update_dml_pipes_odm_policy_based_on_context(dc, context, pipes);

/* repopulate_pipes = 1 means the pipes were either split or merged. In this case
* we have to re-calculate the DET allocation and run through DML once more to
Expand All @@ -2186,7 +2187,9 @@ bool dcn32_internal_validate_bw(struct dc *dc,
* */
context->bw_ctx.dml.soc.allow_for_pstate_or_stutter_in_vblank_final =
dm_prefetch_support_uclk_fclk_and_stutter_if_possible;

vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);

if (vlevel == context->bw_ctx.dml.soc.num_states) {
/* failed after DET size changes */
goto validate_fail;
Expand Down

0 comments on commit eec6662

Please sign in to comment.