]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amd/display: Prevent freesync power optimization during validation
authorIsabel Zhang <isabel.zhang@amd.com>
Fri, 23 Oct 2020 15:55:32 +0000 (11:55 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 10 Nov 2020 19:24:48 +0000 (14:24 -0500)
[Why]
Due to the freesync power optimization increasing vtotal, the driver
believes that MPO is supported. MPO is turned on. Freesync then
exits, MPO can no longer be supported and immediate flip fails. This
causes corruption on the panel.

[How]
Avoid the freesync optimization when doing validation so in the case
freesync exits, driver can still support the configuration.

Signed-off-by: Isabel Zhang <isabel.zhang@amd.com>
Acked-by: Bindu Ramamurthy <bindu.r@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.h
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.h
drivers/gpu/drm/amd/display/dc/inc/core_types.h

index 3fcc31d75792b0290f97eff2f295d640876f4940..728212cca7aa59725b7fffd86e989e0a0646c0c6 100644 (file)
@@ -2012,7 +2012,10 @@ void dcn20_populate_dml_writeback_from_context(
 }
 
 int dcn20_populate_dml_pipes_from_context(
-               struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes)
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               bool fast_validate)
 {
        int pipe_cnt, i;
        bool synchronized_vblank = true;
@@ -2050,6 +2053,7 @@ int dcn20_populate_dml_pipes_from_context(
 
                v_total = timing->v_total;
                front_porch = timing->v_front_porch;
+
                /* todo:
                pipes[pipe_cnt].pipe.src.dynamic_metadata_enable = 0;
                pipes[pipe_cnt].pipe.src.dcc = 0;
@@ -2827,7 +2831,8 @@ bool dcn20_fast_validate_bw(
                display_e2e_pipe_params_st *pipes,
                int *pipe_cnt_out,
                int *pipe_split_from,
-               int *vlevel_out)
+               int *vlevel_out,
+               bool fast_validate)
 {
        bool out = false;
        int split[MAX_PIPES] = { 0 };
@@ -2839,7 +2844,7 @@ bool dcn20_fast_validate_bw(
 
        dcn20_merge_pipes_for_validate(dc, context);
 
-       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes);
+       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
 
        *pipe_cnt_out = pipe_cnt;
 
@@ -2943,7 +2948,8 @@ static void dcn20_calculate_wm(
                display_e2e_pipe_params_st *pipes,
                int *out_pipe_cnt,
                int *pipe_split_from,
-               int vlevel)
+               int vlevel,
+               bool fast_validate)
 {
        int pipe_cnt, i, pipe_idx;
 
@@ -2988,10 +2994,10 @@ static void dcn20_calculate_wm(
        if (pipe_cnt != pipe_idx) {
                if (dc->res_pool->funcs->populate_dml_pipes)
                        pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc,
-                               context, pipes);
+                               context, pipes, fast_validate);
                else
                        pipe_cnt = dcn20_populate_dml_pipes_from_context(dc,
-                               context, pipes);
+                               context, pipes, fast_validate);
        }
 
        *out_pipe_cnt = pipe_cnt;
@@ -3136,7 +3142,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
 
        BW_VAL_TRACE_COUNT();
 
-       out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel);
+       out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, fast_validate);
 
        if (pipe_cnt == 0)
                goto validate_out;
@@ -3151,7 +3157,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
                goto validate_out;
        }
 
-       dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel);
+       dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);
        dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
 
        BW_VAL_TRACE_END_WATERMARKS();
index 64bce14fefa3100a97b815ea99a40a2e8832bbf4..c8f3127bbcdf1108b760b37758d5a6763cc5e732 100644 (file)
@@ -50,7 +50,10 @@ unsigned int dcn20_calc_max_scaled_time(
                enum mmhubbub_wbif_mode mode,
                unsigned int urgent_watermark);
 int dcn20_populate_dml_pipes_from_context(
-               struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes);
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               bool fast_validate);
 struct pipe_ctx *dcn20_acquire_idle_pipe_for_layer(
                struct dc_state *state,
                const struct resource_pool *pool,
@@ -155,7 +158,8 @@ bool dcn20_fast_validate_bw(
                display_e2e_pipe_params_st *pipes,
                int *pipe_cnt_out,
                int *pipe_split_from,
-               int *vlevel_out);
+               int *vlevel_out,
+               bool fast_validate);
 void dcn20_calculate_dlg_params(
                struct dc *dc, struct dc_state *context,
                display_e2e_pipe_params_st *pipes,
index 3d8b0875e905ff80d6c43c6490dffaa86074e03e..5eedc19662a3db98f6dadece0ceecb9e99040533 100644 (file)
@@ -704,7 +704,10 @@ static const struct dcn10_stream_encoder_mask se_mask = {
 static void dcn21_pp_smu_destroy(struct pp_smu_funcs **pp_smu);
 
 static int dcn21_populate_dml_pipes_from_context(
-               struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes);
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               bool fast_validate);
 
 static struct input_pixel_processor *dcn21_ipp_create(
        struct dc_context *ctx, uint32_t inst)
@@ -1091,7 +1094,8 @@ void dcn21_calculate_wm(
                display_e2e_pipe_params_st *pipes,
                int *out_pipe_cnt,
                int *pipe_split_from,
-               int vlevel_req)
+               int vlevel_req,
+               bool fast_validate)
 {
        int pipe_cnt, i, pipe_idx;
        int vlevel, vlevel_max;
@@ -1133,10 +1137,10 @@ void dcn21_calculate_wm(
        if (pipe_cnt != pipe_idx) {
                if (dc->res_pool->funcs->populate_dml_pipes)
                        pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc,
-                               context, pipes);
+                               context, pipes, fast_validate);
                else
                        pipe_cnt = dcn21_populate_dml_pipes_from_context(dc,
-                               context, pipes);
+                               context, pipes, fast_validate);
        }
 
        *out_pipe_cnt = pipe_cnt;
@@ -1177,7 +1181,8 @@ static bool dcn21_fast_validate_bw(
                display_e2e_pipe_params_st *pipes,
                int *pipe_cnt_out,
                int *pipe_split_from,
-               int *vlevel_out)
+               int *vlevel_out,
+               bool fast_validate)
 {
        bool out = false;
        int split[MAX_PIPES] = { 0 };
@@ -1189,7 +1194,7 @@ static bool dcn21_fast_validate_bw(
 
        dcn20_merge_pipes_for_validate(dc, context);
 
-       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes);
+       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
 
        *pipe_cnt_out = pipe_cnt;
 
@@ -1339,7 +1344,7 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
        /*Unsafe due to current pipe merge and split logic*/
        ASSERT(context != dc->current_state);
 
-       out = dcn21_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel);
+       out = dcn21_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel, fast_validate);
 
        if (pipe_cnt == 0)
                goto validate_out;
