Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a36d6450 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ANDROID: arm64: enable max frequency capping"

parents 51b768c5 079addb5
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -38,6 +38,9 @@ int pcibus_to_node(struct pci_bus *bus);
/* Replace task scheduler's default frequency-invariant accounting */
#define arch_scale_freq_capacity topology_get_freq_scale

/* Replace task scheduler's default max-frequency-invariant accounting */
#define arch_scale_max_freq_capacity topology_get_max_freq_scale

/* Replace task scheduler's default cpu-invariant accounting */
#define arch_scale_cpu_capacity topology_get_cpu_scale

+24 −1
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@

DEFINE_PER_CPU(unsigned long, freq_scale) = SCHED_CAPACITY_SCALE;
DEFINE_PER_CPU(unsigned long, efficiency) = SCHED_CAPACITY_SCALE;
DEFINE_PER_CPU(unsigned long, max_cpu_freq);
DEFINE_PER_CPU(unsigned long, max_freq_scale) = SCHED_CAPACITY_SCALE;

void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq,
			 unsigned long max_freq)
@@ -35,8 +37,29 @@ void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq,

	scale = (cur_freq << SCHED_CAPACITY_SHIFT) / max_freq;

	for_each_cpu(i, cpus)
	for_each_cpu(i, cpus) {
		per_cpu(freq_scale, i) = scale;
		per_cpu(max_cpu_freq, i) = max_freq;
	}
}

void arch_set_max_freq_scale(struct cpumask *cpus,
			     unsigned long policy_max_freq)
{
	unsigned long scale, max_freq;
	int cpu = cpumask_first(cpus);

	if (cpu > nr_cpu_ids)
		return;

	max_freq = per_cpu(max_cpu_freq, cpu);
	if (!max_freq)
		return;

	scale = (policy_max_freq << SCHED_CAPACITY_SHIFT) / max_freq;

	for_each_cpu(cpu, cpus)
		per_cpu(max_freq_scale, cpu) = scale;
}

static DEFINE_MUTEX(cpu_scale_mutex);
+9 −0
Original line number Diff line number Diff line
@@ -2234,6 +2234,9 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy,

	policy->min = new_policy->min;
	policy->max = new_policy->max;

	arch_set_max_freq_scale(policy->cpus, policy->max);

	trace_cpu_frequency_limits(policy->max, policy->min, policy->cpu);

	policy->cached_target_freq = UINT_MAX;
@@ -2444,6 +2447,12 @@ __weak void arch_set_freq_scale(struct cpumask *cpus,
}
EXPORT_SYMBOL_GPL(arch_set_freq_scale);

__weak void arch_set_max_freq_scale(struct cpumask *cpus,
				    unsigned long policy_max_freq)
{
}
EXPORT_SYMBOL_GPL(arch_set_max_freq_scale);

/*********************************************************************
 *               REGISTER / UNREGISTER CPUFREQ DRIVER                *
 *********************************************************************/
+8 −0
Original line number Diff line number Diff line
@@ -44,4 +44,12 @@ unsigned long topology_get_freq_scale(struct sched_domain *sd, int cpu)
	return per_cpu(freq_scale, cpu);
}

DECLARE_PER_CPU(unsigned long, max_freq_scale);

static inline
unsigned long topology_get_max_freq_scale(struct sched_domain *sd, int cpu)
{
	return per_cpu(max_freq_scale, cpu);
}

#endif /* _LINUX_ARCH_TOPOLOGY_H_ */
+2 −0
Original line number Diff line number Diff line
@@ -922,6 +922,8 @@ extern unsigned int arch_freq_get_on_cpu(int cpu);

extern void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq,
				unsigned long max_freq);
extern void arch_set_max_freq_scale(struct cpumask *cpus,
				    unsigned long policy_max_freq);

/* the following are really really optional */
extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;