Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / tools / power / cpupower / bench / main.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*  cpufreq-bench CPUFreq microbenchmark
3  *
4  *  Copyright (C) 2008 Christian Kornacker <ckornacker@suse.de>
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <getopt.h>
12 #include <errno.h>
13
14 #include "config.h"
15 #include "system.h"
16 #include "benchmark.h"
17
18 static struct option long_options[] = {
19         {"output",      1,      0,      'o'},
20         {"sleep",       1,      0,      's'},
21         {"load",        1,      0,      'l'},
22         {"verbose",     0,      0,      'v'},
23         {"cpu",         1,      0,      'c'},
24         {"governor",    1,      0,      'g'},
25         {"prio",        1,      0,      'p'},
26         {"file",        1,      0,      'f'},
27         {"cycles",      1,      0,      'n'},
28         {"rounds",      1,      0,      'r'},
29         {"load-step",   1,      0,      'x'},
30         {"sleep-step",  1,      0,      'y'},
31         {"help",        0,      0,      'h'},
32         {0, 0, 0, 0}
33 };
34
35 /*******************************************************************
36  usage
37 *******************************************************************/
38
39 void usage()
40 {
41         printf("usage: ./bench\n");
42         printf("Options:\n");
43         printf(" -l, --load=<long int>\t\tinitial load time in us\n");
44         printf(" -s, --sleep=<long int>\t\tinitial sleep time in us\n");
45         printf(" -x, --load-step=<long int>\ttime to be added to load time, in us\n");
46         printf(" -y, --sleep-step=<long int>\ttime to be added to sleep time, in us\n");
47         printf(" -c, --cpu=<cpu #>\t\t\tCPU Nr. to use, starting at 0\n");
48         printf(" -p, --prio=<priority>\t\t\tscheduler priority, HIGH, LOW or DEFAULT\n");
49         printf(" -g, --governor=<governor>\t\tcpufreq governor to test\n");
50         printf(" -n, --cycles=<int>\t\t\tload/sleep cycles\n");
51         printf(" -r, --rounds<int>\t\t\tload/sleep rounds\n");
52         printf(" -f, --file=<configfile>\t\tconfig file to use\n");
53         printf(" -o, --output=<dir>\t\t\toutput path. Filename will be OUTPUTPATH/benchmark_TIMESTAMP.log\n");
54         printf(" -v, --verbose\t\t\t\tverbose output on/off\n");
55         printf(" -h, --help\t\t\t\tPrint this help screen\n");
56         exit(1);
57 }
58
59 /*******************************************************************
60  main
61 *******************************************************************/
62
63 int main(int argc, char **argv)
64 {
65         int c;
66         int option_index = 0;
67         struct config *config = NULL;
68
69         config = prepare_default_config();
70
71         if (config == NULL)
72                 return EXIT_FAILURE;
73
74         while (1) {
75                 c = getopt_long (argc, argv, "hg:o:s:l:vc:p:f:n:r:x:y:",
76                                 long_options, &option_index);
77                 if (c == -1)
78                         break;
79
80                 switch (c) {
81                 case 'o':
82                         if (config->output != NULL)
83                                 fclose(config->output);
84
85                         config->output = prepare_output(optarg);
86
87                         if (config->output == NULL)
88                                 return EXIT_FAILURE;
89
90                         dprintf("user output path -> %s\n", optarg);
91                         break;
92                 case 's':
93                         sscanf(optarg, "%li", &config->sleep);
94                         dprintf("user sleep time -> %s\n", optarg);
95                         break;
96                 case 'l':
97                         sscanf(optarg, "%li", &config->load);
98                         dprintf("user load time -> %s\n", optarg);
99                         break;
100                 case 'c':
101                         sscanf(optarg, "%u", &config->cpu);
102                         dprintf("user cpu -> %s\n", optarg);
103                         break;
104                 case 'g':
105                         strncpy(config->governor, optarg, 14);
106                         dprintf("user governor -> %s\n", optarg);
107                         break;
108                 case 'p':
109                         if (string_to_prio(optarg) != SCHED_ERR) {
110                                 config->prio = string_to_prio(optarg);
111                                 dprintf("user prio -> %s\n", optarg);
112                         } else {
113                                 if (config != NULL) {
114                                         if (config->output != NULL)
115                                                 fclose(config->output);
116                                         free(config);
117                                 }
118                                 usage();
119                         }
120                         break;
121                 case 'n':
122                         sscanf(optarg, "%u", &config->cycles);
123                         dprintf("user cycles -> %s\n", optarg);
124                         break;
125                 case 'r':
126                         sscanf(optarg, "%u", &config->rounds);
127                         dprintf("user rounds -> %s\n", optarg);
128                         break;
129                 case 'x':
130                         sscanf(optarg, "%li", &config->load_step);
131                         dprintf("user load_step -> %s\n", optarg);
132                         break;
133                 case 'y':
134                         sscanf(optarg, "%li", &config->sleep_step);
135                         dprintf("user sleep_step -> %s\n", optarg);
136                         break;
137                 case 'f':
138                         if (prepare_config(optarg, config))
139                                 return EXIT_FAILURE;
140                         break;
141                 case 'v':
142                         config->verbose = 1;
143                         dprintf("verbose output enabled\n");
144                         break;
145                 case 'h':
146                 case '?':
147                 default:
148                         if (config != NULL) {
149                                 if (config->output != NULL)
150                                         fclose(config->output);
151                                 free(config);
152                         }
153                         usage();
154                 }
155         }
156
157         if (config->verbose) {
158                 printf("starting benchmark with parameters:\n");
159                 printf("config:\n\t"
160                        "sleep=%li\n\t"
161                        "load=%li\n\t"
162                        "sleep_step=%li\n\t"
163                        "load_step=%li\n\t"
164                        "cpu=%u\n\t"
165                        "cycles=%u\n\t"
166                        "rounds=%u\n\t"
167                        "governor=%s\n\n",
168                        config->sleep,
169                        config->load,
170                        config->sleep_step,
171                        config->load_step,
172                        config->cpu,
173                        config->cycles,
174                        config->rounds,
175                        config->governor);
176         }
177
178         prepare_user(config);
179         prepare_system(config);
180         start_benchmark(config);
181
182         if (config->output != stdout)
183                 fclose(config->output);
184
185         free(config);
186
187         return EXIT_SUCCESS;
188 }
189