linux/tools/power/cpupower/utils/cpupower-set.c
<<
>>
Prefs
   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
  19static struct option set_opts[] = {
  20        {"perf-bias", required_argument, NULL, 'b'},
  21        { },
  22};
  23
  24static void print_wrong_arg_exit(void)
  25{
  26        printf(_("invalid or unknown argument\n"));
  27        exit(EXIT_FAILURE);
  28}
  29
  30int 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}
 100