aboutsummaryrefslogtreecommitdiffstats
path: root/cputemp2maxfreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'cputemp2maxfreq.c')
-rw-r--r--cputemp2maxfreq.c60
1 files changed, 36 insertions, 24 deletions
diff --git a/cputemp2maxfreq.c b/cputemp2maxfreq.c
index 1760996..267c54e 100644
--- a/cputemp2maxfreq.c
+++ b/cputemp2maxfreq.c
@@ -1,26 +1,13 @@
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
#include "sysfs.h"
#include "cpufreq.h"
#include "debug.h"
-
-struct s_cpudata {
- long int min_freq;
- long int max_freq;
- long int cur_freq;
- long int cur_temp;
- long int scale_max;
-};
-
-struct s_config {
- char *governor;
- long int max_temp;
- char *temp_input;
- long int freq_step;
- long int fallback_freq;
- unsigned int interval;
-};
+#include "cputemp2maxfreq.h"
+#include "failsafe.h"
struct s_cpudata cpudata;
struct s_config config={"conservative",70000,"/sys/devices/virtual/thermal/thermal_zone0/temp",100000,2000000,10};
@@ -29,19 +16,44 @@ int main()
{
long int diff;
long int newfreq;
-
- printf("Governor: %s\nTemp input: %s\n",config.governor,config.temp_input);
- if (cpufreq_set_str("scaling_governor",config.governor,0)!=0)
- {
- printf("Failed to set governow\n");
- exit(1);
- }
+// Print configuration
+ printf("Configuration:");
+ printf("Governor: %s\n",config.governor);
+ printf("Temperature: %ld\n",config.max_temp);
+ printf("Temp input: %s\n",config.temp_input);
+ printf("Frequency step: %ld\n",config.freq_step);
+ printf("Fallback frquency: %ld\n",config.fallback_freq);
+ printf("Interval: %d\n",config.interval);
+// Get and validate CPU data
cpudata.min_freq=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq");
cpudata.max_freq=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq");
cpudata.scale_max=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq");
+ printf("\nCPU data:\n");
+ printf("Minimum frequency: %ld\n",cpudata.min_freq);
+ printf("Maximum frequency: %ld\n",cpudata.max_freq);
+ printf("Scaling maximum frequency: %ld\n",cpudata.scale_max);
+
+ if ((cpudata.min_freq<100000) || (cpudata.min_freq>10000000) ||
+ (cpudata.max_freq<100000) || (cpudata.max_freq>10000000) ||
+ (cpudata.scale_max<100000) || (cpudata.scale_max>10000000))
+ {
+// If we have to fail now, there's not much we can do because we have no data
+ printf("Invalid CPU data, exiting.\n");
+ exit(1);
+ }
+
+// Set the governor
+ if (cpufreq_set_str("scaling_governor",config.governor,0)!=0)
+ {
+ printf("Failed to set governor, error %d (%s).\n",errno,strerror(errno));
+
+// We failed to set the governor, call the failsafe
+ failsafe();
+ }
+
while(1)
{
cpudata.cur_freq=sysfs_read_long_int("/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq");