GNU Linux-libre 4.19.268-gnu1
[releases.git] / tools / power / cpupower / utils / cpupower-set.c
1 /*
2  *  (C) 2011 Thomas Renninger <trenn@suse.de>, Novell Inc.
3  *
4  *  Licensed under the terms of the GNU GPL License version 2.
5  */
6
7
8 #include <unistd.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <errno.h>
12 #include <string.h>
13 #include <getopt.h>
14
15 #include "helpers/helpers.h"
16 #include "helpers/sysfs.h"
17 #include "helpers/bitmask.h"
18
19 static struct option set_opts[] = {
20         {"perf-bias", required_argument, NULL, 'b'},
21         { },
22 };
23
24 static void print_wrong_arg_exit(void)
25 {
26         printf(_("invalid or unknown argument\n"));
27         exit(EXIT_FAILURE);
28 }
29
30 int cmd_set(int argc, char **argv)
31 {
32         extern char *optarg;
33         extern int optind, opterr, optopt;
34         unsigned int cpu;
35
36         union {
37                 struct {
38                         int perf_bias:1;
39                 };
40                 int params;
41         } params;
42         int perf_bias = 0;
43         int ret = 0;
44
45         setlocale(LC_ALL, "");
46         textdomain(PACKAGE);
47
48         params.params = 0;
49         /* parameter parsing */
50         while ((ret = getopt_long(argc, argv, "b:",
51                                                 set_opts, NULL)) != -1) {
52                 switch (ret) {
53                 case 'b':
54                         if (params.perf_bias)
55                                 print_wrong_arg_exit();
56                         perf_bias = atoi(optarg);
57                         if (perf_bias < 0 || perf_bias > 15) {
58                                 printf(_("--perf-bias param out "
59                                          "of range [0-%d]\n"), 15);
60                                 print_wrong_arg_exit();
61                         }
62                         params.perf_bias = 1;
63                         break;
64                 default:
65                         print_wrong_arg_exit();
66                 }
67         };
68
69         if (!params.params)
70                 print_wrong_arg_exit();
71
72         /* Default is: set all CPUs */
73         if (bitmask_isallclear(cpus_chosen))
74                 bitmask_setall(cpus_chosen);
75
76         /* loop over CPUs */
77         for (cpu = bitmask_first(cpus_chosen);
78              cpu <= bitmask_last(cpus_chosen); cpu++) {
79
80                 if (!bitmask_isbitset(cpus_chosen, cpu))
81                         continue;
82
83                 if (sysfs_is_cpu_online(cpu) != 1){
84                         fprintf(stderr, _("Cannot set values on CPU %d:"), cpu);
85                         fprintf(stderr, _(" *is offline\n"));
86                         continue;
87                 }
88
89                 if (params.perf_bias) {
90                         ret = msr_intel_set_perf_bias(cpu, perf_bias);
91                         if (ret) {
92                                 fprintf(stderr, _("Error setting perf-bias "
93                                                   "value on CPU %d\n"), cpu);
94                                 break;
95                         }
96                 }
97         }
98         return ret;
99 }