2019-10-03 12:11:54

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 0/7] Add CascadeLake-N Support

Add support for SST-BF on CascadeLake-N support. The CascadeLake-N
processor only support SST-BF and not other SST functionality.

v2: Updated with comments from Srinivas (use common clx_n_* function names,
common is_clx_n_platform() function call to identify CascadeLake-N)

Signed-off-by: Prarit Bhargava <[email protected]>

Prarit Bhargava (7):
intel-speed-select: Add int argument to command functions
intel-speed-select: Make process_command generic
intel-speed-select: Add check for CascadeLake-N models
intel-speed-select: Add configuration for CascadeLake-N
intel-speed-select: Implement CascadeLake-N help and command functions
structures
intel-speed-select: Implement 'perf-profile info' on CascadeLake-N
intel-speed-select: Implement base-freq commands on CascadeLake-N

.../x86/intel-speed-select/isst-config.c | 493 ++++++++++++------
.../x86/intel-speed-select/isst-display.c | 14 +-
tools/power/x86/intel-speed-select/isst.h | 3 +
3 files changed, 339 insertions(+), 171 deletions(-)

--
2.18.1


2019-10-03 12:12:03

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 7/7] intel-speed-select: Implement base-freq commands on CascadeLake-N

Add functionality for base-freq info|enable|disable info on CascadeLake-N.

The enable command always returns success, and the disable command always
returns failed because SST-BF cannot be enabled or disabled from the OS on
CascadeLake-N.

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 68 +++++++++++++------
1 file changed, 48 insertions(+), 20 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index d9b580139a07..7c7f0551eda1 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -836,7 +836,7 @@ static void clx_n_config(void)
ctdp_level->fact_enabled = 0;
}

-static void dump_cn_config_for_cpu(int cpu, void *arg1, void *arg2,
+static void dump_clx_n_config_for_cpu(int cpu, void *arg1, void *arg2,
void *arg3, void *arg4)
{
isst_ctdp_display_information(cpu, outf, tdp_level, &clx_n_pkg_dev);
@@ -876,7 +876,7 @@ static void dump_isst_config(int arg)
if (!is_clx_n_platform())
fn = dump_isst_config_for_cpu;
else
- fn = dump_cn_config_for_cpu;
+ fn = dump_clx_n_config_for_cpu;

isst_ctdp_display_information_start(outf);

@@ -951,6 +951,18 @@ static void set_tdp_level(int arg)
isst_ctdp_display_information_end(outf);
}

+static void clx_n_dump_pbf_config_for_cpu(int cpu, void *arg1, void *arg2,
+ void *arg3, void *arg4)
+{
+ struct isst_pbf_info *pbf_info;
+ struct isst_pkg_ctdp_level_info *ctdp_level;
+
+ ctdp_level = &clx_n_pkg_dev.ctdp_level[0];
+ pbf_info = &ctdp_level->pbf_info;
+
+ isst_pbf_display_information(cpu, outf, tdp_level, pbf_info);
+}
+
static void dump_pbf_config_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
void *arg4)
{
@@ -968,6 +980,8 @@ static void dump_pbf_config_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,

static void dump_pbf_config(int arg)
{
+ void *fn;
+
if (cmd_help) {
fprintf(stderr,
"Print Intel(R) Speed Select Technology base frequency configuration for a TDP level\n");
@@ -981,13 +995,18 @@ static void dump_pbf_config(int arg)
exit(1);
}

+ if (!is_clx_n_platform())
+ fn = dump_pbf_config_for_cpu;
+ else
+ fn = clx_n_dump_pbf_config_for_cpu;
+
isst_ctdp_display_information_start(outf);
+
if (max_target_cpus)
- for_each_online_target_cpu_in_set(dump_pbf_config_for_cpu, NULL,
- NULL, NULL, NULL);
+ for_each_online_target_cpu_in_set(fn, NULL, NULL, NULL, NULL);
else
- for_each_online_package_in_set(dump_pbf_config_for_cpu, NULL,
- NULL, NULL, NULL);
+ for_each_online_package_in_set(fn, NULL, NULL, NULL, NULL);
+
isst_ctdp_display_information_end(outf);
}

@@ -1165,21 +1184,27 @@ static void set_pbf_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
int ret;
int status = *(int *)arg4;

- ret = isst_set_pbf_fact_status(cpu, 1, status);
- if (ret) {
- perror("isst_set_pbf");
- } else {
- if (status) {
- if (auto_mode)
- ret = set_pbf_core_power(cpu);
- isst_display_result(cpu, outf, "base-freq", "enable",
- ret);
- } else {
- if (auto_mode)
- isst_pm_qos_config(cpu, 0, 0);
- isst_display_result(cpu, outf, "base-freq", "disable",
- ret);
+ if (!is_clx_n_platform()) {
+ ret = isst_set_pbf_fact_status(cpu, 1, status);
+ if (ret) {
+ perror("isst_set_pbf");
+ return;
}
+ } else {
+ if (status == 0)
+ ret = -1;
+ else
+ ret = 0;
+ }
+
+ if (status) {
+ if (auto_mode)
+ ret = set_pbf_core_power(cpu);
+ isst_display_result(cpu, outf, "base-freq", "enable", ret);
+ } else {
+ if (auto_mode)
+ isst_pm_qos_config(cpu, 0, 0);
+ isst_display_result(cpu, outf, "base-freq", "disable", ret);
}
}

@@ -1645,6 +1670,9 @@ static void get_clos_assoc(int arg)

static struct process_cmd_struct clx_n_cmds[] = {
{ "perf-profile", "info", dump_isst_config, 0 },
+ { "base-freq", "info", dump_pbf_config, 0 },
+ { "base-freq", "enable", set_pbf_enable, 1 },
+ { "base-freq", "disable", set_pbf_enable, 0 },
{ NULL, NULL, NULL, 0 }
};

--
2.18.1

2019-10-03 12:12:12

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 3/7] intel-speed-select: Add check for CascadeLake-N models

Three CascadeLake-N models (6252N, 6230N, and 5218N) have SST-PBF support.

Return an error if the CascadeLake processor is not one of these specific
models.

v2: Add is_clx_n_platform()

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 44 ++++++++++++++++++-
1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index f4a23678416e..734a7960458c 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -23,6 +23,7 @@ static int debug_flag;
static FILE *outf;

static int cpu_model;
+static int cpu_stepping;

#define MAX_CPUS_IN_ONE_REQ 64
static short max_target_cpus;
@@ -72,7 +73,16 @@ void debug_printf(const char *format, ...)
va_end(args);
}

-static void update_cpu_model(void)
+
+int is_clx_n_platform(void)
+{
+ if (cpu_model == 0x55)
+ if (cpu_stepping == 0x6 || cpu_stepping == 0x7)
+ return 1;
+ return 0;
+}
+
+static int update_cpu_model(void)
{
unsigned int ebx, ecx, edx;
unsigned int fms, family;
@@ -82,6 +92,34 @@ static void update_cpu_model(void)
cpu_model = (fms >> 4) & 0xf;
if (family == 6 || family == 0xf)
cpu_model += ((fms >> 16) & 0xf) << 4;
+
+ cpu_stepping = fms & 0xf;
+
+ /* only three CascadeLake-N models are supported */
+ if (is_clx_n_platform()) {
+ FILE *fp;
+ size_t n;
+ char *line;
+ int ret = 1;
+
+ fp = fopen("/proc/cpuinfo", "r");
+ if (!fp)
+ err(-1, "cannot open /proc/cpuinfo\n");
+
+ while (getline(&line, &n, fp) > 0) {
+ if (strstr(line, "model name")) {
+ if (strstr(line, "6252N") ||
+ strstr(line, "6230N") ||
+ strstr(line, "5218N"))
+ ret = 0;
+ break;
+ }
+ }
+ free(line);
+ fclose(fp);
+ return ret;
+ }
+ return 0;
}

/* Open a file, and exit on failure */
@@ -1889,7 +1927,9 @@ static void cmdline(int argc, char **argv)
fprintf(stderr, "Feature name and|or command not specified\n");
exit(0);
}
- update_cpu_model();
+ ret = update_cpu_model();
+ if (ret)
+ err(-1, "Invalid CPU model (%d)\n", cpu_model);
printf("Intel(R) Speed Select Technology\n");
printf("Executing on CPU model:%d[0x%x]\n", cpu_model, cpu_model);
set_max_cpu_num();
--
2.18.1

2019-10-03 12:12:16

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 6/7] intel-speed-select: Implement 'perf-profile info' on CascadeLake-N

