Lines Matching +full:cluster +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2013 - 2019 ARM Ltd.
47 #define ACTUAL_FREQ(cluster, freq) ((cluster == A7_CLUSTER) ? freq << 1 : freq) argument
48 #define VIRT_FREQ(cluster, freq) ((cluster == A7_CLUSTER) ? freq >> 1 : freq) argument
74 static unsigned int find_cluster_maxfreq(int cluster) in find_cluster_maxfreq() argument
82 if (cluster == per_cpu(physical_cluster, j) && in find_cluster_maxfreq()
141 ret = -EIO; in ve_spc_cpufreq_set_rate()
157 /* Recalc freq for old cluster when switching clusters */ in ve_spc_cpufreq_set_rate()
159 /* Switch cluster */ in ve_spc_cpufreq_set_rate()
164 /* Set freq of old cluster if there are cpus left on it */ in ve_spc_cpufreq_set_rate()
170 pr_err("%s: clk_set_rate failed: %d, old cluster: %d\n", in ve_spc_cpufreq_set_rate()
183 u32 cpu = policy->cpu, cur_cluster, new_cluster, actual_cluster; in ve_spc_cpufreq_set_target()
220 if (pos->frequency < min_freq) in get_table_min()
221 min_freq = pos->frequency; in get_table_min()
232 if (pos->frequency > max_freq) in get_table_max()
233 max_freq = pos->frequency; in get_table_max()
260 return -ENOMEM; in merge_cluster_tables()
265 for (i = MAX_CLUSTERS - 1; i >= 0; i--, count = k) { in merge_cluster_tables()
285 u32 cluster = raw_cpu_to_cluster(cpu_dev->id); in _put_cluster_clk_and_freq_table() local
287 if (!freq_table[cluster]) in _put_cluster_clk_and_freq_table()
290 clk_put(clk[cluster]); in _put_cluster_clk_and_freq_table()
291 dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table[cluster]); in _put_cluster_clk_and_freq_table()
297 u32 cluster = cpu_to_cluster(cpu_dev->id); in put_cluster_clk_and_freq_table() local
300 if (atomic_dec_return(&cluster_usage[cluster])) in put_cluster_clk_and_freq_table()
303 if (cluster < MAX_CLUSTERS) in put_cluster_clk_and_freq_table()
316 kfree(freq_table[cluster]); in put_cluster_clk_and_freq_table()
322 u32 cluster = raw_cpu_to_cluster(cpu_dev->id); in _get_cluster_clk_and_freq_table() local
325 if (freq_table[cluster]) in _get_cluster_clk_and_freq_table()
330 * so just check if the OPP count is non-zero in _get_cluster_clk_and_freq_table()
336 ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table[cluster]); in _get_cluster_clk_and_freq_table()
340 clk[cluster] = clk_get(cpu_dev, NULL); in _get_cluster_clk_and_freq_table()
341 if (!IS_ERR(clk[cluster])) in _get_cluster_clk_and_freq_table()
344 dev_err(cpu_dev, "%s: Failed to get clk for cpu: %d, cluster: %d\n", in _get_cluster_clk_and_freq_table()
345 __func__, cpu_dev->id, cluster); in _get_cluster_clk_and_freq_table()
346 ret = PTR_ERR(clk[cluster]); in _get_cluster_clk_and_freq_table()
347 dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table[cluster]); in _get_cluster_clk_and_freq_table()
350 dev_err(cpu_dev, "%s: Failed to get data for cluster: %d\n", __func__, in _get_cluster_clk_and_freq_table()
351 cluster); in _get_cluster_clk_and_freq_table()
358 u32 cluster = cpu_to_cluster(cpu_dev->id); in get_cluster_clk_and_freq_table() local
361 if (atomic_inc_return(&cluster_usage[cluster]) != 1) in get_cluster_clk_and_freq_table()
364 if (cluster < MAX_CLUSTERS) { in get_cluster_clk_and_freq_table()
367 atomic_dec(&cluster_usage[cluster]); in get_cluster_clk_and_freq_table()
372 * Get data for all clusters and fill virtual cluster with a merge of in get_cluster_clk_and_freq_table()
379 return -ENODEV; in get_cluster_clk_and_freq_table()
390 /* Assuming 2 cluster, set clk_big_min and clk_little_max */ in get_cluster_clk_and_freq_table()
402 return -ENODEV; in get_cluster_clk_and_freq_table()
407 atomic_dec(&cluster_usage[cluster]); in get_cluster_clk_and_freq_table()
412 /* Per-CPU initialization */
415 u32 cur_cluster = cpu_to_cluster(policy->cpu); in ve_spc_cpufreq_init()
419 cpu_dev = get_cpu_device(policy->cpu); in ve_spc_cpufreq_init()
422 policy->cpu); in ve_spc_cpufreq_init()
423 return -ENODEV; in ve_spc_cpufreq_init()
429 dev_pm_opp_get_sharing_cpus(cpu_dev, policy->cpus); in ve_spc_cpufreq_init()
431 for_each_cpu(cpu, policy->cpus) in ve_spc_cpufreq_init()
435 per_cpu(physical_cluster, policy->cpu) = A15_CLUSTER; in ve_spc_cpufreq_init()
438 ret = get_cluster_clk_and_freq_table(cpu_dev, policy->cpus); in ve_spc_cpufreq_init()
442 policy->freq_table = freq_table[cur_cluster]; in ve_spc_cpufreq_init()
443 policy->cpuinfo.transition_latency = 1000000; /* 1 ms */ in ve_spc_cpufreq_init()
445 dev_pm_opp_of_register_em(cpu_dev, policy->cpus); in ve_spc_cpufreq_init()
448 per_cpu(cpu_last_req_freq, policy->cpu) = in ve_spc_cpufreq_init()
449 clk_get_cpu_rate(policy->cpu); in ve_spc_cpufreq_init()
451 dev_info(cpu_dev, "%s: CPU %d initialized\n", __func__, policy->cpu); in ve_spc_cpufreq_init()
458 int cur_cluster = cpu_to_cluster(policy->cpu); in ve_spc_cpufreq_exit()
465 cpu_dev = get_cpu_device(policy->cpu); in ve_spc_cpufreq_exit()
468 policy->cpu); in ve_spc_cpufreq_exit()
469 return -ENODEV; in ve_spc_cpufreq_exit()
472 put_cluster_clk_and_freq_table(cpu_dev, policy->related_cpus); in ve_spc_cpufreq_exit()
478 int cur_cluster = cpu_to_cluster(policy->cpu); in ve_spc_cpufreq_ready()
480 /* Do not register a cpu_cooling device if we are in IKS mode */ in ve_spc_cpufreq_ready()
488 .name = "vexpress-spc",
580 pr_info("%s: Un-registered platform driver: %s\n", __func__, in ve_spc_cpufreq_remove()
587 .name = "vexpress-spc-cpufreq",
594 MODULE_ALIAS("platform:vexpress-spc-cpufreq");