Lines Matching +full:compute +full:- +full:cb
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2018-2021, Arm ltd.
34 return (dev->bus == &cpu_subsys); in _is_cpu_device()
48 struct em_dbg_info *em_dbg = s->private; \
53 table = em_perf_state_from_pd(em_dbg->pd); \
54 val = table[em_dbg->ps_id].name; \
87 /* Create per-ps directory */ in em_debug_create_ps()
103 seq_printf(s, "%*pbl\n", cpumask_pr_args(to_cpumask(s->private))); in em_debug_cpus_show()
111 struct em_perf_domain *pd = s->private; in em_debug_flags_show()
113 seq_printf(s, "%#lx\n", pd->flags); in em_debug_flags_show()
129 debugfs_create_file("cpus", 0444, d, dev->em_pd->cpus, in em_debug_create_pd()
132 debugfs_create_file("flags", 0444, d, dev->em_pd, in em_debug_create_pd()
135 em_dbg = devm_kcalloc(dev, dev->em_pd->nr_perf_states, in em_debug_create_pd()
140 /* Create a sub-directory for each performance state */ in em_debug_create_pd()
141 for (i = 0; i < dev->em_pd->nr_perf_states; i++) in em_debug_create_pd()
142 em_debug_create_ps(dev->em_pd, em_dbg, i, d); in em_debug_create_pd()
171 * em_table_free() - Handles safe free of the EM table when needed
178 kref_put(&table->kref, em_release_table_kref); in em_table_free()
182 * em_table_alloc() - Allocate a new EM table
194 table_size = sizeof(struct em_perf_state) * pd->nr_perf_states; in em_table_alloc()
200 kref_init(&table->kref); in em_table_alloc()
222 fmax = (u64) table[nr_states - 1].frequency; in em_init_performance()
230 const struct em_data_callback *cb, int nr_states, in em_compute_costs() argument
240 /* Compute the cost of each performance state. */ in em_compute_costs()
241 for (i = nr_states - 1; i >= 0; i--) { in em_compute_costs()
244 if ((flags & EM_PERF_DOMAIN_ARTIFICIAL) && cb->get_cost) { in em_compute_costs()
245 ret = cb->get_cost(dev, table[i].frequency, &cost); in em_compute_costs()
249 return -EINVAL; in em_compute_costs()
272 * em_dev_compute_costs() - Calculate cost values for new runtime EM table
291 * em_dev_update_perf_domain() - Update runtime EM table for a device
298 * from a non-sleeping context.
309 return -EINVAL; in em_dev_update_perf_domain()
314 if (!dev->em_pd) { in em_dev_update_perf_domain()
316 return -EINVAL; in em_dev_update_perf_domain()
318 pd = dev->em_pd; in em_dev_update_perf_domain()
320 kref_get(&new_table->kref); in em_dev_update_perf_domain()
322 old_table = rcu_dereference_protected(pd->em_table, in em_dev_update_perf_domain()
324 rcu_assign_pointer(pd->em_table, new_table); in em_dev_update_perf_domain()
326 em_cpufreq_update_efficiencies(dev, new_table->state); in em_dev_update_perf_domain()
337 const struct em_data_callback *cb, in em_create_perf_table() argument
341 int nr_states = pd->nr_perf_states; in em_create_perf_table()
351 ret = cb->active_power(dev, &power, &freq); in em_create_perf_table()
355 return -EINVAL; in em_create_perf_table()
363 dev_err(dev, "EM: non-increasing freq: %lu\n", in em_create_perf_table()
365 return -EINVAL; in em_create_perf_table()
375 return -EINVAL; in em_create_perf_table()
384 ret = em_compute_costs(dev, table, cb, nr_states, flags); in em_create_perf_table()
386 return -EINVAL; in em_create_perf_table()
392 const struct em_data_callback *cb, in em_create_pd() argument
407 return -EINVAL; in em_create_pd()
412 return -ENOMEM; in em_create_pd()
418 return -ENOMEM; in em_create_pd()
421 pd->nr_perf_states = nr_states; in em_create_pd()
427 ret = em_create_perf_table(dev, pd, em_table->state, cb, flags); in em_create_pd()
431 rcu_assign_pointer(pd->em_table, em_table); in em_create_pd()
436 cpu_dev->em_pd = pd; in em_create_pd()
439 dev->em_pd = pd; in em_create_pd()
447 return -EINVAL; in em_create_pd()
453 struct em_perf_domain *pd = dev->em_pd; in em_cpufreq_update_efficiencies()
474 for (i = 0; i < pd->nr_perf_states; i++) { in em_cpufreq_update_efficiencies()
491 pd->flags |= EM_PERF_DOMAIN_SKIP_INEFFICIENCIES; in em_cpufreq_update_efficiencies()
495 * em_pd_get() - Return the performance domain for a device
506 return dev->em_pd; in em_pd_get()
511 * em_cpu_get() - Return the performance domain for a CPU
530 * em_dev_register_perf_domain() - Register the Energy Model (EM) for a device
533 * @cb : Callback functions providing the data of the Energy Model
535 * obligatory. It can be taken from i.e. 'policy->cpus'. For other
537 * @microwatts : Flag indicating that the power values are in micro-Watts or
541 * defined in cb.
544 * sub-systems might rely on this flag and check if all devices in the EM are
553 const struct em_data_callback *cb, in em_dev_register_perf_domain() argument
556 int ret = em_dev_register_pd_no_update(dev, nr_states, cb, cpus, microwatts); in em_dev_register_perf_domain()
566 * em_dev_register_pd_no_update() - Register a perf domain for a device
569 * @cb : Callback functions for populating the energy model
577 const struct em_data_callback *cb, in em_dev_register_pd_no_update() argument
585 if (!dev || !nr_states || !cb) in em_dev_register_pd_no_update()
586 return -EINVAL; in em_dev_register_pd_no_update()
590 * let the driver-defined callback functions sleep. in em_dev_register_pd_no_update()
594 if (dev->em_pd) { in em_dev_register_pd_no_update()
595 ret = -EEXIST; in em_dev_register_pd_no_update()
602 ret = -EINVAL; in em_dev_register_pd_no_update()
609 ret = -EEXIST; in em_dev_register_pd_no_update()
614 * micro-architecture since they all share the same in em_dev_register_pd_no_update()
622 ret = -EINVAL; in em_dev_register_pd_no_update()
631 else if (cb->get_cost) in em_dev_register_pd_no_update()
641 ret = -EINVAL; in em_dev_register_pd_no_update()
645 ret = em_create_pd(dev, nr_states, cb, cpus, flags); in em_dev_register_pd_no_update()
649 dev->em_pd->flags |= flags; in em_dev_register_pd_no_update()
650 dev->em_pd->min_perf_state = 0; in em_dev_register_pd_no_update()
651 dev->em_pd->max_perf_state = nr_states - 1; in em_dev_register_pd_no_update()
653 em_table = rcu_dereference_protected(dev->em_pd->em_table, in em_dev_register_pd_no_update()
655 em_cpufreq_update_efficiencies(dev, em_table->state); in em_dev_register_pd_no_update()
668 * em_dev_unregister_perf_domain() - Unregister Energy Model (EM) for a device
675 if (IS_ERR_OR_NULL(dev) || !dev->em_pd) in em_dev_unregister_perf_domain()
683 * from potential clean-up/setup issues in the debugfs directories. in em_dev_unregister_perf_domain()
689 em_table_free(rcu_dereference_protected(dev->em_pd->em_table, in em_dev_unregister_perf_domain()
692 kfree(dev->em_pd); in em_dev_unregister_perf_domain()
693 dev->em_pd = NULL; in em_dev_unregister_perf_domain()
708 new_ps = em_table->state; in em_table_dup()
713 ps_size = sizeof(struct em_perf_state) * pd->nr_perf_states; in em_table_dup()
727 ret = em_compute_costs(dev, em_table->state, NULL, in em_recalc_and_update()
728 pd->nr_perf_states, pd->flags); in em_recalc_and_update()
738 * This is one-time-update, so give up the ownership in this updater. in em_recalc_and_update()
761 em_max_perf = table[pd->nr_perf_states - 1].performance; in em_adjust_new_capacity()
776 em_init_performance(dev, pd, em_table->state, pd->nr_perf_states); in em_adjust_new_capacity()
782 * em_adjust_cpu_capacity() - Adjust the EM for a CPU after a capacity update.
848 * em_dev_update_chip_binning() - Update Energy Model after the new voltage
863 return -EINVAL; in em_dev_update_chip_binning()
868 return -EINVAL; in em_dev_update_chip_binning()
874 return -ENOMEM; in em_dev_update_chip_binning()
878 for (i = 0; i < pd->nr_perf_states; i++) { in em_dev_update_chip_binning()
879 unsigned long freq = em_table->state[i].frequency; in em_dev_update_chip_binning()
888 em_table->state[i].power = power; in em_dev_update_chip_binning()
897 * em_update_performance_limits() - Update Energy Model with performance
906 * Returns 0 on success or -EINVAL when failed.
912 int min_ps = -1; in em_update_performance_limits()
913 int max_ps = -1; in em_update_performance_limits()
917 return -EINVAL; in em_update_performance_limits()
922 for (i = 0; i < pd->nr_perf_states; i++) { in em_update_performance_limits()
932 return -EINVAL; in em_update_performance_limits()
937 pd->min_perf_state = min_ps; in em_update_performance_limits()
938 pd->max_perf_state = max_ps; in em_update_performance_limits()