115 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*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 base_cpu only */71 if (bitmask_isallclear(cpus_chosen))72 bitmask_setbit(cpus_chosen, base_cpu);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 } else110 printf(_("perf-bias: %d\n"), ret);111 }112 }113 return 0;114}115