arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / tools / power / cpupower / utils / cpuidle-set.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include <unistd.h>
3 #include <stdio.h>
4 #include <errno.h>
5 #include <stdlib.h>
6 #include <limits.h>
7 #include <string.h>
8 #include <ctype.h>
9 #include <getopt.h>
10
11 #include <cpufreq.h>
12 #include <cpuidle.h>
13
14 #include "helpers/helpers.h"
15
16 static struct option info_opts[] = {
17      {"disable",        required_argument,              NULL, 'd'},
18      {"enable",         required_argument,              NULL, 'e'},
19      {"disable-by-latency", required_argument,          NULL, 'D'},
20      {"enable-all",     no_argument,                    NULL, 'E'},
21      { },
22 };
23
24
25 int cmd_idle_set(int argc, char **argv)
26 {
27         extern char *optarg;
28         extern int optind, opterr, optopt;
29         int ret = 0, cont = 1, param = 0, disabled;
30         unsigned long long latency = 0, state_latency;
31         unsigned int cpu = 0, idlestate = 0, idlestates = 0;
32         char *endptr;
33
34         do {
35                 ret = getopt_long(argc, argv, "d:e:ED:", info_opts, NULL);
36                 if (ret == -1)
37                         break;
38                 switch (ret) {
39                 case '?':
40                         param = '?';
41                         cont = 0;
42                         break;
43                 case 'd':
44                 case 'e':
45                         if (param) {
46                                 param = -1;
47                                 cont = 0;
48                                 break;
49                         }
50                         param = ret;
51                         strtol(optarg, &endptr, 10);
52                         if (*endptr != '\0') {
53                                 printf(_("Bad value: %s, Integer expected\n"), optarg);
54                                 exit(EXIT_FAILURE);
55                         } else {
56                                 idlestate = atoi(optarg);
57                         }
58                         break;
59                 case 'D':
60                         if (param) {
61                                 param = -1;
62                                 cont = 0;
63                                 break;
64                         }
65                         param = ret;
66                         latency = strtoull(optarg, &endptr, 10);
67                         if (*endptr != '\0') {
68                                 printf(_("Bad latency value: %s\n"), optarg);
69                                 exit(EXIT_FAILURE);
70                         }
71                         break;
72                 case 'E':
73                         if (param) {
74                                 param = -1;
75                                 cont = 0;
76                                 break;
77                         }
78                         param = ret;
79                         break;
80                 case -1:
81                         cont = 0;
82                         break;
83                 }
84         } while (cont);
85
86         switch (param) {
87         case -1:
88                 printf(_("You can't specify more than one "
89                          "output-specific argument\n"));
90                 exit(EXIT_FAILURE);
91         case '?':
92                 printf(_("invalid or unknown argument\n"));
93                 exit(EXIT_FAILURE);
94         }
95
96         get_cpustate();
97
98         /* Default is: set all CPUs */
99         if (bitmask_isallclear(cpus_chosen))
100                 bitmask_setall(cpus_chosen);
101
102         for (cpu = bitmask_first(cpus_chosen);
103              cpu <= bitmask_last(cpus_chosen); cpu++) {
104
105                 if (!bitmask_isbitset(cpus_chosen, cpu))
106                         continue;
107
108                 if (cpupower_is_cpu_online(cpu) != 1)
109                         continue;
110
111                 idlestates = cpuidle_state_count(cpu);
112                 if (idlestates <= 0)
113                         continue;
114
115                 switch (param) {
116                 case 'd':
117                         ret = cpuidle_state_disable(cpu, idlestate, 1);
118                         if (ret == 0)
119                 printf(_("Idlestate %u disabled on CPU %u\n"),  idlestate, cpu);
120                         else if (ret == -1)
121                 printf(_("Idlestate %u not available on CPU %u\n"),
122                        idlestate, cpu);
123                         else if (ret == -2)
124                 printf(_("Idlestate disabling not supported by kernel\n"));
125                         else
126                 printf(_("Idlestate %u not disabled on CPU %u\n"),
127                        idlestate, cpu);
128                         break;
129                 case 'e':
130                         ret = cpuidle_state_disable(cpu, idlestate, 0);
131                         if (ret == 0)
132                 printf(_("Idlestate %u enabled on CPU %u\n"),  idlestate, cpu);
133                         else if (ret == -1)
134                 printf(_("Idlestate %u not available on CPU %u\n"),
135                        idlestate, cpu);
136                         else if (ret == -2)
137                 printf(_("Idlestate enabling not supported by kernel\n"));
138                         else
139                 printf(_("Idlestate %u not enabled on CPU %u\n"),
140                        idlestate, cpu);
141                         break;
142                 case 'D':
143                         for (idlestate = 0; idlestate < idlestates; idlestate++) {
144                                 disabled = cpuidle_is_state_disabled
145                                         (cpu, idlestate);
146                                 state_latency = cpuidle_state_latency
147                                         (cpu, idlestate);
148                                 if (disabled == 1) {
149                                         if (latency > state_latency){
150                                                 ret = cpuidle_state_disable
151                                                         (cpu, idlestate, 0);
152                                                 if (ret == 0)
153                 printf(_("Idlestate %u enabled on CPU %u\n"),  idlestate, cpu);
154                                         }
155                                         continue;
156                                 }
157                                 if (latency <= state_latency){
158                                         ret = cpuidle_state_disable
159                                                 (cpu, idlestate, 1);
160                                         if (ret == 0)
161                 printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu);
162                                 }
163                         }
164                         break;
165                 case 'E':
166                         for (idlestate = 0; idlestate < idlestates; idlestate++) {
167                                 disabled = cpuidle_is_state_disabled
168                                         (cpu, idlestate);
169                                 if (disabled == 1) {
170                                         ret = cpuidle_state_disable
171                                                 (cpu, idlestate, 0);
172                                         if (ret == 0)
173                 printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu);
174                                 }
175                         }
176                         break;
177                 default:
178                         /* Not reachable with proper args checking */
179                         printf(_("Invalid or unknown argument\n"));
180                         exit(EXIT_FAILURE);
181                         break;
182                 }
183         }
184
185         print_offline_cpus();
186         return EXIT_SUCCESS;
187 }