Lines Matching +full:performance +full:- +full:domain
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2018-2021 ARM Ltd.
11 #include <linux/clk-provider.h>
45 priv = policy->driver_data; in scmi_cpufreq_get_rate()
47 ret = perf_ops->freq_get(ph, priv->domain_id, &rate, false); in scmi_cpufreq_get_rate()
54 * perf_ops->freq_set is not a synchronous, the actual OPP change will
61 struct scmi_data *priv = policy->driver_data; in scmi_cpufreq_set_target()
62 u64 freq = policy->freq_table[index].frequency; in scmi_cpufreq_set_target()
64 return perf_ops->freq_set(ph, priv->domain_id, freq * 1000, false); in scmi_cpufreq_set_target()
70 struct scmi_data *priv = policy->driver_data; in scmi_cpufreq_fast_switch()
73 if (!perf_ops->freq_set(ph, priv->domain_id, freq * 1000, true)) in scmi_cpufreq_fast_switch()
82 int cpu, domain, tdomain; in scmi_get_sharing_cpus() local
85 domain = perf_ops->device_domain_id(cpu_dev); in scmi_get_sharing_cpus()
86 if (domain < 0) in scmi_get_sharing_cpus()
87 return domain; in scmi_get_sharing_cpus()
90 if (cpu == cpu_dev->id) in scmi_get_sharing_cpus()
97 tdomain = perf_ops->device_domain_id(tcpu_dev); in scmi_get_sharing_cpus()
98 if (tdomain == domain) in scmi_get_sharing_cpus()
109 enum scmi_power_scale power_scale = perf_ops->power_scale_get(ph); in scmi_get_cpu_power()
111 int ret, domain; in scmi_get_cpu_power() local
113 domain = perf_ops->device_domain_id(cpu_dev); in scmi_get_cpu_power()
114 if (domain < 0) in scmi_get_cpu_power()
115 return domain; in scmi_get_cpu_power()
117 /* Get the power cost of the performance domain. */ in scmi_get_cpu_power()
119 ret = perf_ops->est_power_get(ph, domain, &Hz, power); in scmi_get_cpu_power()
141 cpu_dev = get_cpu_device(policy->cpu); in scmi_cpufreq_init()
143 pr_err("failed to get cpu%d device\n", policy->cpu); in scmi_cpufreq_init()
144 return -ENODEV; in scmi_cpufreq_init()
149 return -ENOMEM; in scmi_cpufreq_init()
151 if (!zalloc_cpumask_var(&priv->opp_shared_cpus, GFP_KERNEL)) { in scmi_cpufreq_init()
152 ret = -ENOMEM; in scmi_cpufreq_init()
156 /* Obtain CPUs that share SCMI performance controls */ in scmi_cpufreq_init()
157 ret = scmi_get_sharing_cpus(cpu_dev, policy->cpus); in scmi_cpufreq_init()
164 * Obtain CPUs that share performance levels. in scmi_cpufreq_init()
166 * table and opp-shared. in scmi_cpufreq_init()
168 ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, priv->opp_shared_cpus); in scmi_cpufreq_init()
169 if (ret || cpumask_empty(priv->opp_shared_cpus)) { in scmi_cpufreq_init()
171 * Either opp-table is not set or no opp-shared was found. in scmi_cpufreq_init()
175 cpumask_copy(priv->opp_shared_cpus, policy->cpus); in scmi_cpufreq_init()
185 ret = perf_ops->device_opps_add(ph, cpu_dev); in scmi_cpufreq_init()
196 ret = -ENODEV; in scmi_cpufreq_init()
200 ret = dev_pm_opp_set_sharing_cpus(cpu_dev, priv->opp_shared_cpus); in scmi_cpufreq_init()
208 priv->nr_opp = nr_opp; in scmi_cpufreq_init()
217 priv->cpu_dev = cpu_dev; in scmi_cpufreq_init()
218 priv->domain_id = perf_ops->device_domain_id(cpu_dev); in scmi_cpufreq_init()
220 policy->driver_data = priv; in scmi_cpufreq_init()
221 policy->freq_table = freq_table; in scmi_cpufreq_init()
223 /* SCMI allows DVFS request for any domain from any CPU */ in scmi_cpufreq_init()
224 policy->dvfs_possible_from_any_cpu = true; in scmi_cpufreq_init()
226 latency = perf_ops->transition_latency_get(ph, cpu_dev); in scmi_cpufreq_init()
230 policy->cpuinfo.transition_latency = latency; in scmi_cpufreq_init()
232 policy->fast_switch_possible = in scmi_cpufreq_init()
233 perf_ops->fast_switch_possible(ph, cpu_dev); in scmi_cpufreq_init()
241 free_cpumask_var(priv->opp_shared_cpus); in scmi_cpufreq_init()
251 struct scmi_data *priv = policy->driver_data; in scmi_cpufreq_exit()
253 dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); in scmi_cpufreq_exit()
254 dev_pm_opp_remove_all_dynamic(priv->cpu_dev); in scmi_cpufreq_exit()
255 free_cpumask_var(priv->opp_shared_cpus); in scmi_cpufreq_exit()
264 enum scmi_power_scale power_scale = perf_ops->power_scale_get(ph); in scmi_cpufreq_register_em()
265 struct scmi_data *priv = policy->driver_data; in scmi_cpufreq_register_em()
271 * policy, some CPUs may still share their perf-domains, and a CPU from in scmi_cpufreq_register_em()
275 if (!priv->nr_opp) in scmi_cpufreq_register_em()
282 em_dev_register_perf_domain(get_cpu_device(policy->cpu), priv->nr_opp, in scmi_cpufreq_register_em()
283 &em_cb, priv->opp_shared_cpus, in scmi_cpufreq_register_em()
325 idx = of_property_match_string(cpu_np, "power-domain-names", "perf"); in scmi_dev_used_by_cpus()
326 np = of_parse_phandle(cpu_np, "power-domains", idx); in scmi_dev_used_by_cpus()
339 struct device *dev = &sdev->dev; in scmi_cpufreq_probe()
342 handle = sdev->handle; in scmi_cpufreq_probe()
345 return -ENODEV; in scmi_cpufreq_probe()
347 perf_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_PERF, &ph); in scmi_cpufreq_probe()
353 if (of_property_present(dev->of_node, "#clock-cells")) { in scmi_cpufreq_probe()
381 .name = "scmi-cpufreq",