tools/power turbostat: Intel Xeon x200: fix turbo-ratio decoding
Following changes have been made: - changed MSR_NHM_TURBO_RATIO_LIMIT to MSR_TURBO_RATIO_LIMIT in debug print for consistency with Developer Manual - updated definition of bitfields in MSR_TURBO_RATIO_LIMIT and appropriate parsing code - added x200 to list of architectures that do not support Nahlem compatible definition of MSR_TURBO_RATIO_LIMIT register (x200 has the register but bits definition is custom) - fixed typo in code that parses MSR_TURBO_RATIO_LIMIT (logical instead of bitwise operator) - changed MSR_TURBO_RATIO_LIMIT parsing algorithm so the print out had the same order as implementations for other platforms Signed-off-by: Hubert Chrzaniuk <hubert.chrzaniuk@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
121b48bb77
commit
cbf97abaf3
|
@ -1328,21 +1328,23 @@ dump_nhm_turbo_ratio_limits(void)
|
||||||
static void
|
static void
|
||||||
dump_knl_turbo_ratio_limits(void)
|
dump_knl_turbo_ratio_limits(void)
|
||||||
{
|
{
|
||||||
int cores;
|
const unsigned int buckets_no = 7;
|
||||||
unsigned int ratio;
|
|
||||||
unsigned long long msr;
|
unsigned long long msr;
|
||||||
int delta_cores;
|
int delta_cores, delta_ratio;
|
||||||
int delta_ratio;
|
int i, b_nr;
|
||||||
int i;
|
unsigned int cores[buckets_no];
|
||||||
|
unsigned int ratio[buckets_no];
|
||||||
|
|
||||||
get_msr(base_cpu, MSR_NHM_TURBO_RATIO_LIMIT, &msr);
|
get_msr(base_cpu, MSR_NHM_TURBO_RATIO_LIMIT, &msr);
|
||||||
|
|
||||||
fprintf(stderr, "cpu%d: MSR_NHM_TURBO_RATIO_LIMIT: 0x%08llx\n",
|
fprintf(stderr, "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:
|
||||||
* [7:0] -- Base value of number of active cores of bucket 1.
|
* [0] -- Reserved
|
||||||
|
* [7:1] -- Base value of number of active cores of bucket 1.
|
||||||
* [15:8] -- Base value of freq ratio of bucket 1.
|
* [15:8] -- Base value of freq ratio of bucket 1.
|
||||||
* [20:16] -- +ve delta of number of active cores of bucket 2.
|
* [20:16] -- +ve delta of number of active cores of bucket 2.
|
||||||
* i.e. active cores of bucket 2 =
|
* i.e. active cores of bucket 2 =
|
||||||
|
@ -1361,29 +1363,25 @@ dump_knl_turbo_ratio_limits(void)
|
||||||
* [60:56]-- +ve delta of number of active cores of bucket 7.
|
* [60:56]-- +ve delta of number of active cores of bucket 7.
|
||||||
* [63:61]-- -ve delta of freq ratio of bucket 7.
|
* [63:61]-- -ve delta of freq ratio of bucket 7.
|
||||||
*/
|
*/
|
||||||
cores = msr & 0xFF;
|
|
||||||
ratio = (msr >> 8) && 0xFF;
|
|
||||||
if (ratio > 0)
|
|
||||||
fprintf(stderr,
|
|
||||||
"%d * %.0f = %.0f MHz max turbo %d active cores\n",
|
|
||||||
ratio, bclk, ratio * bclk, cores);
|
|
||||||
|
|
||||||
for (i = 16; i < 64; i = i + 8) {
|
b_nr = 0;
|
||||||
|
cores[b_nr] = (msr & 0xFF) >> 1;
|
||||||
|
ratio[b_nr] = (msr >> 8) & 0xFF;
|
||||||
|
|
||||||
|
for (i = 16; i < 64; i += 8) {
|
||||||
delta_cores = (msr >> i) & 0x1F;
|
delta_cores = (msr >> i) & 0x1F;
|
||||||
delta_ratio = (msr >> (i + 5)) && 0x7;
|
delta_ratio = (msr >> (i + 5)) & 0x7;
|
||||||
if (!delta_cores || !delta_ratio)
|
|
||||||
return;
|
|
||||||
cores = cores + delta_cores;
|
|
||||||
ratio = ratio - delta_ratio;
|
|
||||||
|
|
||||||
/** -ve ratios will make successive ratio calculations
|
cores[b_nr + 1] = cores[b_nr] + delta_cores;
|
||||||
* negative. Hence return instead of carrying on.
|
ratio[b_nr + 1] = ratio[b_nr] - delta_ratio;
|
||||||
*/
|
b_nr++;
|
||||||
if (ratio > 0)
|
}
|
||||||
|
|
||||||
|
for (i = buckets_no - 1; i >= 0; i--)
|
||||||
|
if (i > 0 ? ratio[i] != ratio[i - 1] : 1)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%d * %.0f = %.0f MHz max turbo %d active cores\n",
|
"%d * %.0f = %.0f MHz max turbo %d active cores\n",
|
||||||
ratio, bclk, ratio * bclk, cores);
|
ratio[i], bclk, ratio[i] * bclk, cores[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1896,6 +1894,7 @@ int has_nhm_turbo_ratio_limit(unsigned int family, unsigned int model)
|
||||||
/* Nehalem compatible, but do not include turbo-ratio limit support */
|
/* Nehalem compatible, but do not include turbo-ratio limit support */
|
||||||
case 0x2E: /* Nehalem-EX Xeon - Beckton */
|
case 0x2E: /* Nehalem-EX Xeon - Beckton */
|
||||||
case 0x2F: /* Westmere-EX Xeon - Eagleton */
|
case 0x2F: /* Westmere-EX Xeon - Eagleton */
|
||||||
|
case 0x57: /* PHI - Knights Landing (different MSR definition) */
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in a new issue