Lines Matching +full:opp +full:- +full:table

1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright (C) 2014-2015 ARM Limited
9 * - If OPPs are added or removed after devfreq cooling has
30 * struct devfreq_cooling_device - Devfreq cooling device
36 * @power_table: Pointer to table with maximum power draw for each
37 * cooling state. State is the index into the table, and
39 * @freq_table: Pointer to a table with the frequencies sorted in descending
40 * order. You can index the table by cooling device state
71 struct devfreq_cooling_device *dfc = cdev->devdata; in devfreq_cooling_get_max_state()
73 *state = dfc->freq_table_size - 1; in devfreq_cooling_get_max_state()
81 struct devfreq_cooling_device *dfc = cdev->devdata; in devfreq_cooling_get_cur_state()
83 *state = dfc->cooling_state; in devfreq_cooling_get_cur_state()
91 struct devfreq_cooling_device *dfc = cdev->devdata; in devfreq_cooling_set_cur_state()
92 struct devfreq *df = dfc->devfreq; in devfreq_cooling_set_cur_state()
93 struct device *dev = df->dev.parent; in devfreq_cooling_set_cur_state()
96 if (state == dfc->cooling_state) in devfreq_cooling_set_cur_state()
101 if (state >= dfc->freq_table_size) in devfreq_cooling_set_cur_state()
102 return -EINVAL; in devfreq_cooling_set_cur_state()
104 freq = dfc->freq_table[state]; in devfreq_cooling_set_cur_state()
106 dev_pm_qos_update_request(&dfc->req_max_freq, in devfreq_cooling_set_cur_state()
109 dfc->cooling_state = state; in devfreq_cooling_set_cur_state()
115 * freq_get_state() - get the cooling state corresponding to a frequency
127 for (i = 0; i < dfc->freq_table_size; i++) { in freq_get_state()
128 if (dfc->freq_table[i] == freq) in freq_get_state()
137 struct device *dev = df->dev.parent; in get_voltage()
139 struct dev_pm_opp *opp; in get_voltage() local
141 opp = dev_pm_opp_find_freq_exact(dev, freq, true); in get_voltage()
142 if (PTR_ERR(opp) == -ERANGE) in get_voltage()
143 opp = dev_pm_opp_find_freq_exact(dev, freq, false); in get_voltage()
145 if (IS_ERR(opp)) { in get_voltage()
146 dev_err_ratelimited(dev, "Failed to find OPP for frequency %lu: %ld\n", in get_voltage()
147 freq, PTR_ERR(opp)); in get_voltage()
151 voltage = dev_pm_opp_get_voltage(opp) / 1000; /* mV */ in get_voltage()
152 dev_pm_opp_put(opp); in get_voltage()
164 * get_static_power() - calculate the static power
170 * OPP library. If no get_static_power() was supplied, assume the
176 struct devfreq *df = dfc->devfreq; in get_static_power()
179 if (!dfc->power_ops->get_static_power) in get_static_power()
187 return dfc->power_ops->get_static_power(df, voltage); in get_static_power()
191 * get_dynamic_power - calculate the dynamic power
208 struct devfreq_cooling_power *dfc_power = dfc->power_ops; in get_dynamic_power()
210 if (dfc_power->get_dynamic_power) in get_dynamic_power()
211 return dfc_power->get_dynamic_power(dfc->devfreq, freq, in get_dynamic_power()
215 power = (u64)dfc_power->dyn_power_coeff * freq_mhz * voltage * voltage; in get_dynamic_power()
234 struct devfreq_cooling_device *dfc = cdev->devdata; in devfreq_cooling_get_requested_power()
235 struct devfreq *df = dfc->devfreq; in devfreq_cooling_get_requested_power()
236 struct devfreq_dev_status *status = &df->last_status; in devfreq_cooling_get_requested_power()
238 unsigned long freq = status->current_frequency; in devfreq_cooling_get_requested_power()
246 res = -EAGAIN; in devfreq_cooling_get_requested_power()
250 if (dfc->power_ops->get_real_power) { in devfreq_cooling_get_requested_power()
253 res = -EINVAL; in devfreq_cooling_get_requested_power()
257 res = dfc->power_ops->get_real_power(df, power, freq, voltage); in devfreq_cooling_get_requested_power()
259 state = dfc->capped_state; in devfreq_cooling_get_requested_power()
260 dfc->res_util = dfc->power_table[state]; in devfreq_cooling_get_requested_power()
261 dfc->res_util *= SCALE_ERROR_MITIGATION; in devfreq_cooling_get_requested_power()
264 dfc->res_util /= *power; in devfreq_cooling_get_requested_power()
269 dyn_power = dfc->power_table[state]; in devfreq_cooling_get_requested_power()
272 dyn_power *= status->busy_time; in devfreq_cooling_get_requested_power()
273 dyn_power /= status->total_time; in devfreq_cooling_get_requested_power()
286 dfc->res_util = SCALE_ERROR_MITIGATION; in devfreq_cooling_get_requested_power()
294 struct devfreq_cooling_device *dfc = cdev->devdata; in devfreq_cooling_state2power()
298 if (state >= dfc->freq_table_size) in devfreq_cooling_state2power()
299 return -EINVAL; in devfreq_cooling_state2power()
301 freq = dfc->freq_table[state]; in devfreq_cooling_state2power()
304 *power = dfc->power_table[state] + static_power; in devfreq_cooling_state2power()
311 struct devfreq_cooling_device *dfc = cdev->devdata; in devfreq_cooling_power2state()
312 struct devfreq *df = dfc->devfreq; in devfreq_cooling_power2state()
313 struct devfreq_dev_status *status = &df->last_status; in devfreq_cooling_power2state()
314 unsigned long freq = status->current_frequency; in devfreq_cooling_power2state()
321 if (dfc->power_ops->get_real_power) { in devfreq_cooling_power2state()
323 est_power = power * dfc->res_util; in devfreq_cooling_power2state()
328 dyn_power = power - static_power; in devfreq_cooling_power2state()
332 busy_time = status->busy_time ?: 1; in devfreq_cooling_power2state()
333 est_power = (dyn_power * status->total_time) / busy_time; in devfreq_cooling_power2state()
340 for (i = 0; i < dfc->freq_table_size - 1; i++) in devfreq_cooling_power2state()
341 if (est_power >= dfc->power_table[i]) in devfreq_cooling_power2state()
345 dfc->capped_state = i; in devfreq_cooling_power2state()
357 * devfreq_cooling_gen_tables() - Generate power and freq tables.
360 * Generate power and frequency tables: the power table hold the
361 * device's maximum power usage at each cooling state (OPP). The
366 * The frequency table holds the frequencies in descending order.
376 struct devfreq *df = dfc->devfreq; in devfreq_cooling_gen_tables()
377 struct device *dev = df->dev.parent; in devfreq_cooling_gen_tables()
386 if (dfc->power_ops) { in devfreq_cooling_gen_tables()
390 return -ENOMEM; in devfreq_cooling_gen_tables()
396 ret = -ENOMEM; in devfreq_cooling_gen_tables()
400 for (i = 0, freq = ULONG_MAX; i < num_opps; i++, freq--) { in devfreq_cooling_gen_tables()
402 struct dev_pm_opp *opp; in devfreq_cooling_gen_tables() local
404 opp = dev_pm_opp_find_freq_floor(dev, &freq); in devfreq_cooling_gen_tables()
405 if (IS_ERR(opp)) { in devfreq_cooling_gen_tables()
406 ret = PTR_ERR(opp); in devfreq_cooling_gen_tables()
410 voltage = dev_pm_opp_get_voltage(opp) / 1000; /* mV */ in devfreq_cooling_gen_tables()
411 dev_pm_opp_put(opp); in devfreq_cooling_gen_tables()
413 if (dfc->power_ops) { in devfreq_cooling_gen_tables()
414 if (dfc->power_ops->get_real_power) in devfreq_cooling_gen_tables()
419 dev_dbg(dev, "Power table: %lu MHz @ %lu mV: %lu = %lu mW\n", in devfreq_cooling_gen_tables()
428 if (dfc->power_ops) in devfreq_cooling_gen_tables()
429 dfc->power_table = power_table; in devfreq_cooling_gen_tables()
431 dfc->freq_table = freq_table; in devfreq_cooling_gen_tables()
432 dfc->freq_table_size = num_opps; in devfreq_cooling_gen_tables()
445 * of_devfreq_cooling_register_power() - Register devfreq cooling device,
470 return ERR_PTR(-ENOMEM); in of_devfreq_cooling_register_power()
472 dfc->devfreq = df; in of_devfreq_cooling_register_power()
475 dfc->power_ops = dfc_power; in of_devfreq_cooling_register_power()
487 err = dev_pm_qos_add_request(df->dev.parent, &dfc->req_max_freq, in of_devfreq_cooling_register_power()
496 dfc->id = err; in of_devfreq_cooling_register_power()
498 snprintf(dev_name, sizeof(dev_name), "thermal-devfreq-%d", dfc->id); in of_devfreq_cooling_register_power()
504 dev_err(df->dev.parent, in of_devfreq_cooling_register_power()
510 dfc->cdev = cdev; in of_devfreq_cooling_register_power()
515 ida_simple_remove(&devfreq_ida, dfc->id); in of_devfreq_cooling_register_power()
518 dev_pm_qos_remove_request(&dfc->req_max_freq); in of_devfreq_cooling_register_power()
521 kfree(dfc->power_table); in of_devfreq_cooling_register_power()
522 kfree(dfc->freq_table); in of_devfreq_cooling_register_power()
531 * of_devfreq_cooling_register() - Register devfreq cooling device,
544 * devfreq_cooling_register() - Register devfreq cooling device.
554 * devfreq_cooling_unregister() - Unregister devfreq cooling device.
564 dfc = cdev->devdata; in devfreq_cooling_unregister()
566 thermal_cooling_device_unregister(dfc->cdev); in devfreq_cooling_unregister()
567 ida_simple_remove(&devfreq_ida, dfc->id); in devfreq_cooling_unregister()
568 dev_pm_qos_remove_request(&dfc->req_max_freq); in devfreq_cooling_unregister()
569 kfree(dfc->power_table); in devfreq_cooling_unregister()
570 kfree(dfc->freq_table); in devfreq_cooling_unregister()