Commit 1f39fa0d authored by Vincent Donnefort's avatar Vincent Donnefort Committed by Rafael J. Wysocki
Browse files

cpufreq: Introducing CPUFREQ_RELATION_E



This newly introduced flag can be applied by a governor to a CPUFreq
relation, when looking for a frequency within the policy table. The
resolution would then only walk through efficient frequencies.

Even with the flag set, the policy max limit will still be honoured. If no
efficient frequencies can be found within the limits of the policy, an
inefficient one would be returned.

Signed-off-by: default avatarVincent Donnefort <vincent.donnefort@arm.com>
Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 442d24a5
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -470,7 +470,8 @@ static unsigned int acpi_cpufreq_fast_switch(struct cpufreq_policy *policy,
	if (policy->cached_target_freq == target_freq)
		index = policy->cached_resolved_idx;
	else
		index = cpufreq_table_find_index_dl(policy, target_freq);
		index = cpufreq_table_find_index_dl(policy, target_freq,
						    false);

	entry = &policy->freq_table[index];
	next_freq = entry->frequency;
+2 −1
Original line number Diff line number Diff line
@@ -91,7 +91,8 @@ static unsigned int amd_powersave_bias_target(struct cpufreq_policy *policy,
			unsigned int index;

			index = cpufreq_table_find_index_h(policy,
							   policy->cur - 1);
							   policy->cur - 1,
							   relation & CPUFREQ_RELATION_E);
			freq_next = policy->freq_table[index].frequency;
		}

+9 −1
Original line number Diff line number Diff line
@@ -2260,8 +2260,16 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy,
	    !(cpufreq_driver->flags & CPUFREQ_NEED_UPDATE_LIMITS))
		return 0;

	if (cpufreq_driver->target)
	if (cpufreq_driver->target) {
		/*
		 * If the driver hasn't setup a single inefficient frequency,
		 * it's unlikely it knows how to decode CPUFREQ_RELATION_E.
		 */
		if (!policy->efficiencies_available)
			relation &= ~CPUFREQ_RELATION_E;

		return cpufreq_driver->target(policy, target_freq, relation);
	}

	if (!cpufreq_driver->target_index)
		return -EINVAL;
+4 −2
Original line number Diff line number Diff line
@@ -83,9 +83,11 @@ static unsigned int generic_powersave_bias_target(struct cpufreq_policy *policy,
	freq_avg = freq_req - freq_reduc;

	/* Find freq bounds for freq_avg in freq_table */
	index = cpufreq_table_find_index_h(policy, freq_avg);
	index = cpufreq_table_find_index_h(policy, freq_avg,
					   relation & CPUFREQ_RELATION_E);
	freq_lo = freq_table[index].frequency;
	index = cpufreq_table_find_index_l(policy, freq_avg);
	index = cpufreq_table_find_index_l(policy, freq_avg,
					   relation & CPUFREQ_RELATION_E);
	freq_hi = freq_table[index].frequency;

	/* Find out how long we have to be in hi and lo freqs */
+2 −2
Original line number Diff line number Diff line
@@ -934,7 +934,7 @@ static void powernv_cpufreq_work_fn(struct work_struct *work)
		policy = cpufreq_cpu_get(cpu);
		if (!policy)
			continue;
		index = cpufreq_table_find_index_c(policy, policy->cur);
		index = cpufreq_table_find_index_c(policy, policy->cur, false);
		powernv_cpufreq_target_index(policy, index);
		cpumask_andnot(&mask, &mask, policy->cpus);
		cpufreq_cpu_put(policy);
@@ -1022,7 +1022,7 @@ static unsigned int powernv_fast_switch(struct cpufreq_policy *policy,
	int index;
	struct powernv_smp_call_data freq_data;

	index = cpufreq_table_find_index_dl(policy, target_freq);
	index = cpufreq_table_find_index_dl(policy, target_freq, false);
	freq_data.pstate_id = powernv_freqs[index].driver_data;
	freq_data.gpstate_id = powernv_freqs[index].driver_data;
	set_pstate(&freq_data);
Loading