2 * (C) 2004 Dominik Brodowski <linux@dominikbrodowski.de>
4 * Licensed under the terms of the GNU GPL License version 2.
14 #define MAX_LINE_LEN 255
16 static int readout_proc_cpufreq(unsigned int cpu, unsigned long *min, unsigned long *max, char **governor)
19 char value[MAX_LINE_LEN];
20 char gov_value[MAX_LINE_LEN];
22 unsigned int cpu_read;
23 unsigned int tmp1, tmp2;
25 if ((!min) || (!max) || (!governor))
28 fp = fopen("/proc/cpufreq","r");
33 if (!fgets(value, MAX_LINE_LEN, fp)) {
38 if (strlen(value) > (MAX_LINE_LEN - 10)) {
44 if (!fgets(value, MAX_LINE_LEN, fp)) {
49 if (strlen(value) > (MAX_LINE_LEN - 10)) {
54 ret = sscanf(value, "CPU%3d %9lu kHz (%3d %%) - %9lu kHz (%3d %%) - %s",
55 &cpu_read , min, &tmp1, max, &tmp2, gov_value);
64 if ((tmp2 < tmp1) || (tmp2 > 100) || (*max < *min)) {
69 tmp1 = strlen(gov_value);
75 *governor = malloc(sizeof(char) * (tmp1 + 2));
81 strncpy(*governor, gov_value, tmp1);
82 (*governor)[tmp1] = '\0';
94 int proc_cpu_exists(unsigned int cpu) {
95 unsigned long tmp1, tmp2;
99 ret = readout_proc_cpufreq(cpu, &tmp1, &tmp2, &tmp3);
107 struct cpufreq_policy * proc_get_policy(unsigned int cpu) {
108 struct cpufreq_policy tmp;
109 struct cpufreq_policy *ret;
112 err = readout_proc_cpufreq(cpu, &tmp.min, &tmp.max, &tmp.governor);
116 ret = malloc(sizeof(struct cpufreq_policy));
122 ret->governor = tmp.governor;
127 unsigned long proc_get_freq_kernel(unsigned int cpu) {
129 char value[MAX_LINE_LEN];
130 char file[MAX_LINE_LEN];
131 unsigned long value2;
133 snprintf(file, MAX_LINE_LEN, "/proc/sys/cpu/%u/speed", cpu);
135 fp = fopen(file,"r");
139 if (!fgets(value, MAX_LINE_LEN, fp)) {
146 if (strlen(value) > (MAX_LINE_LEN - 10)) {
150 if (sscanf(value, "%lu", &value2) != 1)
156 int proc_set_policy(unsigned int cpu, struct cpufreq_policy *policy) {
158 char value[MAX_LINE_LEN];
161 if ((!policy) || (!policy->governor) || (strlen(policy->governor) > 15))
164 snprintf(value, MAX_LINE_LEN, "%d:%lu:%lu:%s", cpu, policy->min, policy->max, policy->governor);
166 value[MAX_LINE_LEN - 1]='\0';
168 fp = fopen("/proc/cpufreq","r+");
171 ret = fputs(value, fp);
180 int proc_set_frequency(unsigned int cpu, unsigned long target_frequency) {
181 struct cpufreq_policy *pol = proc_get_policy(cpu);
182 struct cpufreq_policy new_pol;
183 char userspace_gov[] = "userspace";
185 char value[MAX_LINE_LEN];
186 char file[MAX_LINE_LEN];
192 if (strncmp(pol->governor, userspace_gov, 9) != 0) {
193 cpufreq_put_policy(pol);
194 new_pol.min = pol->min;
195 new_pol.max = pol->max;
196 new_pol.governor = userspace_gov;
197 ret = proc_set_policy(cpu, &new_pol);
203 snprintf(file, MAX_LINE_LEN, "/proc/sys/cpu/%u/speed", cpu);
204 snprintf(value, MAX_LINE_LEN, "%lu", target_frequency);
206 fp = fopen(file,"r+");
209 ret = fputs(value, fp);