Lines Matching +full:cluster +full:- +full:cpufreq
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Apple SoC CPU cluster performance state driver
7 * Based on scpi-cpufreq.c
13 #include <linux/cpufreq.h>
90 .compatible = "apple,t8103-cluster-cpufreq",
94 .compatible = "apple,t8112-cluster-cpufreq",
98 .compatible = "apple,cluster-cpufreq",
115 priv = policy->driver_data; in apple_soc_cpufreq_get_rate()
117 if (priv->info->cur_pstate_mask) { in apple_soc_cpufreq_get_rate()
118 u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_STATUS); in apple_soc_cpufreq_get_rate()
120 pstate = (reg & priv->info->cur_pstate_mask) >> priv->info->cur_pstate_shift; in apple_soc_cpufreq_get_rate()
126 u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_CMD); in apple_soc_cpufreq_get_rate()
131 cpufreq_for_each_valid_entry(p, policy->freq_table) in apple_soc_cpufreq_get_rate()
132 if (p->driver_data == pstate) in apple_soc_cpufreq_get_rate()
133 return p->frequency; in apple_soc_cpufreq_get_rate()
135 dev_err(priv->cpu_dev, "could not find frequency for pstate %d\n", in apple_soc_cpufreq_get_rate()
143 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_set_target()
144 unsigned int pstate = policy->freq_table[index].driver_data; in apple_soc_cpufreq_set_target()
148 if (index > priv->info->max_pstate) in apple_soc_cpufreq_set_target()
149 index = priv->info->max_pstate; in apple_soc_cpufreq_set_target()
151 if (readq_poll_timeout_atomic(priv->reg_base + APPLE_DVFS_CMD, reg, in apple_soc_cpufreq_set_target()
154 return -EIO; in apple_soc_cpufreq_set_target()
162 writeq_relaxed(reg, priv->reg_base + APPLE_DVFS_CMD); in apple_soc_cpufreq_set_target()
170 if (apple_soc_cpufreq_set_target(policy, policy->cached_resolved_idx) < 0) in apple_soc_cpufreq_fast_switch()
173 return policy->freq_table[policy->cached_resolved_idx].frequency; in apple_soc_cpufreq_fast_switch()
184 ret = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains", in apple_soc_cpufreq_find_cluster()
185 "#performance-domain-cells", in apple_soc_cpufreq_find_cluster()
186 policy->cpus, &args); in apple_soc_cpufreq_find_cluster()
193 return -ENODEV; in apple_soc_cpufreq_find_cluster()
195 *info = match->data; in apple_soc_cpufreq_find_cluster()
199 return -ENOMEM; in apple_soc_cpufreq_find_cluster()
220 cpu_dev = get_cpu_device(policy->cpu); in apple_soc_cpufreq_init()
222 pr_err("failed to get cpu%d device\n", policy->cpu); in apple_soc_cpufreq_init()
223 return -ENODEV; in apple_soc_cpufreq_init()
234 dev_err(cpu_dev, "%s: failed to get cluster info: %d\n", __func__, ret); in apple_soc_cpufreq_init()
238 ret = dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); in apple_soc_cpufreq_init()
247 ret = -EPROBE_DEFER; in apple_soc_cpufreq_init()
253 ret = -ENOMEM; in apple_soc_cpufreq_init()
259 dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); in apple_soc_cpufreq_init()
263 /* Get OPP levels (p-state indexes) and stash them in driver_data */ in apple_soc_cpufreq_init()
276 priv->cpu_dev = cpu_dev; in apple_soc_cpufreq_init()
277 priv->reg_base = reg_base; in apple_soc_cpufreq_init()
278 priv->info = info; in apple_soc_cpufreq_init()
279 policy->driver_data = priv; in apple_soc_cpufreq_init()
280 policy->freq_table = freq_table; in apple_soc_cpufreq_init()
286 policy->cpuinfo.transition_latency = transition_latency; in apple_soc_cpufreq_init()
287 policy->dvfs_possible_from_any_cpu = true; in apple_soc_cpufreq_init()
288 policy->fast_switch_possible = true; in apple_soc_cpufreq_init()
289 policy->suspend_freq = freq_table[0].frequency; in apple_soc_cpufreq_init()
316 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_exit()
318 dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); in apple_soc_cpufreq_exit()
319 dev_pm_opp_remove_all_dynamic(priv->cpu_dev); in apple_soc_cpufreq_exit()
320 iounmap(priv->reg_base); in apple_soc_cpufreq_exit()
327 .name = "apple-cpufreq",
343 if (!of_machine_is_compatible("apple,arm-platform")) in apple_soc_cpufreq_module_init()
344 return -ENODEV; in apple_soc_cpufreq_module_init()
358 MODULE_DESCRIPTION("Apple SoC CPU cluster DVFS driver");