• Home
  • Raw
  • Download

Lines Matching +full:max +full:- +full:frequency

21  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
38 * Cooling state <-> CPUFreq frequency
43 * Highest cooling state corresponds to lowest possible frequency.
46 * level 0 --> 1st Max Freq
47 * level 1 --> 2nd Max Freq
52 * struct freq_table - frequency table along with power entries
53 * @frequency: frequency in KHz
57 * in translating frequency to power and vice versa.
60 u32 frequency; member
65 * struct time_in_idle - Idle time stats
75 * struct cpufreq_cooling_device - data for cooling device with cpufreq
82 * frequency.
115 * get_level: Find the level for a particular frequency
117 * @freq: Frequency
119 * Return: level corresponding to the frequency.
124 struct freq_table *freq_table = cpufreq_cdev->freq_table; in get_level()
127 for (level = 1; level <= cpufreq_cdev->max_level; level++) in get_level()
128 if (freq > freq_table[level].frequency) in get_level()
131 return level - 1; in get_level()
135 * cpufreq_thermal_notifier - notifier callback for cpufreq policy change.
138 * @data: callback-specific data
162 if (policy->cpu != cpufreq_cdev->policy->cpu) in cpufreq_thermal_notifier()
166 * policy->max is the maximum allowed frequency defined by user in cpufreq_thermal_notifier()
170 * If clipped_freq is lower than policy->max, then we need to in cpufreq_thermal_notifier()
171 * readjust policy->max. in cpufreq_thermal_notifier()
173 * But, if clipped_freq is greater than policy->max, we don't in cpufreq_thermal_notifier()
176 clipped_freq = cpufreq_cdev->clipped_freq; in cpufreq_thermal_notifier()
178 if (policy->max > clipped_freq) in cpufreq_thermal_notifier()
188 * update_freq_table() - Update the freq table with power numbers
194 * frequency efficiently. Power is stored in mW, frequency in KHz. The
197 * Return: 0 on success, -EINVAL if there are no OPPs for any CPUs,
198 * or -ENOMEM if we run out of memory.
203 struct freq_table *freq_table = cpufreq_cdev->freq_table; in update_freq_table()
206 int num_opps = 0, cpu = cpufreq_cdev->policy->cpu, i; in update_freq_table()
210 dev_warn(&cpufreq_cdev->cdev->device, in update_freq_table()
212 return -ENODEV; in update_freq_table()
223 if (num_opps != cpufreq_cdev->max_level + 1) { in update_freq_table()
225 return -EINVAL; in update_freq_table()
228 for (i = 0; i <= cpufreq_cdev->max_level; i++) { in update_freq_table()
229 unsigned long freq = freq_table[i].frequency * 1000; in update_freq_table()
230 u32 freq_mhz = freq_table[i].frequency / 1000; in update_freq_table()
235 * Find ceil frequency as 'freq' may be slightly lower than OPP in update_freq_table()
240 dev_err(dev, "failed to get opp for %lu frequency\n", in update_freq_table()
242 return -EINVAL; in update_freq_table()
266 struct freq_table *freq_table = cpufreq_cdev->freq_table; in cpu_freq_to_power()
268 for (i = 1; i <= cpufreq_cdev->max_level; i++) in cpu_freq_to_power()
269 if (freq > freq_table[i].frequency) in cpu_freq_to_power()
272 return freq_table[i - 1].power; in cpu_freq_to_power()
279 struct freq_table *freq_table = cpufreq_cdev->freq_table; in cpu_power_to_freq()
281 for (i = 0; i < cpufreq_cdev->max_level; i++) in cpu_power_to_freq()
285 return freq_table[i].frequency; in cpu_power_to_freq()
289 * get_load() - get load for a cpu since last updated
302 struct time_in_idle *idle_time = &cpufreq_cdev->idle_time[cpu_idx]; in get_load()
305 delta_idle = now_idle - idle_time->time; in get_load()
306 delta_time = now - idle_time->timestamp; in get_load()
311 load = div64_u64(100 * (delta_time - delta_idle), delta_time); in get_load()
313 idle_time->time = now_idle; in get_load()
314 idle_time->timestamp = now; in get_load()
320 * get_dynamic_power() - calculate the dynamic power
322 * @freq: current frequency
333 return (raw_cpu_power * cpufreq_cdev->last_load) / 100; in get_dynamic_power()
339 * cpufreq_get_max_state - callback function to get the max cooling state.
341 * @state: fill this variable with the max cooling state.
344 * max cooling state.
351 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_get_max_state()
353 *state = cpufreq_cdev->max_level; in cpufreq_get_max_state()
358 * cpufreq_get_cur_state - callback function to get the current cooling state.
370 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_get_cur_state()
372 *state = cpufreq_cdev->cpufreq_state; in cpufreq_get_cur_state()
378 * cpufreq_set_cur_state - callback function to set the current cooling state.
390 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_set_cur_state()
394 if (WARN_ON(state > cpufreq_cdev->max_level)) in cpufreq_set_cur_state()
395 return -EINVAL; in cpufreq_set_cur_state()
398 if (cpufreq_cdev->cpufreq_state == state) in cpufreq_set_cur_state()
401 clip_freq = cpufreq_cdev->freq_table[state].frequency; in cpufreq_set_cur_state()
402 cpufreq_cdev->cpufreq_state = state; in cpufreq_set_cur_state()
403 cpufreq_cdev->clipped_freq = clip_freq; in cpufreq_set_cur_state()
405 cpufreq_update_policy(cpufreq_cdev->policy->cpu); in cpufreq_set_cur_state()
411 * cpufreq_get_requested_power() - get the current power
418 * the requested power, but it's hard to get the frequency that
423 * We use the current frequency and the average load since this
431 * Return: 0 on success, -E* if getting the static power failed.
440 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_get_requested_power()
441 struct cpufreq_policy *policy = cpufreq_cdev->policy; in cpufreq_get_requested_power()
444 freq = cpufreq_quick_get(policy->cpu); in cpufreq_get_requested_power()
447 u32 ncpus = cpumask_weight(policy->related_cpus); in cpufreq_get_requested_power()
452 for_each_cpu(cpu, policy->related_cpus) { in cpufreq_get_requested_power()
467 cpufreq_cdev->last_load = total_load; in cpufreq_get_requested_power()
472 trace_thermal_power_cpu_get_power(policy->related_cpus, freq, in cpufreq_get_requested_power()
482 * cpufreq_state2power() - convert a cpu cdev state to power consumed
492 * Return: 0 on success, -EINVAL if the cooling device state could not
493 * be converted into a frequency or other -E* if there was an error
501 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_state2power()
504 if (WARN_ON(state > cpufreq_cdev->max_level)) in cpufreq_state2power()
505 return -EINVAL; in cpufreq_state2power()
507 num_cpus = cpumask_weight(cpufreq_cdev->policy->cpus); in cpufreq_state2power()
509 freq = cpufreq_cdev->freq_table[state].frequency; in cpufreq_state2power()
516 * cpufreq_power2state() - convert power to a cooling device state
529 * Return: 0 on success, -ENODEV if no cpus are online or -EINVAL if
530 * the calculated frequency could not be converted to a valid state.
541 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_power2state()
542 struct cpufreq_policy *policy = cpufreq_cdev->policy; in cpufreq_power2state()
544 cur_freq = cpufreq_quick_get(policy->cpu); in cpufreq_power2state()
546 last_load = cpufreq_cdev->last_load ?: 1; in cpufreq_power2state()
551 trace_thermal_power_cpu_limit(policy->related_cpus, target_freq, *state, in cpufreq_power2state()
582 unsigned int max = 0; in find_next_max() local
585 if (pos->frequency > max && pos->frequency < prev_max) in find_next_max()
586 max = pos->frequency; in find_next_max()
589 return max; in find_next_max()
593 * __cpufreq_cooling_register - helper function to create cpufreq cooling device
596 * Normally this should be same as cpufreq policy->related_cpus.
600 * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
621 return ERR_PTR(-EINVAL); in __cpufreq_cooling_register()
628 return ERR_PTR(-ENODEV); in __cpufreq_cooling_register()
633 return ERR_PTR(-ENOMEM); in __cpufreq_cooling_register()
635 cpufreq_cdev->policy = policy; in __cpufreq_cooling_register()
636 num_cpus = cpumask_weight(policy->related_cpus); in __cpufreq_cooling_register()
637 cpufreq_cdev->idle_time = kcalloc(num_cpus, in __cpufreq_cooling_register()
638 sizeof(*cpufreq_cdev->idle_time), in __cpufreq_cooling_register()
640 if (!cpufreq_cdev->idle_time) { in __cpufreq_cooling_register()
641 cdev = ERR_PTR(-ENOMEM); in __cpufreq_cooling_register()
646 cpufreq_cdev->max_level = i - 1; in __cpufreq_cooling_register()
648 cpufreq_cdev->freq_table = kmalloc_array(i, in __cpufreq_cooling_register()
649 sizeof(*cpufreq_cdev->freq_table), in __cpufreq_cooling_register()
651 if (!cpufreq_cdev->freq_table) { in __cpufreq_cooling_register()
652 cdev = ERR_PTR(-ENOMEM); in __cpufreq_cooling_register()
661 cpufreq_cdev->id = ret; in __cpufreq_cooling_register()
663 snprintf(dev_name, sizeof(dev_name), "thermal-cpufreq-%d", in __cpufreq_cooling_register()
664 cpufreq_cdev->id); in __cpufreq_cooling_register()
666 /* Fill freq-table in descending order of frequencies */ in __cpufreq_cooling_register()
667 for (i = 0, freq = -1; i <= cpufreq_cdev->max_level; i++) { in __cpufreq_cooling_register()
668 freq = find_next_max(policy->freq_table, freq); in __cpufreq_cooling_register()
669 cpufreq_cdev->freq_table[i].frequency = freq; in __cpufreq_cooling_register()
695 cpufreq_cdev->clipped_freq = cpufreq_cdev->freq_table[0].frequency; in __cpufreq_cooling_register()
696 cpufreq_cdev->cdev = cdev; in __cpufreq_cooling_register()
701 list_add(&cpufreq_cdev->node, &cpufreq_cdev_list); in __cpufreq_cooling_register()
711 ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id); in __cpufreq_cooling_register()
713 kfree(cpufreq_cdev->freq_table); in __cpufreq_cooling_register()
715 kfree(cpufreq_cdev->idle_time); in __cpufreq_cooling_register()
722 * cpufreq_cooling_register - function to create cpufreq cooling device.
726 * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
740 * of_cpufreq_cooling_register - function to create cpufreq cooling device.
744 * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
761 struct device_node *np = of_get_cpu_node(policy->cpu, NULL); in of_cpufreq_cooling_register()
767 policy->cpu); in of_cpufreq_cooling_register()
771 if (of_find_property(np, "#cooling-cells", NULL)) { in of_cpufreq_cooling_register()
772 of_property_read_u32(np, "dynamic-power-coefficient", in of_cpufreq_cooling_register()
778 policy->cpu, PTR_ERR(cdev)); in of_cpufreq_cooling_register()
789 * cpufreq_cooling_unregister - function to remove cpufreq cooling device.
792 * This interface function unregisters the "thermal-cpufreq-%x" cooling device.
802 cpufreq_cdev = cdev->devdata; in cpufreq_cooling_unregister()
805 list_del(&cpufreq_cdev->node); in cpufreq_cooling_unregister()
814 thermal_cooling_device_unregister(cpufreq_cdev->cdev); in cpufreq_cooling_unregister()
815 ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id); in cpufreq_cooling_unregister()
816 kfree(cpufreq_cdev->idle_time); in cpufreq_cooling_unregister()
817 kfree(cpufreq_cdev->freq_table); in cpufreq_cooling_unregister()