Commit f4230973 authored by Ulf Hansson's avatar Ulf Hansson
Browse files

pmdomain: Merge branch fixes into next



Merge the pmdomain fixes for v6.16-rc[n] into the next branch, to allow
them to get tested together with the new changes that are targeted for
v6.17.

Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parents da3d0b77 500ba332
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#include <linux/pm_domain.h>
#include <linux/pm_qos.h>
#include <linux/hrtimer.h>
#include <linux/cpu.h>
#include <linux/cpuidle.h>
#include <linux/cpumask.h>
#include <linux/ktime.h>
@@ -349,6 +350,8 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd)
	struct cpuidle_device *dev;
	ktime_t domain_wakeup, next_hrtimer;
	ktime_t now = ktime_get();
	struct device *cpu_dev;
	s64 cpu_constraint, global_constraint;
	s64 idle_duration_ns;
	int cpu, i;

@@ -359,6 +362,7 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd)
	if (!(genpd->flags & GENPD_FLAG_CPU_DOMAIN))
		return true;

	global_constraint = cpu_latency_qos_limit();
	/*
	 * Find the next wakeup for any of the online CPUs within the PM domain
	 * and its subdomains. Note, we only need the genpd->cpus, as it already
@@ -372,8 +376,16 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd)
			if (ktime_before(next_hrtimer, domain_wakeup))
				domain_wakeup = next_hrtimer;
		}

		cpu_dev = get_cpu_device(cpu);
		if (cpu_dev) {
			cpu_constraint = dev_pm_qos_raw_resume_latency(cpu_dev);
			if (cpu_constraint < global_constraint)
				global_constraint = cpu_constraint;
		}
	}

	global_constraint *= NSEC_PER_USEC;
	/* The minimum idle duration is from now - until the next wakeup. */
	idle_duration_ns = ktime_to_ns(ktime_sub(domain_wakeup, now));
	if (idle_duration_ns <= 0)
@@ -389,8 +401,10 @@ static bool cpu_power_down_ok(struct dev_pm_domain *pd)
	 */
	i = genpd->state_idx;
	do {
		if (idle_duration_ns >= (genpd->states[i].residency_ns +
		    genpd->states[i].power_off_latency_ns)) {
		if ((idle_duration_ns >= (genpd->states[i].residency_ns +
		    genpd->states[i].power_off_latency_ns)) &&
		    (global_constraint >= (genpd->states[i].power_on_latency_ns +
		    genpd->states[i].power_off_latency_ns))) {
			genpd->state_idx = i;
			genpd->gd->last_enter = now;
			genpd->gd->reflect_residency = true;