• Home
  • Raw
  • Download

Lines Matching +full:dynamic +full:- +full:power +full:- +full:coefficient

21  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
38 * Cooling state <-> CPUFreq frequency
46 * level 0 --> 1st Max Freq
47 * level 1 --> 2nd Max Freq
52 * struct freq_table - frequency table along with power entries
54 * @power: power in mW
57 * in translating frequency to power and vice versa.
61 u32 power; member
65 * struct time_in_idle - Idle time stats
75 * struct cpufreq_cooling_device - data for cooling device with cpufreq
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()
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
190 * @capacitance: dynamic power coefficient for these cpus
192 * Update the freq table with power numbers. This table will be used in
193 * cpu_power_to_freq() and cpu_freq_to_power() to convert between power and
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()
231 u64 power; in update_freq_table() local
242 return -EINVAL; in update_freq_table()
252 power = (u64)capacitance * freq_mhz * voltage_mv * voltage_mv; in update_freq_table()
253 do_div(power, 1000000000); in update_freq_table()
255 /* power is stored in mW */ in update_freq_table()
256 freq_table[i].power = power; 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()
272 return freq_table[i - 1].power; in cpu_freq_to_power()
276 u32 power) in cpu_power_to_freq() argument
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()
282 if (power >= freq_table[i].power) 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
324 * Return: the dynamic power consumed by the cpus described by
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.
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
414 * @power: pointer in which to store the resulting power
416 * Calculate the current power consumption of the cpus in milliwatts
417 * and store it in @power. This function should actually calculate
418 * the requested power, but it's hard to get the frequency that
420 * Instead, we calculate the current power on the assumption that the
431 * Return: 0 on success, -E* if getting the static power failed.
435 u32 *power) in cpufreq_get_requested_power() argument
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()
469 *power = get_dynamic_power(cpufreq_cdev, freq); in cpufreq_get_requested_power()
472 trace_thermal_power_cpu_get_power(policy->related_cpus, freq, in cpufreq_get_requested_power()
473 load_cpu, i, *power); in cpufreq_get_requested_power()
482 * cpufreq_state2power() - convert a cpu cdev state to power consumed
486 * @power: pointer in which to store the resulting power
488 * Convert cooling device state @state into power consumption in
489 * milliwatts assuming 100% load. Store the calculated power in
490 * @power.
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
494 * when calculating the static power.
498 unsigned long state, u32 *power) in cpufreq_state2power() argument
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()
510 *power = cpu_freq_to_power(cpufreq_cdev, freq) * num_cpus; in cpufreq_state2power()
516 * cpufreq_power2state() - convert power to a cooling device state
519 * @power: power in milliwatts to be converted
523 * that would allow them to consume at most @power mW and store it in
525 * such as the cpu load or the current static power. Calling this
526 * function with the same power as input can yield different cooling
529 * Return: 0 on success, -ENODEV if no cpus are online or -EINVAL if
536 struct thermal_zone_device *tz, u32 power, in cpufreq_power2state() argument
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()
545 power = power > 0 ? power : 0; in cpufreq_power2state()
546 last_load = cpufreq_cdev->last_load ?: 1; in cpufreq_power2state()
547 normalised_power = (power * 100) / last_load; in cpufreq_power2state()
551 trace_thermal_power_cpu_limit(policy->related_cpus, target_freq, *state, in cpufreq_power2state()
552 power); in cpufreq_power2state()
585 if (pos->frequency > max && pos->frequency < prev_max) in find_next_max()
586 max = pos->frequency; 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.
597 * @capacitance: dynamic power coefficient for these 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
748 * Using this function, the cooling device will implement the power
749 * extensions by using a simple cpu power model. The cpus must have
753 * static power consumed by the cpu.
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()