2 * @file fres_acpi_cpu.c
3 * @author Dario Faggioli <faggioli@gandalf.sssup.it>
4 * Michael Trimarchi <trimarchimichael@yahoo.it>
6 * @brief Implementation of shared CPU related ACPI functions.
10 #include "fra_acpi_cpu.h"
12 static int frequency_initialized = 0;
14 static unsigned long freqs[3];
16 int fra_CPU_power_init(int cpu)
19 int i, j, freq_num = 0;
20 struct cpufreq_available_governors *governors, *g;
21 struct cpufreq_available_frequencies *frequencies, *f;
23 if (frequency_initialized == 1) return 0;
25 ret = cpufreq_cpu_exists(cpu);
26 if (ret) return EINVAL;
28 governors = cpufreq_get_available_governors(cpu);
29 if (!governors) return EINVAL;
30 for (g = governors; g != NULL; g = g->next)
31 if (strncmp("userspace", g->governor, sizeof(*g->governor)) == 0)
33 cpufreq_put_available_governors(governors);
35 if (g == NULL) return EINVAL;
37 ret = cpufreq_modify_policy_governor(cpu, "userspace");
38 if (ret) return EPERM;
41 frequencies = cpufreq_get_available_frequencies(cpu);
42 if (!frequencies) return EINVAL;
43 for (f = frequencies; f; f = f->next, freq_num++)
50 i == ((int)ceil((double)freq_num / 2.0f)) ||
52 freqs[j] = f->frequency;
58 cpufreq_put_available_frequencies(frequencies);
60 frequency_initialized = 1;
65 int fra_CPU_get_power(int cpu, int *level)
70 if (!frequency_initialized) return EINVAL;
72 freq = cpufreq_get(cpu);
73 for (i = 0; i < 3; i++)
74 if (freqs[i] == freq) {
82 int fra_CPU_set_power(int cpu, int level)
84 if (!frequency_initialized || level >= 3)
87 return cpufreq_set_frequency(cpu, freqs[level]);
90 int fra_CPU_get_speed(int cpu, int level, double *ratio)
92 if (!frequency_initialized || level >= 3)
95 *ratio = (double) freqs[level] / freqs[0];