Commit 1b439f01 authored by Len Brown's avatar Len Brown

tools/power turbostat: formatting

Spring is here...
run a long overdue Lendent on turbostat.c

no functional change
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 55279aef
...@@ -41,8 +41,8 @@ char *proc_stat = "/proc/stat"; ...@@ -41,8 +41,8 @@ char *proc_stat = "/proc/stat";
FILE *outf; FILE *outf;
int *fd_percpu; int *fd_percpu;
int *fd_instr_count_percpu; int *fd_instr_count_percpu;
struct timeval interval_tv = {5, 0}; struct timeval interval_tv = { 5, 0 };
struct timespec interval_ts = {5, 0}; struct timespec interval_ts = { 5, 0 };
/* Save original CPU model */ /* Save original CPU model */
unsigned int model_orig; unsigned int model_orig;
...@@ -84,7 +84,7 @@ unsigned int do_rapl; ...@@ -84,7 +84,7 @@ unsigned int do_rapl;
unsigned int do_dts; unsigned int do_dts;
unsigned int do_ptm; unsigned int do_ptm;
unsigned int do_ipc; unsigned int do_ipc;
unsigned long long gfx_cur_rc6_ms; unsigned long long gfx_cur_rc6_ms;
unsigned long long cpuidle_cur_cpu_lpi_us; unsigned long long cpuidle_cur_cpu_lpi_us;
unsigned long long cpuidle_cur_sys_lpi_us; unsigned long long cpuidle_cur_sys_lpi_us;
unsigned int gfx_cur_mhz; unsigned int gfx_cur_mhz;
...@@ -104,12 +104,12 @@ unsigned int crystal_hz; ...@@ -104,12 +104,12 @@ unsigned int crystal_hz;
unsigned long long tsc_hz; unsigned long long tsc_hz;
int base_cpu; int base_cpu;
double discover_bclk(unsigned int family, unsigned int model); double discover_bclk(unsigned int family, unsigned int model);
unsigned int has_hwp; /* IA32_PM_ENABLE, IA32_HWP_CAPABILITIES */ unsigned int has_hwp; /* IA32_PM_ENABLE, IA32_HWP_CAPABILITIES */
/* IA32_HWP_REQUEST, IA32_HWP_STATUS */ /* IA32_HWP_REQUEST, IA32_HWP_STATUS */
unsigned int has_hwp_notify; /* IA32_HWP_INTERRUPT */ unsigned int has_hwp_notify; /* IA32_HWP_INTERRUPT */
unsigned int has_hwp_activity_window; /* IA32_HWP_REQUEST[bits 41:32] */ unsigned int has_hwp_activity_window; /* IA32_HWP_REQUEST[bits 41:32] */
unsigned int has_hwp_epp; /* IA32_HWP_REQUEST[bits 31:24] */ unsigned int has_hwp_epp; /* IA32_HWP_REQUEST[bits 31:24] */
unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG */ unsigned int has_hwp_pkg; /* IA32_HWP_REQUEST_PKG */
unsigned int has_misc_feature_control; unsigned int has_misc_feature_control;
unsigned int first_counter_read = 1; unsigned int first_counter_read = 1;
int ignore_stdin; int ignore_stdin;
...@@ -185,7 +185,7 @@ struct thread_data { ...@@ -185,7 +185,7 @@ struct thread_data {
unsigned long long mperf; unsigned long long mperf;
unsigned long long c1; unsigned long long c1;
unsigned long long instr_count; unsigned long long instr_count;
unsigned long long irq_count; unsigned long long irq_count;
unsigned int smi_count; unsigned int smi_count;
unsigned int cpu_id; unsigned int cpu_id;
unsigned int apic_id; unsigned int apic_id;
...@@ -253,12 +253,11 @@ struct pkg_data { ...@@ -253,12 +253,11 @@ struct pkg_data {
((node_no) * topo.cores_per_node) + \ ((node_no) * topo.cores_per_node) + \
(core_no)) (core_no))
#define GET_PKG(pkg_base, pkg_no) (pkg_base + pkg_no) #define GET_PKG(pkg_base, pkg_no) (pkg_base + pkg_no)
enum counter_scope {SCOPE_CPU, SCOPE_CORE, SCOPE_PACKAGE}; enum counter_scope { SCOPE_CPU, SCOPE_CORE, SCOPE_PACKAGE };
enum counter_type {COUNTER_ITEMS, COUNTER_CYCLES, COUNTER_SECONDS, COUNTER_USEC}; enum counter_type { COUNTER_ITEMS, COUNTER_CYCLES, COUNTER_SECONDS, COUNTER_USEC };
enum counter_format {FORMAT_RAW, FORMAT_DELTA, FORMAT_PERCENT}; enum counter_format { FORMAT_RAW, FORMAT_DELTA, FORMAT_PERCENT };
struct msr_counter { struct msr_counter {
unsigned int msr_num; unsigned int msr_num;
...@@ -294,9 +293,9 @@ int get_msr_sum(int cpu, off_t offset, unsigned long long *msr); ...@@ -294,9 +293,9 @@ int get_msr_sum(int cpu, off_t offset, unsigned long long *msr);
struct msr_sum_array { struct msr_sum_array {
/* get_msr_sum() = sum + (get_msr() - last) */ /* get_msr_sum() = sum + (get_msr() - last) */
struct { struct {
/*The accumulated MSR value is updated by the timer*/ /*The accumulated MSR value is updated by the timer */
unsigned long long sum; unsigned long long sum;
/*The MSR footprint recorded in last timer*/ /*The MSR footprint recorded in last timer */
unsigned long long last; unsigned long long last;
} entries[IDX_COUNT]; } entries[IDX_COUNT];
}; };
...@@ -385,6 +384,7 @@ int idx_valid(int idx) ...@@ -385,6 +384,7 @@ int idx_valid(int idx)
return 0; return 0;
} }
} }
struct sys_counters { struct sys_counters {
unsigned int added_thread_counters; unsigned int added_thread_counters;
unsigned int added_core_counters; unsigned int added_core_counters;
...@@ -408,7 +408,7 @@ struct cpu_topology { ...@@ -408,7 +408,7 @@ struct cpu_topology {
int logical_node_id; /* 0-based count within the package */ int logical_node_id; /* 0-based count within the package */
int physical_core_id; int physical_core_id;
int thread_id; int thread_id;
cpu_set_t *put_ids; /* Processing Unit/Thread IDs */ cpu_set_t *put_ids; /* Processing Unit/Thread IDs */
} *cpus; } *cpus;
struct topo_params { struct topo_params {
...@@ -425,7 +425,7 @@ struct topo_params { ...@@ -425,7 +425,7 @@ struct topo_params {
struct timeval tv_even, tv_odd, tv_delta; struct timeval tv_even, tv_odd, tv_delta;
int *irq_column_2_cpu; /* /proc/interrupts column numbers */ int *irq_column_2_cpu; /* /proc/interrupts column numbers */
int *irqs_per_cpu; /* indexed by cpu_num */ int *irqs_per_cpu; /* indexed by cpu_num */
void setup_all_buffers(void); void setup_all_buffers(void);
...@@ -438,34 +438,31 @@ int cpu_is_not_present(int cpu) ...@@ -438,34 +438,31 @@ int cpu_is_not_present(int cpu)
{ {
return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set); return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set);
} }
/* /*
* run func(thread, core, package) in topology order * run func(thread, core, package) in topology order
* skip non-present cpus * skip non-present cpus
*/ */
int for_all_cpus(int (func)(struct thread_data *, struct core_data *, struct pkg_data *), int for_all_cpus(int (func) (struct thread_data *, struct core_data *, struct pkg_data *),
struct thread_data *thread_base, struct core_data *core_base, struct pkg_data *pkg_base) struct thread_data *thread_base, struct core_data *core_base, struct pkg_data *pkg_base)
{ {
int retval, pkg_no, core_no, thread_no, node_no; int retval, pkg_no, core_no, thread_no, node_no;
for (pkg_no = 0; pkg_no < topo.num_packages; ++pkg_no) { for (pkg_no = 0; pkg_no < topo.num_packages; ++pkg_no) {
for (node_no = 0; node_no < topo.nodes_per_pkg; node_no++) { for (node_no = 0; node_no < topo.nodes_per_pkg; node_no++) {
for (core_no = 0; core_no < topo.cores_per_node; ++core_no) { for (core_no = 0; core_no < topo.cores_per_node; ++core_no) {
for (thread_no = 0; thread_no < for (thread_no = 0; thread_no < topo.threads_per_core; ++thread_no) {
topo.threads_per_core; ++thread_no) {
struct thread_data *t; struct thread_data *t;
struct core_data *c; struct core_data *c;
struct pkg_data *p; struct pkg_data *p;
t = GET_THREAD(thread_base, thread_no, t = GET_THREAD(thread_base, thread_no, core_no, node_no, pkg_no);
core_no, node_no,
pkg_no);
if (cpu_is_not_present(t->cpu_id)) if (cpu_is_not_present(t->cpu_id))
continue; continue;
c = GET_CORE(core_base, core_no, c = GET_CORE(core_base, core_no, node_no, pkg_no);
node_no, pkg_no);
p = GET_PKG(pkg_base, pkg_no); p = GET_PKG(pkg_base, pkg_no);
retval = func(t, c, p); retval = func(t, c, p);
...@@ -487,6 +484,7 @@ int cpu_migrate(int cpu) ...@@ -487,6 +484,7 @@ int cpu_migrate(int cpu)
else else
return 0; return 0;
} }
int get_msr_fd(int cpu) int get_msr_fd(int cpu)
{ {
char pathname[32]; char pathname[32];
...@@ -524,7 +522,7 @@ static int perf_instr_count_open(int cpu_num) ...@@ -524,7 +522,7 @@ static int perf_instr_count_open(int cpu_num)
/* counter for cpu_num, including user + kernel and all processes */ /* counter for cpu_num, including user + kernel and all processes */
fd = perf_event_open(&pea, -1, cpu_num, -1, 0); fd = perf_event_open(&pea, -1, cpu_num, -1, 0);
if (fd == -1) if (fd == -1)
err(-1, "cpu%d: perf instruction counter\n", cpu_num); err(-1, "cpu%d: perf instruction counter\n", cpu_num);
return fd; return fd;
...@@ -568,7 +566,7 @@ struct msr_counter bic[] = { ...@@ -568,7 +566,7 @@ struct msr_counter bic[] = {
{ 0x0, "Bzy_MHz" }, { 0x0, "Bzy_MHz" },
{ 0x0, "TSC_MHz" }, { 0x0, "TSC_MHz" },
{ 0x0, "IRQ" }, { 0x0, "IRQ" },
{ 0x0, "SMI", "", 32, 0, FORMAT_DELTA, NULL}, { 0x0, "SMI", "", 32, 0, FORMAT_DELTA, NULL },
{ 0x0, "sysfs" }, { 0x0, "sysfs" },
{ 0x0, "CPU%c1" }, { 0x0, "CPU%c1" },
{ 0x0, "CPU%c3" }, { 0x0, "CPU%c3" },
...@@ -681,7 +679,6 @@ unsigned long long bic_present = BIC_USEC | BIC_TOD | BIC_sysfs | BIC_APIC | BIC ...@@ -681,7 +679,6 @@ unsigned long long bic_present = BIC_USEC | BIC_TOD | BIC_sysfs | BIC_APIC | BIC
#define BIC_NOT_PRESENT(COUNTER_BIT) (bic_present &= ~COUNTER_BIT) #define BIC_NOT_PRESENT(COUNTER_BIT) (bic_present &= ~COUNTER_BIT)
#define BIC_IS_ENABLED(COUNTER_BIT) (bic_enabled & COUNTER_BIT) #define BIC_IS_ENABLED(COUNTER_BIT) (bic_enabled & COUNTER_BIT)
#define MAX_DEFERRED 16 #define MAX_DEFERRED 16
char *deferred_skip_names[MAX_DEFERRED]; char *deferred_skip_names[MAX_DEFERRED];
int deferred_skip_index; int deferred_skip_index;
...@@ -695,42 +692,40 @@ enum show_hide_mode { SHOW_LIST, HIDE_LIST } global_show_hide_mode = HIDE_LIST; ...@@ -695,42 +692,40 @@ enum show_hide_mode { SHOW_LIST, HIDE_LIST } global_show_hide_mode = HIDE_LIST;
void help(void) void help(void)
{ {
fprintf(outf, fprintf(outf,
"Usage: turbostat [OPTIONS][(--interval seconds) | COMMAND ...]\n" "Usage: turbostat [OPTIONS][(--interval seconds) | COMMAND ...]\n"
"\n" "\n"
"Turbostat forks the specified COMMAND and prints statistics\n" "Turbostat forks the specified COMMAND and prints statistics\n"
"when COMMAND completes.\n" "when COMMAND completes.\n"
"If no COMMAND is specified, turbostat wakes every 5-seconds\n" "If no COMMAND is specified, turbostat wakes every 5-seconds\n"
"to print statistics, until interrupted.\n" "to print statistics, until interrupted.\n"
" -a, --add add a counter\n" " -a, --add add a counter\n"
" eg. --add msr0x10,u64,cpu,delta,MY_TSC\n" " eg. --add msr0x10,u64,cpu,delta,MY_TSC\n"
" -c, --cpu cpu-set limit output to summary plus cpu-set:\n" " -c, --cpu cpu-set limit output to summary plus cpu-set:\n"
" {core | package | j,k,l..m,n-p }\n" " {core | package | j,k,l..m,n-p }\n"
" -d, --debug displays usec, Time_Of_Day_Seconds and more debugging\n" " -d, --debug displays usec, Time_Of_Day_Seconds and more debugging\n"
" -D, --Dump displays the raw counter values\n" " -D, --Dump displays the raw counter values\n"
" -e, --enable [all | column]\n" " -e, --enable [all | column]\n"
" shows all or the specified disabled column\n" " shows all or the specified disabled column\n"
" -H, --hide [column|column,column,...]\n" " -H, --hide [column|column,column,...]\n"
" hide the specified column(s)\n" " hide the specified column(s)\n"
" -i, --interval sec.subsec\n" " -i, --interval sec.subsec\n"
" Override default 5-second measurement interval\n" " Override default 5-second measurement interval\n"
" -J, --Joules displays energy in Joules instead of Watts\n" " -J, --Joules displays energy in Joules instead of Watts\n"
" -l, --list list column headers only\n" " -l, --list list column headers only\n"
" -n, --num_iterations num\n" " -n, --num_iterations num\n"
" number of the measurement iterations\n" " number of the measurement iterations\n"
" -o, --out file\n" " -o, --out file\n"
" create or truncate \"file\" for all output\n" " create or truncate \"file\" for all output\n"
" -q, --quiet skip decoding system configuration header\n" " -q, --quiet skip decoding system configuration header\n"
" -s, --show [column|column,column,...]\n" " -s, --show [column|column,column,...]\n"
" show only the specified column(s)\n" " show only the specified column(s)\n"
" -S, --Summary\n" " -S, --Summary\n"
" limits output to 1-line system summary per interval\n" " limits output to 1-line system summary per interval\n"
" -T, --TCC temperature\n" " -T, --TCC temperature\n"
" sets the Thermal Control Circuit temperature in\n" " sets the Thermal Control Circuit temperature in\n"
" degrees Celsius\n" " degrees Celsius\n"
" -h, --help print this help message\n" " -h, --help print this help message\n"
" -v, --version print version information\n" " -v, --version print version information\n" "\n" "For more help, run \"man turbostat\"\n");
"\n"
"For more help, run \"man turbostat\"\n");
} }
/* /*
...@@ -784,7 +779,6 @@ unsigned long long bic_lookup(char *name_list, enum show_hide_mode mode) ...@@ -784,7 +779,6 @@ unsigned long long bic_lookup(char *name_list, enum show_hide_mode mode)
return retval; return retval;
} }
void print_header(char *delim) void print_header(char *delim)
{ {
struct msr_counter *mp; struct msr_counter *mp;
...@@ -966,8 +960,7 @@ void print_header(char *delim) ...@@ -966,8 +960,7 @@ void print_header(char *delim)
outp += sprintf(outp, "\n"); outp += sprintf(outp, "\n");
} }
int dump_counters(struct thread_data *t, struct core_data *c, int dump_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
struct pkg_data *p)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
...@@ -975,8 +968,7 @@ int dump_counters(struct thread_data *t, struct core_data *c, ...@@ -975,8 +968,7 @@ int dump_counters(struct thread_data *t, struct core_data *c,
outp += sprintf(outp, "t %p, c %p, p %p\n", t, c, p); outp += sprintf(outp, "t %p, c %p, p %p\n", t, c, p);
if (t) { if (t) {
outp += sprintf(outp, "CPU: %d flags 0x%x\n", outp += sprintf(outp, "CPU: %d flags 0x%x\n", t->cpu_id, t->flags);
t->cpu_id, t->flags);
outp += sprintf(outp, "TSC: %016llX\n", t->tsc); outp += sprintf(outp, "TSC: %016llX\n", t->tsc);
outp += sprintf(outp, "aperf: %016llX\n", t->aperf); outp += sprintf(outp, "aperf: %016llX\n", t->aperf);
outp += sprintf(outp, "mperf: %016llX\n", t->mperf); outp += sprintf(outp, "mperf: %016llX\n", t->mperf);
...@@ -991,8 +983,7 @@ int dump_counters(struct thread_data *t, struct core_data *c, ...@@ -991,8 +983,7 @@ int dump_counters(struct thread_data *t, struct core_data *c,
outp += sprintf(outp, "SMI: %d\n", t->smi_count); outp += sprintf(outp, "SMI: %d\n", t->smi_count);
for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) { for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) {
outp += sprintf(outp, "tADDED [%d] msr0x%x: %08llX\n", outp += sprintf(outp, "tADDED [%d] msr0x%x: %08llX\n", i, mp->msr_num, t->counter[i]);
i, mp->msr_num, t->counter[i]);
} }
} }
...@@ -1005,8 +996,7 @@ int dump_counters(struct thread_data *t, struct core_data *c, ...@@ -1005,8 +996,7 @@ int dump_counters(struct thread_data *t, struct core_data *c,
outp += sprintf(outp, "Joules: %0X\n", c->core_energy); outp += sprintf(outp, "Joules: %0X\n", c->core_energy);
for (i = 0, mp = sys.cp; mp; i++, mp = mp->next) { for (i = 0, mp = sys.cp; mp; i++, mp = mp->next) {
outp += sprintf(outp, "cADDED [%d] msr0x%x: %08llX\n", outp += sprintf(outp, "cADDED [%d] msr0x%x: %08llX\n", i, mp->msr_num, c->counter[i]);
i, mp->msr_num, c->counter[i]);
} }
outp += sprintf(outp, "mc6_us: %016llX\n", c->mc6_us); outp += sprintf(outp, "mc6_us: %016llX\n", c->mc6_us);
} }
...@@ -1035,15 +1025,12 @@ int dump_counters(struct thread_data *t, struct core_data *c, ...@@ -1035,15 +1025,12 @@ int dump_counters(struct thread_data *t, struct core_data *c,
outp += sprintf(outp, "Joules COR: %0llX\n", p->energy_cores); outp += sprintf(outp, "Joules COR: %0llX\n", p->energy_cores);
outp += sprintf(outp, "Joules GFX: %0llX\n", p->energy_gfx); outp += sprintf(outp, "Joules GFX: %0llX\n", p->energy_gfx);
outp += sprintf(outp, "Joules RAM: %0llX\n", p->energy_dram); outp += sprintf(outp, "Joules RAM: %0llX\n", p->energy_dram);
outp += sprintf(outp, "Throttle PKG: %0llX\n", outp += sprintf(outp, "Throttle PKG: %0llX\n", p->rapl_pkg_perf_status);
p->rapl_pkg_perf_status); outp += sprintf(outp, "Throttle RAM: %0llX\n", p->rapl_dram_perf_status);
outp += sprintf(outp, "Throttle RAM: %0llX\n",
p->rapl_dram_perf_status);
outp += sprintf(outp, "PTM: %dC\n", p->pkg_temp_c); outp += sprintf(outp, "PTM: %dC\n", p->pkg_temp_c);
for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) { for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) {
outp += sprintf(outp, "pADDED [%d] msr0x%x: %08llX\n", outp += sprintf(outp, "pADDED [%d] msr0x%x: %08llX\n", i, mp->msr_num, p->counter[i]);
i, mp->msr_num, p->counter[i]);
} }
} }
...@@ -1055,8 +1042,7 @@ int dump_counters(struct thread_data *t, struct core_data *c, ...@@ -1055,8 +1042,7 @@ int dump_counters(struct thread_data *t, struct core_data *c,
/* /*
* column formatting convention & formats * column formatting convention & formats
*/ */
int format_counters(struct thread_data *t, struct core_data *c, int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
struct pkg_data *p)
{ {
double interval_float, tsc; double interval_float, tsc;
char *fmt8; char *fmt8;
...@@ -1065,17 +1051,16 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1065,17 +1051,16 @@ int format_counters(struct thread_data *t, struct core_data *c,
char *delim = "\t"; char *delim = "\t";
int printed = 0; int printed = 0;
/* if showing only 1st thread in core and this isn't one, bail out */ /* if showing only 1st thread in core and this isn't one, bail out */
if (show_core_only && !(t->flags & CPU_IS_FIRST_THREAD_IN_CORE)) if (show_core_only && !(t->flags & CPU_IS_FIRST_THREAD_IN_CORE))
return 0; return 0;
/* if showing only 1st thread in pkg and this isn't one, bail out */ /* if showing only 1st thread in pkg and this isn't one, bail out */
if (show_pkg_only && !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) if (show_pkg_only && !(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE))
return 0; return 0;
/*if not summary line and --cpu is used */ /*if not summary line and --cpu is used */
if ((t != &average.threads) && if ((t != &average.threads) && (cpu_subset && !CPU_ISSET_S(t->cpu_id, cpu_subset_size, cpu_subset)))
(cpu_subset && !CPU_ISSET_S(t->cpu_id, cpu_subset_size, cpu_subset)))
return 0; return 0;
if (DO_BIC(BIC_USEC)) { if (DO_BIC(BIC_USEC)) {
...@@ -1090,7 +1075,7 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1090,7 +1075,7 @@ int format_counters(struct thread_data *t, struct core_data *c,
if (DO_BIC(BIC_TOD)) if (DO_BIC(BIC_TOD))
outp += sprintf(outp, "%10ld.%06ld\t", t->tv_end.tv_sec, t->tv_end.tv_usec); outp += sprintf(outp, "%10ld.%06ld\t", t->tv_end.tv_sec, t->tv_end.tv_usec);
interval_float = t->tv_delta.tv_sec + t->tv_delta.tv_usec/1000000.0; interval_float = t->tv_delta.tv_sec + t->tv_delta.tv_usec / 1000000.0;
tsc = t->tsc * tsc_tweak; tsc = t->tsc * tsc_tweak;
...@@ -1126,11 +1111,9 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1126,11 +1111,9 @@ int format_counters(struct thread_data *t, struct core_data *c,
if (DO_BIC(BIC_Node)) { if (DO_BIC(BIC_Node)) {
if (t) if (t)
outp += sprintf(outp, "%s%d", outp += sprintf(outp, "%s%d",
(printed++ ? delim : ""), (printed++ ? delim : ""), cpus[t->cpu_id].physical_node_id);
cpus[t->cpu_id].physical_node_id);
else else
outp += sprintf(outp, "%s-", outp += sprintf(outp, "%s-", (printed++ ? delim : ""));
(printed++ ? delim : ""));
} }
if (DO_BIC(BIC_Core)) { if (DO_BIC(BIC_Core)) {
if (c) if (c)
...@@ -1147,22 +1130,22 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1147,22 +1130,22 @@ int format_counters(struct thread_data *t, struct core_data *c,
} }
if (DO_BIC(BIC_Avg_MHz)) if (DO_BIC(BIC_Avg_MHz))
outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""), outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""), 1.0 / units * t->aperf / interval_float);
1.0 / units * t->aperf / interval_float);
if (DO_BIC(BIC_Busy)) if (DO_BIC(BIC_Busy))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * t->mperf/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * t->mperf / tsc);
if (DO_BIC(BIC_Bzy_MHz)) { if (DO_BIC(BIC_Bzy_MHz)) {
if (has_base_hz) if (has_base_hz)
outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""), base_hz / units * t->aperf / t->mperf); outp +=
sprintf(outp, "%s%.0f", (printed++ ? delim : ""), base_hz / units * t->aperf / t->mperf);
else else
outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""), outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""),
tsc / units * t->aperf / t->mperf / interval_float); tsc / units * t->aperf / t->mperf / interval_float);
} }
if (DO_BIC(BIC_TSC_MHz)) if (DO_BIC(BIC_TSC_MHz))
outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""), 1.0 * t->tsc/units/interval_float); outp += sprintf(outp, "%s%.0f", (printed++ ? delim : ""), 1.0 * t->tsc / units / interval_float);
if (DO_BIC(BIC_IPC)) if (DO_BIC(BIC_IPC))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 1.0 * t->instr_count / t->aperf); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 1.0 * t->instr_count / t->aperf);
...@@ -1183,7 +1166,8 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1183,7 +1166,8 @@ int format_counters(struct thread_data *t, struct core_data *c,
for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) { for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) {
if (mp->format == FORMAT_RAW) { if (mp->format == FORMAT_RAW) {
if (mp->width == 32) if (mp->width == 32)
outp += sprintf(outp, "%s0x%08x", (printed++ ? delim : ""), (unsigned int) t->counter[i]); outp +=
sprintf(outp, "%s0x%08x", (printed++ ? delim : ""), (unsigned int)t->counter[i]);
else else
outp += sprintf(outp, "%s0x%016llx", (printed++ ? delim : ""), t->counter[i]); outp += sprintf(outp, "%s0x%016llx", (printed++ ? delim : ""), t->counter[i]);
} else if (mp->format == FORMAT_DELTA) { } else if (mp->format == FORMAT_DELTA) {
...@@ -1193,27 +1177,28 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1193,27 +1177,28 @@ int format_counters(struct thread_data *t, struct core_data *c,
outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), t->counter[i]); outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), t->counter[i]);
} else if (mp->format == FORMAT_PERCENT) { } else if (mp->format == FORMAT_PERCENT) {
if (mp->type == COUNTER_USEC) if (mp->type == COUNTER_USEC)
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), t->counter[i]/interval_float/10000); outp +=
sprintf(outp, "%s%.2f", (printed++ ? delim : ""),
t->counter[i] / interval_float / 10000);
else else
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * t->counter[i]/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * t->counter[i] / tsc);
} }
} }
/* C1 */ /* C1 */
if (DO_BIC(BIC_CPU_c1)) if (DO_BIC(BIC_CPU_c1))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * t->c1/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * t->c1 / tsc);
/* print per-core data only for 1st thread in core */ /* print per-core data only for 1st thread in core */
if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE)) if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE))
goto done; goto done;
if (DO_BIC(BIC_CPU_c3)) if (DO_BIC(BIC_CPU_c3))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->c3/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->c3 / tsc);
if (DO_BIC(BIC_CPU_c6)) if (DO_BIC(BIC_CPU_c6))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->c6/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->c6 / tsc);
if (DO_BIC(BIC_CPU_c7)) if (DO_BIC(BIC_CPU_c7))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->c7/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->c7 / tsc);
/* Mod%c6 */ /* Mod%c6 */
if (DO_BIC(BIC_Mod_c6)) if (DO_BIC(BIC_Mod_c6))
...@@ -1225,7 +1210,8 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1225,7 +1210,8 @@ int format_counters(struct thread_data *t, struct core_data *c,
for (i = 0, mp = sys.cp; mp; i++, mp = mp->next) { for (i = 0, mp = sys.cp; mp; i++, mp = mp->next) {
if (mp->format == FORMAT_RAW) { if (mp->format == FORMAT_RAW) {
if (mp->width == 32) if (mp->width == 32)
outp += sprintf(outp, "%s0x%08x", (printed++ ? delim : ""), (unsigned int) c->counter[i]); outp +=
sprintf(outp, "%s0x%08x", (printed++ ? delim : ""), (unsigned int)c->counter[i]);
else else
outp += sprintf(outp, "%s0x%016llx", (printed++ ? delim : ""), c->counter[i]); outp += sprintf(outp, "%s0x%016llx", (printed++ ? delim : ""), c->counter[i]);
} else if (mp->format == FORMAT_DELTA) { } else if (mp->format == FORMAT_DELTA) {
...@@ -1234,14 +1220,15 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1234,14 +1220,15 @@ int format_counters(struct thread_data *t, struct core_data *c,
else else
outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), c->counter[i]); outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), c->counter[i]);
} else if (mp->format == FORMAT_PERCENT) { } else if (mp->format == FORMAT_PERCENT) {
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->counter[i]/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * c->counter[i] / tsc);
} }
} }
fmt8 = "%s%.2f"; fmt8 = "%s%.2f";
if (DO_BIC(BIC_CorWatt) && (do_rapl & RAPL_PER_CORE_ENERGY)) if (DO_BIC(BIC_CorWatt) && (do_rapl & RAPL_PER_CORE_ENERGY))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), c->core_energy * rapl_energy_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""), c->core_energy * rapl_energy_units / interval_float);
if (DO_BIC(BIC_Cor_J) && (do_rapl & RAPL_PER_CORE_ENERGY)) if (DO_BIC(BIC_Cor_J) && (do_rapl & RAPL_PER_CORE_ENERGY))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), c->core_energy * rapl_energy_units); outp += sprintf(outp, fmt8, (printed++ ? delim : ""), c->core_energy * rapl_energy_units);
...@@ -1259,7 +1246,7 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1259,7 +1246,7 @@ int format_counters(struct thread_data *t, struct core_data *c,
outp += sprintf(outp, "%s**.**", (printed++ ? delim : "")); outp += sprintf(outp, "%s**.**", (printed++ ? delim : ""));
} else { } else {
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""),
p->gfx_rc6_ms / 10.0 / interval_float); p->gfx_rc6_ms / 10.0 / interval_float);
} }
} }
...@@ -1273,42 +1260,49 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1273,42 +1260,49 @@ int format_counters(struct thread_data *t, struct core_data *c,
/* Totl%C0, Any%C0 GFX%C0 CPUGFX% */ /* Totl%C0, Any%C0 GFX%C0 CPUGFX% */
if (DO_BIC(BIC_Totl_c0)) if (DO_BIC(BIC_Totl_c0))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_wtd_core_c0/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_wtd_core_c0 / tsc);
if (DO_BIC(BIC_Any_c0)) if (DO_BIC(BIC_Any_c0))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_any_core_c0/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_any_core_c0 / tsc);
if (DO_BIC(BIC_GFX_c0)) if (DO_BIC(BIC_GFX_c0))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_any_gfxe_c0/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_any_gfxe_c0 / tsc);
if (DO_BIC(BIC_CPUGFX)) if (DO_BIC(BIC_CPUGFX))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_both_core_gfxe_c0/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pkg_both_core_gfxe_c0 / tsc);
if (DO_BIC(BIC_Pkgpc2)) if (DO_BIC(BIC_Pkgpc2))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc2/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc2 / tsc);
if (DO_BIC(BIC_Pkgpc3)) if (DO_BIC(BIC_Pkgpc3))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc3/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc3 / tsc);
if (DO_BIC(BIC_Pkgpc6)) if (DO_BIC(BIC_Pkgpc6))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc6/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc6 / tsc);
if (DO_BIC(BIC_Pkgpc7)) if (DO_BIC(BIC_Pkgpc7))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc7/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc7 / tsc);
if (DO_BIC(BIC_Pkgpc8)) if (DO_BIC(BIC_Pkgpc8))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc8/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc8 / tsc);
if (DO_BIC(BIC_Pkgpc9)) if (DO_BIC(BIC_Pkgpc9))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc9/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc9 / tsc);
if (DO_BIC(BIC_Pkgpc10)) if (DO_BIC(BIC_Pkgpc10))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc10/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->pc10 / tsc);
if (DO_BIC(BIC_CPU_LPI)) if (DO_BIC(BIC_CPU_LPI))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->cpu_lpi / 1000000.0 / interval_float); outp +=
sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->cpu_lpi / 1000000.0 / interval_float);
if (DO_BIC(BIC_SYS_LPI)) if (DO_BIC(BIC_SYS_LPI))
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->sys_lpi / 1000000.0 / interval_float); outp +=
sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->sys_lpi / 1000000.0 / interval_float);
if (DO_BIC(BIC_PkgWatt)) if (DO_BIC(BIC_PkgWatt))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_pkg * rapl_energy_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_pkg * rapl_energy_units / interval_float);
if (DO_BIC(BIC_CorWatt) && !(do_rapl & RAPL_PER_CORE_ENERGY)) if (DO_BIC(BIC_CorWatt) && !(do_rapl & RAPL_PER_CORE_ENERGY))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_cores * rapl_energy_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_cores * rapl_energy_units / interval_float);
if (DO_BIC(BIC_GFXWatt)) if (DO_BIC(BIC_GFXWatt))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_gfx * rapl_energy_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_gfx * rapl_energy_units / interval_float);
if (DO_BIC(BIC_RAMWatt)) if (DO_BIC(BIC_RAMWatt))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_dram * rapl_dram_energy_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""),
p->energy_dram * rapl_dram_energy_units / interval_float);
if (DO_BIC(BIC_Pkg_J)) if (DO_BIC(BIC_Pkg_J))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_pkg * rapl_energy_units); outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_pkg * rapl_energy_units);
if (DO_BIC(BIC_Cor_J) && !(do_rapl & RAPL_PER_CORE_ENERGY)) if (DO_BIC(BIC_Cor_J) && !(do_rapl & RAPL_PER_CORE_ENERGY))
...@@ -1318,14 +1312,19 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1318,14 +1312,19 @@ int format_counters(struct thread_data *t, struct core_data *c,
if (DO_BIC(BIC_RAM_J)) if (DO_BIC(BIC_RAM_J))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_dram * rapl_dram_energy_units); outp += sprintf(outp, fmt8, (printed++ ? delim : ""), p->energy_dram * rapl_dram_energy_units);
if (DO_BIC(BIC_PKG__)) if (DO_BIC(BIC_PKG__))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), 100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""),
100.0 * p->rapl_pkg_perf_status * rapl_time_units / interval_float);
if (DO_BIC(BIC_RAM__)) if (DO_BIC(BIC_RAM__))
outp += sprintf(outp, fmt8, (printed++ ? delim : ""), 100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float); outp +=
sprintf(outp, fmt8, (printed++ ? delim : ""),
100.0 * p->rapl_dram_perf_status * rapl_time_units / interval_float);
for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) { for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) {
if (mp->format == FORMAT_RAW) { if (mp->format == FORMAT_RAW) {
if (mp->width == 32) if (mp->width == 32)
outp += sprintf(outp, "%s0x%08x", (printed++ ? delim : ""), (unsigned int) p->counter[i]); outp +=
sprintf(outp, "%s0x%08x", (printed++ ? delim : ""), (unsigned int)p->counter[i]);
else else
outp += sprintf(outp, "%s0x%016llx", (printed++ ? delim : ""), p->counter[i]); outp += sprintf(outp, "%s0x%016llx", (printed++ ? delim : ""), p->counter[i]);
} else if (mp->format == FORMAT_DELTA) { } else if (mp->format == FORMAT_DELTA) {
...@@ -1334,7 +1333,7 @@ int format_counters(struct thread_data *t, struct core_data *c, ...@@ -1334,7 +1333,7 @@ int format_counters(struct thread_data *t, struct core_data *c,
else else
outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), p->counter[i]); outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), p->counter[i]);
} else if (mp->format == FORMAT_PERCENT) { } else if (mp->format == FORMAT_PERCENT) {
outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->counter[i]/tsc); outp += sprintf(outp, "%s%.2f", (printed++ ? delim : ""), 100.0 * p->counter[i] / tsc);
} }
} }
...@@ -1359,12 +1358,14 @@ void flush_output_stdout(void) ...@@ -1359,12 +1358,14 @@ void flush_output_stdout(void)
outp = output_buffer; outp = output_buffer;
} }
void flush_output_stderr(void) void flush_output_stderr(void)
{ {
fputs(output_buffer, outf); fputs(output_buffer, outf);
fflush(outf); fflush(outf);
outp = output_buffer; outp = output_buffer;
} }
void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
{ {
static int printed; static int printed;
...@@ -1385,13 +1386,11 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_ ...@@ -1385,13 +1386,11 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_
#define DELTA_WRAP32(new, old) \ #define DELTA_WRAP32(new, old) \
old = ((((unsigned long long)new << 32) - ((unsigned long long)old << 32)) >> 32); old = ((((unsigned long long)new << 32) - ((unsigned long long)old << 32)) >> 32);
int int delta_package(struct pkg_data *new, struct pkg_data *old)
delta_package(struct pkg_data *new, struct pkg_data *old)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
if (DO_BIC(BIC_Totl_c0)) if (DO_BIC(BIC_Totl_c0))
old->pkg_wtd_core_c0 = new->pkg_wtd_core_c0 - old->pkg_wtd_core_c0; old->pkg_wtd_core_c0 = new->pkg_wtd_core_c0 - old->pkg_wtd_core_c0;
if (DO_BIC(BIC_Any_c0)) if (DO_BIC(BIC_Any_c0))
...@@ -1416,7 +1415,7 @@ delta_package(struct pkg_data *new, struct pkg_data *old) ...@@ -1416,7 +1415,7 @@ delta_package(struct pkg_data *new, struct pkg_data *old)
old->pkg_temp_c = new->pkg_temp_c; old->pkg_temp_c = new->pkg_temp_c;
/* flag an error when rc6 counter resets/wraps */ /* flag an error when rc6 counter resets/wraps */
if (old->gfx_rc6_ms > new->gfx_rc6_ms) if (old->gfx_rc6_ms > new->gfx_rc6_ms)
old->gfx_rc6_ms = -1; old->gfx_rc6_ms = -1;
else else
old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms; old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms;
...@@ -1441,8 +1440,7 @@ delta_package(struct pkg_data *new, struct pkg_data *old) ...@@ -1441,8 +1440,7 @@ delta_package(struct pkg_data *new, struct pkg_data *old)
return 0; return 0;
} }
void void delta_core(struct core_data *new, struct core_data *old)
delta_core(struct core_data *new, struct core_data *old)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
...@@ -1474,9 +1472,7 @@ int soft_c1_residency_display(int bic) ...@@ -1474,9 +1472,7 @@ int soft_c1_residency_display(int bic)
/* /*
* old = new - old * old = new - old
*/ */
int int delta_thread(struct thread_data *new, struct thread_data *old, struct core_data *core_delta)
delta_thread(struct thread_data *new, struct thread_data *old,
struct core_data *core_delta)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
...@@ -1507,8 +1503,7 @@ delta_thread(struct thread_data *new, struct thread_data *old, ...@@ -1507,8 +1503,7 @@ delta_thread(struct thread_data *new, struct thread_data *old,
old->c1 = new->c1 - old->c1; old->c1 = new->c1 - old->c1;
if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz) || if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz) || soft_c1_residency_display(BIC_Avg_MHz)) {
soft_c1_residency_display(BIC_Avg_MHz)) {
if ((new->aperf > old->aperf) && (new->mperf > old->mperf)) { if ((new->aperf > old->aperf) && (new->mperf > old->mperf)) {
old->aperf = new->aperf - old->aperf; old->aperf = new->aperf - old->aperf;
old->mperf = new->mperf - old->mperf; old->mperf = new->mperf - old->mperf;
...@@ -1517,7 +1512,6 @@ delta_thread(struct thread_data *new, struct thread_data *old, ...@@ -1517,7 +1512,6 @@ delta_thread(struct thread_data *new, struct thread_data *old,
} }
} }
if (use_c1_residency_msr) { if (use_c1_residency_msr) {
/* /*
* Some models have a dedicated C1 residency MSR, * Some models have a dedicated C1 residency MSR,
...@@ -1534,7 +1528,7 @@ delta_thread(struct thread_data *new, struct thread_data *old, ...@@ -1534,7 +1528,7 @@ delta_thread(struct thread_data *new, struct thread_data *old,
else { else {
/* normal case, derive c1 */ /* normal case, derive c1 */
old->c1 = (old->tsc * tsc_tweak) - old->mperf - core_delta->c3 old->c1 = (old->tsc * tsc_tweak) - old->mperf - core_delta->c3
- core_delta->c6 - core_delta->c7; - core_delta->c6 - core_delta->c7;
} }
} }
...@@ -1563,8 +1557,7 @@ delta_thread(struct thread_data *new, struct thread_data *old, ...@@ -1563,8 +1557,7 @@ delta_thread(struct thread_data *new, struct thread_data *old,
} }
int delta_cpu(struct thread_data *t, struct core_data *c, int delta_cpu(struct thread_data *t, struct core_data *c,
struct pkg_data *p, struct thread_data *t2, struct pkg_data *p, struct thread_data *t2, struct core_data *c2, struct pkg_data *p2)
struct core_data *c2, struct pkg_data *p2)
{ {
int retval = 0; int retval = 0;
...@@ -1587,7 +1580,7 @@ int delta_cpu(struct thread_data *t, struct core_data *c, ...@@ -1587,7 +1580,7 @@ int delta_cpu(struct thread_data *t, struct core_data *c,
void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
t->tv_begin.tv_sec = 0; t->tv_begin.tv_sec = 0;
t->tv_begin.tv_usec = 0; t->tv_begin.tv_usec = 0;
...@@ -1654,8 +1647,8 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data ...@@ -1654,8 +1647,8 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data
for (i = 0, mp = sys.pp; mp; i++, mp = mp->next) for (i = 0, mp = sys.pp; mp; i++, mp = mp->next)
p->counter[i] = 0; p->counter[i] = 0;
} }
int sum_counters(struct thread_data *t, struct core_data *c,
struct pkg_data *p) int sum_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
...@@ -1756,12 +1749,12 @@ int sum_counters(struct thread_data *t, struct core_data *c, ...@@ -1756,12 +1749,12 @@ int sum_counters(struct thread_data *t, struct core_data *c,
} }
return 0; return 0;
} }
/* /*
* sum the counters for all cpus in the system * sum the counters for all cpus in the system
* compute the weighted average * compute the weighted average
*/ */
void compute_average(struct thread_data *t, struct core_data *c, void compute_average(struct thread_data *t, struct core_data *c, struct pkg_data *p)
struct pkg_data *p)
{ {
int i; int i;
struct msr_counter *mp; struct msr_counter *mp;
...@@ -1842,7 +1835,7 @@ static unsigned long long rdtsc(void) ...@@ -1842,7 +1835,7 @@ static unsigned long long rdtsc(void)
{ {
unsigned int low, high; unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high)); asm volatile ("rdtsc":"=a" (low), "=d"(high));
return low | ((unsigned long long)high) << 32; return low | ((unsigned long long)high) << 32;
} }
...@@ -1858,6 +1851,7 @@ FILE *fopen_or_die(const char *path, const char *mode) ...@@ -1858,6 +1851,7 @@ FILE *fopen_or_die(const char *path, const char *mode)
err(1, "%s: open failed", path); err(1, "%s: open failed", path);
return filep; return filep;
} }
/* /*
* snapshot_sysfs_counter() * snapshot_sysfs_counter()
* *
...@@ -1889,8 +1883,7 @@ int get_mp(int cpu, struct msr_counter *mp, unsigned long long *counterp) ...@@ -1889,8 +1883,7 @@ int get_mp(int cpu, struct msr_counter *mp, unsigned long long *counterp)
char path[128 + PATH_BYTES]; char path[128 + PATH_BYTES];
if (mp->flags & SYSFS_PERCPU) { if (mp->flags & SYSFS_PERCPU) {
sprintf(path, "/sys/devices/system/cpu/cpu%d/%s", sprintf(path, "/sys/devices/system/cpu/cpu%d/%s", cpu, mp->path);
cpu, mp->path);
*counterp = snapshot_sysfs_counter(path); *counterp = snapshot_sysfs_counter(path);
} else { } else {
...@@ -1950,7 +1943,7 @@ void get_apic_id(struct thread_data *t) ...@@ -1950,7 +1943,7 @@ void get_apic_id(struct thread_data *t)
eax = ebx = ecx = edx = 0; eax = ebx = ecx = edx = 0;
__cpuid(0x80000001, eax, ebx, ecx, edx); __cpuid(0x80000001, eax, ebx, ecx, edx);
topology_extensions = ecx & (1 << 22); topology_extensions = ecx & (1 << 22);
if (topology_extensions == 0) if (topology_extensions == 0)
return; return;
...@@ -1973,8 +1966,7 @@ void get_apic_id(struct thread_data *t) ...@@ -1973,8 +1966,7 @@ void get_apic_id(struct thread_data *t)
t->x2apic_id = edx; t->x2apic_id = edx;
if (debug && (t->apic_id != (t->x2apic_id & 0xff))) if (debug && (t->apic_id != (t->x2apic_id & 0xff)))
fprintf(outf, "cpu%d: BIOS BUG: apic 0x%x x2apic 0x%x\n", fprintf(outf, "cpu%d: BIOS BUG: apic 0x%x x2apic 0x%x\n", t->cpu_id, t->apic_id, t->x2apic_id);
t->cpu_id, t->apic_id, t->x2apic_id);
} }
/* /*
...@@ -2002,8 +1994,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -2002,8 +1994,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
retry: retry:
t->tsc = rdtsc(); /* we are running on local CPU of interest */ t->tsc = rdtsc(); /* we are running on local CPU of interest */
if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz) || if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz) || soft_c1_residency_display(BIC_Avg_MHz)) {
soft_c1_residency_display(BIC_Avg_MHz)) {
unsigned long long tsc_before, tsc_between, tsc_after, aperf_time, mperf_time; unsigned long long tsc_before, tsc_between, tsc_after, aperf_time, mperf_time;
/* /*
...@@ -2050,8 +2041,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -2050,8 +2041,7 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
if (aperf_mperf_retry_count < 5) if (aperf_mperf_retry_count < 5)
goto retry; goto retry;
else else
warnx("cpu%d jitter %lld %lld", warnx("cpu%d jitter %lld %lld", cpu, aperf_time, mperf_time);
cpu, aperf_time, mperf_time);
} }
aperf_mperf_retry_count = 0; aperf_mperf_retry_count = 0;
...@@ -2252,47 +2242,64 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -2252,47 +2242,64 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
* (>= PCL__7) and to index pkg_cstate_limit_strings[]. * (>= PCL__7) and to index pkg_cstate_limit_strings[].
*/ */
#define PCLUKN 0 /* Unknown */ #define PCLUKN 0 /* Unknown */
#define PCLRSV 1 /* Reserved */ #define PCLRSV 1 /* Reserved */
#define PCL__0 2 /* PC0 */ #define PCL__0 2 /* PC0 */
#define PCL__1 3 /* PC1 */ #define PCL__1 3 /* PC1 */
#define PCL__2 4 /* PC2 */ #define PCL__2 4 /* PC2 */
#define PCL__3 5 /* PC3 */ #define PCL__3 5 /* PC3 */
#define PCL__4 6 /* PC4 */ #define PCL__4 6 /* PC4 */
#define PCL__6 7 /* PC6 */ #define PCL__6 7 /* PC6 */
#define PCL_6N 8 /* PC6 No Retention */ #define PCL_6N 8 /* PC6 No Retention */
#define PCL_6R 9 /* PC6 Retention */ #define PCL_6R 9 /* PC6 Retention */
#define PCL__7 10 /* PC7 */ #define PCL__7 10 /* PC7 */
#define PCL_7S 11 /* PC7 Shrink */ #define PCL_7S 11 /* PC7 Shrink */
#define PCL__8 12 /* PC8 */ #define PCL__8 12 /* PC8 */
#define PCL__9 13 /* PC9 */ #define PCL__9 13 /* PC9 */
#define PCL_10 14 /* PC10 */ #define PCL_10 14 /* PC10 */
#define PCLUNL 15 /* Unlimited */ #define PCLUNL 15 /* Unlimited */
int pkg_cstate_limit = PCLUKN; int pkg_cstate_limit = PCLUKN;
char *pkg_cstate_limit_strings[] = { "reserved", "unknown", "pc0", "pc1", "pc2", char *pkg_cstate_limit_strings[] = { "reserved", "unknown", "pc0", "pc1", "pc2",
"pc3", "pc4", "pc6", "pc6n", "pc6r", "pc7", "pc7s", "pc8", "pc9", "pc10", "unlimited"}; "pc3", "pc4", "pc6", "pc6n", "pc6r", "pc7", "pc7s", "pc8", "pc9", "pc10", "unlimited"
};
int nhm_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCL__3, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int snb_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCL__7, PCL_7S, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int hsw_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, PCL__8, PCL__9, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int slv_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7};
int amt_pkg_cstate_limits[16] = {PCLUNL, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int phi_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int glm_pkg_cstate_limits[16] = {PCLUNL, PCL__1, PCL__3, PCL__6, PCL__7, PCL_7S, PCL__8, PCL__9, PCL_10, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int skx_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
int icx_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL__6, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV};
static void int nhm_pkg_cstate_limits[16] =
calculate_tsc_tweak() { PCL__0, PCL__1, PCL__3, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int snb_pkg_cstate_limits[16] =
{ PCL__0, PCL__2, PCL_6N, PCL_6R, PCL__7, PCL_7S, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int hsw_pkg_cstate_limits[16] =
{ PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, PCL__8, PCL__9, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int slv_pkg_cstate_limits[16] =
{ PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCL__6, PCL__7 };
int amt_pkg_cstate_limits[16] =
{ PCLUNL, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int phi_pkg_cstate_limits[16] =
{ PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int glm_pkg_cstate_limits[16] =
{ PCLUNL, PCL__1, PCL__3, PCL__6, PCL__7, PCL_7S, PCL__8, PCL__9, PCL_10, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int skx_pkg_cstate_limits[16] =
{ PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
int icx_pkg_cstate_limits[16] =
{ PCL__0, PCL__2, PCL__6, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV,
PCLRSV, PCLRSV };
static void calculate_tsc_tweak()
{ {
tsc_tweak = base_hz / tsc_hz; tsc_tweak = base_hz / tsc_hz;
} }
void prewake_cstate_probe(unsigned int family, unsigned int model); void prewake_cstate_probe(unsigned int family, unsigned int model);
static void static void dump_nhm_platform_info(void)
dump_nhm_platform_info(void)
{ {
unsigned long long msr; unsigned long long msr;
unsigned int ratio; unsigned int ratio;
...@@ -2302,12 +2309,10 @@ dump_nhm_platform_info(void) ...@@ -2302,12 +2309,10 @@ dump_nhm_platform_info(void)
fprintf(outf, "cpu%d: MSR_PLATFORM_INFO: 0x%08llx\n", base_cpu, msr); fprintf(outf, "cpu%d: MSR_PLATFORM_INFO: 0x%08llx\n", base_cpu, msr);
ratio = (msr >> 40) & 0xFF; ratio = (msr >> 40) & 0xFF;
fprintf(outf, "%d * %.1f = %.1f MHz max efficiency frequency\n", fprintf(outf, "%d * %.1f = %.1f MHz max efficiency frequency\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 8) & 0xFF; ratio = (msr >> 8) & 0xFF;
fprintf(outf, "%d * %.1f = %.1f MHz base frequency\n", fprintf(outf, "%d * %.1f = %.1f MHz base frequency\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
get_msr(base_cpu, MSR_IA32_POWER_CTL, &msr); get_msr(base_cpu, MSR_IA32_POWER_CTL, &msr);
fprintf(outf, "cpu%d: MSR_IA32_POWER_CTL: 0x%08llx (C1E auto-promotion: %sabled)\n", fprintf(outf, "cpu%d: MSR_IA32_POWER_CTL: 0x%08llx (C1E auto-promotion: %sabled)\n",
...@@ -2315,14 +2320,12 @@ dump_nhm_platform_info(void) ...@@ -2315,14 +2320,12 @@ dump_nhm_platform_info(void)
/* C-state Pre-wake Disable (CSTATE_PREWAKE_DISABLE) */ /* C-state Pre-wake Disable (CSTATE_PREWAKE_DISABLE) */
if (dis_cstate_prewake) if (dis_cstate_prewake)
fprintf(outf, "C-state Pre-wake: %sabled\n", fprintf(outf, "C-state Pre-wake: %sabled\n", msr & 0x40000000 ? "DIS" : "EN");
msr & 0x40000000 ? "DIS" : "EN");
return; return;
} }
static void static void dump_hsw_turbo_ratio_limits(void)
dump_hsw_turbo_ratio_limits(void)
{ {
unsigned long long msr; unsigned long long msr;
unsigned int ratio; unsigned int ratio;
...@@ -2333,18 +2336,15 @@ dump_hsw_turbo_ratio_limits(void) ...@@ -2333,18 +2336,15 @@ dump_hsw_turbo_ratio_limits(void)
ratio = (msr >> 8) & 0xFF; ratio = (msr >> 8) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 18 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 18 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 0) & 0xFF; ratio = (msr >> 0) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 17 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 17 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
return; return;
} }
static void static void dump_ivt_turbo_ratio_limits(void)
dump_ivt_turbo_ratio_limits(void)
{ {
unsigned long long msr; unsigned long long msr;
unsigned int ratio; unsigned int ratio;
...@@ -2355,45 +2355,38 @@ dump_ivt_turbo_ratio_limits(void) ...@@ -2355,45 +2355,38 @@ dump_ivt_turbo_ratio_limits(void)
ratio = (msr >> 56) & 0xFF; ratio = (msr >> 56) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 16 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 16 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 48) & 0xFF; ratio = (msr >> 48) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 15 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 15 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 40) & 0xFF; ratio = (msr >> 40) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 14 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 14 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 32) & 0xFF; ratio = (msr >> 32) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 13 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 13 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 24) & 0xFF; ratio = (msr >> 24) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 12 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 12 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 16) & 0xFF; ratio = (msr >> 16) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 11 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 11 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 8) & 0xFF; ratio = (msr >> 8) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 10 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 10 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 0) & 0xFF; ratio = (msr >> 0) & 0xFF;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 9 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 9 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
return; return;
} }
int has_turbo_ratio_group_limits(int family, int model) int has_turbo_ratio_group_limits(int family, int model)
{ {
...@@ -2411,8 +2404,7 @@ int has_turbo_ratio_group_limits(int family, int model) ...@@ -2411,8 +2404,7 @@ int has_turbo_ratio_group_limits(int family, int model)
return 0; return 0;
} }
static void static void dump_turbo_ratio_limits(int family, int model)
dump_turbo_ratio_limits(int family, int model)
{ {
unsigned long long msr, core_counts; unsigned long long msr, core_counts;
unsigned int ratio, group_size; unsigned int ratio, group_size;
...@@ -2477,8 +2469,7 @@ dump_turbo_ratio_limits(int family, int model) ...@@ -2477,8 +2469,7 @@ dump_turbo_ratio_limits(int family, int model)
return; return;
} }
static void static void dump_atom_turbo_ratio_limits(void)
dump_atom_turbo_ratio_limits(void)
{ {
unsigned long long msr; unsigned long long msr;
unsigned int ratio; unsigned int ratio;
...@@ -2488,45 +2479,37 @@ dump_atom_turbo_ratio_limits(void) ...@@ -2488,45 +2479,37 @@ dump_atom_turbo_ratio_limits(void)
ratio = (msr >> 0) & 0x3F; ratio = (msr >> 0) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz minimum operating frequency\n", fprintf(outf, "%d * %.1f = %.1f MHz minimum operating frequency\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 8) & 0x3F; ratio = (msr >> 8) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz low frequency mode (LFM)\n", fprintf(outf, "%d * %.1f = %.1f MHz low frequency mode (LFM)\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 16) & 0x3F; ratio = (msr >> 16) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz base frequency\n", fprintf(outf, "%d * %.1f = %.1f MHz base frequency\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
get_msr(base_cpu, MSR_ATOM_CORE_TURBO_RATIOS, &msr); get_msr(base_cpu, MSR_ATOM_CORE_TURBO_RATIOS, &msr);
fprintf(outf, "cpu%d: MSR_ATOM_CORE_TURBO_RATIOS: 0x%08llx\n", base_cpu, msr & 0xFFFFFFFF); fprintf(outf, "cpu%d: MSR_ATOM_CORE_TURBO_RATIOS: 0x%08llx\n", base_cpu, msr & 0xFFFFFFFF);
ratio = (msr >> 24) & 0x3F; ratio = (msr >> 24) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 4 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 4 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 16) & 0x3F; ratio = (msr >> 16) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 3 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 3 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 8) & 0x3F; ratio = (msr >> 8) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 2 active cores\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 2 active cores\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
ratio = (msr >> 0) & 0x3F; ratio = (msr >> 0) & 0x3F;
if (ratio) if (ratio)
fprintf(outf, "%d * %.1f = %.1f MHz max turbo 1 active core\n", fprintf(outf, "%d * %.1f = %.1f MHz max turbo 1 active core\n", ratio, bclk, ratio * bclk);
ratio, bclk, ratio * bclk);
} }
static void static void dump_knl_turbo_ratio_limits(void)
dump_knl_turbo_ratio_limits(void)
{ {
const unsigned int buckets_no = 7; const unsigned int buckets_no = 7;
...@@ -2538,8 +2521,7 @@ dump_knl_turbo_ratio_limits(void) ...@@ -2538,8 +2521,7 @@ dump_knl_turbo_ratio_limits(void)
get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT, &msr); get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT, &msr);
fprintf(outf, "cpu%d: MSR_TURBO_RATIO_LIMIT: 0x%08llx\n", fprintf(outf, "cpu%d: MSR_TURBO_RATIO_LIMIT: 0x%08llx\n", base_cpu, msr);
base_cpu, msr);
/* /*
* Turbo encoding in KNL is as follows: * Turbo encoding in KNL is as follows:
...@@ -2584,8 +2566,7 @@ dump_knl_turbo_ratio_limits(void) ...@@ -2584,8 +2566,7 @@ dump_knl_turbo_ratio_limits(void)
ratio[i], bclk, ratio[i] * bclk, cores[i]); ratio[i], bclk, ratio[i] * bclk, cores[i]);
} }
static void static void dump_nhm_cst_cfg(void)
dump_nhm_cst_cfg(void)
{ {
unsigned long long msr; unsigned long long msr;
...@@ -2598,14 +2579,11 @@ dump_nhm_cst_cfg(void) ...@@ -2598,14 +2579,11 @@ dump_nhm_cst_cfg(void)
(msr & SNB_C1_AUTO_UNDEMOTE) ? "UNdemote-C1, " : "", (msr & SNB_C1_AUTO_UNDEMOTE) ? "UNdemote-C1, " : "",
(msr & NHM_C3_AUTO_DEMOTE) ? "demote-C3, " : "", (msr & NHM_C3_AUTO_DEMOTE) ? "demote-C3, " : "",
(msr & NHM_C1_AUTO_DEMOTE) ? "demote-C1, " : "", (msr & NHM_C1_AUTO_DEMOTE) ? "demote-C1, " : "",
(msr & (1 << 15)) ? "" : "UN", (msr & (1 << 15)) ? "" : "UN", (unsigned int)msr & 0xF, pkg_cstate_limit_strings[pkg_cstate_limit]);
(unsigned int)msr & 0xF,
pkg_cstate_limit_strings[pkg_cstate_limit]);
#define AUTOMATIC_CSTATE_CONVERSION (1UL << 16) #define AUTOMATIC_CSTATE_CONVERSION (1UL << 16)
if (has_automatic_cstate_conversion) { if (has_automatic_cstate_conversion) {
fprintf(outf, ", automatic c-state conversion=%s", fprintf(outf, ", automatic c-state conversion=%s", (msr & AUTOMATIC_CSTATE_CONVERSION) ? "on" : "off");
(msr & AUTOMATIC_CSTATE_CONVERSION) ? "on" : "off");
} }
fprintf(outf, ")\n"); fprintf(outf, ")\n");
...@@ -2613,8 +2591,7 @@ dump_nhm_cst_cfg(void) ...@@ -2613,8 +2591,7 @@ dump_nhm_cst_cfg(void)
return; return;
} }
static void static void dump_config_tdp(void)
dump_config_tdp(void)
{ {
unsigned long long msr; unsigned long long msr;
...@@ -2656,7 +2633,7 @@ dump_config_tdp(void) ...@@ -2656,7 +2633,7 @@ dump_config_tdp(void)
fprintf(outf, ")\n"); fprintf(outf, ")\n");
} }
unsigned int irtl_time_units[] = {1, 32, 1024, 32768, 1048576, 33554432, 0, 0 }; unsigned int irtl_time_units[] = { 1, 32, 1024, 32768, 1048576, 33554432, 0, 0 };
void print_irtl(void) void print_irtl(void)
{ {
...@@ -2696,6 +2673,7 @@ void print_irtl(void) ...@@ -2696,6 +2673,7 @@ void print_irtl(void)
(msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]);
} }
void free_fd_percpu(void) void free_fd_percpu(void)
{ {
int i; int i;
...@@ -2752,7 +2730,6 @@ void free_all_buffers(void) ...@@ -2752,7 +2730,6 @@ void free_all_buffers(void)
free(cpus); free(cpus);
} }
/* /*
* Parse a file containing a single int. * Parse a file containing a single int.
* Return 0 if file can not be opened * Return 0 if file can not be opened
...@@ -2827,8 +2804,7 @@ void set_node_data(void) ...@@ -2827,8 +2804,7 @@ void set_node_data(void)
* the logical_node_id * the logical_node_id
*/ */
for (cpux = cpu; cpux <= topo.max_cpu_num; cpux++) { for (cpux = cpu; cpux <= topo.max_cpu_num; cpux++) {
if ((cpus[cpux].physical_package_id == pkg) && if ((cpus[cpux].physical_package_id == pkg) && (cpus[cpux].physical_node_id == node)) {
(cpus[cpux].physical_node_id == node)) {
cpus[cpux].logical_node_id = lnode; cpus[cpux].logical_node_id = lnode;
cpu_count++; cpu_count++;
} }
...@@ -2850,8 +2826,7 @@ int get_physical_node_id(struct cpu_topology *thiscpu) ...@@ -2850,8 +2826,7 @@ int get_physical_node_id(struct cpu_topology *thiscpu)
int cpu = thiscpu->logical_cpu_id; int cpu = thiscpu->logical_cpu_id;
for (i = 0; i <= topo.max_cpu_num; i++) { for (i = 0; i <= topo.max_cpu_num; i++) {
sprintf(path, "/sys/devices/system/cpu/cpu%d/node%i/cpulist", sprintf(path, "/sys/devices/system/cpu/cpu%d/node%i/cpulist", cpu, i);
cpu, i);
filep = fopen(path, "r"); filep = fopen(path, "r");
if (!filep) if (!filep)
continue; continue;
...@@ -2881,8 +2856,7 @@ int get_thread_siblings(struct cpu_topology *thiscpu) ...@@ -2881,8 +2856,7 @@ int get_thread_siblings(struct cpu_topology *thiscpu)
size = CPU_ALLOC_SIZE((topo.max_cpu_num + 1)); size = CPU_ALLOC_SIZE((topo.max_cpu_num + 1));
CPU_ZERO_S(size, thiscpu->put_ids); CPU_ZERO_S(size, thiscpu->put_ids);
sprintf(path, sprintf(path, "/sys/devices/system/cpu/cpu%d/topology/thread_siblings", cpu);
"/sys/devices/system/cpu/cpu%d/topology/thread_siblings", cpu);
filep = fopen(path, "r"); filep = fopen(path, "r");
if (!filep) { if (!filep) {
...@@ -2899,10 +2873,8 @@ int get_thread_siblings(struct cpu_topology *thiscpu) ...@@ -2899,10 +2873,8 @@ int get_thread_siblings(struct cpu_topology *thiscpu)
sib_core = get_core_id(so); sib_core = get_core_id(so);
if (sib_core == thiscpu->physical_core_id) { if (sib_core == thiscpu->physical_core_id) {
CPU_SET_S(so, size, thiscpu->put_ids); CPU_SET_S(so, size, thiscpu->put_ids);
if ((so != cpu) && if ((so != cpu) && (cpus[so].thread_id < 0))
(cpus[so].thread_id < 0)) cpus[so].thread_id = thread_id++;
cpus[so].thread_id =
thread_id++;
} }
} }
} }
...@@ -2917,41 +2889,31 @@ int get_thread_siblings(struct cpu_topology *thiscpu) ...@@ -2917,41 +2889,31 @@ int get_thread_siblings(struct cpu_topology *thiscpu)
* skip non-present cpus * skip non-present cpus
*/ */
int for_all_cpus_2(int (func)(struct thread_data *, struct core_data *, int for_all_cpus_2(int (func) (struct thread_data *, struct core_data *,
struct pkg_data *, struct thread_data *, struct core_data *, struct pkg_data *, struct thread_data *, struct core_data *,
struct pkg_data *), struct thread_data *thread_base, struct pkg_data *), struct thread_data *thread_base,
struct core_data *core_base, struct pkg_data *pkg_base, struct core_data *core_base, struct pkg_data *pkg_base,
struct thread_data *thread_base2, struct core_data *core_base2, struct thread_data *thread_base2, struct core_data *core_base2, struct pkg_data *pkg_base2)
struct pkg_data *pkg_base2)
{ {
int retval, pkg_no, node_no, core_no, thread_no; int retval, pkg_no, node_no, core_no, thread_no;
for (pkg_no = 0; pkg_no < topo.num_packages; ++pkg_no) { for (pkg_no = 0; pkg_no < topo.num_packages; ++pkg_no) {
for (node_no = 0; node_no < topo.nodes_per_pkg; ++node_no) { for (node_no = 0; node_no < topo.nodes_per_pkg; ++node_no) {
for (core_no = 0; core_no < topo.cores_per_node; for (core_no = 0; core_no < topo.cores_per_node; ++core_no) {
++core_no) { for (thread_no = 0; thread_no < topo.threads_per_core; ++thread_no) {
for (thread_no = 0; thread_no <
topo.threads_per_core; ++thread_no) {
struct thread_data *t, *t2; struct thread_data *t, *t2;
struct core_data *c, *c2; struct core_data *c, *c2;
struct pkg_data *p, *p2; struct pkg_data *p, *p2;
t = GET_THREAD(thread_base, thread_no, t = GET_THREAD(thread_base, thread_no, core_no, node_no, pkg_no);
core_no, node_no,
pkg_no);
if (cpu_is_not_present(t->cpu_id)) if (cpu_is_not_present(t->cpu_id))
continue; continue;
t2 = GET_THREAD(thread_base2, thread_no, t2 = GET_THREAD(thread_base2, thread_no, core_no, node_no, pkg_no);
core_no, node_no,
pkg_no);
c = GET_CORE(core_base, core_no, c = GET_CORE(core_base, core_no, node_no, pkg_no);
node_no, pkg_no); c2 = GET_CORE(core_base2, core_no, node_no, pkg_no);
c2 = GET_CORE(core_base2, core_no,
node_no,
pkg_no);
p = GET_PKG(pkg_base, pkg_no); p = GET_PKG(pkg_base, pkg_no);
p2 = GET_PKG(pkg_base2, pkg_no); p2 = GET_PKG(pkg_base2, pkg_no);
...@@ -2970,7 +2932,7 @@ int for_all_cpus_2(int (func)(struct thread_data *, struct core_data *, ...@@ -2970,7 +2932,7 @@ int for_all_cpus_2(int (func)(struct thread_data *, struct core_data *,
* run func(cpu) on every cpu in /proc/stat * run func(cpu) on every cpu in /proc/stat
* return max_cpu number * return max_cpu number
*/ */
int for_all_proc_cpus(int (func)(int)) int for_all_proc_cpus(int (func) (int))
{ {
FILE *fp; FILE *fp;
int cpu_num; int cpu_num;
...@@ -2990,7 +2952,7 @@ int for_all_proc_cpus(int (func)(int)) ...@@ -2990,7 +2952,7 @@ int for_all_proc_cpus(int (func)(int))
retval = func(cpu_num); retval = func(cpu_num);
if (retval) { if (retval) {
fclose(fp); fclose(fp);
return(retval); return (retval);
} }
} }
fclose(fp); fclose(fp);
...@@ -3014,16 +2976,14 @@ void set_max_cpu_num(void) ...@@ -3014,16 +2976,14 @@ void set_max_cpu_num(void)
base_cpu = sched_getcpu(); base_cpu = sched_getcpu();
if (base_cpu < 0) if (base_cpu < 0)
err(1, "cannot find calling cpu ID"); err(1, "cannot find calling cpu ID");
sprintf(pathname, sprintf(pathname, "/sys/devices/system/cpu/cpu%d/topology/thread_siblings", base_cpu);
"/sys/devices/system/cpu/cpu%d/topology/thread_siblings",
base_cpu);
filep = fopen_or_die(pathname, "r"); filep = fopen_or_die(pathname, "r");
topo.max_cpu_num = 0; topo.max_cpu_num = 0;
while (fscanf(filep, "%lx,", &dummy) == 1) while (fscanf(filep, "%lx,", &dummy) == 1)
topo.max_cpu_num += BITMASK_SIZE; topo.max_cpu_num += BITMASK_SIZE;
fclose(filep); fclose(filep);
topo.max_cpu_num--; /* 0 based */ topo.max_cpu_num--; /* 0 based */
} }
/* /*
...@@ -3035,6 +2995,7 @@ int count_cpus(int cpu) ...@@ -3035,6 +2995,7 @@ int count_cpus(int cpu)
topo.num_cpus++; topo.num_cpus++;
return 0; return 0;
} }
int mark_cpu_present(int cpu) int mark_cpu_present(int cpu)
{ {
CPU_SET_S(cpu, cpu_present_setsize, cpu_present_set); CPU_SET_S(cpu, cpu_present_setsize, cpu_present_set);
...@@ -3104,12 +3065,12 @@ int snapshot_proc_interrupts(void) ...@@ -3104,12 +3065,12 @@ int snapshot_proc_interrupts(void)
} }
while (getc(fp) != '\n') while (getc(fp) != '\n') ; /* flush interrupt description */
; /* flush interrupt description */
} }
return 0; return 0;
} }
/* /*
* snapshot_gfx_rc6_ms() * snapshot_gfx_rc6_ms()
* *
...@@ -3133,6 +3094,7 @@ int snapshot_gfx_rc6_ms(void) ...@@ -3133,6 +3094,7 @@ int snapshot_gfx_rc6_ms(void)
return 0; return 0;
} }
/* /*
* snapshot_gfx_mhz() * snapshot_gfx_mhz()
* *
...@@ -3212,6 +3174,7 @@ int snapshot_cpu_lpi_us(void) ...@@ -3212,6 +3174,7 @@ int snapshot_cpu_lpi_us(void)
return 0; return 0;
} }
/* /*
* snapshot_sys_lpi() * snapshot_sys_lpi()
* *
...@@ -3235,6 +3198,7 @@ int snapshot_sys_lpi_us(void) ...@@ -3235,6 +3198,7 @@ int snapshot_sys_lpi_us(void)
return 0; return 0;
} }
/* /*
* snapshot /proc and /sys files * snapshot /proc and /sys files
* *
...@@ -3266,7 +3230,7 @@ int snapshot_proc_sysfs_files(void) ...@@ -3266,7 +3230,7 @@ int snapshot_proc_sysfs_files(void)
int exit_requested; int exit_requested;
static void signal_handler (int signal) static void signal_handler(int signal)
{ {
switch (signal) { switch (signal) {
case SIGINT: case SIGINT:
...@@ -3373,8 +3337,7 @@ static int update_msr_sum(struct thread_data *t, struct core_data *c, struct pkg ...@@ -3373,8 +3337,7 @@ static int update_msr_sum(struct thread_data *t, struct core_data *c, struct pkg
continue; continue;
ret = get_msr(cpu, offset, &msr_cur); ret = get_msr(cpu, offset, &msr_cur);
if (ret) { if (ret) {
fprintf(outf, "Can not update msr(0x%llx)\n", fprintf(outf, "Can not update msr(0x%llx)\n", (unsigned long long)offset);
(unsigned long long)offset);
continue; continue;
} }
...@@ -3387,8 +3350,7 @@ static int update_msr_sum(struct thread_data *t, struct core_data *c, struct pkg ...@@ -3387,8 +3350,7 @@ static int update_msr_sum(struct thread_data *t, struct core_data *c, struct pkg
return 0; return 0;
} }
static void static void msr_record_handler(union sigval v)
msr_record_handler(union sigval v)
{ {
for_all_cpus(update_msr_sum, EVEN_COUNTERS); for_all_cpus(update_msr_sum, EVEN_COUNTERS);
} }
...@@ -3433,9 +3395,9 @@ void msr_sum_record(void) ...@@ -3433,9 +3395,9 @@ void msr_sum_record(void)
} }
return; return;
release_timer: release_timer:
timer_delete(timerid); timer_delete(timerid);
release_msr: release_msr:
free(per_cpu_msr_sum); free(per_cpu_msr_sum);
} }
...@@ -3527,7 +3489,7 @@ void check_dev_msr() ...@@ -3527,7 +3489,7 @@ void check_dev_msr()
sprintf(pathname, "/dev/cpu/%d/msr", base_cpu); sprintf(pathname, "/dev/cpu/%d/msr", base_cpu);
if (stat(pathname, &sb)) if (stat(pathname, &sb))
if (system("/sbin/modprobe msr > /dev/null 2>&1")) if (system("/sbin/modprobe msr > /dev/null 2>&1"))
err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" "); err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" ");
} }
...@@ -3549,8 +3511,7 @@ int check_for_cap_sys_rawio(void) ...@@ -3549,8 +3511,7 @@ int check_for_cap_sys_rawio(void)
err(-6, "cap_get\n"); err(-6, "cap_get\n");
if (cap_flag_value != CAP_SET) { if (cap_flag_value != CAP_SET) {
warnx("capget(CAP_SYS_RAWIO) failed," warnx("capget(CAP_SYS_RAWIO) failed," " try \"# setcap cap_sys_rawio=ep %s\"", progname);
" try \"# setcap cap_sys_rawio=ep %s\"", progname);
return 1; return 1;
} }
...@@ -3559,6 +3520,7 @@ int check_for_cap_sys_rawio(void) ...@@ -3559,6 +3520,7 @@ int check_for_cap_sys_rawio(void)
return 0; return 0;
} }
void check_permissions(void) void check_permissions(void)
{ {
int do_exit = 0; int do_exit = 0;
...@@ -3664,7 +3626,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) ...@@ -3664,7 +3626,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
case INTEL_FAM6_ATOM_GOLDMONT_PLUS: case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */
case INTEL_FAM6_ATOM_TREMONT: /* EHL */ case INTEL_FAM6_ATOM_TREMONT: /* EHL */
case INTEL_FAM6_ATOM_TREMONT_D: /* JVL */ case INTEL_FAM6_ATOM_TREMONT_D: /* JVL */
pkg_cstate_limits = glm_pkg_cstate_limits; pkg_cstate_limits = glm_pkg_cstate_limits;
break; break;
default: default:
...@@ -3680,6 +3642,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) ...@@ -3680,6 +3642,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
has_base_hz = 1; has_base_hz = 1;
return 1; return 1;
} }
/* /*
* SLV client has support for unique MSRs: * SLV client has support for unique MSRs:
* *
...@@ -3700,6 +3663,7 @@ int has_slv_msrs(unsigned int family, unsigned int model) ...@@ -3700,6 +3663,7 @@ int has_slv_msrs(unsigned int family, unsigned int model)
} }
return 0; return 0;
} }
int is_dnv(unsigned int family, unsigned int model) int is_dnv(unsigned int family, unsigned int model)
{ {
...@@ -3712,6 +3676,7 @@ int is_dnv(unsigned int family, unsigned int model) ...@@ -3712,6 +3676,7 @@ int is_dnv(unsigned int family, unsigned int model)
} }
return 0; return 0;
} }
int is_bdx(unsigned int family, unsigned int model) int is_bdx(unsigned int family, unsigned int model)
{ {
...@@ -3724,6 +3689,7 @@ int is_bdx(unsigned int family, unsigned int model) ...@@ -3724,6 +3689,7 @@ int is_bdx(unsigned int family, unsigned int model)
} }
return 0; return 0;
} }
int is_skx(unsigned int family, unsigned int model) int is_skx(unsigned int family, unsigned int model)
{ {
...@@ -3761,6 +3727,7 @@ int is_ehl(unsigned int family, unsigned int model) ...@@ -3761,6 +3727,7 @@ int is_ehl(unsigned int family, unsigned int model)
} }
return 0; return 0;
} }
int is_jvl(unsigned int family, unsigned int model) int is_jvl(unsigned int family, unsigned int model)
{ {
if (!genuine_intel) if (!genuine_intel)
...@@ -3779,7 +3746,7 @@ int has_turbo_ratio_limit(unsigned int family, unsigned int model) ...@@ -3779,7 +3746,7 @@ int has_turbo_ratio_limit(unsigned int family, unsigned int model)
return 0; return 0;
switch (model) { switch (model) {
/* Nehalem compatible, but do not include turbo-ratio limit support */ /* Nehalem compatible, but do not include turbo-ratio limit support */
case INTEL_FAM6_NEHALEM_EX: /* Nehalem-EX Xeon - Beckton */ case INTEL_FAM6_NEHALEM_EX: /* Nehalem-EX Xeon - Beckton */
case INTEL_FAM6_XEON_PHI_KNL: /* PHI - Knights Landing (different MSR definition) */ case INTEL_FAM6_XEON_PHI_KNL: /* PHI - Knights Landing (different MSR definition) */
return 0; return 0;
...@@ -3787,6 +3754,7 @@ int has_turbo_ratio_limit(unsigned int family, unsigned int model) ...@@ -3787,6 +3754,7 @@ int has_turbo_ratio_limit(unsigned int family, unsigned int model)
return 1; return 1;
} }
} }
int has_atom_turbo_ratio_limit(unsigned int family, unsigned int model) int has_atom_turbo_ratio_limit(unsigned int family, unsigned int model)
{ {
if (has_slv_msrs(family, model)) if (has_slv_msrs(family, model))
...@@ -3794,6 +3762,7 @@ int has_atom_turbo_ratio_limit(unsigned int family, unsigned int model) ...@@ -3794,6 +3762,7 @@ int has_atom_turbo_ratio_limit(unsigned int family, unsigned int model)
return 0; return 0;
} }
int has_ivt_turbo_ratio_limit(unsigned int family, unsigned int model) int has_ivt_turbo_ratio_limit(unsigned int family, unsigned int model)
{ {
if (!genuine_intel) if (!genuine_intel)
...@@ -3810,6 +3779,7 @@ int has_ivt_turbo_ratio_limit(unsigned int family, unsigned int model) ...@@ -3810,6 +3779,7 @@ int has_ivt_turbo_ratio_limit(unsigned int family, unsigned int model)
return 0; return 0;
} }
} }
int has_hsw_turbo_ratio_limit(unsigned int family, unsigned int model) int has_hsw_turbo_ratio_limit(unsigned int family, unsigned int model)
{ {
if (!genuine_intel) if (!genuine_intel)
...@@ -3841,6 +3811,7 @@ int has_knl_turbo_ratio_limit(unsigned int family, unsigned int model) ...@@ -3841,6 +3811,7 @@ int has_knl_turbo_ratio_limit(unsigned int family, unsigned int model)
return 0; return 0;
} }
} }
int has_glm_turbo_ratio_limit(unsigned int family, unsigned int model) int has_glm_turbo_ratio_limit(unsigned int family, unsigned int model)
{ {
if (!genuine_intel) if (!genuine_intel)
...@@ -3858,6 +3829,7 @@ int has_glm_turbo_ratio_limit(unsigned int family, unsigned int model) ...@@ -3858,6 +3829,7 @@ int has_glm_turbo_ratio_limit(unsigned int family, unsigned int model)
return 0; return 0;
} }
} }
int has_config_tdp(unsigned int family, unsigned int model) int has_config_tdp(unsigned int family, unsigned int model)
{ {
if (!genuine_intel) if (!genuine_intel)
...@@ -3921,8 +3893,7 @@ void check_tcc_offset(int model) ...@@ -3921,8 +3893,7 @@ void check_tcc_offset(int model)
} }
} }
static void static void remove_underbar(char *s)
remove_underbar(char *s)
{ {
char *to = s; char *to = s;
...@@ -3935,8 +3906,7 @@ remove_underbar(char *s) ...@@ -3935,8 +3906,7 @@ remove_underbar(char *s)
*to = 0; *to = 0;
} }
static void static void dump_cstate_pstate_config_info(unsigned int family, unsigned int model)
dump_cstate_pstate_config_info(unsigned int family, unsigned int model)
{ {
if (!do_nhm_platform_info) if (!do_nhm_platform_info)
return; return;
...@@ -3981,8 +3951,8 @@ static void dump_sysfs_file(char *path) ...@@ -3981,8 +3951,8 @@ static void dump_sysfs_file(char *path)
fprintf(outf, "%s: %s", strrchr(path, '/') + 1, cpuidle_buf); fprintf(outf, "%s: %s", strrchr(path, '/') + 1, cpuidle_buf);
} }
static void
dump_sysfs_cstate_config(void) static void dump_sysfs_cstate_config(void)
{ {
char path[64]; char path[64];
char name_buf[16]; char name_buf[16];
...@@ -4002,15 +3972,14 @@ dump_sysfs_cstate_config(void) ...@@ -4002,15 +3972,14 @@ dump_sysfs_cstate_config(void)
for (state = 0; state < 10; ++state) { for (state = 0; state < 10; ++state) {
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", base_cpu, state);
base_cpu, state);
input = fopen(path, "r"); input = fopen(path, "r");
if (input == NULL) if (input == NULL)
continue; continue;
if (!fgets(name_buf, sizeof(name_buf), input)) if (!fgets(name_buf, sizeof(name_buf), input))
err(1, "%s: failed to read file", path); err(1, "%s: failed to read file", path);
/* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */ /* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */
sp = strchr(name_buf, '-'); sp = strchr(name_buf, '-');
if (!sp) if (!sp)
sp = strchrnul(name_buf, '\n'); sp = strchrnul(name_buf, '\n');
...@@ -4019,8 +3988,7 @@ dump_sysfs_cstate_config(void) ...@@ -4019,8 +3988,7 @@ dump_sysfs_cstate_config(void)
remove_underbar(name_buf); remove_underbar(name_buf);
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/desc", sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/desc", base_cpu, state);
base_cpu, state);
input = fopen(path, "r"); input = fopen(path, "r");
if (input == NULL) if (input == NULL)
continue; continue;
...@@ -4031,8 +3999,8 @@ dump_sysfs_cstate_config(void) ...@@ -4031,8 +3999,8 @@ dump_sysfs_cstate_config(void)
fclose(input); fclose(input);
} }
} }
static void
dump_sysfs_pstate_config(void) static void dump_sysfs_pstate_config(void)
{ {
char path[64]; char path[64];
char driver_buf[64]; char driver_buf[64];
...@@ -4040,8 +4008,7 @@ dump_sysfs_pstate_config(void) ...@@ -4040,8 +4008,7 @@ dump_sysfs_pstate_config(void)
FILE *input; FILE *input;
int turbo; int turbo;
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_driver", sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_driver", base_cpu);
base_cpu);
input = fopen(path, "r"); input = fopen(path, "r");
if (input == NULL) { if (input == NULL) {
fprintf(outf, "NSFOD %s\n", path); fprintf(outf, "NSFOD %s\n", path);
...@@ -4051,8 +4018,7 @@ dump_sysfs_pstate_config(void) ...@@ -4051,8 +4018,7 @@ dump_sysfs_pstate_config(void)
err(1, "%s: failed to read file", path); err(1, "%s: failed to read file", path);
fclose(input); fclose(input);
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", sprintf(path, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", base_cpu);
base_cpu);
input = fopen(path, "r"); input = fopen(path, "r");
if (input == NULL) { if (input == NULL) {
fprintf(outf, "NSFOD %s\n", path); fprintf(outf, "NSFOD %s\n", path);
...@@ -4084,7 +4050,6 @@ dump_sysfs_pstate_config(void) ...@@ -4084,7 +4050,6 @@ dump_sysfs_pstate_config(void)
} }
} }
/* /*
* print_epb() * print_epb()
* Decode the ENERGY_PERF_BIAS MSR * Decode the ENERGY_PERF_BIAS MSR
...@@ -4130,6 +4095,7 @@ int print_epb(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4130,6 +4095,7 @@ int print_epb(struct thread_data *t, struct core_data *c, struct pkg_data *p)
return 0; return 0;
} }
/* /*
* print_hwp() * print_hwp()
* Decode the MSR_HWP_CAPABILITIES * Decode the MSR_HWP_CAPABILITIES
...@@ -4156,8 +4122,7 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4156,8 +4122,7 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p)
if (get_msr(cpu, MSR_PM_ENABLE, &msr)) if (get_msr(cpu, MSR_PM_ENABLE, &msr))
return 0; return 0;
fprintf(outf, "cpu%d: MSR_PM_ENABLE: 0x%08llx (%sHWP)\n", fprintf(outf, "cpu%d: MSR_PM_ENABLE: 0x%08llx (%sHWP)\n", cpu, msr, (msr & (1 << 0)) ? "" : "No-");
cpu, msr, (msr & (1 << 0)) ? "" : "No-");
/* MSR_PM_ENABLE[1] == 1 if HWP is enabled and MSRs visible */ /* MSR_PM_ENABLE[1] == 1 if HWP is enabled and MSRs visible */
if ((msr & (1 << 0)) == 0) if ((msr & (1 << 0)) == 0)
...@@ -4167,25 +4132,23 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4167,25 +4132,23 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p)
return 0; return 0;
fprintf(outf, "cpu%d: MSR_HWP_CAPABILITIES: 0x%08llx " fprintf(outf, "cpu%d: MSR_HWP_CAPABILITIES: 0x%08llx "
"(high %d guar %d eff %d low %d)\n", "(high %d guar %d eff %d low %d)\n",
cpu, msr, cpu, msr,
(unsigned int)HWP_HIGHEST_PERF(msr), (unsigned int)HWP_HIGHEST_PERF(msr),
(unsigned int)HWP_GUARANTEED_PERF(msr), (unsigned int)HWP_GUARANTEED_PERF(msr),
(unsigned int)HWP_MOSTEFFICIENT_PERF(msr), (unsigned int)HWP_MOSTEFFICIENT_PERF(msr), (unsigned int)HWP_LOWEST_PERF(msr));
(unsigned int)HWP_LOWEST_PERF(msr));
if (get_msr(cpu, MSR_HWP_REQUEST, &msr)) if (get_msr(cpu, MSR_HWP_REQUEST, &msr))
return 0; return 0;
fprintf(outf, "cpu%d: MSR_HWP_REQUEST: 0x%08llx " fprintf(outf, "cpu%d: MSR_HWP_REQUEST: 0x%08llx "
"(min %d max %d des %d epp 0x%x window 0x%x pkg 0x%x)\n", "(min %d max %d des %d epp 0x%x window 0x%x pkg 0x%x)\n",
cpu, msr, cpu, msr,
(unsigned int)(((msr) >> 0) & 0xff), (unsigned int)(((msr) >> 0) & 0xff),
(unsigned int)(((msr) >> 8) & 0xff), (unsigned int)(((msr) >> 8) & 0xff),
(unsigned int)(((msr) >> 16) & 0xff), (unsigned int)(((msr) >> 16) & 0xff),
(unsigned int)(((msr) >> 24) & 0xff), (unsigned int)(((msr) >> 24) & 0xff),
(unsigned int)(((msr) >> 32) & 0xff3), (unsigned int)(((msr) >> 32) & 0xff3), (unsigned int)(((msr) >> 42) & 0x1));
(unsigned int)(((msr) >> 42) & 0x1));
if (has_hwp_pkg) { if (has_hwp_pkg) {
if (get_msr(cpu, MSR_HWP_REQUEST_PKG, &msr)) if (get_msr(cpu, MSR_HWP_REQUEST_PKG, &msr))
...@@ -4197,8 +4160,7 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4197,8 +4160,7 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p)
(unsigned int)(((msr) >> 0) & 0xff), (unsigned int)(((msr) >> 0) & 0xff),
(unsigned int)(((msr) >> 8) & 0xff), (unsigned int)(((msr) >> 8) & 0xff),
(unsigned int)(((msr) >> 16) & 0xff), (unsigned int)(((msr) >> 16) & 0xff),
(unsigned int)(((msr) >> 24) & 0xff), (unsigned int)(((msr) >> 24) & 0xff), (unsigned int)(((msr) >> 32) & 0xff3));
(unsigned int)(((msr) >> 32) & 0xff3));
} }
if (has_hwp_notify) { if (has_hwp_notify) {
if (get_msr(cpu, MSR_HWP_INTERRUPT, &msr)) if (get_msr(cpu, MSR_HWP_INTERRUPT, &msr))
...@@ -4206,18 +4168,14 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4206,18 +4168,14 @@ int print_hwp(struct thread_data *t, struct core_data *c, struct pkg_data *p)
fprintf(outf, "cpu%d: MSR_HWP_INTERRUPT: 0x%08llx " fprintf(outf, "cpu%d: MSR_HWP_INTERRUPT: 0x%08llx "
"(%s_Guaranteed_Perf_Change, %s_Excursion_Min)\n", "(%s_Guaranteed_Perf_Change, %s_Excursion_Min)\n",
cpu, msr, cpu, msr, ((msr) & 0x1) ? "EN" : "Dis", ((msr) & 0x2) ? "EN" : "Dis");
((msr) & 0x1) ? "EN" : "Dis",
((msr) & 0x2) ? "EN" : "Dis");
} }
if (get_msr(cpu, MSR_HWP_STATUS, &msr)) if (get_msr(cpu, MSR_HWP_STATUS, &msr))
return 0; return 0;
fprintf(outf, "cpu%d: MSR_HWP_STATUS: 0x%08llx " fprintf(outf, "cpu%d: MSR_HWP_STATUS: 0x%08llx "
"(%sGuaranteed_Perf_Change, %sExcursion_Min)\n", "(%sGuaranteed_Perf_Change, %sExcursion_Min)\n",
cpu, msr, cpu, msr, ((msr) & 0x1) ? "" : "No-", ((msr) & 0x2) ? "" : "No-");
((msr) & 0x1) ? "" : "No-",
((msr) & 0x2) ? "" : "No-");
return 0; return 0;
} }
...@@ -4257,8 +4215,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data ...@@ -4257,8 +4215,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data
(msr & 1 << 5) ? "Auto-HWP, " : "", (msr & 1 << 5) ? "Auto-HWP, " : "",
(msr & 1 << 4) ? "Graphics, " : "", (msr & 1 << 4) ? "Graphics, " : "",
(msr & 1 << 2) ? "bit2, " : "", (msr & 1 << 2) ? "bit2, " : "",
(msr & 1 << 1) ? "ThermStatus, " : "", (msr & 1 << 1) ? "ThermStatus, " : "", (msr & 1 << 0) ? "PROCHOT, " : "");
(msr & 1 << 0) ? "PROCHOT, " : "");
fprintf(outf, " (Logged: %s%s%s%s%s%s%s%s%s%s%s%s%s%s)\n", fprintf(outf, " (Logged: %s%s%s%s%s%s%s%s%s%s%s%s%s%s)\n",
(msr & 1 << 31) ? "bit31, " : "", (msr & 1 << 31) ? "bit31, " : "",
(msr & 1 << 30) ? "bit30, " : "", (msr & 1 << 30) ? "bit30, " : "",
...@@ -4272,8 +4229,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data ...@@ -4272,8 +4229,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data
(msr & 1 << 21) ? "Auto-HWP, " : "", (msr & 1 << 21) ? "Auto-HWP, " : "",
(msr & 1 << 20) ? "Graphics, " : "", (msr & 1 << 20) ? "Graphics, " : "",
(msr & 1 << 18) ? "bit18, " : "", (msr & 1 << 18) ? "bit18, " : "",
(msr & 1 << 17) ? "ThermStatus, " : "", (msr & 1 << 17) ? "ThermStatus, " : "", (msr & 1 << 16) ? "PROCHOT, " : "");
(msr & 1 << 16) ? "PROCHOT, " : "");
} }
if (do_gfx_perf_limit_reasons) { if (do_gfx_perf_limit_reasons) {
...@@ -4286,8 +4242,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data ...@@ -4286,8 +4242,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data
(msr & 1 << 6) ? "VR-Therm, " : "", (msr & 1 << 6) ? "VR-Therm, " : "",
(msr & 1 << 8) ? "Amps, " : "", (msr & 1 << 8) ? "Amps, " : "",
(msr & 1 << 9) ? "GFXPwr, " : "", (msr & 1 << 9) ? "GFXPwr, " : "",
(msr & 1 << 10) ? "PkgPwrL1, " : "", (msr & 1 << 10) ? "PkgPwrL1, " : "", (msr & 1 << 11) ? "PkgPwrL2, " : "");
(msr & 1 << 11) ? "PkgPwrL2, " : "");
fprintf(outf, " (Logged: %s%s%s%s%s%s%s%s)\n", fprintf(outf, " (Logged: %s%s%s%s%s%s%s%s)\n",
(msr & 1 << 16) ? "PROCHOT, " : "", (msr & 1 << 16) ? "PROCHOT, " : "",
(msr & 1 << 17) ? "ThermStatus, " : "", (msr & 1 << 17) ? "ThermStatus, " : "",
...@@ -4295,8 +4250,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data ...@@ -4295,8 +4250,7 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data
(msr & 1 << 22) ? "VR-Therm, " : "", (msr & 1 << 22) ? "VR-Therm, " : "",
(msr & 1 << 24) ? "Amps, " : "", (msr & 1 << 24) ? "Amps, " : "",
(msr & 1 << 25) ? "GFXPwr, " : "", (msr & 1 << 25) ? "GFXPwr, " : "",
(msr & 1 << 26) ? "PkgPwrL1, " : "", (msr & 1 << 26) ? "PkgPwrL1, " : "", (msr & 1 << 27) ? "PkgPwrL2, " : "");
(msr & 1 << 27) ? "PkgPwrL2, " : "");
} }
if (do_ring_perf_limit_reasons) { if (do_ring_perf_limit_reasons) {
get_msr(cpu, MSR_RING_PERF_LIMIT_REASONS, &msr); get_msr(cpu, MSR_RING_PERF_LIMIT_REASONS, &msr);
...@@ -4306,21 +4260,19 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data ...@@ -4306,21 +4260,19 @@ int print_perf_limit(struct thread_data *t, struct core_data *c, struct pkg_data
(msr & 1 << 1) ? "ThermStatus, " : "", (msr & 1 << 1) ? "ThermStatus, " : "",
(msr & 1 << 6) ? "VR-Therm, " : "", (msr & 1 << 6) ? "VR-Therm, " : "",
(msr & 1 << 8) ? "Amps, " : "", (msr & 1 << 8) ? "Amps, " : "",
(msr & 1 << 10) ? "PkgPwrL1, " : "", (msr & 1 << 10) ? "PkgPwrL1, " : "", (msr & 1 << 11) ? "PkgPwrL2, " : "");
(msr & 1 << 11) ? "PkgPwrL2, " : "");
fprintf(outf, " (Logged: %s%s%s%s%s%s)\n", fprintf(outf, " (Logged: %s%s%s%s%s%s)\n",
(msr & 1 << 16) ? "PROCHOT, " : "", (msr & 1 << 16) ? "PROCHOT, " : "",
(msr & 1 << 17) ? "ThermStatus, " : "", (msr & 1 << 17) ? "ThermStatus, " : "",
(msr & 1 << 22) ? "VR-Therm, " : "", (msr & 1 << 22) ? "VR-Therm, " : "",
(msr & 1 << 24) ? "Amps, " : "", (msr & 1 << 24) ? "Amps, " : "",
(msr & 1 << 26) ? "PkgPwrL1, " : "", (msr & 1 << 26) ? "PkgPwrL1, " : "", (msr & 1 << 27) ? "PkgPwrL2, " : "");
(msr & 1 << 27) ? "PkgPwrL2, " : "");
} }
return 0; return 0;
} }
#define RAPL_POWER_GRANULARITY 0x7FFF /* 15 bit power granularity */ #define RAPL_POWER_GRANULARITY 0x7FFF /* 15 bit power granularity */
#define RAPL_TIME_GRANULARITY 0x3F /* 6 bit time granularity */ #define RAPL_TIME_GRANULARITY 0x3F /* 6 bit time granularity */
double get_tdp_intel(unsigned int model) double get_tdp_intel(unsigned int model)
{ {
...@@ -4349,8 +4301,7 @@ double get_tdp_amd(unsigned int family) ...@@ -4349,8 +4301,7 @@ double get_tdp_amd(unsigned int family)
* rapl_dram_energy_units_probe() * rapl_dram_energy_units_probe()
* Energy units are either hard-coded, or come from RAPL Energy Unit MSR. * Energy units are either hard-coded, or come from RAPL Energy Unit MSR.
*/ */
static double static double rapl_dram_energy_units_probe(int model, double rapl_energy_units)
rapl_dram_energy_units_probe(int model, double rapl_energy_units)
{ {
/* only called for genuine_intel, family 6 */ /* only called for genuine_intel, family 6 */
...@@ -4402,7 +4353,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model) ...@@ -4402,7 +4353,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
BIC_PRESENT(BIC_PkgWatt); BIC_PRESENT(BIC_PkgWatt);
break; break;
case INTEL_FAM6_ATOM_TREMONT: /* EHL */ case INTEL_FAM6_ATOM_TREMONT: /* EHL */
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO; do_rapl =
RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS
| RAPL_GFX | RAPL_PKG_POWER_INFO;
if (rapl_joules) { if (rapl_joules) {
BIC_PRESENT(BIC_Pkg_J); BIC_PRESENT(BIC_Pkg_J);
BIC_PRESENT(BIC_Cor_J); BIC_PRESENT(BIC_Cor_J);
...@@ -4425,7 +4378,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model) ...@@ -4425,7 +4378,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
break; break;
case INTEL_FAM6_SKYLAKE_L: /* SKL */ case INTEL_FAM6_SKYLAKE_L: /* SKL */
case INTEL_FAM6_CANNONLAKE_L: /* CNL */ case INTEL_FAM6_CANNONLAKE_L: /* CNL */
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO; do_rapl =
RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS
| RAPL_GFX | RAPL_PKG_POWER_INFO;
BIC_PRESENT(BIC_PKG__); BIC_PRESENT(BIC_PKG__);
BIC_PRESENT(BIC_RAM__); BIC_PRESENT(BIC_RAM__);
if (rapl_joules) { if (rapl_joules) {
...@@ -4445,7 +4400,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model) ...@@ -4445,7 +4400,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
case INTEL_FAM6_SKYLAKE_X: /* SKX */ case INTEL_FAM6_SKYLAKE_X: /* SKX */
case INTEL_FAM6_ICELAKE_X: /* ICX */ case INTEL_FAM6_ICELAKE_X: /* ICX */
case INTEL_FAM6_XEON_PHI_KNL: /* KNL */ case INTEL_FAM6_XEON_PHI_KNL: /* KNL */
do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; do_rapl =
RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS |
RAPL_PKG_POWER_INFO;
BIC_PRESENT(BIC_PKG__); BIC_PRESENT(BIC_PKG__);
BIC_PRESENT(BIC_RAM__); BIC_PRESENT(BIC_RAM__);
if (rapl_joules) { if (rapl_joules) {
...@@ -4458,7 +4415,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model) ...@@ -4458,7 +4415,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
break; break;
case INTEL_FAM6_SANDYBRIDGE_X: case INTEL_FAM6_SANDYBRIDGE_X:
case INTEL_FAM6_IVYBRIDGE_X: case INTEL_FAM6_IVYBRIDGE_X:
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_PKG_PERF_STATUS | RAPL_DRAM_PERF_STATUS | RAPL_PKG_POWER_INFO; do_rapl =
RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_PKG_PERF_STATUS |
RAPL_DRAM_PERF_STATUS | RAPL_PKG_POWER_INFO;
BIC_PRESENT(BIC_PKG__); BIC_PRESENT(BIC_PKG__);
BIC_PRESENT(BIC_RAM__); BIC_PRESENT(BIC_RAM__);
if (rapl_joules) { if (rapl_joules) {
...@@ -4483,7 +4442,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model) ...@@ -4483,7 +4442,9 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
} }
break; break;
case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */
do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO | RAPL_CORES_ENERGY_STATUS; do_rapl =
RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS |
RAPL_PKG_POWER_INFO | RAPL_CORES_ENERGY_STATUS;
BIC_PRESENT(BIC_PKG__); BIC_PRESENT(BIC_PKG__);
BIC_PRESENT(BIC_RAM__); BIC_PRESENT(BIC_RAM__);
if (rapl_joules) { if (rapl_joules) {
...@@ -4600,8 +4561,7 @@ void perf_limit_reasons_probe(unsigned int family, unsigned int model) ...@@ -4600,8 +4561,7 @@ void perf_limit_reasons_probe(unsigned int family, unsigned int model)
void automatic_cstate_conversion_probe(unsigned int family, unsigned int model) void automatic_cstate_conversion_probe(unsigned int family, unsigned int model)
{ {
if (is_skx(family, model) || is_bdx(family, model) || if (is_skx(family, model) || is_bdx(family, model) || is_icx(family, model))
is_icx(family, model))
has_automatic_cstate_conversion = 1; has_automatic_cstate_conversion = 1;
} }
...@@ -4636,8 +4596,7 @@ int print_thermal(struct thread_data *t, struct core_data *c, struct pkg_data *p ...@@ -4636,8 +4596,7 @@ int print_thermal(struct thread_data *t, struct core_data *c, struct pkg_data *p
return 0; return 0;
dts = (msr >> 16) & 0x7F; dts = (msr >> 16) & 0x7F;
fprintf(outf, "cpu%d: MSR_IA32_PACKAGE_THERM_STATUS: 0x%08llx (%d C)\n", fprintf(outf, "cpu%d: MSR_IA32_PACKAGE_THERM_STATUS: 0x%08llx (%d C)\n", cpu, msr, tj_max - dts);
cpu, msr, tj_max - dts);
if (get_msr(cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT, &msr)) if (get_msr(cpu, MSR_IA32_PACKAGE_THERM_INTERRUPT, &msr))
return 0; return 0;
...@@ -4648,7 +4607,6 @@ int print_thermal(struct thread_data *t, struct core_data *c, struct pkg_data *p ...@@ -4648,7 +4607,6 @@ int print_thermal(struct thread_data *t, struct core_data *c, struct pkg_data *p
cpu, msr, tj_max - dts, tj_max - dts2); cpu, msr, tj_max - dts, tj_max - dts2);
} }
if (do_dts && debug) { if (do_dts && debug) {
unsigned int resolution; unsigned int resolution;
...@@ -4678,7 +4636,7 @@ void print_power_limit_msr(int cpu, unsigned long long msr, char *label) ...@@ -4678,7 +4636,7 @@ void print_power_limit_msr(int cpu, unsigned long long msr, char *label)
cpu, label, cpu, label,
((msr >> 15) & 1) ? "EN" : "DIS", ((msr >> 15) & 1) ? "EN" : "DIS",
((msr >> 0) & 0x7FFF) * rapl_power_units, ((msr >> 0) & 0x7FFF) * rapl_power_units,
(1.0 + (((msr >> 22) & 0x3)/4.0)) * (1 << ((msr >> 17) & 0x1F)) * rapl_time_units, (1.0 + (((msr >> 22) & 0x3) / 4.0)) * (1 << ((msr >> 17) & 0x1F)) * rapl_time_units,
(((msr >> 16) & 1) ? "EN" : "DIS")); (((msr >> 16) & 1) ? "EN" : "DIS"));
return; return;
...@@ -4719,12 +4677,11 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4719,12 +4677,11 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
if (do_rapl & RAPL_PKG_POWER_INFO) { if (do_rapl & RAPL_PKG_POWER_INFO) {
if (get_msr(cpu, MSR_PKG_POWER_INFO, &msr)) if (get_msr(cpu, MSR_PKG_POWER_INFO, &msr))
return -5; return -5;
fprintf(outf, "cpu%d: MSR_PKG_POWER_INFO: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n", fprintf(outf, "cpu%d: MSR_PKG_POWER_INFO: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n",
cpu, msr, cpu, msr,
((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units, ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units,
((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units, ((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units,
((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units, ((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units,
((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units); ((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units);
...@@ -4743,17 +4700,17 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4743,17 +4700,17 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
cpu, cpu,
((msr >> 47) & 1) ? "EN" : "DIS", ((msr >> 47) & 1) ? "EN" : "DIS",
((msr >> 32) & 0x7FFF) * rapl_power_units, ((msr >> 32) & 0x7FFF) * rapl_power_units,
(1.0 + (((msr >> 54) & 0x3)/4.0)) * (1 << ((msr >> 49) & 0x1F)) * rapl_time_units, (1.0 + (((msr >> 54) & 0x3) / 4.0)) * (1 << ((msr >> 49) & 0x1F)) * rapl_time_units,
((msr >> 48) & 1) ? "EN" : "DIS"); ((msr >> 48) & 1) ? "EN" : "DIS");
} }
if (do_rapl & RAPL_DRAM_POWER_INFO) { if (do_rapl & RAPL_DRAM_POWER_INFO) {
if (get_msr(cpu, MSR_DRAM_POWER_INFO, &msr)) if (get_msr(cpu, MSR_DRAM_POWER_INFO, &msr))
return -6; return -6;
fprintf(outf, "cpu%d: MSR_DRAM_POWER_INFO,: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n", fprintf(outf, "cpu%d: MSR_DRAM_POWER_INFO,: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n",
cpu, msr, cpu, msr,
((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units, ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units,
((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units, ((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units,
((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units, ((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units,
((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units); ((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units);
...@@ -4762,7 +4719,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4762,7 +4719,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
if (get_msr(cpu, MSR_DRAM_POWER_LIMIT, &msr)) if (get_msr(cpu, MSR_DRAM_POWER_LIMIT, &msr))
return -9; return -9;
fprintf(outf, "cpu%d: MSR_DRAM_POWER_LIMIT: 0x%08llx (%slocked)\n", fprintf(outf, "cpu%d: MSR_DRAM_POWER_LIMIT: 0x%08llx (%slocked)\n",
cpu, msr, (msr >> 31) & 1 ? "" : "UN"); cpu, msr, (msr >> 31) & 1 ? "" : "UN");
print_power_limit_msr(cpu, msr, "DRAM Limit"); print_power_limit_msr(cpu, msr, "DRAM Limit");
} }
...@@ -4776,7 +4733,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4776,7 +4733,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
if (get_msr(cpu, MSR_PP0_POWER_LIMIT, &msr)) if (get_msr(cpu, MSR_PP0_POWER_LIMIT, &msr))
return -9; return -9;
fprintf(outf, "cpu%d: MSR_PP0_POWER_LIMIT: 0x%08llx (%slocked)\n", fprintf(outf, "cpu%d: MSR_PP0_POWER_LIMIT: 0x%08llx (%slocked)\n",
cpu, msr, (msr >> 31) & 1 ? "" : "UN"); cpu, msr, (msr >> 31) & 1 ? "" : "UN");
print_power_limit_msr(cpu, msr, "Cores Limit"); print_power_limit_msr(cpu, msr, "Cores Limit");
} }
if (do_rapl & RAPL_GFX) { if (do_rapl & RAPL_GFX) {
...@@ -4788,7 +4745,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4788,7 +4745,7 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p)
if (get_msr(cpu, MSR_PP1_POWER_LIMIT, &msr)) if (get_msr(cpu, MSR_PP1_POWER_LIMIT, &msr))
return -9; return -9;
fprintf(outf, "cpu%d: MSR_PP1_POWER_LIMIT: 0x%08llx (%slocked)\n", fprintf(outf, "cpu%d: MSR_PP1_POWER_LIMIT: 0x%08llx (%slocked)\n",
cpu, msr, (msr >> 31) & 1 ? "" : "UN"); cpu, msr, (msr >> 31) & 1 ? "" : "UN");
print_power_limit_msr(cpu, msr, "GFX Limit"); print_power_limit_msr(cpu, msr, "GFX Limit");
} }
return 0; return 0;
...@@ -4810,24 +4767,24 @@ int has_snb_msrs(unsigned int family, unsigned int model) ...@@ -4810,24 +4767,24 @@ int has_snb_msrs(unsigned int family, unsigned int model)
switch (model) { switch (model) {
case INTEL_FAM6_SANDYBRIDGE: case INTEL_FAM6_SANDYBRIDGE:
case INTEL_FAM6_SANDYBRIDGE_X: case INTEL_FAM6_SANDYBRIDGE_X:
case INTEL_FAM6_IVYBRIDGE: /* IVB */ case INTEL_FAM6_IVYBRIDGE: /* IVB */
case INTEL_FAM6_IVYBRIDGE_X: /* IVB Xeon */ case INTEL_FAM6_IVYBRIDGE_X: /* IVB Xeon */
case INTEL_FAM6_HASWELL: /* HSW */ case INTEL_FAM6_HASWELL: /* HSW */
case INTEL_FAM6_HASWELL_X: /* HSW */ case INTEL_FAM6_HASWELL_X: /* HSW */
case INTEL_FAM6_HASWELL_L: /* HSW */ case INTEL_FAM6_HASWELL_L: /* HSW */
case INTEL_FAM6_HASWELL_G: /* HSW */ case INTEL_FAM6_HASWELL_G: /* HSW */
case INTEL_FAM6_BROADWELL: /* BDW */ case INTEL_FAM6_BROADWELL: /* BDW */
case INTEL_FAM6_BROADWELL_G: /* BDW */ case INTEL_FAM6_BROADWELL_G: /* BDW */
case INTEL_FAM6_BROADWELL_X: /* BDX */ case INTEL_FAM6_BROADWELL_X: /* BDX */
case INTEL_FAM6_SKYLAKE_L: /* SKL */ case INTEL_FAM6_SKYLAKE_L: /* SKL */
case INTEL_FAM6_CANNONLAKE_L: /* CNL */ case INTEL_FAM6_CANNONLAKE_L: /* CNL */
case INTEL_FAM6_SKYLAKE_X: /* SKX */ case INTEL_FAM6_SKYLAKE_X: /* SKX */
case INTEL_FAM6_ICELAKE_X: /* ICX */ case INTEL_FAM6_ICELAKE_X: /* ICX */
case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */
case INTEL_FAM6_ATOM_GOLDMONT_PLUS: case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */
case INTEL_FAM6_ATOM_TREMONT: /* EHL */ case INTEL_FAM6_ATOM_TREMONT: /* EHL */
case INTEL_FAM6_ATOM_TREMONT_D: /* JVL */ case INTEL_FAM6_ATOM_TREMONT_D: /* JVL */
return 1; return 1;
} }
return 0; return 0;
...@@ -4913,7 +4870,7 @@ int is_cnl(unsigned int family, unsigned int model) ...@@ -4913,7 +4870,7 @@ int is_cnl(unsigned int family, unsigned int model)
return 0; return 0;
switch (model) { switch (model) {
case INTEL_FAM6_CANNONLAKE_L: /* CNL */ case INTEL_FAM6_CANNONLAKE_L: /* CNL */
return 1; return 1;
} }
...@@ -4928,7 +4885,7 @@ unsigned int get_aperf_mperf_multiplier(unsigned int family, unsigned int model) ...@@ -4928,7 +4885,7 @@ unsigned int get_aperf_mperf_multiplier(unsigned int family, unsigned int model)
} }
#define SLM_BCLK_FREQS 5 #define SLM_BCLK_FREQS 5
double slm_freq_table[SLM_BCLK_FREQS] = { 83.3, 100.0, 133.3, 116.7, 80.0}; double slm_freq_table[SLM_BCLK_FREQS] = { 83.3, 100.0, 133.3, 116.7, 80.0 };
double slm_bclk(void) double slm_bclk(void)
{ {
...@@ -4979,7 +4936,7 @@ int get_cpu_type(struct thread_data *t, struct core_data *c, struct pkg_data *p) ...@@ -4979,7 +4936,7 @@ int get_cpu_type(struct thread_data *t, struct core_data *c, struct pkg_data *p)
__cpuid(0x1a, eax, ebx, ecx, edx); __cpuid(0x1a, eax, ebx, ecx, edx);
eax = (eax >> 24) & 0xFF; eax = (eax >> 24) & 0xFF;
if (eax == 0x20 ) if (eax == 0x20)
t->is_atom = true; t->is_atom = true;
return 0; return 0;
} }
...@@ -5018,8 +4975,7 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk ...@@ -5018,8 +4975,7 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk
if (tj_max_override != 0) { if (tj_max_override != 0) {
tj_max = tj_max_override; tj_max = tj_max_override;
fprintf(outf, "cpu%d: Using cmdline TCC Target (%d C)\n", fprintf(outf, "cpu%d: Using cmdline TCC Target (%d C)\n", cpu, tj_max);
cpu, tj_max);
return 0; return 0;
} }
...@@ -5037,16 +4993,15 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk ...@@ -5037,16 +4993,15 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk
case 4: case 4:
tcc_offset = (msr >> 24) & 0xF; tcc_offset = (msr >> 24) & 0xF;
fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C) (%d default - %d offset)\n", fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C) (%d default - %d offset)\n",
cpu, msr, tcc_default - tcc_offset, tcc_default, tcc_offset); cpu, msr, tcc_default - tcc_offset, tcc_default, tcc_offset);
break; break;
case 6: case 6:
tcc_offset = (msr >> 24) & 0x3F; tcc_offset = (msr >> 24) & 0x3F;
fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C) (%d default - %d offset)\n", fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C) (%d default - %d offset)\n",
cpu, msr, tcc_default - tcc_offset, tcc_default, tcc_offset); cpu, msr, tcc_default - tcc_offset, tcc_default, tcc_offset);
break; break;
default: default:
fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C)\n", fprintf(outf, "cpu%d: MSR_IA32_TEMPERATURE_TARGET: 0x%08llx (%d C)\n", cpu, msr, tcc_default);
cpu, msr, tcc_default);
break; break;
} }
} }
...@@ -5060,8 +5015,7 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk ...@@ -5060,8 +5015,7 @@ int set_temperature_target(struct thread_data *t, struct core_data *c, struct pk
guess: guess:
tj_max = TJMAX_DEFAULT; tj_max = TJMAX_DEFAULT;
fprintf(outf, "cpu%d: Guessing tjMax %d C, Please use -T to specify\n", fprintf(outf, "cpu%d: Guessing tjMax %d C, Please use -T to specify\n", cpu, tj_max);
cpu, tj_max);
return 0; return 0;
} }
...@@ -5072,9 +5026,7 @@ void decode_feature_control_msr(void) ...@@ -5072,9 +5026,7 @@ void decode_feature_control_msr(void)
if (!get_msr(base_cpu, MSR_IA32_FEAT_CTL, &msr)) if (!get_msr(base_cpu, MSR_IA32_FEAT_CTL, &msr))
fprintf(outf, "cpu%d: MSR_IA32_FEATURE_CONTROL: 0x%08llx (%sLocked %s)\n", fprintf(outf, "cpu%d: MSR_IA32_FEATURE_CONTROL: 0x%08llx (%sLocked %s)\n",
base_cpu, msr, base_cpu, msr, msr & FEAT_CTL_LOCKED ? "" : "UN-", msr & (1 << 18) ? "SGX" : "");
msr & FEAT_CTL_LOCKED ? "" : "UN-",
msr & (1 << 18) ? "SGX" : "");
} }
void decode_misc_enable_msr(void) void decode_misc_enable_msr(void)
...@@ -5102,13 +5054,12 @@ void decode_misc_feature_control(void) ...@@ -5102,13 +5054,12 @@ void decode_misc_feature_control(void)
return; return;
if (!get_msr(base_cpu, MSR_MISC_FEATURE_CONTROL, &msr)) if (!get_msr(base_cpu, MSR_MISC_FEATURE_CONTROL, &msr))
fprintf(outf, "cpu%d: MSR_MISC_FEATURE_CONTROL: 0x%08llx (%sL2-Prefetch %sL2-Prefetch-pair %sL1-Prefetch %sL1-IP-Prefetch)\n", fprintf(outf,
base_cpu, msr, "cpu%d: MSR_MISC_FEATURE_CONTROL: 0x%08llx (%sL2-Prefetch %sL2-Prefetch-pair %sL1-Prefetch %sL1-IP-Prefetch)\n",
msr & (0 << 0) ? "No-" : "", base_cpu, msr, msr & (0 << 0) ? "No-" : "", msr & (1 << 0) ? "No-" : "",
msr & (1 << 0) ? "No-" : "", msr & (2 << 0) ? "No-" : "", msr & (3 << 0) ? "No-" : "");
msr & (2 << 0) ? "No-" : "",
msr & (3 << 0) ? "No-" : "");
} }
/* /*
* Decode MSR_MISC_PWR_MGMT * Decode MSR_MISC_PWR_MGMT
* *
...@@ -5129,10 +5080,9 @@ void decode_misc_pwr_mgmt_msr(void) ...@@ -5129,10 +5080,9 @@ void decode_misc_pwr_mgmt_msr(void)
if (!get_msr(base_cpu, MSR_MISC_PWR_MGMT, &msr)) if (!get_msr(base_cpu, MSR_MISC_PWR_MGMT, &msr))
fprintf(outf, "cpu%d: MSR_MISC_PWR_MGMT: 0x%08llx (%sable-EIST_Coordination %sable-EPB %sable-OOB)\n", fprintf(outf, "cpu%d: MSR_MISC_PWR_MGMT: 0x%08llx (%sable-EIST_Coordination %sable-EPB %sable-OOB)\n",
base_cpu, msr, base_cpu, msr,
msr & (1 << 0) ? "DIS" : "EN", msr & (1 << 0) ? "DIS" : "EN", msr & (1 << 1) ? "EN" : "DIS", msr & (1 << 8) ? "EN" : "DIS");
msr & (1 << 1) ? "EN" : "DIS",
msr & (1 << 8) ? "EN" : "DIS");
} }
/* /*
* Decode MSR_CC6_DEMOTION_POLICY_CONFIG, MSR_MC6_DEMOTION_POLICY_CONFIG * Decode MSR_CC6_DEMOTION_POLICY_CONFIG, MSR_MC6_DEMOTION_POLICY_CONFIG
* *
...@@ -5158,10 +5108,10 @@ void decode_c6_demotion_policy_msr(void) ...@@ -5158,10 +5108,10 @@ void decode_c6_demotion_policy_msr(void)
unsigned int intel_model_duplicates(unsigned int model) unsigned int intel_model_duplicates(unsigned int model)
{ {
switch(model) { switch (model) {
case INTEL_FAM6_NEHALEM_EP: /* Core i7, Xeon 5500 series - Bloomfield, Gainstown NHM-EP */ case INTEL_FAM6_NEHALEM_EP: /* Core i7, Xeon 5500 series - Bloomfield, Gainstown NHM-EP */
case INTEL_FAM6_NEHALEM: /* Core i7 and i5 Processor - Clarksfield, Lynnfield, Jasper Forest */ case INTEL_FAM6_NEHALEM: /* Core i7 and i5 Processor - Clarksfield, Lynnfield, Jasper Forest */
case 0x1F: /* Core i7 and i5 Processor - Nehalem */ case 0x1F: /* Core i7 and i5 Processor - Nehalem */
case INTEL_FAM6_WESTMERE: /* Westmere Client - Clarkdale, Arrandale */ case INTEL_FAM6_WESTMERE: /* Westmere Client - Clarkdale, Arrandale */
case INTEL_FAM6_WESTMERE_EP: /* Westmere EP - Gulftown */ case INTEL_FAM6_WESTMERE_EP: /* Westmere EP - Gulftown */
return INTEL_FAM6_NEHALEM; return INTEL_FAM6_NEHALEM;
...@@ -5224,13 +5174,11 @@ void print_dev_latency(void) ...@@ -5224,13 +5174,11 @@ void print_dev_latency(void)
close(fd); close(fd);
return; return;
} }
fprintf(outf, "/dev/cpu_dma_latency: %d usec (%s)\n", fprintf(outf, "/dev/cpu_dma_latency: %d usec (%s)\n", value, value == 2000000000 ? "default" : "constrained");
value, value == 2000000000 ? "default" : "constrained");
close(fd); close(fd);
} }
/* /*
* Linux-perf manages the the HW instructions-retired counter * Linux-perf manages the the HW instructions-retired counter
* by enabling when requested, and hiding rollover * by enabling when requested, and hiding rollover
...@@ -5296,7 +5244,8 @@ void process_cpuid() ...@@ -5296,7 +5244,8 @@ void process_cpuid()
if (!quiet) { if (!quiet) {
fprintf(outf, "CPUID(1): family:model:stepping 0x%x:%x:%x (%d:%d:%d) microcode 0x%x\n", fprintf(outf, "CPUID(1): family:model:stepping 0x%x:%x:%x (%d:%d:%d) microcode 0x%x\n",
family, model, stepping, family, model, stepping, (unsigned int)((ucode_patch >> 32) & 0xFFFFFFFF)); family, model, stepping, family, model, stepping,
(unsigned int)((ucode_patch >> 32) & 0xFFFFFFFF));
fprintf(outf, "CPUID(0x80000000): max_extended_levels: 0x%x\n", max_extended_level); fprintf(outf, "CPUID(0x80000000): max_extended_levels: 0x%x\n", max_extended_level);
fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n", fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n",
ecx_flags & (1 << 0) ? "SSE3" : "-", ecx_flags & (1 << 0) ? "SSE3" : "-",
...@@ -5307,8 +5256,7 @@ void process_cpuid() ...@@ -5307,8 +5256,7 @@ void process_cpuid()
edx_flags & (1 << 4) ? "TSC" : "-", edx_flags & (1 << 4) ? "TSC" : "-",
edx_flags & (1 << 5) ? "MSR" : "-", edx_flags & (1 << 5) ? "MSR" : "-",
edx_flags & (1 << 22) ? "ACPI-TM" : "-", edx_flags & (1 << 22) ? "ACPI-TM" : "-",
edx_flags & (1 << 28) ? "HT" : "-", edx_flags & (1 << 28) ? "HT" : "-", edx_flags & (1 << 29) ? "TM" : "-");
edx_flags & (1 << 29) ? "TM" : "-");
} }
if (genuine_intel) { if (genuine_intel) {
model_orig = model; model_orig = model;
...@@ -5364,14 +5312,11 @@ void process_cpuid() ...@@ -5364,14 +5312,11 @@ void process_cpuid()
has_hwp ? "" : "No-", has_hwp ? "" : "No-",
has_hwp_notify ? "" : "No-", has_hwp_notify ? "" : "No-",
has_hwp_activity_window ? "" : "No-", has_hwp_activity_window ? "" : "No-",
has_hwp_epp ? "" : "No-", has_hwp_epp ? "" : "No-", has_hwp_pkg ? "" : "No-", has_epb ? "" : "No-");
has_hwp_pkg ? "" : "No-",
has_epb ? "" : "No-");
if (!quiet) if (!quiet)
decode_misc_enable_msr(); decode_misc_enable_msr();
if (max_level >= 0x7 && !quiet) { if (max_level >= 0x7 && !quiet) {
int has_sgx; int has_sgx;
...@@ -5403,7 +5348,7 @@ void process_cpuid() ...@@ -5403,7 +5348,7 @@ void process_cpuid()
eax_crystal, ebx_tsc, crystal_hz); eax_crystal, ebx_tsc, crystal_hz);
if (crystal_hz == 0) if (crystal_hz == 0)
switch(model) { switch (model) {
case INTEL_FAM6_SKYLAKE_L: /* SKL */ case INTEL_FAM6_SKYLAKE_L: /* SKL */
crystal_hz = 24000000; /* 24.0 MHz */ crystal_hz = 24000000; /* 24.0 MHz */
break; break;
...@@ -5416,13 +5361,13 @@ void process_cpuid() ...@@ -5416,13 +5361,13 @@ void process_cpuid()
break; break;
default: default:
crystal_hz = 0; crystal_hz = 0;
} }
if (crystal_hz) { if (crystal_hz) {
tsc_hz = (unsigned long long) crystal_hz * ebx_tsc / eax_crystal; tsc_hz = (unsigned long long)crystal_hz *ebx_tsc / eax_crystal;
if (!quiet) if (!quiet)
fprintf(outf, "TSC: %lld MHz (%d Hz * %d / %d / 1000000)\n", fprintf(outf, "TSC: %lld MHz (%d Hz * %d / %d / 1000000)\n",
tsc_hz / 1000000, crystal_hz, ebx_tsc, eax_crystal); tsc_hz / 1000000, crystal_hz, ebx_tsc, eax_crystal);
} }
} }
} }
...@@ -5517,10 +5462,9 @@ void process_cpuid() ...@@ -5517,10 +5462,9 @@ void process_cpuid()
BIC_PRESENT(BIC_CPUGFX); BIC_PRESENT(BIC_CPUGFX);
} }
do_slm_cstates = is_slm(family, model); do_slm_cstates = is_slm(family, model);
do_knl_cstates = is_knl(family, model); do_knl_cstates = is_knl(family, model);
if (do_slm_cstates || do_knl_cstates || is_cnl(family, model) || if (do_slm_cstates || do_knl_cstates || is_cnl(family, model) || is_ehl(family, model))
is_ehl(family, model))
BIC_NOT_PRESENT(BIC_CPU_c3); BIC_NOT_PRESENT(BIC_CPU_c3);
if (!quiet) if (!quiet)
...@@ -5614,7 +5558,7 @@ void topology_probe() ...@@ -5614,7 +5558,7 @@ void topology_probe()
if (debug > 1) if (debug > 1)
fprintf(outf, "num_cpus %d max_cpu_num %d\n", topo.num_cpus, topo.max_cpu_num); fprintf(outf, "num_cpus %d max_cpu_num %d\n", topo.num_cpus, topo.max_cpu_num);
cpus = calloc(1, (topo.max_cpu_num + 1) * sizeof(struct cpu_topology)); cpus = calloc(1, (topo.max_cpu_num + 1) * sizeof(struct cpu_topology));
if (cpus == NULL) if (cpus == NULL)
err(1, "calloc cpus"); err(1, "calloc cpus");
...@@ -5693,22 +5637,19 @@ void topology_probe() ...@@ -5693,22 +5637,19 @@ void topology_probe()
topo.cores_per_node = max_core_id + 1; topo.cores_per_node = max_core_id + 1;
if (debug > 1) if (debug > 1)
fprintf(outf, "max_core_id %d, sizing for %d cores per package\n", fprintf(outf, "max_core_id %d, sizing for %d cores per package\n", max_core_id, topo.cores_per_node);
max_core_id, topo.cores_per_node);
if (!summary_only && topo.cores_per_node > 1) if (!summary_only && topo.cores_per_node > 1)
BIC_PRESENT(BIC_Core); BIC_PRESENT(BIC_Core);
topo.num_die = max_die_id + 1; topo.num_die = max_die_id + 1;
if (debug > 1) if (debug > 1)
fprintf(outf, "max_die_id %d, sizing for %d die\n", fprintf(outf, "max_die_id %d, sizing for %d die\n", max_die_id, topo.num_die);
max_die_id, topo.num_die);
if (!summary_only && topo.num_die > 1) if (!summary_only && topo.num_die > 1)
BIC_PRESENT(BIC_Die); BIC_PRESENT(BIC_Die);
topo.num_packages = max_package_id + 1; topo.num_packages = max_package_id + 1;
if (debug > 1) if (debug > 1)
fprintf(outf, "max_package_id %d, sizing for %d packages\n", fprintf(outf, "max_package_id %d, sizing for %d packages\n", max_package_id, topo.num_packages);
max_package_id, topo.num_packages);
if (!summary_only && topo.num_packages > 1) if (!summary_only && topo.num_packages > 1)
BIC_PRESENT(BIC_Package); BIC_PRESENT(BIC_Package);
...@@ -5731,21 +5672,15 @@ void topology_probe() ...@@ -5731,21 +5672,15 @@ void topology_probe()
fprintf(outf, fprintf(outf,
"cpu %d pkg %d die %d node %d lnode %d core %d thread %d\n", "cpu %d pkg %d die %d node %d lnode %d core %d thread %d\n",
i, cpus[i].physical_package_id, cpus[i].die_id, i, cpus[i].physical_package_id, cpus[i].die_id,
cpus[i].physical_node_id, cpus[i].physical_node_id, cpus[i].logical_node_id, cpus[i].physical_core_id, cpus[i].thread_id);
cpus[i].logical_node_id,
cpus[i].physical_core_id,
cpus[i].thread_id);
} }
} }
void void allocate_counters(struct thread_data **t, struct core_data **c, struct pkg_data **p)
allocate_counters(struct thread_data **t, struct core_data **c,
struct pkg_data **p)
{ {
int i; int i;
int num_cores = topo.cores_per_node * topo.nodes_per_pkg * int num_cores = topo.cores_per_node * topo.nodes_per_pkg * topo.num_packages;
topo.num_packages;
int num_threads = topo.threads_per_core * num_cores; int num_threads = topo.threads_per_core * num_cores;
*t = calloc(num_threads, sizeof(struct thread_data)); *t = calloc(num_threads, sizeof(struct thread_data));
...@@ -5773,13 +5708,13 @@ allocate_counters(struct thread_data **t, struct core_data **c, ...@@ -5773,13 +5708,13 @@ allocate_counters(struct thread_data **t, struct core_data **c,
error: error:
err(1, "calloc counters"); err(1, "calloc counters");
} }
/* /*
* init_counter() * init_counter()
* *
* set FIRST_THREAD_IN_CORE and FIRST_CORE_IN_PACKAGE * set FIRST_THREAD_IN_CORE and FIRST_CORE_IN_PACKAGE
*/ */
void init_counter(struct thread_data *thread_base, struct core_data *core_base, void init_counter(struct thread_data *thread_base, struct core_data *core_base, struct pkg_data *pkg_base, int cpu_id)
struct pkg_data *pkg_base, int cpu_id)
{ {
int pkg_id = cpus[cpu_id].physical_package_id; int pkg_id = cpus[cpu_id].physical_package_id;
int node_id = cpus[cpu_id].logical_node_id; int node_id = cpus[cpu_id].logical_node_id;
...@@ -5789,7 +5724,6 @@ void init_counter(struct thread_data *thread_base, struct core_data *core_base, ...@@ -5789,7 +5724,6 @@ void init_counter(struct thread_data *thread_base, struct core_data *core_base,
struct core_data *c; struct core_data *c;
struct pkg_data *p; struct pkg_data *p;
/* Workaround for systems where physical_node_id==-1 /* Workaround for systems where physical_node_id==-1
* and logical_node_id==(-1 - topo.num_cpus) * and logical_node_id==(-1 - topo.num_cpus)
*/ */
...@@ -5811,7 +5745,6 @@ void init_counter(struct thread_data *thread_base, struct core_data *core_base, ...@@ -5811,7 +5745,6 @@ void init_counter(struct thread_data *thread_base, struct core_data *core_base,
p->package_id = pkg_id; p->package_id = pkg_id;
} }
int initialize_counters(int cpu_id) int initialize_counters(int cpu_id)
{ {
init_counter(EVEN_COUNTERS, cpu_id); init_counter(EVEN_COUNTERS, cpu_id);
...@@ -5826,12 +5759,14 @@ void allocate_output_buffer() ...@@ -5826,12 +5759,14 @@ void allocate_output_buffer()
if (outp == NULL) if (outp == NULL)
err(-1, "calloc output buffer"); err(-1, "calloc output buffer");
} }
void allocate_fd_percpu(void) void allocate_fd_percpu(void)
{ {
fd_percpu = calloc(topo.max_cpu_num + 1, sizeof(int)); fd_percpu = calloc(topo.max_cpu_num + 1, sizeof(int));
if (fd_percpu == NULL) if (fd_percpu == NULL)
err(-1, "calloc fd_percpu"); err(-1, "calloc fd_percpu");
} }
void allocate_irq_buffers(void) void allocate_irq_buffers(void)
{ {
irq_column_2_cpu = calloc(topo.num_cpus, sizeof(int)); irq_column_2_cpu = calloc(topo.num_cpus, sizeof(int));
...@@ -5842,6 +5777,7 @@ void allocate_irq_buffers(void) ...@@ -5842,6 +5777,7 @@ void allocate_irq_buffers(void)
if (irqs_per_cpu == NULL) if (irqs_per_cpu == NULL)
err(-1, "calloc %d", topo.max_cpu_num + 1); err(-1, "calloc %d", topo.max_cpu_num + 1);
} }
void setup_all_buffers(void) void setup_all_buffers(void)
{ {
topology_probe(); topology_probe();
...@@ -5872,7 +5808,6 @@ void turbostat_init() ...@@ -5872,7 +5808,6 @@ void turbostat_init()
process_cpuid(); process_cpuid();
linux_perf_init(); linux_perf_init();
if (!quiet) if (!quiet)
for_all_cpus(print_hwp, ODD_COUNTERS); for_all_cpus(print_hwp, ODD_COUNTERS);
...@@ -5945,7 +5880,7 @@ int fork_it(char **argv) ...@@ -5945,7 +5880,7 @@ int fork_it(char **argv)
format_all_counters(EVEN_COUNTERS); format_all_counters(EVEN_COUNTERS);
} }
fprintf(outf, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec/1000000.0); fprintf(outf, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec / 1000000.0);
flush_output_stderr(); flush_output_stderr();
...@@ -5970,14 +5905,14 @@ int get_and_dump_counters(void) ...@@ -5970,14 +5905,14 @@ int get_and_dump_counters(void)
return status; return status;
} }
void print_version() { void print_version()
fprintf(outf, "turbostat version 21.03.12" {
" - Len Brown <lenb@kernel.org>\n"); fprintf(outf, "turbostat version 21.03.12" " - Len Brown <lenb@kernel.org>\n");
} }
int add_counter(unsigned int msr_num, char *path, char *name, int add_counter(unsigned int msr_num, char *path, char *name,
unsigned int width, enum counter_scope scope, unsigned int width, enum counter_scope scope,
enum counter_type type, enum counter_format format, int flags) enum counter_type type, enum counter_format format, int flags)
{ {
struct msr_counter *msrp; struct msr_counter *msrp;
...@@ -6003,8 +5938,7 @@ int add_counter(unsigned int msr_num, char *path, char *name, ...@@ -6003,8 +5938,7 @@ int add_counter(unsigned int msr_num, char *path, char *name,
sys.tp = msrp; sys.tp = msrp;
sys.added_thread_counters++; sys.added_thread_counters++;
if (sys.added_thread_counters > MAX_ADDED_THREAD_COUNTERS) { if (sys.added_thread_counters > MAX_ADDED_THREAD_COUNTERS) {
fprintf(stderr, "exceeded max %d added thread counters\n", fprintf(stderr, "exceeded max %d added thread counters\n", MAX_ADDED_COUNTERS);
MAX_ADDED_COUNTERS);
exit(-1); exit(-1);
} }
break; break;
...@@ -6014,8 +5948,7 @@ int add_counter(unsigned int msr_num, char *path, char *name, ...@@ -6014,8 +5948,7 @@ int add_counter(unsigned int msr_num, char *path, char *name,
sys.cp = msrp; sys.cp = msrp;
sys.added_core_counters++; sys.added_core_counters++;
if (sys.added_core_counters > MAX_ADDED_COUNTERS) { if (sys.added_core_counters > MAX_ADDED_COUNTERS) {
fprintf(stderr, "exceeded max %d added core counters\n", fprintf(stderr, "exceeded max %d added core counters\n", MAX_ADDED_COUNTERS);
MAX_ADDED_COUNTERS);
exit(-1); exit(-1);
} }
break; break;
...@@ -6025,8 +5958,7 @@ int add_counter(unsigned int msr_num, char *path, char *name, ...@@ -6025,8 +5958,7 @@ int add_counter(unsigned int msr_num, char *path, char *name,
sys.pp = msrp; sys.pp = msrp;
sys.added_package_counters++; sys.added_package_counters++;
if (sys.added_package_counters > MAX_ADDED_COUNTERS) { if (sys.added_package_counters > MAX_ADDED_COUNTERS) {
fprintf(stderr, "exceeded max %d added package counters\n", fprintf(stderr, "exceeded max %d added package counters\n", MAX_ADDED_COUNTERS);
MAX_ADDED_COUNTERS);
exit(-1); exit(-1);
} }
break; break;
...@@ -6163,15 +6095,14 @@ void probe_sysfs(void) ...@@ -6163,15 +6095,14 @@ void probe_sysfs(void)
for (state = 10; state >= 0; --state) { for (state = 10; state >= 0; --state) {
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", base_cpu, state);
base_cpu, state);
input = fopen(path, "r"); input = fopen(path, "r");
if (input == NULL) if (input == NULL)
continue; continue;
if (!fgets(name_buf, sizeof(name_buf), input)) if (!fgets(name_buf, sizeof(name_buf), input))
err(1, "%s: failed to read file", path); err(1, "%s: failed to read file", path);
/* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */ /* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */
sp = strchr(name_buf, '-'); sp = strchr(name_buf, '-');
if (!sp) if (!sp)
sp = strchrnul(name_buf, '\n'); sp = strchrnul(name_buf, '\n');
...@@ -6187,20 +6118,18 @@ void probe_sysfs(void) ...@@ -6187,20 +6118,18 @@ void probe_sysfs(void)
if (is_deferred_skip(name_buf)) if (is_deferred_skip(name_buf))
continue; continue;
add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_USEC, add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_USEC, FORMAT_PERCENT, SYSFS_PERCPU);
FORMAT_PERCENT, SYSFS_PERCPU);
} }
for (state = 10; state >= 0; --state) { for (state = 10; state >= 0; --state) {
sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", sprintf(path, "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name", base_cpu, state);
base_cpu, state);
input = fopen(path, "r"); input = fopen(path, "r");
if (input == NULL) if (input == NULL)
continue; continue;
if (!fgets(name_buf, sizeof(name_buf), input)) if (!fgets(name_buf, sizeof(name_buf), input))
err(1, "%s: failed to read file", path); err(1, "%s: failed to read file", path);
/* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */ /* truncate "C1-HSW\n" to "C1", or truncate "C1\n" to "C1" */
sp = strchr(name_buf, '-'); sp = strchr(name_buf, '-');
if (!sp) if (!sp)
sp = strchrnul(name_buf, '\n'); sp = strchrnul(name_buf, '\n');
...@@ -6214,13 +6143,11 @@ void probe_sysfs(void) ...@@ -6214,13 +6143,11 @@ void probe_sysfs(void)
if (is_deferred_skip(name_buf)) if (is_deferred_skip(name_buf))
continue; continue;
add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_ITEMS, add_counter(0, path, name_buf, 64, SCOPE_CPU, COUNTER_ITEMS, FORMAT_DELTA, SYSFS_PERCPU);
FORMAT_DELTA, SYSFS_PERCPU);
} }
} }
/* /*
* parse cpuset with following syntax * parse cpuset with following syntax
* 1,2,4..6,8-10 and set bits in cpu_subset * 1,2,4..6,8-10 and set bits in cpu_subset
...@@ -6307,37 +6234,35 @@ void parse_cpu_command(char *optarg) ...@@ -6307,37 +6234,35 @@ void parse_cpu_command(char *optarg)
exit(-1); exit(-1);
} }
void cmdline(int argc, char **argv) void cmdline(int argc, char **argv)
{ {
int opt; int opt;
int option_index = 0; int option_index = 0;
static struct option long_options[] = { static struct option long_options[] = {
{"add", required_argument, 0, 'a'}, { "add", required_argument, 0, 'a' },
{"cpu", required_argument, 0, 'c'}, { "cpu", required_argument, 0, 'c' },
{"Dump", no_argument, 0, 'D'}, { "Dump", no_argument, 0, 'D' },
{"debug", no_argument, 0, 'd'}, /* internal, not documented */ { "debug", no_argument, 0, 'd' }, /* internal, not documented */
{"enable", required_argument, 0, 'e'}, { "enable", required_argument, 0, 'e' },
{"interval", required_argument, 0, 'i'}, { "interval", required_argument, 0, 'i' },
{"IPC", no_argument, 0, 'I'}, { "IPC", no_argument, 0, 'I' },
{"num_iterations", required_argument, 0, 'n'}, { "num_iterations", required_argument, 0, 'n' },
{"help", no_argument, 0, 'h'}, { "help", no_argument, 0, 'h' },
{"hide", required_argument, 0, 'H'}, // meh, -h taken by --help { "hide", required_argument, 0, 'H' }, // meh, -h taken by --help
{"Joules", no_argument, 0, 'J'}, { "Joules", no_argument, 0, 'J' },
{"list", no_argument, 0, 'l'}, { "list", no_argument, 0, 'l' },
{"out", required_argument, 0, 'o'}, { "out", required_argument, 0, 'o' },
{"quiet", no_argument, 0, 'q'}, { "quiet", no_argument, 0, 'q' },
{"show", required_argument, 0, 's'}, { "show", required_argument, 0, 's' },
{"Summary", no_argument, 0, 'S'}, { "Summary", no_argument, 0, 'S' },
{"TCC", required_argument, 0, 'T'}, { "TCC", required_argument, 0, 'T' },
{"version", no_argument, 0, 'v' }, { "version", no_argument, 0, 'v' },
{0, 0, 0, 0 } { 0, 0, 0, 0 }
}; };
progname = argv[0]; progname = argv[0];
while ((opt = getopt_long_only(argc, argv, "+C:c:Dde:hi:Jn:o:qST:v", while ((opt = getopt_long_only(argc, argv, "+C:c:Dde:hi:Jn:o:qST:v", long_options, &option_index)) != -1) {
long_options, &option_index)) != -1) {
switch (opt) { switch (opt) {
case 'a': case 'a':
parse_add_command(optarg); parse_add_command(optarg);
...@@ -6372,8 +6297,7 @@ void cmdline(int argc, char **argv) ...@@ -6372,8 +6297,7 @@ void cmdline(int argc, char **argv)
double interval = strtod(optarg, NULL); double interval = strtod(optarg, NULL);
if (interval < 0.001) { if (interval < 0.001) {
fprintf(outf, "interval %f seconds is too small\n", fprintf(outf, "interval %f seconds is too small\n", interval);
interval);
exit(2); exit(2);
} }
...@@ -6400,8 +6324,7 @@ void cmdline(int argc, char **argv) ...@@ -6400,8 +6324,7 @@ void cmdline(int argc, char **argv)
num_iterations = strtod(optarg, NULL); num_iterations = strtod(optarg, NULL);
if (num_iterations <= 0) { if (num_iterations <= 0) {
fprintf(outf, "iterations %d should be positive number\n", fprintf(outf, "iterations %d should be positive number\n", num_iterations);
num_iterations);
exit(2); exit(2);
} }
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment