Path: blob/master/tools/power/cpupower/utils/cpuidle-set.c
26292 views
// SPDX-License-Identifier: GPL-2.01#include <unistd.h>2#include <stdio.h>3#include <errno.h>4#include <stdlib.h>5#include <limits.h>6#include <string.h>7#include <ctype.h>8#include <getopt.h>910#include <cpufreq.h>11#include <cpuidle.h>1213#include "helpers/helpers.h"1415static struct option info_opts[] = {16{"disable", required_argument, NULL, 'd'},17{"enable", required_argument, NULL, 'e'},18{"disable-by-latency", required_argument, NULL, 'D'},19{"enable-all", no_argument, NULL, 'E'},20{ },21};222324int cmd_idle_set(int argc, char **argv)25{26extern char *optarg;27extern int optind, opterr, optopt;28int ret = 0, cont = 1, param = 0, disabled;29unsigned long long latency = 0, state_latency;30unsigned int cpu = 0, idlestate = 0, idlestates = 0;31char *endptr;3233do {34ret = getopt_long(argc, argv, "d:e:ED:", info_opts, NULL);35if (ret == -1)36break;37switch (ret) {38case '?':39param = '?';40cont = 0;41break;42case 'd':43case 'e':44if (param) {45param = -1;46cont = 0;47break;48}49param = ret;50strtol(optarg, &endptr, 10);51if (*endptr != '\0') {52printf(_("Bad value: %s, Integer expected\n"), optarg);53exit(EXIT_FAILURE);54} else {55idlestate = atoi(optarg);56}57break;58case 'D':59if (param) {60param = -1;61cont = 0;62break;63}64param = ret;65latency = strtoull(optarg, &endptr, 10);66if (*endptr != '\0') {67printf(_("Bad latency value: %s\n"), optarg);68exit(EXIT_FAILURE);69}70break;71case 'E':72if (param) {73param = -1;74cont = 0;75break;76}77param = ret;78break;79case -1:80cont = 0;81break;82}83} while (cont);8485switch (param) {86case -1:87printf(_("You can't specify more than one "88"output-specific argument\n"));89exit(EXIT_FAILURE);90case '?':91printf(_("invalid or unknown argument\n"));92exit(EXIT_FAILURE);93}9495get_cpustate();9697/* Default is: set all CPUs */98if (bitmask_isallclear(cpus_chosen))99bitmask_setall(cpus_chosen);100101for (cpu = bitmask_first(cpus_chosen);102cpu <= bitmask_last(cpus_chosen); cpu++) {103104if (!bitmask_isbitset(cpus_chosen, cpu))105continue;106107if (cpupower_is_cpu_online(cpu) != 1)108continue;109110idlestates = cpuidle_state_count(cpu);111if (idlestates <= 0)112continue;113114switch (param) {115case 'd':116ret = cpuidle_state_disable(cpu, idlestate, 1);117if (ret == 0)118printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);119else if (ret == -1)120printf(_("Idlestate %u not available on CPU %u\n"),121idlestate, cpu);122else if (ret == -2)123printf(_("Idlestate disabling not supported by kernel\n"));124else125printf(_("Idlestate %u not disabled on CPU %u\n"),126idlestate, cpu);127break;128case 'e':129ret = cpuidle_state_disable(cpu, idlestate, 0);130if (ret == 0)131printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);132else if (ret == -1)133printf(_("Idlestate %u not available on CPU %u\n"),134idlestate, cpu);135else if (ret == -2)136printf(_("Idlestate enabling not supported by kernel\n"));137else138printf(_("Idlestate %u not enabled on CPU %u\n"),139idlestate, cpu);140break;141case 'D':142for (idlestate = 0; idlestate < idlestates; idlestate++) {143disabled = cpuidle_is_state_disabled144(cpu, idlestate);145state_latency = cpuidle_state_latency146(cpu, idlestate);147if (disabled == 1) {148if (latency > state_latency){149ret = cpuidle_state_disable150(cpu, idlestate, 0);151if (ret == 0)152printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);153}154continue;155}156if (latency <= state_latency){157ret = cpuidle_state_disable158(cpu, idlestate, 1);159if (ret == 0)160printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);161}162}163break;164case 'E':165for (idlestate = 0; idlestate < idlestates; idlestate++) {166disabled = cpuidle_is_state_disabled167(cpu, idlestate);168if (disabled == 1) {169ret = cpuidle_state_disable170(cpu, idlestate, 0);171if (ret == 0)172printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);173}174}175break;176default:177/* Not reachable with proper args checking */178printf(_("Invalid or unknown argument\n"));179exit(EXIT_FAILURE);180break;181}182}183184print_offline_cpus();185return EXIT_SUCCESS;186}187188189