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

Commit 5b213e7a authored by Rohit Gupta's avatar Rohit Gupta
Browse files

cpufreq: Add a notifer chain that governors can use to report information



Some modules can benefit from getting additional information cpufreq
governors use to make frequency switch decisions.
This change lays down a basic framework that the governors can use
to report additional information (Eg: CPU's load) information to
the clients that subscribe to cpufreq govinfo notifier chain.

Change-Id: I511b4bdb7d12394a31ce5352ae47553861e49303
Signed-off-by: default avatarRohit Gupta <rohgup@codeaurora.org>
parent 247909f4
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ static void handle_update(struct work_struct *work);
 */
static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list);
static struct srcu_notifier_head cpufreq_transition_notifier_list;
struct atomic_notifier_head cpufreq_govinfo_notifier_list;

static bool init_cpufreq_transition_notifier_list_called;
static int __init init_cpufreq_transition_notifier_list(void)
@@ -90,6 +91,15 @@ static int __init init_cpufreq_transition_notifier_list(void)
}
pure_initcall(init_cpufreq_transition_notifier_list);

static bool init_cpufreq_govinfo_notifier_list_called;
static int __init init_cpufreq_govinfo_notifier_list(void)
{
	ATOMIC_INIT_NOTIFIER_HEAD(&cpufreq_govinfo_notifier_list);
	init_cpufreq_govinfo_notifier_list_called = true;
	return 0;
}
pure_initcall(init_cpufreq_govinfo_notifier_list);

static int off __read_mostly;
static int cpufreq_disabled(void)
{
@@ -1638,7 +1648,8 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
	if (cpufreq_disabled())
		return -EINVAL;

	WARN_ON(!init_cpufreq_transition_notifier_list_called);
	WARN_ON(!init_cpufreq_transition_notifier_list_called ||
		!init_cpufreq_govinfo_notifier_list_called);

	switch (list) {
	case CPUFREQ_TRANSITION_NOTIFIER:
@@ -1649,6 +1660,10 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)
		ret = blocking_notifier_chain_register(
				&cpufreq_policy_notifier_list, nb);
		break;
	case CPUFREQ_GOVINFO_NOTIFIER:
		ret = atomic_notifier_chain_register(
				&cpufreq_govinfo_notifier_list, nb);
		break;
	default:
		ret = -EINVAL;
	}
@@ -1683,6 +1698,10 @@ int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)
		ret = blocking_notifier_chain_unregister(
				&cpufreq_policy_notifier_list, nb);
		break;
	case CPUFREQ_GOVINFO_NOTIFIER:
		ret = atomic_notifier_chain_unregister(
				&cpufreq_govinfo_notifier_list, nb);
		break;
	default:
		ret = -EINVAL;
	}
+14 −0
Original line number Diff line number Diff line
@@ -286,6 +286,7 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy)

#define CPUFREQ_TRANSITION_NOTIFIER	(0)
#define CPUFREQ_POLICY_NOTIFIER		(1)
#define CPUFREQ_GOVINFO_NOTIFIER	(2)

/* Transition notifiers */
#define CPUFREQ_PRECHANGE		(0)
@@ -302,12 +303,25 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy)
#define CPUFREQ_CREATE_POLICY		(5)
#define CPUFREQ_REMOVE_POLICY		(6)

/* Govinfo Notifiers */
#define CPUFREQ_LOAD_CHANGE		(0)

#ifdef CONFIG_CPU_FREQ
int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);

void cpufreq_notify_transition(struct cpufreq_policy *policy,
		struct cpufreq_freqs *freqs, unsigned int state);
/*
 * Governor specific info that can be passed to modules that subscribe
 * to CPUFREQ_GOVINFO_NOTIFIER
 */
struct cpufreq_govinfo {
	unsigned int cpu;
	unsigned int load;
	unsigned int sampling_rate_us;
};
extern struct atomic_notifier_head cpufreq_govinfo_notifier_list;

#else /* CONFIG_CPU_FREQ */
static inline int cpufreq_register_notifier(struct notifier_block *nb,