blob: 1949af1379d58c5198c030af7d2009cdaacda2c3 [file] [log] [blame]
/*
* Copyright 2010, Intel Corporation
*
* This file is part of PowerTOP
*
* This program file 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 in a file named COPYING; if not, write to the
* Free Software Foundation, Inc,
* 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
* or just google for it.
*
* Authors:
* Arjan van de Ven <arjan@linux.intel.com>
*/
#include <stdint.h>
#include <sys/time.h>
#define MSR_TSC 0x10
#define MSR_NEHALEM_PLATFORM_INFO 0xCE
#define MSR_NEHALEM_TURBO_RATIO_LIMIT 0x1AD
#define MSR_APERF 0xE8
#define MSR_MPERF 0xE7
#define MSR_PKG_C2_RESIDENCY 0x60D
#define MSR_PKG_C3_RESIDENCY 0x3F8
#define MSR_PKG_C6_RESIDENCY 0x3F9
#define MSR_PKG_C7_RESIDENCY 0x3FA
#define MSR_CORE_C3_RESIDENCY 0x3FC
#define MSR_CORE_C6_RESIDENCY 0x3FD
#define MSR_CORE_C7_RESIDENCY 0x3FE
class nhm_package: public cpu_package
{
private:
uint64_t c2_before, c2_after;
uint64_t c3_before, c3_after;
uint64_t c6_before, c6_after;
uint64_t c7_before, c7_after;
uint64_t tsc_before, tsc_after;
uint64_t last_stamp;
uint64_t total_stamp;
void account_freq(uint64_t frequency, uint64_t duration);
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
virtual int can_collapse(void) { return 0;};
virtual char * fill_pstate_line(int line_nr, char *buffer);
virtual void calculate_freq(uint64_t time);
virtual void change_effective_frequency(uint64_t time, uint64_t freq);
};
class nhm_core: public cpu_core
{
private:
uint64_t c3_before, c3_after;
uint64_t c6_before, c6_after;
uint64_t c7_before, c7_after;
uint64_t tsc_before, tsc_after;
uint64_t last_stamp;
uint64_t total_stamp;
void account_freq(uint64_t frequency, uint64_t duration);
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
virtual int can_collapse(void) { return 0;};
virtual char * fill_pstate_line(int line_nr, char *buffer);
virtual void calculate_freq(uint64_t time);
virtual void change_effective_frequency(uint64_t time, uint64_t freq);
};
class nhm_cpu: public cpu_linux
{
private:
uint64_t aperf_before;
uint64_t aperf_after;
uint64_t mperf_before;
uint64_t mperf_after;
uint64_t tsc_before, tsc_after;
uint64_t last_stamp;
uint64_t total_stamp;
void account_freq(uint64_t frequency, uint64_t duration);
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
virtual int can_collapse(void) { return 0;};
virtual char * fill_pstate_name(int line_nr, char *buffer);
virtual char * fill_pstate_line(int line_nr, char *buffer);
virtual int has_pstate_level(int level);
virtual void change_freq(uint64_t time, int freq);
virtual void change_effective_frequency(uint64_t time, uint64_t freq);
virtual void go_idle(uint64_t time);
virtual void go_unidle(uint64_t time);
};
class atom_package: public cpu_package
{
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
};
class atom_core: public cpu_core
{
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
};
extern int has_c2c7_res;
class i965_core: public cpu_core
{
private:
uint64_t rc6_before, rc6_after;
uint64_t rc6p_before, rc6p_after;
uint64_t rc6pp_before, rc6pp_after;
struct timeval before;
struct timeval after;
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
virtual int can_collapse(void) { return 0;};
virtual char * fill_pstate_line(int line_nr, char *buffer);
virtual char * fill_pstate_name(int line_nr, char *buffer);
virtual char * fill_cstate_line(int line_nr, char *buffer, const char *separator);
virtual int has_pstate_level(int level) { return 0; };
virtual int has_pstates(void) { return 0; };
};