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 } 100