]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Add ODM check during pipe split/merge validation
authorRelja Vojvodic <relja.vojvodic@amd.com>
Fri, 1 Dec 2023 13:24:59 +0000 (06:24 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:11:31 +0000 (15:11 +0200)
[ Upstream commit dd2c5fac91d46df9dc1bf025ef23eff4704bd85f ]

[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: 26fbcb3da77e ("drm/amd/display: Override min required DCFCLK in dml1_validate")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c

index b931008114c91d4c54deb149683cc7969bd591f9..58943835fb63800003db3a9044acf6ceef7fe200 100644 (file)
@@ -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 */
index bc5f0db23d0c369ea9bbf6eb94d6b43b821b6df5..c80d6485f6ffa680855dd8ceaa5d0b292edede67 100644 (file)
@@ -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++;
+       }
+}
index fe2b67d745f0dbb6de89b240294e924e52dce92b..5b6d9643b02dc0068195a84e1561c8b1c8684961 100644 (file)
@@ -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
@@ -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;