Commit 442d24a5 authored by Vincent Donnefort's avatar Vincent Donnefort Committed by Rafael J. Wysocki
Browse files

cpufreq: Add an interface to mark inefficient frequencies



Some SoCs such as the sd855 have OPPs within the same policy whose cost is
higher than others with a higher frequency. Those OPPs are inefficients
and it might be interesting for a governor to not use them.

cpufreq_table_set_inefficient() allows the caller to identify a specified
frequency as being inefficient. Inefficient frequencies are only supported
on sorted tables.

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 15171769
Loading
Loading
Loading
Loading
+41 −3
Original line number Diff line number Diff line
@@ -664,6 +664,7 @@ struct governor_attr {
#define CPUFREQ_TABLE_END		~1u
/* Special Values of .flags field */
#define CPUFREQ_BOOST_FREQ		(1 << 0)
#define CPUFREQ_INEFFICIENT_FREQ	(1 << 1)

struct cpufreq_frequency_table {
	unsigned int	flags;
@@ -1003,6 +1004,36 @@ static inline int cpufreq_table_count_valid_entries(const struct cpufreq_policy
	return count;
}

/**
 * cpufreq_table_set_inefficient() - Mark a frequency as inefficient
 * @policy:	the &struct cpufreq_policy containing the inefficient frequency
 * @frequency:	the inefficient frequency
 *
 * The &struct cpufreq_policy must use a sorted frequency table
 *
 * Return:	%0 on success or a negative errno code
 */

static inline int
cpufreq_table_set_inefficient(struct cpufreq_policy *policy,
			      unsigned int frequency)
{
	struct cpufreq_frequency_table *pos;

	/* Not supported */
	if (policy->freq_table_sorted == CPUFREQ_TABLE_UNSORTED)
		return -EINVAL;

	cpufreq_for_each_valid_entry(pos, policy->freq_table) {
		if (pos->frequency == frequency) {
			pos->flags |= CPUFREQ_INEFFICIENT_FREQ;
			return 0;
		}
	}

	return -EINVAL;
}

static inline int parse_perf_domain(int cpu, const char *list_name,
				    const char *cell_name)
{
@@ -1071,6 +1102,13 @@ static inline bool policy_has_boost_freq(struct cpufreq_policy *policy)
	return false;
}

static inline int
cpufreq_table_set_inefficient(struct cpufreq_policy *policy,
			      unsigned int frequency)
{
	return -EINVAL;
}

static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_name,
						     const char *cell_name, struct cpumask *cpumask)
{