From 48ec55bd19362c5b8f7d06f7678321c3535672f4 Mon Sep 17 00:00:00 2001 From: PA4WDH Date: Sat, 20 May 2023 19:27:47 +0200 Subject: Add validation and fallback to startup --- cputemp2maxfreq.c | 60 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 24 deletions(-) (limited to 'cputemp2maxfreq.c') diff --git a/cputemp2maxfreq.c b/cputemp2maxfreq.c index 1760996..267c54e 100644 --- a/cputemp2maxfreq.c +++ b/cputemp2maxfreq.c @@ -1,26 +1,13 @@ #include #include #include +#include +#include #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"); -- cgit v1.2.3