--- cpufreq/src/cpufreq-selector/cpufreq-sysctl.h.orig Mon Feb 14 00:38:57 2005 +++ cpufreq/src/cpufreq-selector/cpufreq-sysctl.h Mon Feb 14 00:21:39 2005 @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2001, 2002 Free Software Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Authors : Joe Marcus Clarke + */ + +#ifndef __CPUFREQ_SYSCTL_H__ +#define __CPUFREQ_SYSCTL_H__ + +#include + +#include "cpufreq.h" + +#define TYPE_CPUFREQ_SYSCTL (cpufreq_sysctl_get_type ()) +#define CPUFREQ_SYSCTL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctl)) +#define CPUFREQ_SYSCTL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctlClass)) +#define IS_CPUFREQ_SYSCTL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CPUFREQ_SYSCTL)) +#define IS_CPUFREQ_SYSCTL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CPUFREQ_SYSCTL)) +#define CPUFREQ_SYSCTL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctlClass)) + +typedef struct _CPUFreqSysctl CPUFreqSysctl; +typedef struct _CPUFreqSysctlClass CPUFreqSysctlClass; +typedef struct _CPUFreqSysctlPriv CPUFreqSysctlPriv; + +struct _CPUFreqSysctl { + CPUFreq parent; +}; + +struct _CPUFreqSysctlClass { + CPUFreqClass parent_class; +}; + + +GType cpufreq_sysctl_get_type (); +CPUFreqSysctl *cpufreq_sysctl_new (); + +#endif /* __CPUFREQ_SYSCTL_H__ */ --- cpufreq/src/cpufreq-selector/cpufreq-sysctl.c.orig Mon Feb 14 00:38:52 2005 +++ cpufreq/src/cpufreq-selector/cpufreq-sysctl.c Mon Feb 14 00:44:43 2005 @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2001, 2002 Free Software Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Authors : Joe Marcus Clarke + */ + +#include +#include +#include + +#ifdef __FreeBSD__ +#include +#include +#endif /* __FreeBSD__ */ + +#include "cpufreq-sysctl.h" + +#define PARENT_TYPE TYPE_CPUFREQ + +#define CPUFREQ_SYSCTL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctlPrivate)) + +static void cpufreq_sysctl_init (CPUFreqSysctl *cfq); +static void cpufreq_sysctl_class_init (CPUFreqSysctlClass *klass); +static void cpufreq_sysctl_finalize (GObject *object); + +static void cpufreq_sysctl_set_governor (CPUFreq *cfq, const gchar *governor); +static void cpufreq_sysctl_set_frequency (CPUFreq *cfq, gint frequency); + +static void cpufreq_sysctl_setup (CPUFreqSysctl *cfq); + +static GObjectClass *parent_class = NULL; + +typedef struct _CPUFreqSysctlPrivate CPUFreqSysctlPrivate; + +struct _CPUFreqSysctlPrivate +{ + gint pmax; +}; + +GType cpufreq_sysctl_get_type () +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (CPUFreqSysctlClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) cpufreq_sysctl_class_init, + NULL, + NULL, + sizeof (CPUFreqSysctl), + 0, + (GInstanceInitFunc) cpufreq_sysctl_init + }; + + type = g_type_register_static (PARENT_TYPE, "CPUFreqSysctl", + &info, 0); + } + + return type; +} + +static void +cpufreq_sysctl_init (CPUFreqSysctl *cfq) +{ + CPUFreqSysctlPrivate *private; + + g_return_if_fail (IS_CPUFREQ_SYSCTL (cfq)); + + private = CPUFREQ_SYSCTL_GET_PRIVATE (cfq); +} + +static void +cpufreq_sysctl_class_init (CPUFreqSysctlClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + CPUFreqClass *cfq_class = CPUFREQ_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + g_type_class_add_private (klass, sizeof (CPUFreqSysctlPrivate)); + + cfq_class->set_governor = cpufreq_sysctl_set_governor; + cfq_class->set_frequency = cpufreq_sysctl_set_frequency; + + object_class->finalize = cpufreq_sysctl_finalize; +} + +static void +cpufreq_sysctl_finalize (GObject *object) +{ + if (G_OBJECT_CLASS (parent_class)->finalize) + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +CPUFreqSysctl * +cpufreq_sysctl_new () +{ + CPUFreqSysctl *cfq; + + cfq = g_object_new (TYPE_CPUFREQ_SYSCTL, NULL); + + cpufreq_sysctl_setup (cfq); + + return cfq; +} + +static void +cpufreq_sysctl_set_governor (CPUFreq *cfq, const gchar *governor) +{ + /* Not implemented. */ +} + +static void +cpufreq_sysctl_set_frequency (CPUFreq *cfq, gint frequency) +{ + gint cpu, i; + size_t len; + gchar *freq_oid; + + g_return_if_fail (IS_CPUFREQ_SYSCTL (cfq)); + + g_object_get (G_OBJECT (cfq), "n_cpu", &cpu, NULL); + + frequency = (gint) ((gdouble) frequency / 1000); /* Convert back to MHz*/ + + for (i = 0; i < cpu; i++) { + freq_oid = g_strdup_printf ("dev.cpu.%d.freq", i); + + sysctlbyname (freq_oid, NULL, &len, &frequency, sizeof (frequency)); + g_free (freq_oid); + } +} + + +static void +cpufreq_sysctl_setup (CPUFreqSysctl *cfq) +{ + guint cpu; + gint fmax, fmin; + gint pmax; + gint ifreq; + gint mib[4]; + gchar *governor, *levels; + gchar **levelsp, **frpr, **l; + size_t len; + CPUFreqSysctlPrivate *private; + + g_return_if_fail (IS_CPUFREQ_SYSCTL (cfq)); + + private = CPUFREQ_SYSCTL_GET_PRIVATE (cfq); + + pmax = 100; + fmax = 0; + fmin = 0; + ifreq = 0; + + private->pmax = pmax; + + len = sizeof (cpu); + + if (sysctlbyname ("hw.ncpu", &cpu, &len, NULL, 0) == -1) + cpu = 1; + + len = 4; + sysctlnametomib ("dev.cpu.0.freq_levels", mib, &len); + len = sizeof (levels); + + if (sysctl (mib, 4, NULL, &len, NULL, 0) == -1) { + g_warning ("Failed to fetch dev.cpu.0.freq_levels"); + return; + } + + levels = g_malloc (len); + if (sysctl (mib, 4, levels, &len, NULL, 0) == -1) { + g_warning ("Failed to fetch data for dev.cpu.0.freq_levels"); + return; + } + + levelsp = g_strsplit (levels, " ", 0); + g_free (levels); + + frpr = g_strsplit (levelsp[0], "/", 0); /* MAX */ + if (frpr && frpr[0] != NULL) + fmax = atoi (frpr[0]); + g_strfreev (frpr); + + for (l = levelsp; l && *l; l++) /* Walk to the last frequency */ + ; + + l --; + frpr = g_strsplit (*l, "/", 0); + if (frpr && frpr[0] != NULL) + fmin = atoi (frpr[0]); + + g_strfreev (frpr); + g_strfreev (levelsp); + + len = sizeof (ifreq); + if (sysctlbyname ("dev.cpu.0.freq", &ifreq, &len, NULL, 0) == -1) { + g_warning ("Failed to fetch data for dev.cpu.0.freq"); + return; + } + + if (ifreq == fmax) + governor = g_strdup ("performance"); + else if (ifreq == fmin) + governor = g_strdup ("economy"); + else + governor = g_strdup ("other"); + + fmax *= 1000; + fmin *= 1000; + + g_object_set (G_OBJECT (cfq), "n_cpu", cpu, + "sc_max", fmax, "sc_min", fmin, + "governor", governor, NULL); + + g_free (governor); +} --- cpufreq/src/cpufreq-selector/main.c.orig Sun Apr 3 12:03:13 2005 +++ cpufreq/src/cpufreq-selector/main.c Sun Jul 3 17:16:19 2005 @@ -17,6 +17,7 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Authors : Carlos García Campos + * Joe Marcus Clarke */ #include @@ -26,6 +27,9 @@ #include "cpufreq.h" #include "cpufreq-sysfs.h" #include "cpufreq-procfs.h" +#ifdef __FreeBSD__ +#include "cpufreq-sysctl.h" +#endif /* __FreeBSD__ */ gint main (gint argc, gchar **argv) @@ -34,6 +38,9 @@ main (gint argc, gchar **argv) static gint cpu = 0; static gchar *governor = NULL; static gulong frequency = 0; +#ifdef __FreeBSD__ + size_t len; +#endif /* __FreeBSD__ */ GError *error = NULL; CPUFreq *cfq; @@ -71,10 +78,15 @@ main (gint argc, gchar **argv) g_option_context_free (context); +#ifndef __FreeBSD__ if (g_file_test ("/sys/devices/system/cpu/cpu0/cpufreq", G_FILE_TEST_EXISTS)) { /* 2.6 kernel */ cfq = CPUFREQ (cpufreq_sysfs_new ()); } else if (g_file_test ("/proc/cpufreq", G_FILE_TEST_EXISTS)) { /* 2.4 kernel */ cfq = CPUFREQ (cpufreq_procfs_new ()); +#else + if (sysctlbyname ("dev.cpu.0.freq", NULL, &len, NULL, 0) == 0) { + cfq = CPUFREQ (cpufreq_sysctl_new ()); +#endif /* __FreeBSD__ */ } else { g_print ("No cpufreq support\n"); return 1; --- cpufreq/src/cpufreq-selector/Makefile.in.orig Tue Aug 30 01:16:37 2005 +++ cpufreq/src/cpufreq-selector/Makefile.in Tue Aug 30 01:16:37 2005 @@ -56,7 +56,7 @@ PROGRAMS = $(bin_PROGRAMS) am_cpufreq_selector_OBJECTS = cpufreq.$(OBJEXT) \ cpufreq-sysfs.$(OBJEXT) cpufreq-procfs.$(OBJEXT) \ - main.$(OBJEXT) + cpufreq-sysctl.$(OBJEXT) main.$(OBJEXT) cpufreq_selector_OBJECTS = $(am_cpufreq_selector_OBJECTS) am__DEPENDENCIES_1 = cpufreq_selector_DEPENDENCIES = $(am__DEPENDENCIES_1) @@ -332,6 +332,7 @@ cpufreq.c cpufreq.h \ cpufreq-sysfs.c cpufreq-sysfs.h \ cpufreq-procfs.c cpufreq-procfs.h \ + cpufreq-sysctl.c cpufreq-sysctl.h \ main.c cpufreq_selector_LDADD = $(CPUFREQ_SELECTOR_LIBS) -lpopt @@ -407,6 +408,7 @@ -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq-procfs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq-sysctl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq-sysfs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@