linux/tools/power/cpupower/utils/cpupower-info.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  (C) 2011 Thomas Renninger <trenn@suse.de>, Novell Inc.
   4 */
   5
   6
   7#include <unistd.h>
   8#include <stdio.h>
   9#include <stdlib.h>
  10#include <errno.h>
  11#include <string.h>
  12#include <getopt.h>
  13#include <sys/utsname.h>
  14
  15#include "helpers/helpers.h"
  16#include "helpers/sysfs.h"
  17
  18static struct option set_opts[] = {
  19     {"perf-bias", optional_argument, NULL, 'b'},
  20     { },
  21};
  22
  23static void print_wrong_arg_exit(void)
  24{
  25        printf(_("invalid or unknown argument\n"));
  26        exit(EXIT_FAILURE);
  27}
  28
  29int cmd_info(int argc, char **argv)
  30{
  31        extern char *optarg;
  32        extern int optind, opterr, optopt;
  33        unsigned int cpu;
  34        struct utsname uts;
  35
  36        union {
  37                struct {
  38                        int perf_bias:1;
  39                };
  40                int params;
  41        } params = {};
  42        int ret = 0;
  43
  44        ret = uname(&uts);
  45        if (!ret && (!strcmp(uts.machine, "ppc64le") ||
  46                     !strcmp(uts.machine, "ppc64"))) {
  47                fprintf(stderr, _("Subcommand not supported on POWER.\n"));
  48                return ret;
  49        }
  50
  51        setlocale(LC_ALL, "");
  52        textdomain(PACKAGE);
  53
  54        /* parameter parsing */
  55        while ((ret = getopt_long(argc, argv, "b", set_opts, NULL)) != -1) {
  56                switch (ret) {
  57                case 'b':
  58                        if (params.perf_bias)
  59                                print_wrong_arg_exit();
  60                        params.perf_bias = 1;
  61                        break;
  62                default:
  63                        print_wrong_arg_exit();
  64                }
  65        }
  66
  67        if (!params.params)
  68                params.params = 0x7;
  69
  70        /* Default is: show output of CPU 0 only */
  71        if (bitmask_isallclear(cpus_chosen))
  72                bitmask_setbit(cpus_chosen, 0);
  73
  74        /* Add more per cpu options here */
  75        if (!params.perf_bias)
  76                return ret;
  77
  78        if (params.perf_bias) {
  79                if (!run_as_root) {
  80                        params.perf_bias = 0;
  81                        printf(_("Intel's performance bias setting needs root privileges\n"));
  82                } else if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS)) {
  83                        printf(_("System does not support Intel's performance"
  84                                 " bias setting\n"));
  85                        params.perf_bias = 0;
  86                }
  87        }
  88
  89        /* loop over CPUs */
  90        for (cpu = bitmask_first(cpus_chosen);
  91             cpu <= bitmask_last(cpus_chosen); cpu++) {
  92
  93                if (!bitmask_isbitset(cpus_chosen, cpu))
  94                        continue;
  95
  96                printf(_("analyzing CPU %d:\n"), cpu);
  97
  98                if (sysfs_is_cpu_online(cpu) != 1){
  99                        printf(_(" *is offline\n"));
 100                        continue;
 101                }
 102
 103                if (params.perf_bias) {
 104                        ret = cpupower_intel_get_perf_bias(cpu);
 105                        if (ret < 0) {
 106                                fprintf(stderr,
 107                        _("Could not read perf-bias value[%d]\n"), ret);
 108                                exit(EXIT_FAILURE);
 109                        } else
 110                                printf(_("perf-bias: %d\n"), ret);
 111                }
 112        }
 113        return 0;
 114}
 115