cpufreq: interactive: add boost pulse interface
authorTodd Poynor <toddpoynor@google.com>
Thu, 3 May 2012 07:16:55 +0000 (00:16 -0700)
committerTodd Poynor <toddpoynor@google.com>
Thu, 3 May 2012 07:48:48 +0000 (00:48 -0700)
Change-Id: Icf1e86d2065cc8f0816ba9c6b065eb056d4e8249
Signed-off-by: Todd Poynor <toddpoynor@google.com>
Documentation/cpu-freq/governors.txt
drivers/cpufreq/cpufreq_interactive.c
include/trace/events/cpufreq_interactive.h

index d52912b0b3fd94926e31b52850332a3cb7bf1b90..963a543bde4d8a44d4c2923b1a35b5eebbc69c95 100644 (file)
@@ -243,8 +243,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
index 95727361de3169de2a5804a678723e4b62b33e6f..7e177258593c9c4b70b142617d3803d74db88203 100644 (file)
@@ -497,7 +497,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) {
@@ -536,8 +535,10 @@ 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)
@@ -765,16 +766,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,
@@ -783,6 +804,7 @@ static struct attribute *interactive_attributes[] = {
        &timer_rate_attr.attr,
        &input_boost.attr,
        &boost.attr,
+       &boostpulse.attr,
        NULL,
 };
 
index ae6f232e498fc5241756920389223dd201251038..0791f2728c1bc0c150b0a80bd80c3919e6b299bf 100644 (file)
@@ -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 */