-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cpupowerutils - cpufrequtils extended with quite some features
CPU power consumption vs performance tuning is no longer limited to CPU frequency switching anymore: deep sleep states, traditional dynamic frequency scaling and hidden turbo/boost frequencies are tied close together and depend on each other. The first two exist on different architectures like PPC, Itanium and ARM, the latter (so far) only on X86. On X86 the APU (CPU+GPU) will only run most efficiently if CPU and GPU has proper power management in place. Users and Developers want to have *one* tool to get an overview what their system supports and to monitor and debug CPU power management in detail. The tool should compile and work on as many architectures as possible. Once this tool stabilizes a bit, it is intended to replace the Intel-specific tools in tools/power/x86 Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
- Loading branch information
Dominik Brodowski
committed
Jul 29, 2011
1 parent
02f8c6a
commit 7fe2f63
Showing
73 changed files
with
14,423 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
.libs | ||
libcpufreq.so | ||
libcpufreq.so.0 | ||
libcpufreq.so.0.0.0 | ||
build/ccdv | ||
cpufreq-info | ||
cpufreq-set | ||
cpufreq-aperf | ||
lib/.libs | ||
lib/cpufreq.lo | ||
lib/cpufreq.o | ||
lib/proc.lo | ||
lib/proc.o | ||
lib/sysfs.lo | ||
lib/sysfs.o | ||
libcpufreq.la | ||
po/cpufrequtils.pot | ||
po/*.gmo | ||
utils/cpufreq-info.o | ||
utils/cpufreq-set.o | ||
utils/cpufreq-aperf.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
Dominik Brodowski | ||
<linux@brodo.de> | ||
|
||
Mattia Dongili | ||
via Latisana, 8 | ||
00177 Rome | ||
Italy | ||
<malattia@gmail.com> | ||
|
||
Goran Koruga | ||
Slovenia | ||
<korugag@siol.net> | ||
|
||
Thomas Renninger | ||
SUSE Linux GmbH | ||
Germany | ||
<trenn@suse.de> | ||
|
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,273 @@ | ||
# Makefile for cpupowerutils | ||
# | ||
# Copyright (C) 2005,2006 Dominik Brodowski <linux@dominikbrodowski.net> | ||
# | ||
# Based largely on the Makefile for udev by: | ||
# | ||
# Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com> | ||
# | ||
# This program 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; version 2 of the License. | ||
# | ||
# This program 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 program; if not, write to the Free Software | ||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
# | ||
|
||
# --- CONFIGURATION BEGIN --- | ||
|
||
# Set the following to `true' to make a unstripped, unoptimized | ||
# binary. Leave this set to `false' for production use. | ||
DEBUG ?= true | ||
|
||
# make the build silent. Set this to something else to make it noisy again. | ||
V ?= false | ||
|
||
# Internationalization support (output in different languages). | ||
# Requires gettext. | ||
NLS ?= true | ||
|
||
# Set the following to 'true' to build/install the | ||
# cpufreq-bench benchmarking tool | ||
CPUFRQ_BENCH ?= true | ||
|
||
# Prefix to the directories we're installing to | ||
DESTDIR ?= | ||
|
||
# --- CONFIGURATION END --- | ||
|
||
|
||
|
||
# Package-related definitions. Distributions can modify the version | ||
# and _should_ modify the PACKAGE_BUGREPORT definition | ||
|
||
VERSION = 009p1 | ||
LIB_MAJ= 0.0.0 | ||
LIB_MIN= 0 | ||
|
||
PACKAGE = cpupowerutils | ||
PACKAGE_BUGREPORT = cpufreq@vger.kernel.org | ||
LANGUAGES = de fr it cs pt | ||
|
||
|
||
# Directory definitions. These are default and most probably | ||
# do not need to be changed. Please note that DESTDIR is | ||
# added in front of any of them | ||
|
||
bindir ?= /usr/bin | ||
sbindir ?= /usr/sbin | ||
mandir ?= /usr/man | ||
includedir ?= /usr/include | ||
libdir ?= /usr/lib | ||
localedir ?= /usr/share/locale | ||
docdir ?= /usr/share/doc/packages/cpupowerutils | ||
confdir ?= /etc/ | ||
|
||
# Toolchain: what tools do we use, and what options do they need: | ||
|
||
CP = cp -fpR | ||
INSTALL = /usr/bin/install -c | ||
INSTALL_PROGRAM = ${INSTALL} | ||
INSTALL_DATA = ${INSTALL} -m 644 | ||
INSTALL_SCRIPT = ${INSTALL_PROGRAM} | ||
|
||
# If you are running a cross compiler, you may want to set this | ||
# to something more interesting, like "arm-linux-". If you want | ||
# to compile vs uClibc, that can be done here as well. | ||
CROSS = #/usr/i386-linux-uclibc/usr/bin/i386-uclibc- | ||
CC = $(CROSS)gcc | ||
LD = $(CROSS)gcc | ||
AR = $(CROSS)ar | ||
STRIP = $(CROSS)strip | ||
RANLIB = $(CROSS)ranlib | ||
HOSTCC = gcc | ||
|
||
|
||
# Now we set up the build system | ||
# | ||
|
||
# set up PWD so that older versions of make will work with our build. | ||
PWD = $(shell pwd) | ||
|
||
export CROSS CC AR STRIP RANLIB CFLAGS LDFLAGS LIB_OBJS | ||
|
||
# check if compiler option is supported | ||
cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;} | ||
|
||
# use '-Os' optimization if available, else use -O2 | ||
OPTIMIZATION := $(call cc-supports,-Os,-O2) | ||
|
||
WARNINGS := -Wall -Wchar-subscripts -Wpointer-arith -Wsign-compare | ||
WARNINGS += $(call cc-supports,-Wno-pointer-sign) | ||
WARNINGS += $(call cc-supports,-Wdeclaration-after-statement) | ||
WARNINGS += -Wshadow | ||
|
||
CPPFLAGS += -DVERSION=\"$(VERSION)\" -DPACKAGE=\"$(PACKAGE)\" \ | ||
-DPACKAGE_BUGREPORT=\"$(PACKAGE_BUGREPORT)\" -D_GNU_SOURCE | ||
|
||
UTIL_OBJS = utils/helpers/amd.o utils/helpers/topology.o utils/helpers/msr.o \ | ||
utils/helpers/sysfs.o utils/helpers/misc.o utils/helpers/cpuid.o \ | ||
utils/helpers/pci.o utils/helpers/bitmask.o \ | ||
utils/idle_monitor/nhm_idle.o utils/idle_monitor/snb_idle.o \ | ||
utils/idle_monitor/amd_fam14h_idle.o utils/idle_monitor/cpuidle_sysfs.o \ | ||
utils/idle_monitor/mperf_monitor.o utils/idle_monitor/cpupower-monitor.o \ | ||
utils/cpupower.o utils/cpufreq-info.o utils/cpufreq-set.o \ | ||
utils/cpupower-set.o utils/cpupower-info.o utils/cpuidle-info.o | ||
|
||
UTIL_HEADERS = utils/helpers/helpers.h utils/idle_monitor/cpupower-monitor.h \ | ||
utils/helpers/bitmask.h \ | ||
utils/idle_monitor/idle_monitors.h utils/idle_monitor/idle_monitors.def | ||
|
||
UTIL_SRC := $(UTIL_OBJS:.o=.c) | ||
|
||
LIB_HEADERS = lib/cpufreq.h lib/sysfs.h | ||
LIB_SRC = lib/cpufreq.c lib/sysfs.c | ||
LIB_OBJS = lib/cpufreq.o lib/sysfs.o | ||
|
||
CFLAGS += -pipe | ||
|
||
ifeq ($(strip $(NLS)),true) | ||
INSTALL_NLS += install-gmo | ||
COMPILE_NLS += update-gmo | ||
endif | ||
|
||
ifeq ($(strip $(CPUFRQ_BENCH)),true) | ||
INSTALL_BENCH += install-bench | ||
COMPILE_BENCH += compile-bench | ||
endif | ||
|
||
CFLAGS += $(WARNINGS) | ||
|
||
ifeq ($(strip $(V)),false) | ||
QUIET=@$(PWD)/build/ccdv | ||
HOST_PROGS=build/ccdv | ||
else | ||
QUIET= | ||
HOST_PROGS= | ||
endif | ||
|
||
# if DEBUG is enabled, then we do not strip or optimize | ||
ifeq ($(strip $(DEBUG)),true) | ||
CFLAGS += -O1 -g | ||
CPPFLAGS += -DDEBUG | ||
STRIPCMD = /bin/true -Since_we_are_debugging | ||
else | ||
CFLAGS += $(OPTIMIZATION) -fomit-frame-pointer | ||
STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment | ||
endif | ||
|
||
|
||
# the actual make rules | ||
|
||
all: ccdv libcpufreq cpupower $(COMPILE_NLS) $(COMPILE_BENCH) | ||
|
||
ccdv: build/ccdv | ||
build/ccdv: build/ccdv.c | ||
@echo "Building ccdv" | ||
@$(HOSTCC) -O1 $< -o $@ | ||
|
||
lib/%.o: $(LIB_SRC) $(LIB_HEADERS) build/ccdv | ||
$(QUIET) $(CC) $(CPPFLAGS) $(CFLAGS) -fPIC -o $@ -c lib/$*.c | ||
|
||
libcpufreq.so.$(LIB_MAJ): $(LIB_OBJS) | ||
$(QUIET) $(CC) -shared $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \ | ||
-Wl,-soname,libcpufreq.so.$(LIB_MIN) $(LIB_OBJS) | ||
@ln -sf $@ libcpufreq.so | ||
@ln -sf $@ libcpufreq.so.$(LIB_MIN) | ||
|
||
libcpufreq: libcpufreq.so.$(LIB_MAJ) | ||
|
||
# Let all .o files depend on its .c file and all headers | ||
# Might be worth to put this into utils/Makefile at some point of time | ||
$(UTIL_OBJS): $(UTIL_HEADERS) | ||
|
||
.c.o: | ||
$(QUIET) $(CC) $(CFLAGS) $(CPPFLAGS) -I./lib -I ./utils -o $@ -c $*.c | ||
|
||
cpupower: $(UTIL_OBJS) libcpufreq | ||
$(QUIET) $(CC) $(CFLAGS) $(LDFLAGS) -lcpufreq -lrt -lpci -L. -o $@ $(UTIL_OBJS) | ||
$(STRIPCMD) $@ | ||
|
||
po/$(PACKAGE).pot: $(UTIL_SRC) | ||
@xgettext --default-domain=$(PACKAGE) --add-comments \ | ||
--keyword=_ --keyword=N_ $(UTIL_SRC) && \ | ||
test -f $(PACKAGE).po && \ | ||
mv -f $(PACKAGE).po po/$(PACKAGE).pot | ||
|
||
update-gmo: po/$(PACKAGE).pot | ||
@for HLANG in $(LANGUAGES); do \ | ||
echo -n "Translating $$HLANG "; \ | ||
if msgmerge po/$$HLANG.po po/$(PACKAGE).pot -o \ | ||
po/$$HLANG.new.po; then \ | ||
mv -f po/$$HLANG.new.po po/$$HLANG.po; \ | ||
else \ | ||
echo "msgmerge for $$HLANG failed!"; \ | ||
rm -f po/$$HLANG.new.po; \ | ||
fi; \ | ||
msgfmt --statistics -o po/$$HLANG.gmo po/$$HLANG.po; \ | ||
done; | ||
|
||
compile-bench: libcpufreq.so.$(LIB_MAJ) | ||
@V=$(V) confdir=$(confdir) $(MAKE) -C bench | ||
|
||
clean: | ||
-find . \( -not -type d \) -and \( -name '*~' -o -name '*.[oas]' \) -type f -print \ | ||
| xargs rm -f | ||
-rm -f $(UTIL_BINS) | ||
-rm -f $(IDLE_OBJS) | ||
-rm -f cpupower | ||
-rm -f libcpufreq.so* | ||
-rm -f build/ccdv | ||
-rm -rf po/*.gmo po/*.pot | ||
$(MAKE) -C bench clean | ||
|
||
|
||
install-lib: | ||
$(INSTALL) -d $(DESTDIR)${libdir} | ||
$(CP) libcpufreq.so* $(DESTDIR)${libdir}/ | ||
$(INSTALL) -d $(DESTDIR)${includedir} | ||
$(INSTALL_DATA) lib/cpufreq.h $(DESTDIR)${includedir}/cpufreq.h | ||
|
||
install-tools: | ||
$(INSTALL) -d $(DESTDIR)${bindir} | ||
$(INSTALL_PROGRAM) cpupower $(DESTDIR)${bindir} | ||
|
||
install-man: | ||
$(INSTALL_DATA) -D man/cpupower.1 $(DESTDIR)${mandir}/man1/cpupower.1 | ||
$(INSTALL_DATA) -D man/cpupower-frequency-set.1 $(DESTDIR)${mandir}/man1/cpupower-frequency-set.1 | ||
$(INSTALL_DATA) -D man/cpupower-frequency-info.1 $(DESTDIR)${mandir}/man1/cpupower-frequency-info.1 | ||
$(INSTALL_DATA) -D man/cpupower-set.1 $(DESTDIR)${mandir}/man1/cpupower-set.1 | ||
$(INSTALL_DATA) -D man/cpupower-info.1 $(DESTDIR)${mandir}/man1/cpupower-info.1 | ||
$(INSTALL_DATA) -D man/cpupower-monitor.1 $(DESTDIR)${mandir}/man1/cpupower-monitor.1 | ||
|
||
install-gmo: | ||
$(INSTALL) -d $(DESTDIR)${localedir} | ||
for HLANG in $(LANGUAGES); do \ | ||
echo '$(INSTALL_DATA) -D po/$$HLANG.gmo $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupowerutils.mo'; \ | ||
$(INSTALL_DATA) -D po/$$HLANG.gmo $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupowerutils.mo; \ | ||
done; | ||
|
||
install-bench: | ||
@#DESTDIR must be set from outside to survive | ||
@sbindir=$(sbindir) bindir=$(bindir) docdir=$(docdir) confdir=$(confdir) $(MAKE) -C bench install | ||
|
||
install: all install-lib install-tools install-man $(INSTALL_NLS) $(INSTALL_BENCH) | ||
|
||
uninstall: | ||
- rm -f $(DESTDIR)${libdir}/libcpufreq.* | ||
- rm -f $(DESTDIR)${includedir}/cpufreq.h | ||
- rm -f $(DESTDIR)${bindir}/utils/cpupower | ||
- rm -f $(DESTDIR)${mandir}/man1/cpufreq-set.1 | ||
- rm -f $(DESTDIR)${mandir}/man1/cpufreq-info.1 | ||
- for HLANG in $(LANGUAGES); do \ | ||
rm -f $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupowerutils.mo; \ | ||
done; | ||
|
||
.PHONY: all utils libcpufreq ccdv update-po update-gmo install-lib install-tools install-man install-gmo install uninstall \ | ||
clean |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
The cpufrequtils package (homepage: | ||
http://www.kernel.org/pub/linux/utils/kernel/cpufreq/cpufrequtils.html ) | ||
consists of the following elements: | ||
|
||
requirements | ||
------------ | ||
|
||
On x86 pciutils is needed at runtime (-lpci). | ||
For compilation pciutils-devel (pci/pci.h) and a gcc version | ||
providing cpuid.h is needed. | ||
For both it's not explicitly checked for (yet). | ||
|
||
|
||
libcpufreq | ||
---------- | ||
|
||
"libcpufreq" is a library which offers a unified access method for userspace | ||
tools and programs to the cpufreq core and drivers in the Linux kernel. This | ||
allows for code reduction in userspace tools, a clean implementation of | ||
the interaction to the cpufreq core, and support for both the sysfs and proc | ||
interfaces [depending on configuration, see below]. | ||
|
||
|
||
compilation and installation | ||
---------------------------- | ||
|
||
make | ||
su | ||
make install | ||
|
||
should suffice on most systems. It builds default libcpufreq, | ||
cpufreq-set and cpufreq-info files and installs them in /usr/lib and | ||
/usr/bin, respectively. If you want to set up the paths differently and/or | ||
want to configure the package to your specific needs, you need to open | ||
"Makefile" with an editor of your choice and edit the block marked | ||
CONFIGURATION. | ||
|
||
|
||
THANKS | ||
------ | ||
Many thanks to Mattia Dongili who wrote the autotoolization and | ||
libtoolization, the manpages and the italian language file for cpufrequtils; | ||
to Dave Jones for his feedback and his dump_psb tool; to Bruno Ducrot for his | ||
powernow-k8-decode and intel_gsic tools as well as the french language file; | ||
and to various others commenting on the previous (pre-)releases of | ||
cpufrequtils. | ||
|
||
|
||
Dominik Brodowski |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
ToDos sorted by priority: | ||
|
||
- Use bitmask functions to parse CPU topology more robust | ||
(current implementation has issues on AMD) | ||
- Try to read out boost states and frequencies on Intel | ||
- Adjust README | ||
- Somewhere saw the ability to read power consumption of | ||
RAM from HW on Intel SandyBridge -> another monitor? | ||
- Add another c1e debug idle monitor | ||
-> Is by design racy with BIOS, but could be added | ||
with a --force option and some "be careful" messages |
Oops, something went wrong.