Lines Matching +full:link +full:- +full:frequencies
1 // SPDX-License-Identifier: GPL-2.0
7 * Copyright (C) 2012-2018 Linaro Limited.
28 * Cooling state <-> CPUFreq frequency
30 * Cooling states are translated to frequencies throughout this driver and this
36 * level 0 --> 1st Max Freq
37 * level 1 --> 2nd Max Freq
42 * struct time_in_idle - Idle time stats
52 * struct cpufreq_cooling_device - data for cooling device with cpufreq
59 * cpufreq frequencies.
64 * @node: list_head to link all cpufreq_cooling_device together.
100 for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) { in get_level()
101 if (freq > cpufreq_cdev->em->table[i].frequency) in get_level()
105 return cpufreq_cdev->max_level - i - 1; in get_level()
113 for (i = cpufreq_cdev->max_level - 1; i >= 0; i--) { in cpu_freq_to_power()
114 if (freq > cpufreq_cdev->em->table[i].frequency) in cpu_freq_to_power()
118 return cpufreq_cdev->em->table[i + 1].power; in cpu_freq_to_power()
126 for (i = cpufreq_cdev->max_level; i >= 0; i--) { in cpu_power_to_freq()
127 if (power >= cpufreq_cdev->em->table[i].power) in cpu_power_to_freq()
131 return cpufreq_cdev->em->table[i].frequency; in cpu_power_to_freq()
135 * get_load() - get load for a cpu since last updated
148 struct time_in_idle *idle_time = &cpufreq_cdev->idle_time[cpu_idx]; in get_load()
151 delta_idle = now_idle - idle_time->time; in get_load()
152 delta_time = now - idle_time->timestamp; in get_load()
157 load = div64_u64(100 * (delta_time - delta_idle), delta_time); in get_load()
159 idle_time->time = now_idle; in get_load()
160 idle_time->timestamp = now; in get_load()
166 * get_dynamic_power() - calculate the dynamic power
179 return (raw_cpu_power * cpufreq_cdev->last_load) / 100; in get_dynamic_power()
183 * cpufreq_get_requested_power() - get the current power
202 * Return: 0 on success, -E* if getting the static power failed.
210 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_get_requested_power()
211 struct cpufreq_policy *policy = cpufreq_cdev->policy; in cpufreq_get_requested_power()
214 freq = cpufreq_quick_get(policy->cpu); in cpufreq_get_requested_power()
217 u32 ncpus = cpumask_weight(policy->related_cpus); in cpufreq_get_requested_power()
222 for_each_cpu(cpu, policy->related_cpus) { in cpufreq_get_requested_power()
237 cpufreq_cdev->last_load = total_load; in cpufreq_get_requested_power()
242 trace_thermal_power_cpu_get_power(policy->related_cpus, freq, in cpufreq_get_requested_power()
252 * cpufreq_state2power() - convert a cpu cdev state to power consumed
261 * Return: 0 on success, -EINVAL if the cooling device state could not
262 * be converted into a frequency or other -E* if there was an error
269 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_state2power()
272 if (state > cpufreq_cdev->max_level) in cpufreq_state2power()
273 return -EINVAL; in cpufreq_state2power()
275 num_cpus = cpumask_weight(cpufreq_cdev->policy->cpus); in cpufreq_state2power()
277 idx = cpufreq_cdev->max_level - state; in cpufreq_state2power()
278 freq = cpufreq_cdev->em->table[idx].frequency; in cpufreq_state2power()
285 * cpufreq_power2state() - convert power to a cooling device state
297 * Return: 0 on success, -ENODEV if no cpus are online or -EINVAL if
299 * The latter should not happen unless the frequencies available to
308 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_power2state()
309 struct cpufreq_policy *policy = cpufreq_cdev->policy; in cpufreq_power2state()
311 last_load = cpufreq_cdev->last_load ?: 1; in cpufreq_power2state()
316 trace_thermal_power_cpu_limit(policy->related_cpus, target_freq, *state, in cpufreq_power2state()
329 policy = cpufreq_cdev->policy; in em_is_sane()
330 if (!cpumask_equal(policy->related_cpus, em_span_cpus(em))) { in em_is_sane()
333 cpumask_pr_args(policy->related_cpus)); in em_is_sane()
337 nr_levels = cpufreq_cdev->max_level + 1; in em_is_sane()
357 if (cpufreq_cdev->em) { in get_state_freq()
358 idx = cpufreq_cdev->max_level - state; in get_state_freq()
359 return cpufreq_cdev->em->table[idx].frequency; in get_state_freq()
364 policy = cpufreq_cdev->policy; in get_state_freq()
365 if (policy->freq_table_sorted == CPUFREQ_TABLE_SORTED_ASCENDING) in get_state_freq()
366 idx = cpufreq_cdev->max_level - state; in get_state_freq()
370 return policy->freq_table[idx].frequency; in get_state_freq()
376 * cpufreq_get_max_state - callback function to get the max cooling state.
388 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_get_max_state()
390 *state = cpufreq_cdev->max_level; in cpufreq_get_max_state()
395 * cpufreq_get_cur_state - callback function to get the current cooling state.
407 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_get_cur_state()
409 *state = cpufreq_cdev->cpufreq_state; in cpufreq_get_cur_state()
415 * cpufreq_set_cur_state - callback function to set the current cooling state.
427 struct cpufreq_cooling_device *cpufreq_cdev = cdev->devdata; in cpufreq_set_cur_state()
434 if (state > cpufreq_cdev->max_level) in cpufreq_set_cur_state()
435 return -EINVAL; in cpufreq_set_cur_state()
438 if (cpufreq_cdev->cpufreq_state == state) in cpufreq_set_cur_state()
441 cpufreq_cdev->cpufreq_state = state; in cpufreq_set_cur_state()
445 ret = freq_qos_update_request(&cpufreq_cdev->qos_req, frequency); in cpufreq_set_cur_state()
448 cpus = cpufreq_cdev->policy->cpus; in cpufreq_set_cur_state()
451 capacity /= cpufreq_cdev->policy->cpuinfo.max_freq; in cpufreq_set_cur_state()
452 arch_set_thermal_pressure(cpus, max_capacity - capacity); in cpufreq_set_cur_state()
468 * __cpufreq_cooling_register - helper function to create cpufreq cooling device
471 * Normally this should be same as cpufreq policy->related_cpus.
475 * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
476 * cooling devices. It also gives the opportunity to link the cooling device
495 dev = get_cpu_device(policy->cpu); in __cpufreq_cooling_register()
497 pr_warn("No cpu device for cpu %d\n", policy->cpu); in __cpufreq_cooling_register()
498 return ERR_PTR(-ENODEV); in __cpufreq_cooling_register()
504 return ERR_PTR(-EINVAL); in __cpufreq_cooling_register()
511 return ERR_PTR(-ENODEV); in __cpufreq_cooling_register()
516 return ERR_PTR(-ENOMEM); in __cpufreq_cooling_register()
518 cpufreq_cdev->policy = policy; in __cpufreq_cooling_register()
519 num_cpus = cpumask_weight(policy->related_cpus); in __cpufreq_cooling_register()
520 cpufreq_cdev->idle_time = kcalloc(num_cpus, in __cpufreq_cooling_register()
521 sizeof(*cpufreq_cdev->idle_time), in __cpufreq_cooling_register()
523 if (!cpufreq_cdev->idle_time) { in __cpufreq_cooling_register()
524 cdev = ERR_PTR(-ENOMEM); in __cpufreq_cooling_register()
529 cpufreq_cdev->max_level = i - 1; in __cpufreq_cooling_register()
536 cpufreq_cdev->id = ret; in __cpufreq_cooling_register()
538 snprintf(dev_name, sizeof(dev_name), "thermal-cpufreq-%d", in __cpufreq_cooling_register()
539 cpufreq_cdev->id); in __cpufreq_cooling_register()
545 cpufreq_cdev->em = em; in __cpufreq_cooling_register()
546 cooling_ops->get_requested_power = cpufreq_get_requested_power; in __cpufreq_cooling_register()
547 cooling_ops->state2power = cpufreq_state2power; in __cpufreq_cooling_register()
548 cooling_ops->power2state = cpufreq_power2state; in __cpufreq_cooling_register()
551 if (policy->freq_table_sorted == CPUFREQ_TABLE_UNSORTED) { in __cpufreq_cooling_register()
554 cdev = ERR_PTR(-EINVAL); in __cpufreq_cooling_register()
558 ret = freq_qos_add_request(&policy->constraints, in __cpufreq_cooling_register()
559 &cpufreq_cdev->qos_req, FREQ_QOS_MAX, in __cpufreq_cooling_register()
574 list_add(&cpufreq_cdev->node, &cpufreq_cdev_list); in __cpufreq_cooling_register()
580 freq_qos_remove_request(&cpufreq_cdev->qos_req); in __cpufreq_cooling_register()
582 ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id); in __cpufreq_cooling_register()
584 kfree(cpufreq_cdev->idle_time); in __cpufreq_cooling_register()
591 * cpufreq_cooling_register - function to create cpufreq cooling device.
595 * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
609 * of_cpufreq_cooling_register - function to create cpufreq cooling device.
613 * "thermal-cpufreq-%x". This api can support multiple instances of cpufreq
630 struct device_node *np = of_get_cpu_node(policy->cpu, NULL); in of_cpufreq_cooling_register()
635 policy->cpu); in of_cpufreq_cooling_register()
639 if (of_find_property(np, "#cooling-cells", NULL)) { in of_cpufreq_cooling_register()
640 struct em_perf_domain *em = em_cpu_get(policy->cpu); in of_cpufreq_cooling_register()
645 policy->cpu, PTR_ERR(cdev)); in of_cpufreq_cooling_register()
656 * cpufreq_cooling_unregister - function to remove cpufreq cooling device.
659 * This interface function unregisters the "thermal-cpufreq-%x" cooling device.
668 cpufreq_cdev = cdev->devdata; in cpufreq_cooling_unregister()
671 list_del(&cpufreq_cdev->node); in cpufreq_cooling_unregister()
675 freq_qos_remove_request(&cpufreq_cdev->qos_req); in cpufreq_cooling_unregister()
676 ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id); in cpufreq_cooling_unregister()
677 kfree(cpufreq_cdev->idle_time); in cpufreq_cooling_unregister()