summaryrefslogtreecommitdiff
path: root/drivers/cpufreq/cpufreq_interactive.c
diff options
context:
space:
mode:
authorsatya popuri <spopuri@nvidia.com>2012-06-22 09:38:26 -0700
committerVarun Wadekar <vwadekar@nvidia.com>2012-07-12 10:12:27 +0530
commit9037e49ce32bcddb74b8cb1d38be6b7972458836 (patch)
tree4f39356f60f1545f3d14b562f3d20daed1c1b6f2 /drivers/cpufreq/cpufreq_interactive.c
parent907965b187f75320c297cee645037f0bada70569 (diff)
cpufreq: mid-range frequency bias
Restrict go_maxspeed_load and max_boost at mid-range frequencies. Change-Id: I9e3c59bbe708b428e12ce4dbef2144be09751d5a Signed-off-by: satya popuri <spopuri@nvidia.com> Reviewed-on: http://git-master/r/111754 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Karthikeyan Samynathan <ksamynathan@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Reviewed-by: Aleksandr Frid <afrid@nvidia.com> Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>
Diffstat (limited to 'drivers/cpufreq/cpufreq_interactive.c')
-rw-r--r--drivers/cpufreq/cpufreq_interactive.c90
1 files changed, 87 insertions, 3 deletions
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index 2d0934fea964..7033c67cf431 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -2,6 +2,7 @@
* drivers/cpufreq/cpufreq_interactive.c
*
* Copyright (C) 2010 Google, Inc.
+ * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
@@ -92,6 +93,13 @@ static unsigned long min_sample_time;
#define DEFAULT_TIMER_RATE 20000;
static unsigned long timer_rate;
+/* Defines to control mid-range frequencies */
+#define DEFAULT_MID_RANGE_GO_MAXSPEED_LOAD 95
+
+static unsigned long midrange_freq;
+static unsigned long midrange_go_maxspeed_load;
+static unsigned long midrange_max_boost;
+
static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
unsigned int event);
@@ -109,6 +117,8 @@ static unsigned int cpufreq_interactive_get_target(
int cpu_load, int load_since_change, struct cpufreq_policy *policy)
{
unsigned int target_freq;
+ unsigned int maxspeed_load = go_maxspeed_load;
+ unsigned int mboost = max_boost;
/*
* Choose greater of short-term load (since last idle timer
@@ -118,14 +128,19 @@ static unsigned int cpufreq_interactive_get_target(
if (load_since_change > cpu_load)
cpu_load = load_since_change;
- if (cpu_load >= go_maxspeed_load) {
+ if (midrange_freq && policy->cur > midrange_freq) {
+ maxspeed_load = midrange_go_maxspeed_load;
+ mboost = midrange_max_boost;
+ }
+
+ if (cpu_load >= maxspeed_load) {
if (!boost_factor)
return policy->max;
target_freq = policy->cur * boost_factor;
- if (max_boost && target_freq > policy->cur + max_boost)
- target_freq = policy->cur + max_boost;
+ if (mboost && target_freq > policy->cur + mboost)
+ target_freq = policy->cur + mboost;
}
else {
if (!sustain_load)
@@ -524,6 +539,50 @@ static ssize_t store_go_maxspeed_load(struct kobject *kobj,
static struct global_attr go_maxspeed_load_attr = __ATTR(go_maxspeed_load, 0644,
show_go_maxspeed_load, store_go_maxspeed_load);
+static ssize_t show_midrange_freq(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ return sprintf(buf, "%lu\n", midrange_freq);
+}
+
+static ssize_t store_midrange_freq(struct kobject *kobj,
+ struct attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ unsigned long val;
+
+ ret = strict_strtoul(buf, 0, &val);
+ if (ret < 0)
+ return ret;
+ midrange_freq = val;
+ return count;
+}
+
+static struct global_attr midrange_freq_attr = __ATTR(midrange_freq, 0644,
+ show_midrange_freq, store_midrange_freq);
+
+static ssize_t show_midrange_go_maxspeed_load(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ return sprintf(buf, "%lu\n", midrange_go_maxspeed_load);
+}
+
+static ssize_t store_midrange_go_maxspeed_load(struct kobject *kobj,
+ struct attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ unsigned long val;
+
+ ret = strict_strtoul(buf, 0, &val);
+ if (ret < 0)
+ return ret;
+ midrange_go_maxspeed_load = val;
+ return count;
+}
+
+static struct global_attr midrange_go_maxspeed_load_attr = __ATTR(midrange_go_maxspeed_load, 0644,
+ show_midrange_go_maxspeed_load, store_midrange_go_maxspeed_load);
+
static ssize_t show_boost_factor(struct kobject *kobj,
struct attribute *attr, char *buf)
{
@@ -585,6 +644,27 @@ static ssize_t store_max_boost(struct kobject *kobj,
static struct global_attr max_boost_attr = __ATTR(max_boost, 0644,
show_max_boost, store_max_boost);
+static ssize_t show_midrange_max_boost(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ return sprintf(buf, "%lu\n", midrange_max_boost);
+}
+
+static ssize_t store_midrange_max_boost(struct kobject *kobj,
+ struct attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ unsigned long val;
+
+ ret = strict_strtoul(buf, 0, &val);
+ if (ret < 0)
+ return ret;
+ midrange_max_boost = val;
+ return count;
+}
+
+static struct global_attr midrange_max_boost_attr = __ATTR(midrange_max_boost, 0644,
+ show_midrange_max_boost, store_midrange_max_boost);
static ssize_t show_sustain_load(struct kobject *kobj,
struct attribute *attr, char *buf)
@@ -654,8 +734,11 @@ static struct global_attr timer_rate_attr = __ATTR(timer_rate, 0644,
static struct attribute *interactive_attributes[] = {
&go_maxspeed_load_attr.attr,
+ &midrange_freq_attr.attr,
+ &midrange_go_maxspeed_load_attr.attr,
&boost_factor_attr.attr,
&max_boost_attr.attr,
+ &midrange_max_boost_attr.attr,
&io_is_busy_attr.attr,
&sustain_load_attr.attr,
&min_sample_time_attr.attr,
@@ -784,6 +867,7 @@ static int __init cpufreq_interactive_init(void)
struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
go_maxspeed_load = DEFAULT_GO_MAXSPEED_LOAD;
+ midrange_go_maxspeed_load = DEFAULT_MID_RANGE_GO_MAXSPEED_LOAD;
min_sample_time = DEFAULT_MIN_SAMPLE_TIME;
timer_rate = DEFAULT_TIMER_RATE;