Lines Matching +full:switching +full:- +full:freq
1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/percpu-defs.h>
20 /* On-demand governor macros */
57 * Find right freq to be set now with powersave_bias on.
68 struct policy_dbs_info *policy_dbs = policy->governor_data; in generic_powersave_bias_target()
70 struct dbs_data *dbs_data = policy_dbs->dbs_data; in generic_powersave_bias_target()
71 struct od_dbs_tuners *od_tuners = dbs_data->tuners; in generic_powersave_bias_target()
72 struct cpufreq_frequency_table *freq_table = policy->freq_table; in generic_powersave_bias_target()
75 dbs_info->freq_lo = 0; in generic_powersave_bias_target()
76 dbs_info->freq_lo_delay_us = 0; in generic_powersave_bias_target()
82 freq_reduc = freq_req * od_tuners->powersave_bias / 1000; in generic_powersave_bias_target()
83 freq_avg = freq_req - freq_reduc; in generic_powersave_bias_target()
85 /* Find freq bounds for freq_avg in freq_table */ in generic_powersave_bias_target()
93 dbs_info->freq_lo = 0; in generic_powersave_bias_target()
94 dbs_info->freq_lo_delay_us = 0; in generic_powersave_bias_target()
97 delay_hi_us = (freq_avg - freq_lo) * dbs_data->sampling_rate; in generic_powersave_bias_target()
98 delay_hi_us += (freq_hi - freq_lo) / 2; in generic_powersave_bias_target()
99 delay_hi_us /= freq_hi - freq_lo; in generic_powersave_bias_target()
100 dbs_info->freq_hi_delay_us = delay_hi_us; in generic_powersave_bias_target()
101 dbs_info->freq_lo = freq_lo; in generic_powersave_bias_target()
102 dbs_info->freq_lo_delay_us = dbs_data->sampling_rate - delay_hi_us; in generic_powersave_bias_target()
108 struct od_policy_dbs_info *dbs_info = to_dbs_info(policy->governor_data); in ondemand_powersave_bias_init()
110 dbs_info->freq_lo = 0; in ondemand_powersave_bias_init()
113 static void dbs_freq_increase(struct cpufreq_policy *policy, unsigned int freq) in dbs_freq_increase() argument
115 struct policy_dbs_info *policy_dbs = policy->governor_data; in dbs_freq_increase()
116 struct dbs_data *dbs_data = policy_dbs->dbs_data; in dbs_freq_increase()
117 struct od_dbs_tuners *od_tuners = dbs_data->tuners; in dbs_freq_increase()
119 if (od_tuners->powersave_bias) in dbs_freq_increase()
120 freq = od_ops.powersave_bias_target(policy, freq, in dbs_freq_increase()
122 else if (policy->cur == policy->max) in dbs_freq_increase()
125 __cpufreq_driver_target(policy, freq, od_tuners->powersave_bias ? in dbs_freq_increase()
136 struct policy_dbs_info *policy_dbs = policy->governor_data; in od_update()
138 struct dbs_data *dbs_data = policy_dbs->dbs_data; in od_update()
139 struct od_dbs_tuners *od_tuners = dbs_data->tuners; in od_update()
142 dbs_info->freq_lo = 0; in od_update()
145 if (load > dbs_data->up_threshold) { in od_update()
146 /* If switching to max speed, apply sampling_down_factor */ in od_update()
147 if (policy->cur < policy->max) in od_update()
148 policy_dbs->rate_mult = dbs_data->sampling_down_factor; in od_update()
149 dbs_freq_increase(policy, policy->max); in od_update()
154 min_f = policy->cpuinfo.min_freq; in od_update()
155 max_f = policy->cpuinfo.max_freq; in od_update()
156 freq_next = min_f + load * (max_f - min_f) / 100; in od_update()
159 policy_dbs->rate_mult = 1; in od_update()
161 if (od_tuners->powersave_bias) in od_update()
172 struct policy_dbs_info *policy_dbs = policy->governor_data; in od_dbs_update()
173 struct dbs_data *dbs_data = policy_dbs->dbs_data; in od_dbs_update()
175 int sample_type = dbs_info->sample_type; in od_dbs_update()
178 dbs_info->sample_type = OD_NORMAL_SAMPLE; in od_dbs_update()
183 if (sample_type == OD_SUB_SAMPLE && policy_dbs->sample_delay_ns > 0) { in od_dbs_update()
184 __cpufreq_driver_target(policy, dbs_info->freq_lo, in od_dbs_update()
186 return dbs_info->freq_lo_delay_us; in od_dbs_update()
191 if (dbs_info->freq_lo) { in od_dbs_update()
193 dbs_info->sample_type = OD_SUB_SAMPLE; in od_dbs_update()
194 return dbs_info->freq_hi_delay_us; in od_dbs_update()
197 return dbs_data->sampling_rate * policy_dbs->rate_mult; in od_dbs_update()
212 return -EINVAL; in store_io_is_busy()
213 dbs_data->io_is_busy = !!input; in store_io_is_busy()
215 /* we need to re-evaluate prev_cpu_idle */ in store_io_is_busy()
231 return -EINVAL; in store_up_threshold()
234 dbs_data->up_threshold = input; in store_up_threshold()
248 return -EINVAL; in store_sampling_down_factor()
250 dbs_data->sampling_down_factor = input; in store_sampling_down_factor()
253 list_for_each_entry(policy_dbs, &attr_set->policy_list, list) { in store_sampling_down_factor()
258 mutex_lock(&policy_dbs->update_mutex); in store_sampling_down_factor()
259 policy_dbs->rate_mult = 1; in store_sampling_down_factor()
260 mutex_unlock(&policy_dbs->update_mutex); in store_sampling_down_factor()
275 return -EINVAL; in store_ignore_nice_load()
280 if (input == dbs_data->ignore_nice_load) { /* nothing to do */ in store_ignore_nice_load()
283 dbs_data->ignore_nice_load = input; in store_ignore_nice_load()
285 /* we need to re-evaluate prev_cpu_idle */ in store_ignore_nice_load()
295 struct od_dbs_tuners *od_tuners = dbs_data->tuners; in store_powersave_bias()
302 return -EINVAL; in store_powersave_bias()
307 od_tuners->powersave_bias = input; in store_powersave_bias()
309 list_for_each_entry(policy_dbs, &attr_set->policy_list, list) in store_powersave_bias()
310 ondemand_powersave_bias_init(policy_dbs->policy); in store_powersave_bias()
346 return dbs_info ? &dbs_info->policy_dbs : NULL; in od_alloc()
362 return -ENOMEM; in od_init()
367 if (idle_time != -1ULL) { in od_init()
369 dbs_data->up_threshold = MICRO_FREQUENCY_UP_THRESHOLD; in od_init()
371 dbs_data->up_threshold = DEF_FREQUENCY_UP_THRESHOLD; in od_init()
374 dbs_data->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; in od_init()
375 dbs_data->ignore_nice_load = 0; in od_init()
376 tuners->powersave_bias = default_powersave_bias; in od_init()
377 dbs_data->io_is_busy = should_io_be_busy(); in od_init()
379 dbs_data->tuners = tuners; in od_init()
385 kfree(dbs_data->tuners); in od_exit()
390 struct od_policy_dbs_info *dbs_info = to_dbs_info(policy->governor_data); in od_start()
392 dbs_info->sample_type = OD_NORMAL_SAMPLE; in od_start()
432 if (!policy || policy->governor != &CPU_FREQ_GOV_ONDEMAND) in od_set_powersave_bias()
435 policy_dbs = policy->governor_data; in od_set_powersave_bias()
439 cpumask_or(&done, &done, policy->cpus); in od_set_powersave_bias()
441 dbs_data = policy_dbs->dbs_data; in od_set_powersave_bias()
442 od_tuners = dbs_data->tuners; in od_set_powersave_bias()
443 od_tuners->powersave_bias = default_powersave_bias; in od_set_powersave_bias()
466 MODULE_DESCRIPTION("'cpufreq_ondemand' - A dynamic cpufreq governor for "