Add functionality for perf-profile info on CascadeLake-N.

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 20 +++++++++++++++----
.../x86/intel-speed-select/isst-display.c | 12 +++++++++++
tools/power/x86/intel-speed-select/isst.h | 1 +
3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index 3ab0edade5ec..d9b580139a07 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -836,6 +836,12 @@ static void clx_n_config(void)
ctdp_level->fact_enabled = 0;
}

+static void dump_cn_config_for_cpu(int cpu, void *arg1, void *arg2,
+ void *arg3, void *arg4)
+{
+ isst_ctdp_display_information(cpu, outf, tdp_level, &clx_n_pkg_dev);
+}
+
static void dump_isst_config_for_cpu(int cpu, void *arg1, void *arg2,
void *arg3, void *arg4)
{
@@ -854,6 +860,8 @@ static void dump_isst_config_for_cpu(int cpu, void *arg1, void *arg2,

static void dump_isst_config(int arg)
{
+ void *fn;
+
if (cmd_help) {
fprintf(stderr,
"Print Intel(R) Speed Select Technology Performance profile configuration\n");
@@ -865,14 +873,17 @@ static void dump_isst_config(int arg)
exit(0);
}

+ if (!is_clx_n_platform())
+ fn = dump_isst_config_for_cpu;
+ else
+ fn = dump_cn_config_for_cpu;
+
isst_ctdp_display_information_start(outf);

if (max_target_cpus)
- for_each_online_target_cpu_in_set(dump_isst_config_for_cpu,
- NULL, NULL, NULL, NULL);
+ for_each_online_target_cpu_in_set(fn, NULL, NULL, NULL, NULL);
else
- for_each_online_package_in_set(dump_isst_config_for_cpu, NULL,
- NULL, NULL, NULL);
+ for_each_online_package_in_set(fn, NULL, NULL, NULL, NULL);

isst_ctdp_display_information_end(outf);
}
@@ -1633,6 +1644,7 @@ static void get_clos_assoc(int arg)
}

static struct process_cmd_struct clx_n_cmds[] = {
+ { "perf-profile", "info", dump_isst_config, 0 },
{ NULL, NULL, NULL, 0 }
};

diff --git a/tools/power/x86/intel-speed-select/isst-display.c b/tools/power/x86/intel-speed-select/isst-display.c
index 1caa7ae25245..8309810e7425 100644
--- a/tools/power/x86/intel-speed-select/isst-display.c
+++ b/tools/power/x86/intel-speed-select/isst-display.c
@@ -202,6 +202,9 @@ static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
format_and_print(outf, disp_level + 1, header, value);

+ if (is_clx_n_platform())
+ return;
+
snprintf(header, sizeof(header), "tjunction-temperature(C)");
snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
format_and_print(outf, disp_level + 1, header, value);
@@ -375,6 +378,15 @@ void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
snprintf(value, sizeof(value), "unsupported");
format_and_print(outf, base_level + 4, header, value);

+ if (is_clx_n_platform()) {
+ if (ctdp_level->pbf_support)
+ _isst_pbf_display_information(cpu, outf,
+ tdp_level,
+ &ctdp_level->pbf_info,
+ base_level + 4);
+ continue;
+ }
+
snprintf(header, sizeof(header), "thermal-design-power(W)");
snprintf(value, sizeof(value), "%d", ctdp_level->pkg_tdp);
format_and_print(outf, base_level + 4, header, value);
diff --git a/tools/power/x86/intel-speed-select/isst.h b/tools/power/x86/intel-speed-select/isst.h
index 0dcae17b3945..bef27bd6138e 100644
--- a/tools/power/x86/intel-speed-select/isst.h
+++ b/tools/power/x86/intel-speed-select/isst.h
@@ -239,4 +239,5 @@ extern void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
extern int isst_clos_get_clos_information(int cpu, int *enable, int *type);
extern void isst_clos_display_clos_information(int cpu, FILE *outf,
int clos_enable, int type);
+extern int is_clx_n_platform(void);
#endif
--
2.18.1

2019-10-03 12:12:21

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 2/7] intel-speed-select: Make process_command generic

Make the process_command take any help command and command list. This
will make it easier to help commands and a command list for CascadeLake-N.

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 20 ++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index 1b2899706857..f4a23678416e 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -1749,7 +1749,9 @@ static struct process_cmd_help_struct isst_help_cmds[] = {
{ NULL, NULL }
};

