Lines Matching +full:clk +full:- +full:delay +full:- +full:cycles
1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/delay.h>
9 #include <linux/dma-mapping.h>
19 #include <soc/tegra/bpmp-abi.h>
47 u32 delay; member
67 * Read per-core Read-only system register NVFREQ_FEEDBACK_EL1.
87 return nltbl->ref_clk_hz / KHZ * ndiv / (nltbl->pdiv * nltbl->mdiv); in map_ndiv_to_freq()
97 * ref_clk_counter(32 bit counter) runs on constant clk, in tegra_read_counters()
99 * It will take = 2 ^ 32 / 408 MHz to overflow ref clk counter in tegra_read_counters()
105 * It will take = 2 ^ 32 / 2000 MHz to overflow core clk counter in tegra_read_counters()
110 c = &read_counters_work->c; in tegra_read_counters()
113 c->last_refclk_cnt = lower_32_bits(val); in tegra_read_counters()
114 c->last_coreclk_cnt = upper_32_bits(val); in tegra_read_counters()
115 udelay(c->delay); in tegra_read_counters()
117 c->refclk_cnt = lower_32_bits(val); in tegra_read_counters()
118 c->coreclk_cnt = upper_32_bits(val); in tegra_read_counters()
123 * Instantaneous freq is calculated as -
124 * -Takes sample on every query of getting the freq.
125 * - Read core and ref clock counters;
126 * - Delay for X us
127 * - Read above cycle counters again
128 * - Calculates freq by subtracting current and previous counters
129 * divided by the delay time or eqv. of ref_clk_counter in delta time
130 * - Return Kcycles/second, freq in KHz
134 * freq in Hz = cycles/sec
135 * = (delta cycles / x sec
136 * = (delta cycles * 408 * 10^6) / delta ref_clk_counter
137 * in KHz = (delta cycles * 408 * 10^3) / delta ref_clk_counter
139 * @cpu - logical cpu whose freq to be updated
142 static unsigned int tegra194_get_speed_common(u32 cpu, u32 delay) in tegra194_get_speed_common() argument
156 read_counters_work.c.delay = delay; in tegra194_get_speed_common()
163 delta_ccnt = c.coreclk_cnt + (MAX_CNT - c.last_coreclk_cnt); in tegra194_get_speed_common()
165 delta_ccnt = c.coreclk_cnt - c.last_coreclk_cnt; in tegra194_get_speed_common()
171 delta_refcnt = c.refclk_cnt + (MAX_CNT - c.last_refclk_cnt); in tegra194_get_speed_common()
173 delta_refcnt = c.refclk_cnt - c.last_refclk_cnt; in tegra194_get_speed_common()
194 smp_call_function_single(policy->cpu, get_cpu_cluster, &cl, true); in tegra194_cpufreq_init()
196 if (cl >= data->num_clusters) in tegra194_cpufreq_init()
197 return -EINVAL; in tegra194_cpufreq_init()
200 policy->cur = tegra194_get_speed_common(policy->cpu, US_DELAY_MIN); in tegra194_cpufreq_init()
204 cpumask_set_cpu(cpu, policy->cpus); in tegra194_cpufreq_init()
206 policy->freq_table = data->tables[cl]; in tegra194_cpufreq_init()
207 policy->cpuinfo.transition_latency = TEGRA_CPUFREQ_TRANSITION_LATENCY; in tegra194_cpufreq_init()
215 u64 ndiv_val = (u64)tbl->driver_data; in set_cpu_ndiv()
223 struct cpufreq_frequency_table *tbl = policy->freq_table + index; in tegra194_cpufreq_set_target()
230 on_each_cpu_mask(policy->cpus, set_cpu_ndiv, tbl, true); in tegra194_cpufreq_set_target()
284 dev_dbg(&pdev->dev, "cluster %d: frequency table step size: %d\n", in init_freq_table()
287 delta_ndiv = resp.ndiv_max - resp.ndiv_min; in init_freq_table()
298 freq_table = devm_kcalloc(&pdev->dev, num_freqs + 1, in init_freq_table()
301 return ERR_PTR(-ENOMEM); in init_freq_table()
323 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in tegra194_cpufreq_probe()
325 return -ENOMEM; in tegra194_cpufreq_probe()
327 data->num_clusters = MAX_CLUSTERS; in tegra194_cpufreq_probe()
328 data->tables = devm_kcalloc(&pdev->dev, data->num_clusters, in tegra194_cpufreq_probe()
329 sizeof(*data->tables), GFP_KERNEL); in tegra194_cpufreq_probe()
330 if (!data->tables) in tegra194_cpufreq_probe()
331 return -ENOMEM; in tegra194_cpufreq_probe()
335 bpmp = tegra_bpmp_get(&pdev->dev); in tegra194_cpufreq_probe()
341 dev_err(&pdev->dev, "fail to create_workqueue\n"); in tegra194_cpufreq_probe()
342 err = -EINVAL; in tegra194_cpufreq_probe()
346 for (i = 0; i < data->num_clusters; i++) { in tegra194_cpufreq_probe()
347 data->tables[i] = init_freq_table(pdev, bpmp, i); in tegra194_cpufreq_probe()
348 if (IS_ERR(data->tables[i])) { in tegra194_cpufreq_probe()
349 err = PTR_ERR(data->tables[i]); in tegra194_cpufreq_probe()
376 { .compatible = "nvidia,tegra194-ccplex", },
383 .name = "tegra194-cpufreq",