Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbf97aba authored by Hubert Chrzaniuk's avatar Hubert Chrzaniuk Committed by Len Brown
Browse files

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: default avatarHubert Chrzaniuk <hubert.chrzaniuk@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 121b48bb
Loading
Loading
Loading
Loading
+26 −27
Original line number Diff line number Diff line
@@ -1328,21 +1328,23 @@ dump_nhm_turbo_ratio_limits(void)
static void
dump_knl_turbo_ratio_limits(void)
{
	int cores;
	unsigned int ratio;
	const unsigned int buckets_no = 7;

	unsigned long long msr;
	int delta_cores;
	int delta_ratio;
	int i;
	int delta_cores, delta_ratio;
	int i, b_nr;
	unsigned int cores[buckets_no];
	unsigned int ratio[buckets_no];

	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);

	/**
	 * 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.
	 * [20:16] -- +ve delta of number of 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.
	 * [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_ratio = (msr >> (i + 5)) && 0x7;
		if (!delta_cores || !delta_ratio)
			return;
		cores = cores + delta_cores;
		ratio = ratio - delta_ratio;
		delta_ratio = (msr >> (i + 5)) & 0x7;

		/** -ve ratios will make successive ratio calculations
		 * negative. Hence return instead of carrying on.
		 */
		if (ratio > 0)
		cores[b_nr + 1] = cores[b_nr] + delta_cores;
		ratio[b_nr + 1] = ratio[b_nr] - delta_ratio;
		b_nr++;
	}

	for (i = buckets_no - 1; i >= 0; i--)
		if (i > 0 ? ratio[i] != ratio[i - 1] : 1)
			fprintf(stderr,
				"%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
@@ -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 */
	case 0x2E:	/* Nehalem-EX Xeon - Beckton */
	case 0x2F:	/* Westmere-EX Xeon - Eagleton */
	case 0x57:	/* PHI - Knights Landing (different MSR definition) */
		return 0;
	default:
		return 1;