Lines Matching +full:tegra194 +full:- +full:ccplex

1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/dma-mapping.h>
19 #include <soc/tegra/bpmp-abi.h>
65 * Read per-core Read-only system register NVFREQ_FEEDBACK_EL1.
85 return nltbl->ref_clk_hz / KHZ * ndiv / (nltbl->pdiv * nltbl->mdiv); in map_ndiv_to_freq()
108 c = &read_counters_work->c; in tegra_read_counters()
111 c->last_refclk_cnt = lower_32_bits(val); in tegra_read_counters()
112 c->last_coreclk_cnt = upper_32_bits(val); in tegra_read_counters()
115 c->refclk_cnt = lower_32_bits(val); in tegra_read_counters()
116 c->coreclk_cnt = upper_32_bits(val); in tegra_read_counters()
121 * Instantaneous freq is calculated as -
122 * -Takes sample on every query of getting the freq.
123 * - Read core and ref clock counters;
124 * - Delay for X us
125 * - Read above cycle counters again
126 * - Calculates freq by subtracting current and previous counters
128 * - Return Kcycles/second, freq in KHz
137 * @cpu - logical cpu whose freq to be updated
160 delta_ccnt = c.coreclk_cnt + (MAX_CNT - c.last_coreclk_cnt); in tegra194_calculate_speed()
162 delta_ccnt = c.coreclk_cnt - c.last_coreclk_cnt; in tegra194_calculate_speed()
168 delta_refcnt = c.refclk_cnt + (MAX_CNT - c.last_refclk_cnt); in tegra194_calculate_speed()
170 delta_refcnt = c.refclk_cnt - c.last_refclk_cnt; in tegra194_calculate_speed()
192 u64 ndiv_val = (u64)tbl->driver_data; in set_cpu_ndiv()
222 cpufreq_for_each_valid_entry(pos, data->tables[cl]) { in tegra194_get_speed()
223 if (pos->driver_data != ndiv) in tegra194_get_speed()
226 if (abs(pos->frequency - rate) > 115200) { in tegra194_get_speed()
228 cpu, rate, pos->frequency, ndiv); in tegra194_get_speed()
230 rate = pos->frequency; in tegra194_get_speed()
243 smp_call_function_single(policy->cpu, get_cpu_cluster, &cl, true); in tegra194_cpufreq_init()
245 if (cl >= data->num_clusters) in tegra194_cpufreq_init()
246 return -EINVAL; in tegra194_cpufreq_init()
250 cpumask_set_cpu(cpu, policy->cpus); in tegra194_cpufreq_init()
252 policy->freq_table = data->tables[cl]; in tegra194_cpufreq_init()
253 policy->cpuinfo.transition_latency = TEGRA_CPUFREQ_TRANSITION_LATENCY; in tegra194_cpufreq_init()
261 struct cpufreq_frequency_table *tbl = policy->freq_table + index; in tegra194_cpufreq_set_target()
268 on_each_cpu_mask(policy->cpus, set_cpu_ndiv, tbl, true); in tegra194_cpufreq_set_target()
274 .name = "tegra194",
321 dev_dbg(&pdev->dev, "cluster %d: frequency table step size: %d\n", in init_freq_table()
324 delta_ndiv = resp.ndiv_max - resp.ndiv_min; in init_freq_table()
335 freq_table = devm_kcalloc(&pdev->dev, num_freqs + 1, in init_freq_table()
338 return ERR_PTR(-ENOMEM); in init_freq_table()
360 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in tegra194_cpufreq_probe()
362 return -ENOMEM; in tegra194_cpufreq_probe()
364 data->num_clusters = MAX_CLUSTERS; in tegra194_cpufreq_probe()
365 data->tables = devm_kcalloc(&pdev->dev, data->num_clusters, in tegra194_cpufreq_probe()
366 sizeof(*data->tables), GFP_KERNEL); in tegra194_cpufreq_probe()
367 if (!data->tables) in tegra194_cpufreq_probe()
368 return -ENOMEM; in tegra194_cpufreq_probe()
372 bpmp = tegra_bpmp_get(&pdev->dev); in tegra194_cpufreq_probe()
378 dev_err(&pdev->dev, "fail to create_workqueue\n"); in tegra194_cpufreq_probe()
379 err = -EINVAL; in tegra194_cpufreq_probe()
383 for (i = 0; i < data->num_clusters; i++) { in tegra194_cpufreq_probe()
384 data->tables[i] = init_freq_table(pdev, bpmp, i); in tegra194_cpufreq_probe()
385 if (IS_ERR(data->tables[i])) { in tegra194_cpufreq_probe()
386 err = PTR_ERR(data->tables[i]); in tegra194_cpufreq_probe()
413 { .compatible = "nvidia,tegra194-ccplex", },
420 .name = "tegra194-cpufreq",
430 MODULE_DESCRIPTION("NVIDIA Tegra194 cpufreq driver");