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

Commit 123f74a5 authored by Todd Poynor's avatar Todd Poynor Committed by Ruchi Kandoi
Browse files

cpufreq: interactive: add boost pulse interface



Change-Id: Icf1e86d2065cc8f0816ba9c6b065eb056d4e8249
Signed-off-by: default avatarTodd Poynor <toddpoynor@google.com>
parent c4bc0807
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -267,8 +267,13 @@ not idle. Default is 20000 uS.
input_boost: If non-zero, boost speed of all CPUs to hispeed_freq on
touchscreen activity.  Default is 0.

boost: If non-zero, immediately boost speed of all CPUs to
hispeed_freq.  If zero, allow CPU speeds to drop below hispeed_freq.
boost: If non-zero, immediately boost speed of all CPUs to at least
hispeed_freq until zero is written to this attribute.  If zero, allow
CPU speeds to drop below hispeed_freq according to load as usual.

boostpulse: Immediately boost speed of all CPUs to hispeed_freq for
min_sample_time, after which speeds are allowed to drop below
hispeed_freq according to load as usual.


3. The Governor Interface in the CPUfreq Core
+27 −5
Original line number Diff line number Diff line
@@ -495,7 +495,6 @@ static void cpufreq_interactive_boost(void)
	unsigned long flags;
	struct cpufreq_interactive_cpuinfo *pcpu;

	trace_cpufreq_interactive_boost(hispeed_freq);
	spin_lock_irqsave(&up_cpumask_lock, flags);

	for_each_online_cpu(i) {
@@ -534,9 +533,11 @@ static void cpufreq_interactive_input_event(struct input_handle *handle,
					    unsigned int type,
					    unsigned int code, int value)
{
	if (input_boost_val && type == EV_SYN && code == SYN_REPORT)
	if (input_boost_val && type == EV_SYN && code == SYN_REPORT) {
		trace_cpufreq_interactive_boost("input");
		cpufreq_interactive_boost();
	}
}

static void cpufreq_interactive_input_open(struct work_struct *w)
{
@@ -763,16 +764,36 @@ static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,

	boost_val = val;

	if (boost_val)
	if (boost_val) {
		trace_cpufreq_interactive_boost("on");
		cpufreq_interactive_boost();
	else
		trace_cpufreq_interactive_unboost(hispeed_freq);
	} else {
		trace_cpufreq_interactive_unboost("off");
	}

	return count;
}

define_one_global_rw(boost);

static ssize_t store_boostpulse(struct kobject *kobj, struct attribute *attr,
				const char *buf, size_t count)
{
	int ret;
	unsigned long val;

	ret = kstrtoul(buf, 0, &val);
	if (ret < 0)
		return ret;

	trace_cpufreq_interactive_boost("pulse");
	cpufreq_interactive_boost();
	return count;
}

static struct global_attr boostpulse =
	__ATTR(boostpulse, 0200, NULL, store_boostpulse);

static struct attribute *interactive_attributes[] = {
	&hispeed_freq_attr.attr,
	&go_hispeed_load_attr.attr,
@@ -781,6 +802,7 @@ static struct attribute *interactive_attributes[] = {
	&timer_rate_attr.attr,
	&input_boost.attr,
	&boost.attr,
	&boostpulse.attr,
	NULL,
};

+10 −10
Original line number Diff line number Diff line
@@ -83,27 +83,27 @@ DEFINE_EVENT(loadeval, cpufreq_interactive_notyet,
);

TRACE_EVENT(cpufreq_interactive_boost,
	    TP_PROTO(unsigned long freq),
	    TP_ARGS(freq),
	    TP_PROTO(char *s),
	    TP_ARGS(s),
	    TP_STRUCT__entry(
		    __field(unsigned long, freq)
		    __field(char *, s)
	    ),
	    TP_fast_assign(
		    __entry->freq = freq;
		    __entry->s = s;
	    ),
	    TP_printk("freq=%lu", __entry->freq)
	    TP_printk("%s", __entry->s)
);

TRACE_EVENT(cpufreq_interactive_unboost,
	    TP_PROTO(unsigned long freq),
	    TP_ARGS(freq),
	    TP_PROTO(char *s),
	    TP_ARGS(s),
	    TP_STRUCT__entry(
		    __field(unsigned long, freq)
		    __field(char *, s)
	    ),
	    TP_fast_assign(
		    __entry->freq = freq;
		    __entry->s = s;
	    ),
	    TP_printk("freq=%lu", __entry->freq)
	    TP_printk("%s", __entry->s)
);

#endif /* _TRACE_CPUFREQ_INTERACTIVE_H */