#define DEFAULT_GO_HISPEED_LOAD 85
static unsigned long go_hispeed_load;
+/* Target load. Lower values result in higher CPU speeds. */
+#define DEFAULT_TARGET_LOAD 90
+static unsigned long target_load = DEFAULT_TARGET_LOAD;
+
/*
* The minimum amount of time to spend at a frequency before we can ramp down.
*/
hispeed_freq < pcpu->policy->max) {
new_freq = hispeed_freq;
} else {
- new_freq = pcpu->policy->max * cpu_load / 100;
+ new_freq = pcpu->policy->cur * cpu_load / target_load;
if (new_freq < hispeed_freq)
new_freq = hispeed_freq;
}
}
} else {
- new_freq = hispeed_freq * cpu_load / 100;
+ new_freq = pcpu->policy->cur * cpu_load / target_load;
}
if (new_freq <= hispeed_freq)
pcpu->hispeed_validate_time = now;
if (cpufreq_frequency_table_target(pcpu->policy, pcpu->freq_table,
- new_freq, CPUFREQ_RELATION_H,
+ new_freq, CPUFREQ_RELATION_L,
&index)) {
pr_warn_once("timer %d: cpufreq_frequency_table_target error\n",
(int) data);
wake_up_process(speedchange_task);
}
+static ssize_t show_target_load(
+ struct kobject *kobj, struct attribute *attr, char *buf)
+{
+ return sprintf(buf, "%lu\n", target_load);
+}
+
+static ssize_t store_target_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;
+ target_load = val;
+ return count;
+}
+
+static struct global_attr target_load_attr =
+ __ATTR(target_load, S_IRUGO | S_IWUSR,
+ show_target_load, store_target_load);
+
static ssize_t show_hispeed_freq(struct kobject *kobj,
struct attribute *attr, char *buf)
{
__ATTR(boostpulse, 0200, NULL, store_boostpulse);
static struct attribute *interactive_attributes[] = {
+ &target_load_attr.attr,
&hispeed_freq_attr.attr,
&go_hispeed_load_attr.attr,
&above_hispeed_delay.attr,