[AMD Official Use Only - Internal Distribution Only]

-----Original Message-----
From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Rodrigo 
Siqueira
Sent: Saturday, July 11, 2020 4:33 AM
To: amd-gfx@lists.freedesktop.org
Cc: Laktyushkin, Dmytro <dmytro.laktyush...@amd.com>; Brol, Eryk 
<eryk.b...@amd.com>; Li, Sun peng (Leo) <sunpeng...@amd.com>; Wentland, Harry 
<harry.wentl...@amd.com>; Zhuo, Qingqing <qingqing.z...@amd.com>; Siqueira, 
Rodrigo <rodrigo.sique...@amd.com>; Pillai, Aurabindo 
<aurabindo.pil...@amd.com>; Lee, Alvin <alvin.l...@amd.com>; Lakha, Bhawanpreet 
<bhawanpreet.la...@amd.com>
Subject: [PATCH 06/10] drm/amd/display: fix dcn3 p_state_change_support 
validation

From: Dmytro Laktyushkin <dmytro.laktyush...@amd.com>

Our validation is a known mess with actual validation mixed with topology 
configuration. This change makes sure topolgical validation is completed before 
any topology changes are made so we do not run into issues where we merge and 
split a pipe over the course of a single call.

Signed-off-by: Dmytro Laktyushkin <dmytro.laktyush...@amd.com>
Reviewed-by: Alvin Lee <alvin.l...@amd.com>
Acked-by: Rodrigo Siqueira <rodrigo.sique...@amd.com>
---
 .../drm/amd/display/dc/dcn30/dcn30_resource.c | 46 ++++++++++++++++---
 1 file changed, 39 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
index d7ba895de765..653a571e366d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c
@@ -1870,12 +1870,14 @@ static bool dcn30_split_stream_for_mpc_or_odm(
 
        return true;
 }
-static bool dcn30_fast_validate_bw(
+
+static bool dcn30_internal_validate_bw(
                struct dc *dc,
                struct dc_state *context,
                display_e2e_pipe_params_st *pipes,
                int *pipe_cnt_out,
-               int *vlevel_out)
+               int *vlevel_out,
+               bool fast_validate)
 {
        bool out = false;
        bool repopulate_pipes = false;
@@ -1898,7 +1900,38 @@ static bool dcn30_fast_validate_bw(
 
        dml_log_pipe_params(&context->bw_ctx.dml, pipes, pipe_cnt);
 
-       vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, pipe_cnt);
+       if (!fast_validate) {
+               /*
+                * DML favors voltage over p-state, but we're more interested in
+                * supporting p-state over voltage. We can't support p-state in
+                * prefetch mode > 0 so try capping the prefetch mode to start.
+                */
+               
context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
+                       dm_allow_self_refresh_and_mclk_switch;
+               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, 
pipe_cnt);
+               /* This may adjust vlevel and maxMpcComb */
+               if (vlevel < context->bw_ctx.dml.soc.num_states)
+                       vlevel = dcn20_validate_apply_pipe_split_flags(dc, 
context, vlevel, split, merge);
+       }
+       if (fast_validate || vlevel == context->bw_ctx.dml.soc.num_states ||
+                       vba->DRAMClockChangeSupport[vlevel][vba->maxMpcComb] == 
dm_dram_clock_change_unsupported) {
+               /*
+                * If mode is unsupported or there's still no p-state support 
then
+                * fall back to favoring voltage.
+                *
+                * We don't actually support prefetch mode 2, so require that we
+                * at least support prefetch mode 1.
+                */
+               
context->bw_ctx.dml.soc.allow_dram_self_refresh_or_dram_clock_change_in_vblank =
+                       dm_allow_self_refresh;
+
+               vlevel = dml_get_voltage_level(&context->bw_ctx.dml, pipes, 
pipe_cnt);
+               if (vlevel < context->bw_ctx.dml.soc.num_states) {
+                       memset(split, 0, sizeof(split));
+                       memset(merge, 0, sizeof(merge));

[Dennis] It seems that the above code is wrong. Should they be the following:
        memset(split, 0, sizeof(*split));
        memset(merge, 0, sizeof(*merge));


+                       vlevel = dcn20_validate_apply_pipe_split_flags(dc, 
context, vlevel, split, merge);
+               }
+       }
 
        dml_log_mode_support_params(&context->bw_ctx.dml);
 
@@ -1938,8 +1971,6 @@ static bool dcn30_fast_validate_bw(
                pipe_idx++;
        }
 
-       vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, 
split, merge);
-
        /* merge pipes if necessary */
        for (i = 0; i < dc->res_pool->pipe_count; i++) {
                struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i]; @@ 
-2187,7 +2218,8 @@ static void dcn30_calculate_wm(
        }
 }
 
-bool dcn30_validate_bandwidth(struct dc *dc, struct dc_state *context,
+bool dcn30_validate_bandwidth(struct dc *dc,
+               struct dc_state *context,
                bool fast_validate)
 {
        bool out = false;
@@ -2201,7 +2233,7 @@ bool dcn30_validate_bandwidth(struct dc *dc, struct 
dc_state *context,
 
        BW_VAL_TRACE_COUNT();
 
-       out = dcn30_fast_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel);
+       out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, 
+&vlevel, fast_validate);
 
        if (pipe_cnt == 0)
                goto validate_out;
--
2.27.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=02%7C01%7CDennis.Li%40amd.com%7Cd29b9f7db74c45f9e1de08d825109bdf%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637300100558483702&amp;sdata=6aapNEnuw0JjplCw7Y7nttR8LYD7F8rjISoersjlIgY%3D&amp;reserved=0
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to