diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c index e5dd97cd2499..11cdf6fa53eb 100644 --- a/drivers/cpuidle/lpm-levels.c +++ b/drivers/cpuidle/lpm-levels.c @@ -680,6 +680,8 @@ static int cluster_configure(struct lpm_cluster *cluster, int idx, /* Notify cluster enter event after successfully config completion */ cluster_notify(cluster, level, true); + sched_set_cluster_dstate(&cluster->child_cpus, idx, 0, 0); + cluster->last_level = idx; return 0; @@ -816,6 +818,7 @@ static void cluster_unprepare(struct lpm_cluster *cluster, BUG_ON(ret); } + sched_set_cluster_dstate(&cluster->child_cpus, 0, 0, 0); cluster_notify(cluster, &cluster->levels[last_level], false); cluster_unprepare(cluster->parent, &cluster->child_cpus, @@ -1015,6 +1018,10 @@ static int lpm_cpuidle_enter(struct cpuidle_device *dev, int64_t start_time = ktime_to_ns(ktime_get()), end_time; struct power_params *pwr_params; + pwr_params = &cluster->cpu->levels[idx].pwr; + sched_set_cpu_cstate(smp_processor_id(), idx + 1, + pwr_params->energy_overhead, pwr_params->latency_us); + pwr_params = &cluster->cpu->levels[idx].pwr; cpu_prepare(cluster, idx, true); @@ -1034,6 +1041,7 @@ exit: cluster_unprepare(cluster, cpumask, idx, true, end_time); cpu_unprepare(cluster, idx, true); + sched_set_cpu_cstate(smp_processor_id(), 0, 0, 0); trace_cpu_idle_exit(idx, success); trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu);