aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/cpufreq/cpufreq_conservative.c53
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index ac38766b2583..adecd31f6156 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -35,12 +35,7 @@
35 */ 35 */
36 36
37#define DEF_FREQUENCY_UP_THRESHOLD (80) 37#define DEF_FREQUENCY_UP_THRESHOLD (80)
38#define MIN_FREQUENCY_UP_THRESHOLD (0)
39#define MAX_FREQUENCY_UP_THRESHOLD (100)
40
41#define DEF_FREQUENCY_DOWN_THRESHOLD (20) 38#define DEF_FREQUENCY_DOWN_THRESHOLD (20)
42#define MIN_FREQUENCY_DOWN_THRESHOLD (0)
43#define MAX_FREQUENCY_DOWN_THRESHOLD (100)
44 39
45/* 40/*
46 * The polling frequency of this governor depends on the capability of 41 * The polling frequency of this governor depends on the capability of
@@ -53,10 +48,14 @@
53 * All times here are in uS. 48 * All times here are in uS.
54 */ 49 */
55static unsigned int def_sampling_rate; 50static unsigned int def_sampling_rate;
56#define MIN_SAMPLING_RATE (def_sampling_rate / 2) 51#define MIN_SAMPLING_RATE_RATIO (2)
52/* for correct statistics, we need at least 10 ticks between each measure */
53#define MIN_STAT_SAMPLING_RATE (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
54#define MIN_SAMPLING_RATE (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
57#define MAX_SAMPLING_RATE (500 * def_sampling_rate) 55#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
58#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (100000) 56#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
59#define DEF_SAMPLING_DOWN_FACTOR (5) 57#define DEF_SAMPLING_DOWN_FACTOR (1)
58#define MAX_SAMPLING_DOWN_FACTOR (10)
60#define TRANSITION_LATENCY_LIMIT (10 * 1000) 59#define TRANSITION_LATENCY_LIMIT (10 * 1000)
61 60
62static void do_dbs_timer(void *data); 61static void do_dbs_timer(void *data);
@@ -136,7 +135,7 @@ static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
136 unsigned int input; 135 unsigned int input;
137 int ret; 136 int ret;
138 ret = sscanf (buf, "%u", &input); 137 ret = sscanf (buf, "%u", &input);
139 if (ret != 1 ) 138 if (ret != 1 || input > MAX_SAMPLING_DOWN_FACTOR || input < 1)
140 return -EINVAL; 139 return -EINVAL;
141 140
142 mutex_lock(&dbs_mutex); 141 mutex_lock(&dbs_mutex);
@@ -173,8 +172,7 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
173 ret = sscanf (buf, "%u", &input); 172 ret = sscanf (buf, "%u", &input);
174 173
175 mutex_lock(&dbs_mutex); 174 mutex_lock(&dbs_mutex);
176 if (ret != 1 || input > MAX_FREQUENCY_UP_THRESHOLD || 175 if (ret != 1 || input > 100 || input < 0 ||
177 input < MIN_FREQUENCY_UP_THRESHOLD ||
178 input <= dbs_tuners_ins.down_threshold) { 176 input <= dbs_tuners_ins.down_threshold) {
179 mutex_unlock(&dbs_mutex); 177 mutex_unlock(&dbs_mutex);
180 return -EINVAL; 178 return -EINVAL;
@@ -194,8 +192,7 @@ static ssize_t store_down_threshold(struct cpufreq_policy *unused,
194 ret = sscanf (buf, "%u", &input); 192 ret = sscanf (buf, "%u", &input);
195 193
196 mutex_lock(&dbs_mutex); 194 mutex_lock(&dbs_mutex);
197 if (ret != 1 || input > MAX_FREQUENCY_DOWN_THRESHOLD || 195 if (ret != 1 || input > 100 || input < 0 ||
198 input < MIN_FREQUENCY_DOWN_THRESHOLD ||
199 input >= dbs_tuners_ins.up_threshold) { 196 input >= dbs_tuners_ins.up_threshold) {
200 mutex_unlock(&dbs_mutex); 197 mutex_unlock(&dbs_mutex);
201 return -EINVAL; 198 return -EINVAL;
@@ -337,7 +334,6 @@ static void dbs_check_cpu(int cpu)
337 */ 334 */
338 335
339 /* Check for frequency increase */ 336 /* Check for frequency increase */
340
341 idle_ticks = UINT_MAX; 337 idle_ticks = UINT_MAX;
342 for_each_cpu_mask(j, policy->cpus) { 338 for_each_cpu_mask(j, policy->cpus) {
343 unsigned int tmp_idle_ticks, total_idle_ticks; 339 unsigned int tmp_idle_ticks, total_idle_ticks;
@@ -357,7 +353,7 @@ static void dbs_check_cpu(int cpu)
357 /* Scale idle ticks by 100 and compare with up and down ticks */ 353 /* Scale idle ticks by 100 and compare with up and down ticks */
358 idle_ticks *= 100; 354 idle_ticks *= 100;
359 up_idle_ticks = (100 - dbs_tuners_ins.up_threshold) * 355 up_idle_ticks = (100 - dbs_tuners_ins.up_threshold) *
360 usecs_to_jiffies(dbs_tuners_ins.sampling_rate); 356 usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
361 357
362 if (idle_ticks < up_idle_ticks) { 358 if (idle_ticks < up_idle_ticks) {
363 down_skip[cpu] = 0; 359 down_skip[cpu] = 0;
@@ -398,6 +394,7 @@ static void dbs_check_cpu(int cpu)
398 struct cpu_dbs_info_s *j_dbs_info; 394 struct cpu_dbs_info_s *j_dbs_info;
399 395
400 j_dbs_info = &per_cpu(cpu_dbs_info, j); 396 j_dbs_info = &per_cpu(cpu_dbs_info, j);
397 /* Check for frequency decrease */
401 total_idle_ticks = j_dbs_info->prev_cpu_idle_up; 398 total_idle_ticks = j_dbs_info->prev_cpu_idle_up;
402 tmp_idle_ticks = total_idle_ticks - 399 tmp_idle_ticks = total_idle_ticks -
403 j_dbs_info->prev_cpu_idle_down; 400 j_dbs_info->prev_cpu_idle_down;
@@ -414,12 +411,14 @@ static void dbs_check_cpu(int cpu)
414 freq_down_sampling_rate = dbs_tuners_ins.sampling_rate * 411 freq_down_sampling_rate = dbs_tuners_ins.sampling_rate *
415 dbs_tuners_ins.sampling_down_factor; 412 dbs_tuners_ins.sampling_down_factor;
416 down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) * 413 down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) *
417 usecs_to_jiffies(freq_down_sampling_rate); 414 usecs_to_jiffies(freq_down_sampling_rate);
418 415
419 if (idle_ticks > down_idle_ticks) { 416 if (idle_ticks > down_idle_ticks) {
420 /* if we are already at the lowest speed then break out early 417 /*
418 * if we are already at the lowest speed then break out early
421 * or if we 'cannot' reduce the speed as the user might want 419 * or if we 'cannot' reduce the speed as the user might want
422 * freq_step to be zero */ 420 * freq_step to be zero
421 */
423 if (requested_freq[cpu] == policy->min 422 if (requested_freq[cpu] == policy->min
424 || dbs_tuners_ins.freq_step == 0) 423 || dbs_tuners_ins.freq_step == 0)
425 return; 424 return;
@@ -434,9 +433,8 @@ static void dbs_check_cpu(int cpu)
434 if (requested_freq[cpu] < policy->min) 433 if (requested_freq[cpu] < policy->min)
435 requested_freq[cpu] = policy->min; 434 requested_freq[cpu] = policy->min;
436 435
437 __cpufreq_driver_target(policy, 436 __cpufreq_driver_target(policy, requested_freq[cpu],
438 requested_freq[cpu], 437 CPUFREQ_RELATION_H);
439 CPUFREQ_RELATION_H);
440 return; 438 return;
441 } 439 }
442} 440}
@@ -507,13 +505,16 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
507 if (dbs_enable == 1) { 505 if (dbs_enable == 1) {
508 unsigned int latency; 506 unsigned int latency;
509 /* policy latency is in nS. Convert it to uS first */ 507 /* policy latency is in nS. Convert it to uS first */
508 latency = policy->cpuinfo.transition_latency / 1000;
509 if (latency == 0)
510 latency = 1;
510 511
511 latency = policy->cpuinfo.transition_latency; 512 def_sampling_rate = latency *
512 if (latency < 1000)
513 latency = 1000;
514
515 def_sampling_rate = (latency / 1000) *
516 DEF_SAMPLING_RATE_LATENCY_MULTIPLIER; 513 DEF_SAMPLING_RATE_LATENCY_MULTIPLIER;
514
515 if (def_sampling_rate < MIN_STAT_SAMPLING_RATE)
516 def_sampling_rate = MIN_STAT_SAMPLING_RATE;
517
517 dbs_tuners_ins.sampling_rate = def_sampling_rate; 518 dbs_tuners_ins.sampling_rate = def_sampling_rate;
518 dbs_tuners_ins.ignore_nice = 0; 519 dbs_tuners_ins.ignore_nice = 0;
519 dbs_tuners_ins.freq_step = 5; 520 dbs_tuners_ins.freq_step = 5;