@@ -1354,7 +1359,7 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
                goto validate_out;
        }
 
-       dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel);
+       dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);
        dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
 
        BW_VAL_TRACE_END_WATERMARKS();
@@ -1870,9 +1875,12 @@ static uint32_t read_pipe_fuses(struct dc_context *ctx)
 }
 
 static int dcn21_populate_dml_pipes_from_context(
-               struct dc *dc, struct dc_state *context, display_e2e_pipe_params_st *pipes)
+               struct dc *dc,
+               struct dc_state *context,
+               display_e2e_pipe_params_st *pipes,
+               bool fast_validate)
 {
-       uint32_t pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes);
+       uint32_t pipe_cnt = dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
        int i;
 
        for (i = 0; i < pipe_cnt; i++) {
index 01ac8b2921c6f4d932e513ea345767d5046c6e3e..c8851853843acc893deb51f09a13d9b8ce31f6cb 100644 (file)
@@ -1451,12 +1451,13 @@ static struct clock_source *dcn30_clock_source_create(
 
 int dcn30_populate_dml_pipes_from_context(
        struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes)
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate)
 {
        int i, pipe_cnt;
        struct resource_context *res_ctx = &context->res_ctx;
 
-       dcn20_populate_dml_pipes_from_context(dc, context, pipes);
+       dcn20_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);
 
        for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) {
                if (!res_ctx->pipe_ctx[i].stream)
@@ -1996,7 +1997,7 @@ static bool dcn30_internal_validate_bw(
        if (!pipes)
                return false;
 
-       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes);
+       pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
 
        if (!pipe_cnt) {
                out = true;
@@ -2210,7 +2211,7 @@ static bool dcn30_internal_validate_bw(
        }
 
        if (repopulate_pipes)
-               pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes);
+               pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
        *vlevel_out = vlevel;
        *pipe_cnt_out = pipe_cnt;
 
index d163812af85843d82674c7d52c1cb95680595aa2..8ce7f6d39a204b115c65e63af2b82ae41744927b 100644 (file)
@@ -65,7 +65,8 @@ void dcn30_populate_dml_writeback_from_context(
 
 int dcn30_populate_dml_pipes_from_context(
        struct dc *dc, struct dc_state *context,
-       display_e2e_pipe_params_st *pipes);
+       display_e2e_pipe_params_st *pipes,
+       bool fast_validate);
 
 bool dcn30_acquire_post_bldn_3dlut(
                struct resource_context *res_ctx,
index 2ce8c39ca6f56b4a896d722a16967ef0bb3ef905..2d77eac66cb036cfdb85e5ff9cf379f59d7140d9 100644 (file)
@@ -109,7 +109,8 @@ struct resource_funcs {
        int (*populate_dml_pipes)(
                struct dc *dc,
                struct dc_state *context,
-               display_e2e_pipe_params_st *pipes);
+               display_e2e_pipe_params_st *pipes,
+               bool fast_validate);
 
        enum dc_status (*validate_global)(
                struct dc *dc,