[PATCH 2/2] intel-speed-select: Display turbo frequencies in a table

From: Prarit Bhargava
Date: Mon Sep 23 2019 - 09:17:32 EST


The output of turbo frequencies is also long (each bucket has
3 lines and the headers). This can be shrunk down into a table that is
easier to consume for both scripts and humans.

Display the turbo and clip frequencies in a table.

Signed-off-by: Prarit Bhargava <prarit@xxxxxxxxxx>
Cc: Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx>
---
.../x86/intel-speed-select/isst-display.c | 116 ++++++++++--------
1 file changed, 63 insertions(+), 53 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-display.c b/tools/power/x86/intel-speed-select/isst-display.c
index 9b0ae0831a60..16843e0f78f0 100644
--- a/tools/power/x86/intel-speed-select/isst-display.c
+++ b/tools/power/x86/intel-speed-select/isst-display.c
@@ -213,6 +213,52 @@ static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
format_and_print(outf, disp_level + 1, header, value);
}

+static void _isst_fact_display_frequencies(FILE *outf, int fact_avx, int level,
+ char *description, int bucket,
+ int core_count, int sse,
+ int avx, int avx512)
+{
+ char header[256];
+ int ret;
+ void *header_ptr;
+ int header_size;
+
+ header_ptr = header;
+ if (core_count > 0)
+ ret = snprintf(header_ptr, sizeof(header), "%s%d %6d ",
+ description, bucket, core_count);
+ else
+ ret = snprintf(header_ptr, sizeof(header), "%s%6s ",
+ description, "-");
+
+
+ header_ptr += ret;
+ header_size = header_ptr - (void *) header;
+ if (fact_avx & 0x01)
+ ret = snprintf(header_ptr, header_size, "%12d ",
+ sse * DISP_FREQ_MULTIPLIER);
+ else
+ ret = snprintf(header_ptr, header_size, "%12s ", "- ");
+
+ header_ptr += ret;
+ header_size = header_ptr - (void *) header;
+ if (fact_avx & 0x02)
+ ret = snprintf(header_ptr, header_size, "%12d ",
+ avx * DISP_FREQ_MULTIPLIER);
+ else
+ ret = snprintf(header_ptr, header_size, "%12s ", "- ");
+
+ header_ptr += ret;
+ header_size = header_ptr - (void *) header;
+ if (fact_avx & 0x04)
+ ret = snprintf(header_ptr, header_size, "%12d",
+ avx512 * DISP_FREQ_MULTIPLIER);
+ else
+ ret = snprintf(header_ptr, header_size, "%12s", "-");
+
+ format_and_print(outf, level + 1, header, NULL);
+}
+
static void _isst_fact_display_information(int cpu, FILE *outf, int level,
int fact_bucket, int fact_avx,
struct isst_fact_info *fact_info,
@@ -220,11 +266,14 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
{
struct isst_fact_bucket_info *bucket_info = fact_info->bucket_info;
char header[256];
- char value[256];
int j;

snprintf(header, sizeof(header), "speed-select-turbo-freq");
format_and_print(outf, base_level, header, NULL);
+ snprintf(header, sizeof(header),"%11s %s %s %s %s",
+ "", "core-count", "max-sse(MHz)" , "max-avx2(MHz)", "max-avx512(MHz)");
+ format_and_print(outf, base_level + 1, header, NULL);
+
for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
if (fact_bucket != 0xff && fact_bucket != j)
continue;
@@ -232,59 +281,20 @@ static void _isst_fact_display_information(int cpu, FILE *outf, int level,
if (!bucket_info[j].high_priority_cores_count)
break;

- snprintf(header, sizeof(header), "bucket-%d", j);
- format_and_print(outf, base_level + 1, header, NULL);
-
- snprintf(header, sizeof(header), "high-priority-cores-count");
- snprintf(value, sizeof(value), "%d",
- bucket_info[j].high_priority_cores_count);
- format_and_print(outf, base_level + 2, header, value);
-
- if (fact_avx & 0x01) {
- snprintf(header, sizeof(header),
- "high-priority-max-frequency(MHz)");
- snprintf(value, sizeof(value), "%d",
- bucket_info[j].sse_trl * DISP_FREQ_MULTIPLIER);
- format_and_print(outf, base_level + 2, header, value);
- }
-
- if (fact_avx & 0x02) {
- snprintf(header, sizeof(header),
- "high-priority-max-avx2-frequency(MHz)");
- snprintf(value, sizeof(value), "%d",
- bucket_info[j].avx_trl * DISP_FREQ_MULTIPLIER);
- format_and_print(outf, base_level + 2, header, value);
- }
-
- if (fact_avx & 0x04) {
- snprintf(header, sizeof(header),
- "high-priority-max-avx512-frequency(MHz)");
- snprintf(value, sizeof(value), "%d",
- bucket_info[j].avx512_trl *
- DISP_FREQ_MULTIPLIER);
- format_and_print(outf, base_level + 2, header, value);
- }
+ _isst_fact_display_frequencies(
+ outf, fact_avx, base_level + 1, "bucket-", j,
+ bucket_info[j].high_priority_cores_count,
+ bucket_info[j].sse_trl,
+ bucket_info[j].avx_trl,
+ bucket_info[j].avx512_trl);
}
- snprintf(header, sizeof(header),
- "speed-select-turbo-freq-clip-frequencies");
- format_and_print(outf, base_level + 1, header, NULL);
- snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
- snprintf(value, sizeof(value), "%d",
- fact_info->lp_clipping_ratio_license_sse *
- DISP_FREQ_MULTIPLIER);
- format_and_print(outf, base_level + 2, header, value);
- snprintf(header, sizeof(header),
- "low-priority-max-avx2-frequency(MHz)");
- snprintf(value, sizeof(value), "%d",
- fact_info->lp_clipping_ratio_license_avx2 *
- DISP_FREQ_MULTIPLIER);
- format_and_print(outf, base_level + 2, header, value);
- snprintf(header, sizeof(header),
- "low-priority-max-avx512-frequency(MHz)");
- snprintf(value, sizeof(value), "%d",
- fact_info->lp_clipping_ratio_license_avx512 *
- DISP_FREQ_MULTIPLIER);
- format_and_print(outf, base_level + 2, header, value);
+
+ _isst_fact_display_frequencies(
+ outf, fact_avx, base_level + 1, "clip-freq", 1,
+ -1, /* no core-count */
+ fact_info->lp_clipping_ratio_license_sse,
+ fact_info->lp_clipping_ratio_license_avx2,
+ fact_info->lp_clipping_ratio_license_avx512);
}

static void isst_turbo_ratio_limits(FILE *outf, char *header_name,
--
2.21.0