From: Wenjing Liu <wenjing....@amd.com>

[why]
Based on power measurement result, in most cases when display clock is higher
than Vmin display clock, lowering display clock using dynamic ODM will improve
overall power consumption by 0 to 4 watts even if we can't reach Vmin.

[how]
Allow vmin optimization applied even if dispclk can't reach Vmin.

Reviewed-by: Jun Lei <jun....@amd.com>
Signed-off-by: Jerry Zuo <jerry....@amd.com>
Signed-off-by: Wenjing Liu <wenjing....@amd.com>
---
 .../dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c  | 14 +++++++++-----
 .../display/dc/dml2/dml21/src/dml2_top/dml_top.c   | 13 +++++++++++--
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git 
a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c 
b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c
index 603036df68ba..60a9faf81d3d 100644
--- 
a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c
+++ 
b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c
@@ -591,6 +591,8 @@ bool pmo_dcn4_fams2_init_for_vmin(struct 
dml2_pmo_init_for_vmin_in_out *in_out)
                        &in_out->base_display_config->display_config;
        const struct dml2_core_mode_support_result *mode_support_result =
                        &in_out->base_display_config->mode_support_result;
+       struct dml2_optimization_stage4_state *state =
+                       &in_out->base_display_config->stage4;
 
        if (in_out->instance->options->disable_dyn_odm ||
                        
(in_out->instance->options->disable_dyn_odm_for_multi_stream && 
display_config->num_streams > 1))
@@ -611,28 +613,30 @@ bool pmo_dcn4_fams2_init_for_vmin(struct 
dml2_pmo_init_for_vmin_in_out *in_out)
                 */
                if 
(mode_support_result->cfg_support_info.plane_support_info[i].dpps_used > 1 &&
                                
mode_support_result->cfg_support_info.stream_support_info[display_config->plane_descriptors[i].stream_index].odms_used
 == 1)
-                       
in_out->base_display_config->stage4.unoptimizable_streams[display_config->plane_descriptors[i].stream_index]
 = true;
+                       
state->unoptimizable_streams[display_config->plane_descriptors[i].stream_index] 
= true;
 
        for (i = 0; i < display_config->num_streams; i++) {
                if 
(display_config->stream_descriptors[i].overrides.disable_dynamic_odm)
-                       
in_out->base_display_config->stage4.unoptimizable_streams[i] = true;
+                       state->unoptimizable_streams[i] = true;
                else if 
(in_out->base_display_config->stage3.stream_svp_meta[i].valid &&
                                
in_out->instance->options->disable_dyn_odm_for_stream_with_svp)
-                       
in_out->base_display_config->stage4.unoptimizable_streams[i] = true;
+                       state->unoptimizable_streams[i] = true;
                /*
                 * ODM Combine requires horizontal timing divisible by 2 so each
                 * ODM segment has the same size.
                 */
                else if 
(!is_h_timing_divisible_by(&display_config->stream_descriptors[i].timing, 2))
-                       
in_out->base_display_config->stage4.unoptimizable_streams[i] = true;
+                       state->unoptimizable_streams[i] = true;
                /*
                 * Our hardware support seamless ODM transitions for DP encoders
                 * only.
                 */
                else if 
(!is_dp_encoder(display_config->stream_descriptors[i].output.output_encoder))
-                       
in_out->base_display_config->stage4.unoptimizable_streams[i] = true;
+                       state->unoptimizable_streams[i] = true;
        }
 
+       state->performed = true;
+
        return true;
 }
 
diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml_top.c 
b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml_top.c
index 2fb3e2f45e07..b25e9230adea 100644
--- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml_top.c
+++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_top/dml_top.c
@@ -268,9 +268,18 @@ bool dml2_build_mode_programming(struct 
dml2_build_mode_programming_in_out *in_o
 
        vmin_success = 
dml2_top_optimization_perform_optimization_phase(&l->optimization_phase_locals, 
&l->vmin_phase);
 
-       if (vmin_success) {
+       if (l->optimized_display_config_with_meta.stage4.performed) {
+               /*
+                * when performed is true, optimization has applied to
+                * optimized_display_config_with_meta and it has passed mode
+                * support. However it may or may not pass the test function to
+                * reach actual Vmin. As long as voltage is optimized even if it
+                * doesn't reach Vmin level, there is still power benefit so in
+                * this case we will still copy this optimization into base
+                * display config.
+                */
                memcpy(&l->base_display_config_with_meta, 
&l->optimized_display_config_with_meta, sizeof(struct 
display_configuation_with_meta));
-               l->base_display_config_with_meta.stage4.success = true;
+               l->base_display_config_with_meta.stage4.success = vmin_success;
        }
 
        /*
-- 
2.34.1

Reply via email to