1 --- kernel-power-2.6.28.orig/drivers/cpufreq/cpufreq_ondemand.c
2 +++ kernel-power-2.6.28/drivers/cpufreq/cpufreq_ondemand.c
4 #define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
5 #define TRANSITION_LATENCY_LIMIT (10 * 1000 * 1000)
7 +static int avoid_frequencies_count=0;
8 +static unsigned int avoid_frequencies_table[16];
10 static void do_dbs_timer(struct work_struct *work);
17 +static unsigned int find_min_frequency(struct cpufreq_policy *policy,
18 + struct cpufreq_frequency_table *table)
23 + while(table[i].frequency!=CPUFREQ_TABLE_END) {
24 + if((table[i].frequency<f) &&
25 + (table[i].frequency>=policy->min))
26 + f=table[i].frequency;
32 +static unsigned int find_max_frequency(struct cpufreq_policy *policy,
33 + struct cpufreq_frequency_table *table)
38 + while(table[i].frequency!=CPUFREQ_TABLE_END) {
39 + if((table[i].frequency>f) &&
40 + (table[i].frequency<=policy->max))
41 + f=table[i].frequency;
47 +static unsigned int find_lower_frequency(struct cpufreq_policy *policy,
48 + struct cpufreq_frequency_table *table,
52 + f=find_min_frequency(policy, table);
54 + while(table[i].frequency!=CPUFREQ_TABLE_END) {
55 + if((table[i].frequency>f) &&
56 + (table[i].frequency<=freq))
57 + f=table[i].frequency;
63 static inline cputime64_t get_cpu_idle_time_jiffy(unsigned int cpu,
68 for_each_online_cpu(i) {
69 struct cpu_dbs_info_s *dbs_info = &per_cpu(cpu_dbs_info, i);
70 - dbs_info->freq_table = cpufreq_frequency_get_table(i);
71 + struct cpufreq_frequency_table *table;
73 + table = cpufreq_frequency_get_table(i);
76 + while(table[k].frequency != CPUFREQ_TABLE_END) {
77 + if(table[k].frequency != CPUFREQ_ENTRY_INVALID) {
80 + for(j=0;j<avoid_frequencies_count;j++) if(table[k].frequency==avoid_frequencies_table[j]) t=0;
85 + if(dbs_info->freq_table) kfree(dbs_info->freq_table );
86 + dbs_info->freq_table = kzalloc(sizeof(struct cpufreq_frequency_table)*(l+1), GFP_KERNEL);
87 + for(l=0,k=0; (table[l].frequency != CPUFREQ_TABLE_END); l++)
88 + if (table[l].frequency != CPUFREQ_ENTRY_INVALID) {
91 + for(j=0;j<avoid_frequencies_count;j++) if(table[l].frequency==avoid_frequencies_table[j]) t=0;
92 + if(t)memcpy(&dbs_info->freq_table[k++], &table[l], sizeof(struct cpufreq_frequency_table));
94 + dbs_info->freq_table[k].frequency = CPUFREQ_TABLE_END;
95 dbs_info->freq_lo = 0;
101 define_one_rw(ignore_nice_load);
102 define_one_rw(powersave_bias);
104 +static ssize_t show_avoid_frequencies(struct cpufreq_policy *unused,
109 + for(i=0;i<avoid_frequencies_count;i++)
110 + b+=sprintf(b, "%d ", avoid_frequencies_table[i]);
111 + b+=sprintf(b, "\n");
115 +static ssize_t store_avoid_frequencies(struct cpufreq_policy *unused,
116 + const char *buf, size_t n)
118 + unsigned int value[16];
121 + i=sscanf(buf, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
122 + &value[0], &value[1], &value[2], &value[3],
123 + &value[4], &value[5], &value[6], &value[7],
124 + &value[8], &value[9], &value[10], &value[11],
125 + &value[12], &value[13], &value[14], &value[15]
128 + printk(KERN_ERR "avoid_frequencies: Invalid value\n");
132 + avoid_frequencies_count=i;
134 + for(i=0;i<avoid_frequencies_count;i++) {
135 + avoid_frequencies_table[i]=value[i];
138 + mutex_lock(&dbs_mutex);
139 + ondemand_powersave_bias_init();
140 + mutex_unlock(&dbs_mutex);
145 +define_one_rw(avoid_frequencies);
147 static struct attribute * dbs_attributes[] = {
148 &sampling_rate_max.attr,
149 &sampling_rate_min.attr,
152 &ignore_nice_load.attr,
153 &powersave_bias.attr,
154 + &avoid_frequencies.attr,
159 if (max_load_freq > dbs_tuners_ins.up_threshold * policy->cur) {
160 /* if we are already at full speed then break out early */
161 if (!dbs_tuners_ins.powersave_bias) {
162 - if (policy->cur == policy->max)
163 + if (policy->cur == find_max_frequency(policy, this_dbs_info->freq_table))
166 - __cpufreq_driver_target(policy, policy->max,
167 + __cpufreq_driver_target(policy, find_max_frequency(policy, this_dbs_info->freq_table),
170 int freq = powersave_bias_target(policy, policy->max,
172 dbs_tuners_ins.down_differential);
174 if (!dbs_tuners_ins.powersave_bias) {
175 - __cpufreq_driver_target(policy, freq_next,
177 + __cpufreq_driver_target(policy, find_lower_frequency(policy, this_dbs_info->freq_table, freq_next),
180 int freq = powersave_bias_target(policy, freq_next,
182 this_dbs_info = &per_cpu(cpu_dbs_info, 0);
183 policy = this_dbs_info->cur_policy;
185 - __cpufreq_driver_target(policy, policy->max,
186 + __cpufreq_driver_target(policy, find_max_frequency(policy, this_dbs_info->freq_table),
188 this_dbs_info->prev_cpu_idle = get_cpu_idle_time(0,
189 &this_dbs_info->prev_cpu_wall);