]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/amd/display: Require minimum VBlank size for stutter optimization
authorDillon Varone <dillon.varone@amd.com>
Fri, 1 Nov 2024 16:00:14 +0000 (12:00 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 11 Nov 2024 19:05:26 +0000 (14:05 -0500)
If the nominal VBlank is too small, optimizing for stutter can cause
the prefetch bandwidth to increase drasticaly, resulting in higher
clock and power requirements. Only optimize if it is >3x the stutter
latency.

Reviewed-by: Austin Zheng <austin.zheng@amd.com>
Signed-off-by: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 003215f962cdf2265f126a3f4c9ad20917f87fca)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c

index 1cf9015e854a961ae11184d2c11224aca1388a21..dd9971867f74940b5321c5dc200f7a5ad9480eb8 100644 (file)
@@ -8,6 +8,7 @@
 #include "dml2_pmo_dcn4_fams2.h"
 
 static const double MIN_VACTIVE_MARGIN_PCT = 0.25; // We need more than non-zero margin because DET buffer granularity can alter vactive latency hiding
+static const double MIN_BLANK_STUTTER_FACTOR = 3.0;
 
 static const struct dml2_pmo_pstate_strategy base_strategy_list_1_display[] = {
        // VActive Preferred
@@ -2139,6 +2140,7 @@ bool pmo_dcn4_fams2_init_for_stutter(struct dml2_pmo_init_for_stutter_in_out *in
        struct dml2_pmo_instance *pmo = in_out->instance;
        bool stutter_period_meets_z8_eco = true;
        bool z8_stutter_optimization_too_expensive = false;
+       bool stutter_optimization_too_expensive = false;
        double line_time_us, vblank_nom_time_us;
 
        unsigned int i;
@@ -2160,10 +2162,15 @@ bool pmo_dcn4_fams2_init_for_stutter(struct dml2_pmo_init_for_stutter_in_out *in
                line_time_us = (double)in_out->base_display_config->display_config.stream_descriptors[i].timing.h_total / (in_out->base_display_config->display_config.stream_descriptors[i].timing.pixel_clock_khz * 1000) * 1000000;
                vblank_nom_time_us = line_time_us * in_out->base_display_config->display_config.stream_descriptors[i].timing.vblank_nom;
 
-               if (vblank_nom_time_us < pmo->soc_bb->power_management_parameters.z8_stutter_exit_latency_us) {
+               if (vblank_nom_time_us < pmo->soc_bb->power_management_parameters.z8_stutter_exit_latency_us * MIN_BLANK_STUTTER_FACTOR) {
                        z8_stutter_optimization_too_expensive = true;
                        break;
                }
+
+               if (vblank_nom_time_us < pmo->soc_bb->power_management_parameters.stutter_enter_plus_exit_latency_us * MIN_BLANK_STUTTER_FACTOR) {
+                       stutter_optimization_too_expensive = true;
+                       break;
+               }
        }
 
        pmo->scratch.pmo_dcn4.num_stutter_candidates = 0;
@@ -2179,7 +2186,7 @@ bool pmo_dcn4_fams2_init_for_stutter(struct dml2_pmo_init_for_stutter_in_out *in
                pmo->scratch.pmo_dcn4.z8_vblank_optimizable = false;
        }
 
-       if (pmo->soc_bb->power_management_parameters.stutter_enter_plus_exit_latency_us > 0) {
+       if (!stutter_optimization_too_expensive && pmo->soc_bb->power_management_parameters.stutter_enter_plus_exit_latency_us > 0) {
                pmo->scratch.pmo_dcn4.optimal_vblank_reserved_time_for_stutter_us[pmo->scratch.pmo_dcn4.num_stutter_candidates] = (unsigned int)pmo->soc_bb->power_management_parameters.stutter_enter_plus_exit_latency_us;
                pmo->scratch.pmo_dcn4.num_stutter_candidates++;
        }