-void process_command(int argc, char **argv)
+void process_command(int argc, char **argv,
+ struct process_cmd_help_struct *help_cmds,
+ struct process_cmd_struct *cmds)
{
int i = 0, matched = 0;
char *feature = argv[optind];
@@ -1760,9 +1762,9 @@ void process_command(int argc, char **argv)

debug_printf("feature name [%s] command [%s]\n", feature, cmd);
if (!strcmp(cmd, "-h") || !strcmp(cmd, "--help")) {
- while (isst_help_cmds[i].feature) {
- if (!strcmp(isst_help_cmds[i].feature, feature)) {
- isst_help_cmds[i].process_fn();
+ while (help_cmds[i].feature) {
+ if (!strcmp(help_cmds[i].feature, feature)) {
+ help_cmds[i].process_fn();
exit(0);
}
++i;
@@ -1772,11 +1774,11 @@ void process_command(int argc, char **argv)
create_cpu_map();

i = 0;
- while (isst_cmds[i].feature) {
- if (!strcmp(isst_cmds[i].feature, feature) &&
- !strcmp(isst_cmds[i].command, cmd)) {
+ while (cmds[i].feature) {
+ if (!strcmp(cmds[i].feature, feature) &&
+ !strcmp(cmds[i].command, cmd)) {
parse_cmd_args(argc, optind + 1, argv);
- isst_cmds[i].process_fn(isst_cmds[i].arg);
+ cmds[i].process_fn(cmds[i].arg);
matched = 1;
break;
}
@@ -1897,7 +1899,7 @@ static void cmdline(int argc, char **argv)
if (ret)
goto out;

- process_command(argc, argv);
+ process_command(argc, argv, isst_help_cmds, isst_cmds);
out:
free_cpu_set(present_cpumask);
free_cpu_set(target_cpumask);
--
2.18.1

2019-10-03 12:13:10

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 5/7] intel-speed-select: Implement CascadeLake-N help and command functions structures

CascadeLake-N only supports SST-BF and needs some of the perf-profile
commands, and the base-freq commands.

Add help functions, and create an empty command structures (the functions
will be implemented later in this patchset). Call these functions
when running on CascadeLake-N.

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 37 ++++++++++++++-----
1 file changed, 27 insertions(+), 10 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index 164c4e5e6ccb..3ab0edade5ec 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -1632,6 +1632,10 @@ static void get_clos_assoc(int arg)
isst_ctdp_display_information_end(outf);
}

+static struct process_cmd_struct clx_n_cmds[] = {
+ { NULL, NULL, NULL, 0 }
+};
+
static struct process_cmd_struct isst_cmds[] = {
{ "perf-profile", "get-lock-status", get_tdp_locked, 0 },
{ "perf-profile", "get-config-levels", get_tdp_levels, 0 },
@@ -1820,12 +1824,15 @@ static void isst_help(void)
TDP, etc.\n");
printf("\nCommands : For feature=perf-profile\n");
printf("\tinfo\n");
- printf("\tget-lock-status\n");
- printf("\tget-config-levels\n");
- printf("\tget-config-version\n");
- printf("\tget-config-enabled\n");
- printf("\tget-config-current-level\n");
- printf("\tset-config-level\n");
+
+ if (!is_clx_n_platform()) {
+ printf("\tget-lock-status\n");
+ printf("\tget-config-levels\n");
+ printf("\tget-config-version\n");
+ printf("\tget-config-enabled\n");
+ printf("\tget-config-current-level\n");
+ printf("\tset-config-level\n");
+ }
}

static void pbf_help(void)
@@ -1875,6 +1882,12 @@ static struct process_cmd_help_struct isst_help_cmds[] = {
{ NULL, NULL }
};

+static struct process_cmd_help_struct clx_n_help_cmds[] = {
+ { "perf-profile", isst_help },
+ { "base-freq", pbf_help },
+ { NULL, NULL }
+};
+
void process_command(int argc, char **argv,
struct process_cmd_help_struct *help_cmds,
struct process_cmd_struct *cmds)
@@ -2031,11 +2044,15 @@ static void cmdline(int argc, char **argv)
set_max_cpu_num();
set_cpu_present_cpu_mask();
set_cpu_target_cpu_mask();
- ret = isst_fill_platform_info();
- if (ret)
- goto out;

- process_command(argc, argv, isst_help_cmds, isst_cmds);
+ if (!is_clx_n_platform()) {
+ ret = isst_fill_platform_info();
+ if (ret)
+ goto out;
+ process_command(argc, argv, isst_help_cmds, isst_cmds);
+ } else {
+ process_command(argc, argv, clx_n_help_cmds, clx_n_cmds);
+ }
out:
free_cpu_set(present_cpumask);
free_cpu_set(target_cpumask);
--
2.18.1

2019-10-03 12:14:43

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 4/7] intel-speed-select: Add configuration for CascadeLake-N

Create a 'dummy' pkg_dev struct for use by CascadeLake-N processors. This
struct will be used in later patches to implement info and status calls
for CascadeLake-N SST-BF.

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 98 ++++++++++++++++++-
.../x86/intel-speed-select/isst-display.c | 2 -
tools/power/x86/intel-speed-select/isst.h | 2 +
3 files changed, 99 insertions(+), 3 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index 734a7960458c..164c4e5e6ccb 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -748,6 +748,94 @@ _get_tdp_level("get-config-current_level", levels, current_level,
"Current TDP Level");
_get_tdp_level("get-lock-status", levels, locked, "TDP lock status");

+struct isst_pkg_ctdp clx_n_pkg_dev;
+
+static int clx_n_get_base_ratio(void)
+{
+ FILE *fp;
+ char *begin, *end, *line;
+ char number[5];
+ float value = 0;
+ size_t n;
+
+ fp = fopen("/proc/cpuinfo", "r");
+ if (!fp)
+ err(-1, "cannot open /proc/cpuinfo\n");
+
+ while (getline(&line, &n, fp) > 0) {
+ if (strstr(line, "model name")) {
+ /* this is true for CascadeLake-N */
+ begin = strstr(line, "@ ") + 2;
+ end = strstr(line, "GHz");
+ strncpy(number, begin, end - begin);
+ value = atof(number) * 10;
+ break;
+ }
+ }
+ free(line);
+ fclose(fp);
+
+ return (int)(value);
+}
+
+static void clx_n_config(void)
+{
+ int i;
+ unsigned long cpu_bf;
+ struct isst_pkg_ctdp_level_info *ctdp_level;
+ struct isst_pbf_info *pbf_info;
+
+ ctdp_level = &clx_n_pkg_dev.ctdp_level[0];
+ pbf_info = &ctdp_level->pbf_info;
+
+ /* find the frequency base ratio */
+ ctdp_level->tdp_ratio = clx_n_get_base_ratio();
+ if (ctdp_level->tdp_ratio == 0)
+ err(-1, "cn base ratio is zero\n");
+
+ /* find the high and low priority frequencies */
+ pbf_info->p1_high = 0;
+ pbf_info->p1_low = ~0;
+ for (i = 0; i < topo_max_cpus; i++) {
+ cpu_bf = parse_int_file(1,
+ "/sys/devices/system/cpu/cpu%d/cpufreq/base_frequency",
+ i);
+ if (cpu_bf > pbf_info->p1_high)
+ pbf_info->p1_high = cpu_bf;
+ if (cpu_bf < pbf_info->p1_low)
+ pbf_info->p1_low = cpu_bf;
+ }
+
+ if (pbf_info->p1_high == ~0UL)
+ err(-1, "maximum base frequency not set\n");
+
+ if (pbf_info->p1_low == 0)
+ err(-1, "minimum base frequency not set\n");
+
+ /* convert frequencies back to ratios */
+ pbf_info->p1_high = pbf_info->p1_high / DISP_FREQ_MULTIPLIER;
+ pbf_info->p1_low = pbf_info->p1_low / DISP_FREQ_MULTIPLIER;
+
+ /* create high priority cpu mask */
+ pbf_info->core_cpumask_size = alloc_cpu_set(&pbf_info->core_cpumask);
+ for (i = 0; i < topo_max_cpus; i++) {
+ cpu_bf = parse_int_file(1,
+ "/sys/devices/system/cpu/cpu%d/cpufreq/base_frequency",
+ i);
+ cpu_bf = cpu_bf / DISP_FREQ_MULTIPLIER;
+ if (cpu_bf == pbf_info->p1_high)
+ CPU_SET_S(i, pbf_info->core_cpumask_size,
+ pbf_info->core_cpumask);
+ }
+
+ /* extra ctdp & pbf struct parameters */
+ ctdp_level->processed = 1;
+ ctdp_level->pbf_support = 1; /* PBF is always supported and enabled */
+ ctdp_level->pbf_enabled = 1;
+ ctdp_level->fact_support = 0; /* FACT is never supported */
+ ctdp_level->fact_enabled = 0;
+}
+
static void dump_isst_config_for_cpu(int cpu, void *arg1, void *arg2,
void *arg3, void *arg4)
{
@@ -1809,7 +1897,10 @@ void process_command(int argc, char **argv,
}
}

- create_cpu_map();
+ if (!is_clx_n_platform())
+ create_cpu_map();
+ else
+ clx_n_config();

i = 0;
while (cmds[i].feature) {
@@ -1825,6 +1916,11 @@ void process_command(int argc, char **argv,

if (!matched)
fprintf(stderr, "Invalid command\n");
+
+ if (!is_clx_n_platform()) {
+ /* this was allocated in clx_n_config() */
+ free_cpu_set(clx_n_pkg_dev.ctdp_level[0].pbf_info.core_cpumask);
+ }
}

static void usage(void)
diff --git a/tools/power/x86/intel-speed-select/isst-display.c b/tools/power/x86/intel-speed-select/isst-display.c
index 40346d534f78..1caa7ae25245 100644
--- a/tools/power/x86/intel-speed-select/isst-display.c
+++ b/tools/power/x86/intel-speed-select/isst-display.c
@@ -6,8 +6,6 @@

#include "isst.h"

-#define DISP_FREQ_MULTIPLIER 100
-
static void printcpulist(int str_len, char *str, int mask_size,
cpu_set_t *cpu_mask)
{
diff --git a/tools/power/x86/intel-speed-select/isst.h b/tools/power/x86/intel-speed-select/isst.h
index d280b27d600d..0dcae17b3945 100644
--- a/tools/power/x86/intel-speed-select/isst.h
+++ b/tools/power/x86/intel-speed-select/isst.h
@@ -69,6 +69,8 @@
#define PM_CLOS_OFFSET 0x08
#define PQR_ASSOC_OFFSET 0x20

+#define DISP_FREQ_MULTIPLIER 100
+
struct isst_clos_config {
int pkg_id;
int die_id;
--
2.18.1

2019-10-03 12:15:10

by Prarit Bhargava

[permalink] [raw]
Subject: [PATCH v2 1/7] intel-speed-select: Add int argument to command functions

The current code structure has similar but separate command functions for
the enable and disable operations. This can be improved by adding an int
argument to the command function structure, and interpreting 1 as enable
and 0 as disable. This change results in the removal of the disable
command functions.

Add int argument to the command function structure.

Signed-off-by: Prarit Bhargava <[email protected]>
---
.../x86/intel-speed-select/isst-config.c | 216 +++++++-----------
1 file changed, 88 insertions(+), 128 deletions(-)

diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index edc4c50853bd..1b2899706857 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -11,7 +11,8 @@
struct process_cmd_struct {
char *feature;
char *command;
- void (*process_fn)(void);
+ void (*process_fn)(int arg);
+ int arg;
};

static const char *version_str = "v1.0";
@@ -679,7 +680,7 @@ static void exec_on_get_ctdp_cpu(int cpu, void *arg1, void *arg2, void *arg3,
}

#define _get_tdp_level(desc, suffix, object, help) \
- static void get_tdp_##object(void) \
+ static void get_tdp_##object(int arg) \
{ \
struct isst_pkg_ctdp ctdp; \
\
@@ -725,7 +726,7 @@ static void dump_isst_config_for_cpu(int cpu, void *arg1, void *arg2,
}
}

-static void dump_isst_config(void)
+static void dump_isst_config(int arg)
{
if (cmd_help) {
fprintf(stderr,
@@ -788,7 +789,7 @@ static void set_tdp_level_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
}
}

-static void set_tdp_level(void)
+static void set_tdp_level(int arg)
{
if (cmd_help) {
fprintf(stderr, "Set Config TDP level\n");
@@ -828,7 +829,7 @@ static void dump_pbf_config_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
}
}

-static void dump_pbf_config(void)
+static void dump_pbf_config(int arg)
{
if (cmd_help) {
fprintf(stderr,
@@ -1045,51 +1046,36 @@ static void set_pbf_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
}
}

-static void set_pbf_enable(void)
+static void set_pbf_enable(int arg)
{
- int status = 1;
+ int enable = arg;

if (cmd_help) {
- fprintf(stderr,
- "Enable Intel Speed Select Technology base frequency feature\n");
- fprintf(stderr,
- "\tOptional Arguments: -a|--auto : Use priority of cores to set core-power associations\n");
-
- exit(0);
- }
-
- isst_ctdp_display_information_start(outf);
- if (max_target_cpus)
- for_each_online_target_cpu_in_set(set_pbf_for_cpu, NULL, NULL,
- NULL, &status);
- else
- for_each_online_package_in_set(set_pbf_for_cpu, NULL, NULL,
- NULL, &status);
- isst_ctdp_display_information_end(outf);
-}
-
-static void set_pbf_disable(void)
-{
- int status = 0;
+ if (enable) {
+ fprintf(stderr,
+ "Enable Intel Speed Select Technology base frequency feature\n");
+ fprintf(stderr,
+ "\tOptional Arguments: -a|--auto : Use priority of cores to set core-power associations\n");
+ } else {

- if (cmd_help) {
- fprintf(stderr,
- "Disable Intel Speed Select Technology base frequency feature\n");
- fprintf(stderr,
- "\tOptional Arguments: -a|--auto : Also disable core-power associations\n");
+ fprintf(stderr,
+ "Disable Intel Speed Select Technology base frequency feature\n");
+ fprintf(stderr,
+ "\tOptional Arguments: -a|--auto : Also disable core-power associations\n");
+ }
exit(0);
}

isst_ctdp_display_information_start(outf);
if (max_target_cpus)
for_each_online_target_cpu_in_set(set_pbf_for_cpu, NULL, NULL,
- NULL, &status);
+ NULL, &enable);
else
for_each_online_package_in_set(set_pbf_for_cpu, NULL, NULL,
- NULL, &status);
+ NULL, &enable);
isst_ctdp_display_information_end(outf);

- if (auto_mode)
+ if (!enable && auto_mode)
reset_cpufreq_scaling_min();
}

@@ -1107,7 +1093,7 @@ static void dump_fact_config_for_cpu(int cpu, void *arg1, void *arg2,
fact_avx, &fact_info);
}

-static void dump_fact_config(void)
+static void dump_fact_config(int arg)
{
if (cmd_help) {
fprintf(stderr,
@@ -1169,31 +1155,42 @@ static void set_fact_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
}
}

-static void set_fact_enable(void)
+static void set_fact_enable(int arg)
{
- int status = 1, i, j, ret;
+ int i, j, ret;
+ int enable = arg;

if (cmd_help) {
- fprintf(stderr,
- "Enable Intel Speed Select Technology Turbo frequency feature\n");
- fprintf(stderr,
- "Optional: -t|--trl : Specify turbo ratio limit\n");
- fprintf(stderr,
- "\tOptional Arguments: -a|--auto : Designate specified target CPUs with");
- fprintf(stderr, "-C|--cpu option as as high priority using core-power feature\n");
+ if (enable) {
+ fprintf(stderr,
+ "Enable Intel Speed Select Technology Turbo frequency feature\n");
+ fprintf(stderr,
+ "Optional: -t|--trl : Specify turbo ratio limit\n");
+ fprintf(stderr,
+ "\tOptional Arguments: -a|--auto : Designate specified target CPUs with");
+ fprintf(stderr,
+ "-C|--cpu option as as high priority using core-power feature\n");
+ } else {
+ fprintf(stderr,
+ "Disable Intel Speed Select Technology turbo frequency feature\n");
+ fprintf(stderr,
+ "Optional: -t|--trl : Specify turbo ratio limit\n");
+ fprintf(stderr,
+ "\tOptional Arguments: -a|--auto : Also disable core-power associations\n");
+ }
exit(0);
}

isst_ctdp_display_information_start(outf);
if (max_target_cpus)
for_each_online_target_cpu_in_set(set_fact_for_cpu, NULL, NULL,
- NULL, &status);
+ NULL, &enable);
else
for_each_online_package_in_set(set_fact_for_cpu, NULL, NULL,
- NULL, &status);
+ NULL, &enable);
isst_ctdp_display_information_end(outf);

- if (auto_mode) {
+ if (enable && auto_mode) {
for (i = 0; i < get_topo_max_cpus(); ++i) {
int clos;

@@ -1247,30 +1244,6 @@ static void set_fact_enable(void)

}

-static void set_fact_disable(void)
-{
- int status = 0;
-
- if (cmd_help) {
- fprintf(stderr,
- "Disable Intel Speed Select Technology turbo frequency feature\n");
- fprintf(stderr,
- "Optional: -t|--trl : Specify turbo ratio limit\n");
- fprintf(stderr,
- "\tOptional Arguments: -a|--auto : Also disable core-power associations\n");
- exit(0);
- }
-
- isst_ctdp_display_information_start(outf);
- if (max_target_cpus)
- for_each_online_target_cpu_in_set(set_fact_for_cpu, NULL, NULL,
- NULL, &status);
- else
- for_each_online_package_in_set(set_fact_for_cpu, NULL, NULL,
- NULL, &status);
- isst_ctdp_display_information_end(outf);
-}
-
static void enable_clos_qos_config(int cpu, void *arg1, void *arg2, void *arg3,
void *arg4)
{
@@ -1289,19 +1262,25 @@ static void enable_clos_qos_config(int cpu, void *arg1, void *arg2, void *arg3,
ret);
}

-static void set_clos_enable(void)
+static void set_clos_enable(int arg)
{
- int status = 1;
+ int enable = arg;

if (cmd_help) {
- fprintf(stderr, "Enable core-power for a package/die\n");
- fprintf(stderr,
- "\tClos Enable: Specify priority type with [--priority|-p]\n");
- fprintf(stderr, "\t\t 0: Proportional, 1: Ordered\n");
+ if (enable) {
+ fprintf(stderr,
+ "Enable core-power for a package/die\n");
+ fprintf(stderr,
+ "\tClos Enable: Specify priority type with [--priority|-p]\n");
+ fprintf(stderr, "\t\t 0: Proportional, 1: Ordered\n");
+ } else {
+ fprintf(stderr,
+ "Disable core-power: [No command arguments are required]\n");
+ }
exit(0);
}

- if (cpufreq_sysfs_present()) {
+ if (enable && cpufreq_sysfs_present()) {
fprintf(stderr,
"cpufreq subsystem and core-power enable will interfere with each other!\n");
}
@@ -1309,30 +1288,10 @@ static void set_clos_enable(void)
isst_ctdp_display_information_start(outf);
if (max_target_cpus)
for_each_online_target_cpu_in_set(enable_clos_qos_config, NULL,
- NULL, NULL, &status);
- else
- for_each_online_package_in_set(enable_clos_qos_config, NULL,
- NULL, NULL, &status);
- isst_ctdp_display_information_end(outf);
-}
-
-static void set_clos_disable(void)
-{
- int status = 0;
-
- if (cmd_help) {
- fprintf(stderr,
- "Disable core-power: [No command arguments are required]\n");
- exit(0);
- }
-
- isst_ctdp_display_information_start(outf);
- if (max_target_cpus)
- for_each_online_target_cpu_in_set(enable_clos_qos_config, NULL,
- NULL, NULL, &status);
+ NULL, NULL, &enable);
else
for_each_online_package_in_set(enable_clos_qos_config, NULL,
- NULL, NULL, &status);
+ NULL, NULL, &enable);
isst_ctdp_display_information_end(outf);
}

@@ -1350,7 +1309,7 @@ static void dump_clos_config_for_cpu(int cpu, void *arg1, void *arg2,
&clos_config);
}

-static void dump_clos_config(void)
+static void dump_clos_config(int arg)
{
if (cmd_help) {
fprintf(stderr,
@@ -1386,7 +1345,7 @@ static void get_clos_info_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
isst_clos_display_clos_information(cpu, outf, enable, prio_type);
}

-static void dump_clos_info(void)
+static void dump_clos_info(int arg)
{
if (cmd_help) {
fprintf(stderr,
@@ -1429,7 +1388,7 @@ static void set_clos_config_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
isst_display_result(cpu, outf, "core-power", "config", ret);
}

-static void set_clos_config(void)
+static void set_clos_config(int arg)
{
if (cmd_help) {
fprintf(stderr,
@@ -1493,7 +1452,7 @@ static void set_clos_assoc_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
isst_display_result(cpu, outf, "core-power", "assoc", ret);
}

-static void set_clos_assoc(void)
+static void set_clos_assoc(int arg)
{
if (cmd_help) {
fprintf(stderr, "Associate a clos id to a CPU\n");
@@ -1527,7 +1486,7 @@ static void get_clos_assoc_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
isst_clos_display_assoc_information(cpu, outf, clos);
}

-static void get_clos_assoc(void)
+static void get_clos_assoc(int arg)
{
if (cmd_help) {
fprintf(stderr, "Get associate clos id to a CPU\n");
@@ -1548,26 +1507,27 @@ static void get_clos_assoc(void)
}

static struct process_cmd_struct isst_cmds[] = {
- { "perf-profile", "get-lock-status", get_tdp_locked },
- { "perf-profile", "get-config-levels", get_tdp_levels },
- { "perf-profile", "get-config-version", get_tdp_version },
- { "perf-profile", "get-config-enabled", get_tdp_enabled },
- { "perf-profile", "get-config-current-level", get_tdp_current_level },
- { "perf-profile", "set-config-level", set_tdp_level },
- { "perf-profile", "info", dump_isst_config },
- { "base-freq", "info", dump_pbf_config },
- { "base-freq", "enable", set_pbf_enable },
- { "base-freq", "disable", set_pbf_disable },
- { "turbo-freq", "info", dump_fact_config },
- { "turbo-freq", "enable", set_fact_enable },
- { "turbo-freq", "disable", set_fact_disable },
- { "core-power", "info", dump_clos_info },
- { "core-power", "enable", set_clos_enable },
- { "core-power", "disable", set_clos_disable },
- { "core-power", "config", set_clos_config },
- { "core-power", "get-config", dump_clos_config },
- { "core-power", "assoc", set_clos_assoc },
- { "core-power", "get-assoc", get_clos_assoc },
+ { "perf-profile", "get-lock-status", get_tdp_locked, 0 },
+ { "perf-profile", "get-config-levels", get_tdp_levels, 0 },
+ { "perf-profile", "get-config-version", get_tdp_version, 0 },
+ { "perf-profile", "get-config-enabled", get_tdp_enabled, 0 },
+ { "perf-profile", "get-config-current-level", get_tdp_current_level,
+ 0 },
+ { "perf-profile", "set-config-level", set_tdp_level, 0 },
+ { "perf-profile", "info", dump_isst_config, 0 },
+ { "base-freq", "info", dump_pbf_config, 0 },
+ { "base-freq", "enable", set_pbf_enable, 1 },
+ { "base-freq", "disable", set_pbf_enable, 0 },
+ { "turbo-freq", "info", dump_fact_config, 0 },
+ { "turbo-freq", "enable", set_fact_enable, 1 },
+ { "turbo-freq", "disable", set_fact_enable, 0 },
+ { "core-power", "info", dump_clos_info, 0 },
+ { "core-power", "enable", set_clos_enable, 1 },
+ { "core-power", "disable", set_clos_enable, 0 },
+ { "core-power", "config", set_clos_config, 0 },
+ { "core-power", "get-config", dump_clos_config, 0 },
+ { "core-power", "assoc", set_clos_assoc, 0 },
+ { "core-power", "get-assoc", get_clos_assoc, 0 },
{ NULL, NULL, NULL }
};

@@ -1816,7 +1776,7 @@ void process_command(int argc, char **argv)
if (!strcmp(isst_cmds[i].feature, feature) &&
!strcmp(isst_cmds[i].command, cmd)) {
parse_cmd_args(argc, optind + 1, argv);
- isst_cmds[i].process_fn();
+ isst_cmds[i].process_fn(isst_cmds[i].arg);
matched = 1;
break;
}
--
2.18.1

2019-10-04 17:17:05

by srinivas pandruvada

[permalink] [raw]
Subject: Re: [PATCH v2 3/7] intel-speed-select: Add check for CascadeLake-N models

On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:
> Three CascadeLake-N models (6252N, 6230N, and 5218N) have SST-PBF
> support.
>
> Return an error if the CascadeLake processor is not one of these
> specific
> models.
>
This patch sigfaults immediately on CLX.

> v2: Add is_clx_n_platform()
>
> Signed-off-by: Prarit Bhargava <[email protected]>
> ---
> .../x86/intel-speed-select/isst-config.c | 44
> ++++++++++++++++++-
> 1 file changed, 42 insertions(+), 2 deletions(-)
>
> diff --git a/tools/power/x86/intel-speed-select/isst-config.c
> b/tools/power/x86/intel-speed-select/isst-config.c
> index f4a23678416e..734a7960458c 100644
> --- a/tools/power/x86/intel-speed-select/isst-config.c
> +++ b/tools/power/x86/intel-speed-select/isst-config.c
> @@ -23,6 +23,7 @@ static int debug_flag;
> static FILE *outf;
>
> static int cpu_model;
> +static int cpu_stepping;
>
> #define MAX_CPUS_IN_ONE_REQ 64
> static short max_target_cpus;
> @@ -72,7 +73,16 @@ void debug_printf(const char *format, ...)
> va_end(args);
> }
>
> -static void update_cpu_model(void)
> +
> +int is_clx_n_platform(void)
> +{
> + if (cpu_model == 0x55)
> + if (cpu_stepping == 0x6 || cpu_stepping == 0x7)
> + return 1;
> + return 0;
> +}
> +
> +static int update_cpu_model(void)
> {
> unsigned int ebx, ecx, edx;
> unsigned int fms, family;
> @@ -82,6 +92,34 @@ static void update_cpu_model(void)
> cpu_model = (fms >> 4) & 0xf;
> if (family == 6 || family == 0xf)
> cpu_model += ((fms >> 16) & 0xf) << 4;
> +
> + cpu_stepping = fms & 0xf;
> +
> + /* only three CascadeLake-N models are supported */
> + if (is_clx_n_platform()) {
> + FILE *fp;
> + size_t n;
> + char *line;
Need n = 0 and *line = NULL here as getline() will require if it has to
allocate.

Anyway I will update the patchset and post after test.

Thanks,
Srinivas
> + int ret = 1;
> +
> + fp = fopen("/proc/cpuinfo", "r");
> + if (!fp)
> + err(-1, "cannot open /proc/cpuinfo\n");
> +
> + while (getline(&line, &n, fp) > 0) {
> + if (strstr(line, "model name")) {
> + if (strstr(line, "6252N") ||
> + strstr(line, "6230N") ||
> + strstr(line, "5218N"))
> + ret = 0;
> + break;
> + }
> + }
> + free(line);
> + fclose(fp);
> + return ret;
> + }
> + return 0;
> }
>
> /* Open a file, and exit on failure */
> @@ -1889,7 +1927,9 @@ static void cmdline(int argc, char **argv)
> fprintf(stderr, "Feature name and|or command not
> specified\n");
> exit(0);
> }
> - update_cpu_model();
> + ret = update_cpu_model();
> + if (ret)
> + err(-1, "Invalid CPU model (%d)\n", cpu_model);
> printf("Intel(R) Speed Select Technology\n");
> printf("Executing on CPU model:%d[0x%x]\n", cpu_model,
> cpu_model);
> set_max_cpu_num();

2019-10-04 17:21:38

by Prarit Bhargava

[permalink] [raw]
Subject: Re: [PATCH v2 3/7] intel-speed-select: Add check for CascadeLake-N models



On 10/4/19 1:15 PM, Srinivas Pandruvada wrote:
> On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:
>> Three CascadeLake-N models (6252N, 6230N, and 5218N) have SST-PBF
>> support.
>>
>> Return an error if the CascadeLake processor is not one of these
>> specific
>> models.
>>
> This patch sigfaults immediately on CLX.>
>> v2: Add is_clx_n_platform()
>>
>> Signed-off-by: Prarit Bhargava <[email protected]>
>> ---
>> .../x86/intel-speed-select/isst-config.c | 44
>> ++++++++++++++++++-
>> 1 file changed, 42 insertions(+), 2 deletions(-)
>>
>> diff --git a/tools/power/x86/intel-speed-select/isst-config.c
>> b/tools/power/x86/intel-speed-select/isst-config.c
>> index f4a23678416e..734a7960458c 100644
>> --- a/tools/power/x86/intel-speed-select/isst-config.c
>> +++ b/tools/power/x86/intel-speed-select/isst-config.c
>> @@ -23,6 +23,7 @@ static int debug_flag;
>> static FILE *outf;
>>
>> static int cpu_model;
>> +static int cpu_stepping;
>>
>> #define MAX_CPUS_IN_ONE_REQ 64
>> static short max_target_cpus;
>> @@ -72,7 +73,16 @@ void debug_printf(const char *format, ...)
>> va_end(args);
>> }
>>
>> -static void update_cpu_model(void)
>> +
>> +int is_clx_n_platform(void)
>> +{
>> + if (cpu_model == 0x55)
>> + if (cpu_stepping == 0x6 || cpu_stepping == 0x7)
>> + return 1;
>> + return 0;
>> +}
>> +
>> +static int update_cpu_model(void)
>> {
>> unsigned int ebx, ecx, edx;
>> unsigned int fms, family;
>> @@ -82,6 +92,34 @@ static void update_cpu_model(void)
>> cpu_model = (fms >> 4) & 0xf;
>> if (family == 6 || family == 0xf)
>> cpu_model += ((fms >> 16) & 0xf) << 4;
>> +
>> + cpu_stepping = fms & 0xf;
>> +
>> + /* only three CascadeLake-N models are supported */
>> + if (is_clx_n_platform()) {
>> + FILE *fp;
>> + size_t n;
>> + char *line;
> Need n = 0 and *line = NULL here as getline() will require if it has to
> allocate.

Odd, I ran multiple tests and never hit the segfault :(. Thanks for fixing.

P.

>
> Anyway I will update the patchset and post after test.
>

> Thanks,
> Srinivas
>> + int ret = 1;
>> +
>> + fp = fopen("/proc/cpuinfo", "r");
>> + if (!fp)
>> + err(-1, "cannot open /proc/cpuinfo\n");
>> +
>> + while (getline(&line, &n, fp) > 0) {
>> + if (strstr(line, "model name")) {
>> + if (strstr(line, "6252N") ||
>> + strstr(line, "6230N") ||
>> + strstr(line, "5218N"))
>> + ret = 0;
>> + break;
>> + }
>> + }
>> + free(line);
>> + fclose(fp);
>> + return ret;
>> + }
>> + return 0;
>> }
>>
>> /* Open a file, and exit on failure */
>> @@ -1889,7 +1927,9 @@ static void cmdline(int argc, char **argv)
>> fprintf(stderr, "Feature name and|or command not
>> specified\n");
>> exit(0);
>> }
>> - update_cpu_model();
>> + ret = update_cpu_model();
>> + if (ret)
>> + err(-1, "Invalid CPU model (%d)\n", cpu_model);
>> printf("Intel(R) Speed Select Technology\n");
>> printf("Executing on CPU model:%d[0x%x]\n", cpu_model,
>> cpu_model);
>> set_max_cpu_num();
>

2019-10-04 17:25:23

by srinivas pandruvada

[permalink] [raw]
Subject: Re: [PATCH v2 6/7] intel-speed-select: Implement 'perf-profile info' on CascadeLake-N

On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:
> Add functionality for perf-profile info on CascadeLake-N.
>

This results in
#intel-speed-select perf-profile info
Intel(R) Speed Select Technology
Executing on CPU model:85[0x55]
intel-speed-select:
/sys/devices/system/cpu/cpu40/cpufreq/base_frequency: open failed: No
such file or directory

Let me fix this.

Also the previous crash was also for this v2 series.

Thanks,
Srinivas

> Signed-off-by: Prarit Bhargava <[email protected]>
> ---
> .../x86/intel-speed-select/isst-config.c | 20 +++++++++++++++
> ----
> .../x86/intel-speed-select/isst-display.c | 12 +++++++++++
> tools/power/x86/intel-speed-select/isst.h | 1 +
> 3 files changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/tools/power/x86/intel-speed-select/isst-config.c
> b/tools/power/x86/intel-speed-select/isst-config.c
> index 3ab0edade5ec..d9b580139a07 100644
> --- a/tools/power/x86/intel-speed-select/isst-config.c
> +++ b/tools/power/x86/intel-speed-select/isst-config.c
> @@ -836,6 +836,12 @@ static void clx_n_config(void)
> ctdp_level->fact_enabled = 0;
> }
>
> +static void dump_cn_config_for_cpu(int cpu, void *arg1, void *arg2,
> + void *arg3, void *arg4)
> +{
> + isst_ctdp_display_information(cpu, outf, tdp_level,
> &clx_n_pkg_dev);
> +}
> +
> static void dump_isst_config_for_cpu(int cpu, void *arg1, void
> *arg2,
> void *arg3, void *arg4)
> {
> @@ -854,6 +860,8 @@ static void dump_isst_config_for_cpu(int cpu,
> void *arg1, void *arg2,
>
> static void dump_isst_config(int arg)
> {
> + void *fn;
> +
> if (cmd_help) {
> fprintf(stderr,
> "Print Intel(R) Speed Select Technology
> Performance profile configuration\n");
> @@ -865,14 +873,17 @@ static void dump_isst_config(int arg)
> exit(0);
> }
>
> + if (!is_clx_n_platform())
> + fn = dump_isst_config_for_cpu;
> + else
> + fn = dump_cn_config_for_cpu;
> +
> isst_ctdp_display_information_start(outf);
>
> if (max_target_cpus)
> - for_each_online_target_cpu_in_set(dump_isst_config_for_
> cpu,
> - NULL, NULL, NULL,
> NULL);
> + for_each_online_target_cpu_in_set(fn, NULL, NULL, NULL,
> NULL);
> else
> - for_each_online_package_in_set(dump_isst_config_for_cpu
> , NULL,
> - NULL, NULL, NULL);
> + for_each_online_package_in_set(fn, NULL, NULL, NULL,
> NULL);
>
> isst_ctdp_display_information_end(outf);
> }
> @@ -1633,6 +1644,7 @@ static void get_clos_assoc(int arg)
> }
>
> static struct process_cmd_struct clx_n_cmds[] = {
> + { "perf-profile", "info", dump_isst_config, 0 },
> { NULL, NULL, NULL, 0 }
> };
>
> diff --git a/tools/power/x86/intel-speed-select/isst-display.c
> b/tools/power/x86/intel-speed-select/isst-display.c
> index 1caa7ae25245..8309810e7425 100644
> --- a/tools/power/x86/intel-speed-select/isst-display.c
> +++ b/tools/power/x86/intel-speed-select/isst-display.c
> @@ -202,6 +202,9 @@ static void _isst_pbf_display_information(int
> cpu, FILE *outf, int level,
> pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
> format_and_print(outf, disp_level + 1, header, value);
>
> + if (is_clx_n_platform())
> + return;
> +
> snprintf(header, sizeof(header), "tjunction-temperature(C)");
> snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
> format_and_print(outf, disp_level + 1, header, value);
> @@ -375,6 +378,15 @@ void isst_ctdp_display_information(int cpu, FILE
> *outf, int tdp_level,
> snprintf(value, sizeof(value), "unsupported");
> format_and_print(outf, base_level + 4, header, value);
>
> + if (is_clx_n_platform()) {
> + if (ctdp_level->pbf_support)
> + _isst_pbf_display_information(cpu,
> outf,
> + tdp_level
> ,
> + &ctdp_level-
> >pbf_info,
> + base_leve
> l + 4);
> + continue;
> + }
> +
> snprintf(header, sizeof(header), "thermal-design-
> power(W)");
> snprintf(value, sizeof(value), "%d", ctdp_level-
> >pkg_tdp);
> format_and_print(outf, base_level + 4, header, value);
> diff --git a/tools/power/x86/intel-speed-select/isst.h
> b/tools/power/x86/intel-speed-select/isst.h
> index 0dcae17b3945..bef27bd6138e 100644
> --- a/tools/power/x86/intel-speed-select/isst.h
> +++ b/tools/power/x86/intel-speed-select/isst.h
> @@ -239,4 +239,5 @@ extern void isst_display_result(int cpu, FILE
> *outf, char *feature, char *cmd,
> extern int isst_clos_get_clos_information(int cpu, int *enable, int
> *type);
> extern void isst_clos_display_clos_information(int cpu, FILE *outf,
> int clos_enable, int
> type);
> +extern int is_clx_n_platform(void);
> #endif

2019-10-04 17:35:05

by srinivas pandruvada

[permalink] [raw]
Subject: Re: [PATCH v2 6/7] intel-speed-select: Implement 'perf-profile info' on CascadeLake-N

On Fri, 2019-10-04 at 10:23 -0700, Srinivas Pandruvada wrote:
> On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:
> > Add functionality for perf-profile info on CascadeLake-N.
> >
>
> This results in
> #intel-speed-select perf-profile info
> Intel(R) Speed Select Technology
> Executing on CPU model:85[0x55]
> intel-speed-select:
> /sys/devices/system/cpu/cpu40/cpufreq/base_frequency: open failed: No
> such file or directory
>
> Let me fix this.
>
> Also the previous crash was also for this v2 series.
>

After fix

intel-speed-select perf-profile info
Intel(R) Speed Select Technology
Executing on CPU model:85[0x55]
package-0
die-0
cpu-0
perf-profile-level-0
cpu-count:20
enable-cpu-mask:00000000,00000000
enable-cpu-list:none
thermal-design-power-ratio:23
base-frequency(MHz):2300
speed-select-turbo-freq:unsupported
speed-select-base-freq:enabled
speed-select-base-freq
high-priority-base-frequency(MHz):2700000
high-priority-cpu-mask:0000000e,8c00e8c0
high-priority-cpu-list:6,7,11,13,14,15,26,27,31,33,34,35
low-priority-base-frequency(MHz):2100000
package-1
die-0
cpu-20
perf-profile-level-0
cpu-count:20
enable-cpu-mask:00000000,00000000
enable-cpu-list:none
thermal-design-power-ratio:23
base-frequency(MHz):2300
speed-select-turbo-freq:unsupported
speed-select-base-freq:enabled
speed-select-base-freq
high-priority-base-frequency(MHz):2700000
high-priority-cpu-mask:0000000e,8c00e8c0
high-priority-cpu-list:6,7,11,13,14,15,26,27,31,33,34,35
low-priority-base-frequency(MHz):2100000

The display for enable-cpu-mask should be all 1 for all present CPUs.
I will address this.

Thanks,
Srinivas

> Thanks,
> Srinivas
>
> > Signed-off-by: Prarit Bhargava <[email protected]>
> > ---
> > .../x86/intel-speed-select/isst-config.c | 20 +++++++++++++++
> > ----
> > .../x86/intel-speed-select/isst-display.c | 12 +++++++++++
> > tools/power/x86/intel-speed-select/isst.h | 1 +
> > 3 files changed, 29 insertions(+), 4 deletions(-)
> >
> > diff --git a/tools/power/x86/intel-speed-select/isst-config.c
> > b/tools/power/x86/intel-speed-select/isst-config.c
> > index 3ab0edade5ec..d9b580139a07 100644
> > --- a/tools/power/x86/intel-speed-select/isst-config.c
> > +++ b/tools/power/x86/intel-speed-select/isst-config.c
> > @@ -836,6 +836,12 @@ static void clx_n_config(void)
> > ctdp_level->fact_enabled = 0;
> > }
> >
> > +static void dump_cn_config_for_cpu(int cpu, void *arg1, void
> > *arg2,
> > + void *arg3, void *arg4)
> > +{
> > + isst_ctdp_display_information(cpu, outf, tdp_level,
> > &clx_n_pkg_dev);
> > +}
> > +
> > static void dump_isst_config_for_cpu(int cpu, void *arg1, void
> > *arg2,
> > void *arg3, void *arg4)
> > {
> > @@ -854,6 +860,8 @@ static void dump_isst_config_for_cpu(int cpu,
> > void *arg1, void *arg2,
> >
> > static void dump_isst_config(int arg)
> > {
> > + void *fn;
> > +
> > if (cmd_help) {
> > fprintf(stderr,
> > "Print Intel(R) Speed Select Technology
> > Performance profile configuration\n");
> > @@ -865,14 +873,17 @@ static void dump_isst_config(int arg)
> > exit(0);
> > }
> >
> > + if (!is_clx_n_platform())
> > + fn = dump_isst_config_for_cpu;
> > + else
> > + fn = dump_cn_config_for_cpu;
> > +
> > isst_ctdp_display_information_start(outf);
> >
> > if (max_target_cpus)
> > - for_each_online_target_cpu_in_set(dump_isst_config_for_
> > cpu,
> > - NULL, NULL, NULL,
> > NULL);
> > + for_each_online_target_cpu_in_set(fn, NULL, NULL, NULL,
> > NULL);
> > else
> > - for_each_online_package_in_set(dump_isst_config_for_cpu
> > , NULL,
> > - NULL, NULL, NULL);
> > + for_each_online_package_in_set(fn, NULL, NULL, NULL,
> > NULL);
> >
> > isst_ctdp_display_information_end(outf);
> > }
> > @@ -1633,6 +1644,7 @@ static void get_clos_assoc(int arg)
> > }
> >
> > static struct process_cmd_struct clx_n_cmds[] = {
> > + { "perf-profile", "info", dump_isst_config, 0 },
> > { NULL, NULL, NULL, 0 }
> > };
> >
> > diff --git a/tools/power/x86/intel-speed-select/isst-display.c
> > b/tools/power/x86/intel-speed-select/isst-display.c
> > index 1caa7ae25245..8309810e7425 100644
> > --- a/tools/power/x86/intel-speed-select/isst-display.c
> > +++ b/tools/power/x86/intel-speed-select/isst-display.c
> > @@ -202,6 +202,9 @@ static void _isst_pbf_display_information(int
> > cpu, FILE *outf, int level,
> > pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
> > format_and_print(outf, disp_level + 1, header, value);
> >
> > + if (is_clx_n_platform())
> > + return;
> > +
> > snprintf(header, sizeof(header), "tjunction-temperature(C)");
> > snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
> > format_and_print(outf, disp_level + 1, header, value);
> > @@ -375,6 +378,15 @@ void isst_ctdp_display_information(int cpu,
> > FILE
> > *outf, int tdp_level,
> > snprintf(value, sizeof(value), "unsupported");
> > format_and_print(outf, base_level + 4, header, value);
> >
> > + if (is_clx_n_platform()) {
> > + if (ctdp_level->pbf_support)
> > + _isst_pbf_display_information(cpu,
> > outf,
> > + tdp_level
> > ,
> > + &ctdp_level-
> > > pbf_info,
> >
> > + base_leve
> > l + 4);
> > + continue;
> > + }
> > +
> > snprintf(header, sizeof(header), "thermal-design-
> > power(W)");
> > snprintf(value, sizeof(value), "%d", ctdp_level-
> > > pkg_tdp);
> >
> > format_and_print(outf, base_level + 4, header, value);
> > diff --git a/tools/power/x86/intel-speed-select/isst.h
> > b/tools/power/x86/intel-speed-select/isst.h
> > index 0dcae17b3945..bef27bd6138e 100644
> > --- a/tools/power/x86/intel-speed-select/isst.h
> > +++ b/tools/power/x86/intel-speed-select/isst.h
> > @@ -239,4 +239,5 @@ extern void isst_display_result(int cpu, FILE
> > *outf, char *feature, char *cmd,
> > extern int isst_clos_get_clos_information(int cpu, int *enable,
> > int
> > *type);
> > extern void isst_clos_display_clos_information(int cpu, FILE
> > *outf,
> > int clos_enable, int
> > type);
> > +extern int is_clx_n_platform(void);
> > #endif

2019-10-04 20:16:31

by srinivas pandruvada

[permalink] [raw]
Subject: Re: [PATCH v2 6/7] intel-speed-select: Implement 'perf-profile info' on CascadeLake-N

On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:
> Add functionality for perf-profile info on CascadeLake-N.
Also the display is not correct. It will show redundant info for both
packages.

#intel-speed-select perf-profile info
Intel(R) Speed Select Technology
Executing on CPU model:85[0x55]
package-0
die-0
cpu-0
perf-profile-level-0
cpu-count:20
enable-cpu-mask:00000000,00000000
enable-cpu-list:none
thermal-design-power-ratio:23
base-frequency(MHz):2300
speed-select-turbo-freq:unsupported
speed-select-base-freq:enabled
speed-select-base-freq
high-priority-base-frequency(MHz):2700000
high-priority-cpu-mask:0000000e,8c00e8c0
high-priority-cpu-list:6,7,11,13,14,15,26,27,31,33,34,35
low-priority-base-frequency(MHz):2100000
package-1
die-0
cpu-20
perf-profile-level-0
cpu-count:20
enable-cpu-mask:00000000,00000000
enable-cpu-list:none
thermal-design-power-ratio:23
base-frequency(MHz):2300
speed-select-turbo-freq:unsupported
speed-select-base-freq:enabled
speed-select-base-freq
high-priority-base-frequency(MHz):2700000
high-priority-cpu-mask:0000000e,8c00e8c0
high-priority-cpu-list:6,7,11,13,14,15,26,27,31,33,34,35
low-priority-base-frequency(MHz):2100000

Thanks,
Srinivas

>
> Signed-off-by: Prarit Bhargava <[email protected]>
> ---
> .../x86/intel-speed-select/isst-config.c | 20 +++++++++++++++
> ----
> .../x86/intel-speed-select/isst-display.c | 12 +++++++++++
> tools/power/x86/intel-speed-select/isst.h | 1 +
> 3 files changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/tools/power/x86/intel-speed-select/isst-config.c
> b/tools/power/x86/intel-speed-select/isst-config.c
> index 3ab0edade5ec..d9b580139a07 100644
> --- a/tools/power/x86/intel-speed-select/isst-config.c
> +++ b/tools/power/x86/intel-speed-select/isst-config.c
> @@ -836,6 +836,12 @@ static void clx_n_config(void)
> ctdp_level->fact_enabled = 0;
> }
>
> +static void dump_cn_config_for_cpu(int cpu, void *arg1, void *arg2,
> + void *arg3, void *arg4)
> +{
> + isst_ctdp_display_information(cpu, outf, tdp_level,
> &clx_n_pkg_dev);
> +}
> +
> static void dump_isst_config_for_cpu(int cpu, void *arg1, void
> *arg2,
> void *arg3, void *arg4)
> {
> @@ -854,6 +860,8 @@ static void dump_isst_config_for_cpu(int cpu,
> void *arg1, void *arg2,
>
> static void dump_isst_config(int arg)
> {
> + void *fn;
> +
> if (cmd_help) {
> fprintf(stderr,
> "Print Intel(R) Speed Select Technology
> Performance profile configuration\n");
> @@ -865,14 +873,17 @@ static void dump_isst_config(int arg)
> exit(0);
> }
>
> + if (!is_clx_n_platform())
> + fn = dump_isst_config_for_cpu;
> + else
> + fn = dump_cn_config_for_cpu;
> +
> isst_ctdp_display_information_start(outf);
>
> if (max_target_cpus)
> - for_each_online_target_cpu_in_set(dump_isst_config_for_
> cpu,
> - NULL, NULL, NULL,
> NULL);
> + for_each_online_target_cpu_in_set(fn, NULL, NULL, NULL,
> NULL);
> else
> - for_each_online_package_in_set(dump_isst_config_for_cpu
> , NULL,
> - NULL, NULL, NULL);
> + for_each_online_package_in_set(fn, NULL, NULL, NULL,
> NULL);
>
> isst_ctdp_display_information_end(outf);
> }
> @@ -1633,6 +1644,7 @@ static void get_clos_assoc(int arg)
> }
>
> static struct process_cmd_struct clx_n_cmds[] = {
> + { "perf-profile", "info", dump_isst_config, 0 },
> { NULL, NULL, NULL, 0 }
> };
>
> diff --git a/tools/power/x86/intel-speed-select/isst-display.c
> b/tools/power/x86/intel-speed-select/isst-display.c
> index 1caa7ae25245..8309810e7425 100644
> --- a/tools/power/x86/intel-speed-select/isst-display.c
> +++ b/tools/power/x86/intel-speed-select/isst-display.c
> @@ -202,6 +202,9 @@ static void _isst_pbf_display_information(int
> cpu, FILE *outf, int level,
> pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
> format_and_print(outf, disp_level + 1, header, value);
>
> + if (is_clx_n_platform())
> + return;
> +
> snprintf(header, sizeof(header), "tjunction-temperature(C)");
> snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
> format_and_print(outf, disp_level + 1, header, value);
> @@ -375,6 +378,15 @@ void isst_ctdp_display_information(int cpu, FILE
> *outf, int tdp_level,
> snprintf(value, sizeof(value), "unsupported");
> format_and_print(outf, base_level + 4, header, value);
>
> + if (is_clx_n_platform()) {
> + if (ctdp_level->pbf_support)
> + _isst_pbf_display_information(cpu,
> outf,
> + tdp_level
> ,
> + &ctdp_level-
> >pbf_info,
> + base_leve
> l + 4);
> + continue;
> + }
> +
> snprintf(header, sizeof(header), "thermal-design-
> power(W)");
> snprintf(value, sizeof(value), "%d", ctdp_level-
> >pkg_tdp);
> format_and_print(outf, base_level + 4, header, value);
> diff --git a/tools/power/x86/intel-speed-select/isst.h
> b/tools/power/x86/intel-speed-select/isst.h
> index 0dcae17b3945..bef27bd6138e 100644
> --- a/tools/power/x86/intel-speed-select/isst.h
> +++ b/tools/power/x86/intel-speed-select/isst.h
> @@ -239,4 +239,5 @@ extern void isst_display_result(int cpu, FILE
> *outf, char *feature, char *cmd,
> extern int isst_clos_get_clos_information(int cpu, int *enable, int
> *type);
> extern void isst_clos_display_clos_information(int cpu, FILE *outf,
> int clos_enable, int
> type);
> +extern int is_clx_n_platform(void);
> #endif

2019-10-07 10:04:18

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 3/7] intel-speed-select: Add check for CascadeLake-N models

On Fri, Oct 04, 2019 at 10:15:21AM -0700, Srinivas Pandruvada wrote:
> On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:

> > + /* only three CascadeLake-N models are supported */
> > + if (is_clx_n_platform()) {
> > + FILE *fp;
> > + size_t n;
> > + char *line;
> Need n = 0 and *line = NULL here as getline() will require if it has to
> allocate.

Good catch and thus...

> > + int ret = 1;
> > +
> > + fp = fopen("/proc/cpuinfo", "r");
> > + if (!fp)
> > + err(-1, "cannot open /proc/cpuinfo\n");
> > +
> > + while (getline(&line, &n, fp) > 0) {

> > + if (strstr(line, "model name")) {
> > + if (strstr(line, "6252N") ||
> > + strstr(line, "6230N") ||
> > + strstr(line, "5218N"))
> > + ret = 0;
> > + break;
> > + }

Missed free(line) here.

> > + }
> > + free(line);
> > + fclose(fp);
> > + return ret;
> > + }
> > + return 0;
> > }
> >
> > /* Open a file, and exit on failure */
> > @@ -1889,7 +1927,9 @@ static void cmdline(int argc, char **argv)
> > fprintf(stderr, "Feature name and|or command not
> > specified\n");
> > exit(0);
> > }
> > - update_cpu_model();
> > + ret = update_cpu_model();
> > + if (ret)
> > + err(-1, "Invalid CPU model (%d)\n", cpu_model);
> > printf("Intel(R) Speed Select Technology\n");
> > printf("Executing on CPU model:%d[0x%x]\n", cpu_model,
> > cpu_model);
> > set_max_cpu_num();
>

--
With Best Regards,
Andy Shevchenko


2019-10-07 19:18:50

by srinivas pandruvada

[permalink] [raw]
Subject: Re: [PATCH v2 3/7] intel-speed-select: Add check for CascadeLake-N models

On Mon, 2019-10-07 at 13:03 +0300, Andy Shevchenko wrote:
> On Fri, Oct 04, 2019 at 10:15:21AM -0700, Srinivas Pandruvada wrote:
> > On Thu, 2019-10-03 at 08:11 -0400, Prarit Bhargava wrote:
> > > + /* only three CascadeLake-N models are supported */
> > > + if (is_clx_n_platform()) {
> > > + FILE *fp;
> > > + size_t n;
> > > + char *line;
> >
> > Need n = 0 and *line = NULL here as getline() will require if it
> > has to
> > allocate.
>
> Good catch and thus...
>
> > > + int ret = 1;
> > > +
> > > + fp = fopen("/proc/cpuinfo", "r");
> > > + if (!fp)
> > > + err(-1, "cannot open /proc/cpuinfo\n");
> > > +
> > > + while (getline(&line, &n, fp) > 0) {
> > > + if (strstr(line, "model name")) {
> > > + if (strstr(line, "6252N") ||
> > > + strstr(line, "6230N") ||
> > > + strstr(line, "5218N"))
> > > + ret = 0;
> > > + break;
> > > + }
>
> Missed free(line) here.
This may not be required. After the first call geline() allocated a
buffer and will reuse it during next call. If it is not enough it will
realloc even if the buffer is passed by user via malloc().

From man page:

"
If *lineptr is set to NULL and *n is set 0 before the call, then
getline() will allocate a buffer for storing the line. This
buffer
should be freed by the user program even if getline() failed.

Alternatively, before calling getline(), *lineptr can contain a
pointer to a malloc(3)-allocated buffer *n bytes in size. If
the
buffer is not large enough to hold the line, getline() resizes
it
with realloc(3), updating *lineptr and *n as necessary.

In either case, on a successful call, *lineptr and *n will be
updated
to reflect the buffer address and allocated size respectively.
"

>
> > > + }
> > > + free(line);
> > > + fclose(fp);
> > > + return ret;
> > > + }
> > > + return 0;
> > > }
> > >
> > > /* Open a file, and exit on failure */
> > > @@ -1889,7 +1927,9 @@ static void cmdline(int argc, char **argv)
> > > fprintf(stderr, "Feature name and|or command not
> > > specified\n");
> > > exit(0);
> > > }
> > > - update_cpu_model();
> > > + ret = update_cpu_model();
> > > + if (ret)
> > > + err(-1, "Invalid CPU model (%d)\n", cpu_model);
> > > printf("Intel(R) Speed Select Technology\n");
> > > printf("Executing on CPU model:%d[0x%x]\n", cpu_model,
> > > cpu_model);
> > > set_max_cpu_num();
>
>