aboutsummaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2010-08-08 08:42:34 -0700
committerArjan van de Ven <arjan@linux.intel.com>2010-08-08 08:42:34 -0700
commit6d10cf6fa7821b93025dd226651a6ed7cb59a49e (patch)
treead00d4825743a184fe399a2d4c24393f81dbcd2e /cpu
parentd8e3da347eab38ef7d9142896c06bb783a95ede0 (diff)
downloadpowertop-6d10cf6fa7821b93025dd226651a6ed7cb59a49e.tar.gz
add turbo mode support
Diffstat (limited to 'cpu')
-rw-r--r--cpu/abstract_cpu.cpp14
-rw-r--r--cpu/cpu.h2
-rw-r--r--cpu/cpu_linux.cpp13
3 files changed, 29 insertions, 0 deletions
diff --git a/cpu/abstract_cpu.cpp b/cpu/abstract_cpu.cpp
index a6305d3..b084327 100644
--- a/cpu/abstract_cpu.cpp
+++ b/cpu/abstract_cpu.cpp
@@ -1,11 +1,16 @@
+#include <iostream>
+#include <fstream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "cpu.h"
+
void abstract_cpu::measurement_start(void)
{
unsigned int i;
+ ifstream file;
+ char filename[4096];
for (i = 0; i < cstates.size(); i++)
delete cstates[i];
@@ -15,6 +20,15 @@ void abstract_cpu::measurement_start(void)
delete pstates[i];
pstates.resize(0);
+
+ sprintf(filename, "/sys/devices/system/cpu/cpu%i/cpufreq/scaling_available_frequencies", number);
+ file.open(filename, ios::in);
+ if (file) {
+ file >> max_frequency;
+ file >> max_minus_one_frequency;
+ file.close();
+ }
+
for (i = 0; i < children.size(); i++)
if (children[i])
children[i]->measurement_start();
diff --git a/cpu/cpu.h b/cpu/cpu.h
index 80c911b..1d2dad9 100644
--- a/cpu/cpu.h
+++ b/cpu/cpu.h
@@ -51,6 +51,8 @@ protected:
int first_cpu;
struct timeval stamp_before, stamp_after;
double time_factor;
+ uint64_t max_frequency;
+ uint64_t max_minus_one_frequency;
public:
vector<class abstract_cpu *> children;
vector<struct idle_state *> cstates;
diff --git a/cpu/cpu_linux.cpp b/cpu/cpu_linux.cpp
index 9441953..1a964fd 100644
--- a/cpu/cpu_linux.cpp
+++ b/cpu/cpu_linux.cpp
@@ -14,6 +14,15 @@
#include <sys/stat.h>
#include <dirent.h>
+static int is_turbo(uint64_t freq, uint64_t max, uint64_t maxmo)
+{
+ if (freq != max)
+ return 0;
+ if (maxmo + 1000 != max)
+ return 0;
+ return 1;
+}
+
void cpu_linux::measurement_start(void)
{
@@ -103,6 +112,10 @@ void cpu_linux::measurement_start(void)
hz_to_human(f, line);
+ if (is_turbo(f, max_frequency, max_minus_one_frequency)) {
+ sprintf(line, _("Turbo Mode"));
+ }
+
if (f > 0)
update_pstate(f, line, count, 1);