diff --git a/msm/sde/sde_core_perf.c b/msm/sde/sde_core_perf.c index 9425815c..ce38e596 100644 --- a/msm/sde/sde_core_perf.c +++ b/msm/sde/sde_core_perf.c @@ -842,12 +842,18 @@ static void _sde_core_perf_crtc_update_check(struct drm_crtc *crtc, } } + if (kms->perf.perf_tune.mode_changed && + kms->perf.perf_tune.min_core_clk) + new->core_clk_rate = kms->perf.perf_tune.min_core_clk; + if ((params_changed && (new->core_clk_rate > old->core_clk_rate)) || (!params_changed && new->core_clk_rate && - (new->core_clk_rate < old->core_clk_rate))) { + (new->core_clk_rate < old->core_clk_rate)) || + kms->perf.perf_tune.mode_changed) { old->core_clk_rate = new->core_clk_rate; *update_clk = 1; + kms->perf.perf_tune.mode_changed = false; } } @@ -1069,6 +1075,7 @@ static ssize_t _sde_core_perf_mode_write(struct file *file, DRM_INFO("normal performance mode\n"); } perf->perf_tune.mode = perf_mode; + perf->perf_tune.mode_changed = true; return count; } diff --git a/msm/sde/sde_core_perf.h b/msm/sde/sde_core_perf.h index 439d2433..c6ebfebb 100644 --- a/msm/sde/sde_core_perf.h +++ b/msm/sde/sde_core_perf.h @@ -47,11 +47,13 @@ struct sde_core_perf_params { * @mode: performance mode * @min_core_clk: minimum core clock * @min_bus_vote: minimum bus vote + * @mode_changed: indicate if clock tuning strategy changed */ struct sde_core_perf_tune { u32 mode; u64 min_core_clk; u64 min_bus_vote; + bool mode_changed; }; /**