From 4e95bf3f2044d5264cd48500859e786808a39d14 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Mon, 1 Oct 2012 17:40:43 +0000 Subject: [PATCH] E17: OpenBSD support of the cpufreq module Patch by Maxime Villard (rustyBSD) SVN revision: 77276 --- src/modules/cpufreq/e_mod_main.c | 106 +++++++++++++++++++++++++------ src/modules/cpufreq/e_mod_main.h | 3 + src/modules/cpufreq/freqset.c | 31 ++++++++- 3 files changed, 119 insertions(+), 21 deletions(-) diff --git a/src/modules/cpufreq/e_mod_main.c b/src/modules/cpufreq/e_mod_main.c index 1ba0a349a..31b11e22b 100644 --- a/src/modules/cpufreq/e_mod_main.c +++ b/src/modules/cpufreq/e_mod_main.c @@ -1,9 +1,8 @@ #include "e.h" #include "e_mod_main.h" -#ifdef __FreeBSD__ -#include -#include +#if defined (__FreeBSD__) || defined (__OpenBSD__) +# include #endif /* gadcon requirements */ @@ -291,17 +290,29 @@ _button_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED_ frequency = (long)l->data; mi = e_menu_item_new(mo); + +#ifdef __OpenBSD__ + snprintf(buf, sizeof(buf), "%i %%", frequency); +#else if (frequency < 1000000) snprintf(buf, sizeof(buf), _("%i MHz"), frequency / 1000); else snprintf(buf, sizeof(buf), _("%'.1f GHz"), frequency / 1000000.); +#endif + buf[sizeof(buf) - 1] = 0; e_menu_item_label_set(mi, buf); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); + +#ifdef __OpenBSD__ + if (cpufreq_config->status->cur_percent == frequency) + e_menu_item_toggle_set(mi, 1); +#else if (cpufreq_config->status->cur_frequency == frequency) e_menu_item_toggle_set(mi, 1); +#endif e_menu_item_callback_set(mi, _cpufreq_menu_frequency, l->data); } } @@ -445,8 +456,10 @@ _cpufreq_set_frequency(int frequency) return; } - // change it to "userspace" +#ifndef __OpenBSD__ + /* OpenBSD doesn't have governors */ _cpufreq_set_governor("userspace"); +#endif snprintf(buf, sizeof(buf), "%s %s %i", cpufreq_config->set_exe_path, "frequency", frequency); @@ -548,14 +561,45 @@ _cpufreq_status_check_available(Status *s) { char buf[4096]; Eina_List *l; - // FIXME: this sssumes all cores accept the same freqs/ might be wrong -#ifdef __FreeBSD__ - int freq, i; - size_t len = 0; + // FIXME: this assumes all cores accept the same freqs/ might be wrong + +#if defined (__OpenBSD__) + int freq, mib[] = {CTL_HW, HW_CPUSPEED}; + size_t len = sizeof(freq); + int p; + + if (sysctl(mib, 2, &freq, &len, NULL, 0) == 0) + { + if (s->frequencies) + { + eina_list_free(s->frequencies); + s->frequencies = NULL; + } + + if (s->governors) + { + for (l = s->governors; l; l = l->next) + free(l->data); + eina_list_free(s->governors); + s->governors = NULL; + } + + /* storing percents */ + p = 100; + s->frequencies = eina_list_append(s->frequencies, (void *)p); + p = 75; + s->frequencies = eina_list_append(s->frequencies, (void *)p); + p = 50; + s->frequencies = eina_list_append(s->frequencies, (void *)p); + p = 25; + s->frequencies = eina_list_append(s->frequencies, (void *)p); + } +#elif defined (__FreeBSD__) + int freq; + size_t len = sizeof(buf); char *freqs, *pos, *q; /* read freq_levels sysctl and store it in freq */ - len = sizeof(buf); if (sysctlbyname("dev.cpu.0.freq_levels", buf, &len, NULL, 0) == 0) { /* sysctl returns 0 on success */ @@ -665,18 +709,37 @@ _cpufreq_status_check_available(Status *s) static int _cpufreq_status_check_current(Status *s) { - char buf[4096]; - int i; - FILE *f; int ret = 0; int frequency = 0; - int frequency_min = 0x7fffffff; - int frequency_max = 0; - int freqtot = 0; -#ifdef __FreeBSD__ - int len = 4; +#if defined (__OpenBSD__) + size_t len = sizeof(frequency); + int percent, mib[] = {CTL_HW, HW_CPUSPEED}; s->active = 0; + + _cpufreq_status_check_available(s); + + if (sysctl(mib, 2, &frequency, &len, NULL, 0) == 0) + { + frequency *= 1000; + if (frequency != s->cur_frequency) ret = 1; + s->cur_frequency = frequency; + s->active = 1; + } + + mib[1] = HW_SETPERF; + + if (sysctl(mib, 2, &percent, &len, NULL, 0) == 0) + { + s->cur_percent = percent; + } + + s->can_set_frequency = 1; + s->cur_governor = NULL; +#elif defined (__FreeBSD__) + size_t len = sizeof(frequency); + s->active = 0; + /* frequency is stored in dev.cpu.0.freq */ if (sysctlbyname("dev.cpu.0.freq", &frequency, &len, NULL, 0) == 0) { @@ -690,6 +753,13 @@ _cpufreq_status_check_current(Status *s) s->can_set_frequency = 1; s->cur_governor = NULL; #else + char buf[4096]; + FILE *f; + int frequency_min = 0x7fffffff; + int frequency_max = 0; + int freqtot = 0; + int i; + s->active = 0; _cpufreq_status_check_available(s); @@ -724,7 +794,7 @@ _cpufreq_status_check_current(Status *s) // printf("%i | %i %i\n", frequency, frequency_min, frequency_max); - // FIXME: this sssumes all cores are on the same governor + // FIXME: this assumes all cores are on the same governor f = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed", "r"); if (f) { diff --git a/src/modules/cpufreq/e_mod_main.h b/src/modules/cpufreq/e_mod_main.h index 75e0b488b..5cd5a6c13 100644 --- a/src/modules/cpufreq/e_mod_main.h +++ b/src/modules/cpufreq/e_mod_main.h @@ -11,6 +11,9 @@ struct _Status Eina_List *frequencies; Eina_List *governors; int cur_frequency; +#ifdef __OpenBSD__ + int cur_percent; +#endif int cur_min_frequency; int cur_max_frequency; int can_set_frequency; diff --git a/src/modules/cpufreq/freqset.c b/src/modules/cpufreq/freqset.c index 86e71151a..72142a3e3 100644 --- a/src/modules/cpufreq/freqset.c +++ b/src/modules/cpufreq/freqset.c @@ -5,8 +5,13 @@ #include #ifdef __FreeBSD__ -#include -#include +# include +#endif + +#ifdef __OpenBSD__ +# include +# include +# include #endif static int sys_cpu_setall(const char *control, const char *value); @@ -25,9 +30,29 @@ main(int argc, char *argv[]) if (seteuid(0)) { fprintf(stderr, "Unable to assume root privileges\n"); + return 1; } -#ifdef __FreeBSD__ +#if defined __OpenBSD__ + if (!strcmp(argv[1], "frequency")) + { + int mib[] = {CTL_HW, HW_SETPERF}; + int new_perf = atoi(argv[2]); + size_t len = sizeof(new_perf); + + if (sysctl(mib, 2, NULL, 0, &new_perf, len) == -1) + { + return 1; + } + + return 0; + } + else + { + fprintf(stderr, "Unknown command (%s %s).\n", argv[1], argv[2]); + return 1; + } +#elif defined __FreeBSD__ if (!strcmp(argv[1], "frequency")) { int new_frequency = atoi(argv[2]);