Commit 3c64c81a authored by Srinivas Pandruvada's avatar Srinivas Pandruvada Committed by Andy Shevchenko

tools/power/x86/intel-speed-select: Allow online/offline based on tdp

Using enable core mask, do online offline CPUs. There is a new option
--online|-o for set-config-level.
Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
parent 44460efe
...@@ -38,6 +38,7 @@ static int fact_avx = 0xFF; ...@@ -38,6 +38,7 @@ static int fact_avx = 0xFF;
static unsigned long long fact_trl; static unsigned long long fact_trl;
static int out_format_json; static int out_format_json;
static int cmd_help; static int cmd_help;
static int force_online_offline;
/* clos related */ /* clos related */
static int current_clos = -1; static int current_clos = -1;
...@@ -138,14 +139,14 @@ int out_format_is_json(void) ...@@ -138,14 +139,14 @@ int out_format_is_json(void)
int get_physical_package_id(int cpu) int get_physical_package_id(int cpu)
{ {
return parse_int_file( return parse_int_file(
1, "/sys/devices/system/cpu/cpu%d/topology/physical_package_id", 0, "/sys/devices/system/cpu/cpu%d/topology/physical_package_id",
cpu); cpu);
} }
int get_physical_core_id(int cpu) int get_physical_core_id(int cpu)
{ {
return parse_int_file( return parse_int_file(
1, "/sys/devices/system/cpu/cpu%d/topology/core_id", cpu); 0, "/sys/devices/system/cpu/cpu%d/topology/core_id", cpu);
} }
int get_physical_die_id(int cpu) int get_physical_die_id(int cpu)
...@@ -165,6 +166,26 @@ int get_topo_max_cpus(void) ...@@ -165,6 +166,26 @@ int get_topo_max_cpus(void)
return topo_max_cpus; return topo_max_cpus;
} }
static void set_cpu_online_offline(int cpu, int state)
{
char buffer[128];
int fd;
snprintf(buffer, sizeof(buffer),
"/sys/devices/system/cpu/cpu%d/online", cpu);
fd = open(buffer, O_WRONLY);
if (fd < 0)
err(-1, "%s open failed", buffer);
if (state)
write(fd, "1\n", 2);
else
write(fd, "0\n", 2);
close(fd);
}
#define MAX_PACKAGE_COUNT 8 #define MAX_PACKAGE_COUNT 8
#define MAX_DIE_PER_PACKAGE 2 #define MAX_DIE_PER_PACKAGE 2
static void for_each_online_package_in_set(void (*callback)(int, void *, void *, static void for_each_online_package_in_set(void (*callback)(int, void *, void *,
...@@ -736,9 +757,34 @@ static void set_tdp_level_for_cpu(int cpu, void *arg1, void *arg2, void *arg3, ...@@ -736,9 +757,34 @@ static void set_tdp_level_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
ret = isst_set_tdp_level(cpu, tdp_level); ret = isst_set_tdp_level(cpu, tdp_level);
if (ret) if (ret)
perror("set_tdp_level_for_cpu"); perror("set_tdp_level_for_cpu");
else else {
isst_display_result(cpu, outf, "perf-profile", "set_tdp_level", isst_display_result(cpu, outf, "perf-profile", "set_tdp_level",
ret); ret);
if (force_online_offline) {
struct isst_pkg_ctdp_level_info ctdp_level;
int pkg_id = get_physical_package_id(cpu);
int die_id = get_physical_die_id(cpu);
fprintf(stderr, "Option is set to online/offline\n");
ctdp_level.core_cpumask_size =
alloc_cpu_set(&ctdp_level.core_cpumask);
isst_get_coremask_info(cpu, tdp_level, &ctdp_level);
if (ctdp_level.cpu_count) {
int i, max_cpus = get_topo_max_cpus();
for (i = 0; i < max_cpus; ++i) {
if (pkg_id != get_physical_package_id(i) || die_id != get_physical_die_id(i))
continue;
if (CPU_ISSET_S(i, ctdp_level.core_cpumask_size, ctdp_level.core_cpumask)) {
fprintf(stderr, "online cpu %d\n", i);
set_cpu_online_offline(i, 1);
} else {
fprintf(stderr, "offline cpu %d\n", i);
set_cpu_online_offline(i, 0);
}
}
}
}
}
} }
static void set_tdp_level(void) static void set_tdp_level(void)
...@@ -747,6 +793,8 @@ static void set_tdp_level(void) ...@@ -747,6 +793,8 @@ static void set_tdp_level(void)
fprintf(stderr, "Set Config TDP level\n"); fprintf(stderr, "Set Config TDP level\n");
fprintf(stderr, fprintf(stderr,
"\t Arguments: -l|--level : Specify tdp level\n"); "\t Arguments: -l|--level : Specify tdp level\n");
fprintf(stderr,
"\t Optional Arguments: -o | online : online/offline for the tdp level\n");
exit(0); exit(0);
} }
...@@ -1319,6 +1367,7 @@ static void parse_cmd_args(int argc, int start, char **argv) ...@@ -1319,6 +1367,7 @@ static void parse_cmd_args(int argc, int start, char **argv)
static struct option long_options[] = { static struct option long_options[] = {
{ "bucket", required_argument, 0, 'b' }, { "bucket", required_argument, 0, 'b' },
{ "level", required_argument, 0, 'l' }, { "level", required_argument, 0, 'l' },
{ "online", required_argument, 0, 'o' },
{ "trl-type", required_argument, 0, 'r' }, { "trl-type", required_argument, 0, 'r' },
{ "trl", required_argument, 0, 't' }, { "trl", required_argument, 0, 't' },
{ "help", no_argument, 0, 'h' }, { "help", no_argument, 0, 'h' },
...@@ -1335,7 +1384,7 @@ static void parse_cmd_args(int argc, int start, char **argv) ...@@ -1335,7 +1384,7 @@ static void parse_cmd_args(int argc, int start, char **argv)
option_index = start; option_index = start;
optind = start + 1; optind = start + 1;
while ((opt = getopt_long(argc, argv, "b:l:t:c:d:e:n:m:p:w:h", while ((opt = getopt_long(argc, argv, "b:l:t:c:d:e:n:m:p:w:ho",
long_options, &option_index)) != -1) { long_options, &option_index)) != -1) {
switch (opt) { switch (opt) {
case 'b': case 'b':
...@@ -1347,6 +1396,9 @@ static void parse_cmd_args(int argc, int start, char **argv) ...@@ -1347,6 +1396,9 @@ static void parse_cmd_args(int argc, int start, char **argv)
case 'l': case 'l':
tdp_level = atoi(optarg); tdp_level = atoi(optarg);
break; break;
case 'o':
force_online_offline = 1;
break;
case 't': case 't':
sscanf(optarg, "0x%llx", &fact_trl); sscanf(optarg, "0x%llx", &fact_trl);
break; break;
......
...@@ -187,6 +187,8 @@ extern int isst_send_msr_command(unsigned int cpu, unsigned int command, ...@@ -187,6 +187,8 @@ extern int isst_send_msr_command(unsigned int cpu, unsigned int command,
int write, unsigned long long *req_resp); int write, unsigned long long *req_resp);
extern int isst_get_ctdp_levels(int cpu, struct isst_pkg_ctdp *pkg_dev); extern int isst_get_ctdp_levels(int cpu, struct isst_pkg_ctdp *pkg_dev);
extern int isst_get_coremask_info(int cpu, int config_index,
struct isst_pkg_ctdp_level_info *ctdp_level);
extern int isst_get_process_ctdp(int cpu, int tdp_level, extern int isst_get_process_ctdp(int cpu, int tdp_level,
struct isst_pkg_ctdp *pkg_dev); struct isst_pkg_ctdp *pkg_dev);
extern void isst_get_process_ctdp_complete(int cpu, extern void isst_get_process_ctdp_complete(int cpu,
......
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