2011-03-30 16:30:11 +02:00
/*
* ( C ) 2011 Thomas Renninger < trenn @ suse . de > , Novell Inc .
*
* Licensed under the terms of the GNU GPL License version 2.
*/
# include <unistd.h>
# include <stdio.h>
# include <stdlib.h>
# include <errno.h>
# include <string.h>
# include <getopt.h>
# include "helpers/helpers.h"
# include "helpers/sysfs.h"
# include "helpers/bitmask.h"
static struct option set_opts [ ] = {
2015-10-23 09:52:45 +02:00
{ " perf-bias " , required_argument , NULL , ' b ' } ,
2011-03-30 16:30:11 +02:00
{ } ,
} ;
static void print_wrong_arg_exit ( void )
{
printf ( _ ( " invalid or unknown argument \n " ) ) ;
exit ( EXIT_FAILURE ) ;
}
int cmd_set ( int argc , char * * argv )
{
extern char * optarg ;
extern int optind , opterr , optopt ;
unsigned int cpu ;
union {
struct {
int perf_bias : 1 ;
} ;
int params ;
} params ;
2014-05-13 12:41:45 +02:00
int perf_bias = 0 ;
2011-03-30 16:30:11 +02:00
int ret = 0 ;
setlocale ( LC_ALL , " " ) ;
2011-04-19 20:33:50 +02:00
textdomain ( PACKAGE ) ;
2011-03-30 16:30:11 +02:00
params . params = 0 ;
/* parameter parsing */
2014-05-13 12:41:45 +02:00
while ( ( ret = getopt_long ( argc , argv , " b: " ,
2011-04-19 20:33:50 +02:00
set_opts , NULL ) ) ! = - 1 ) {
2011-03-30 16:30:11 +02:00
switch ( ret ) {
case ' b ' :
if ( params . perf_bias )
print_wrong_arg_exit ( ) ;
perf_bias = atoi ( optarg ) ;
if ( perf_bias < 0 | | perf_bias > 15 ) {
printf ( _ ( " --perf-bias param out "
" of range [0-%d] \n " ) , 15 ) ;
print_wrong_arg_exit ( ) ;
}
params . perf_bias = 1 ;
break ;
default :
print_wrong_arg_exit ( ) ;
}
} ;
2011-08-06 18:11:43 +02:00
if ( ! params . params )
print_wrong_arg_exit ( ) ;
2011-03-30 16:30:11 +02:00
/* Default is: set all CPUs */
if ( bitmask_isallclear ( cpus_chosen ) )
bitmask_setall ( cpus_chosen ) ;
/* loop over CPUs */
for ( cpu = bitmask_first ( cpus_chosen ) ;
cpu < = bitmask_last ( cpus_chosen ) ; cpu + + ) {
2011-04-19 20:33:50 +02:00
2015-12-01 17:14:15 +01:00
if ( ! bitmask_isbitset ( cpus_chosen , cpu ) )
2011-03-30 16:30:11 +02:00
continue ;
2015-12-01 17:14:15 +01:00
if ( sysfs_is_cpu_online ( cpu ) ! = 1 ) {
fprintf ( stderr , _ ( " Cannot set values on CPU %d: " ) , cpu ) ;
fprintf ( stderr , _ ( " *is offline \n " ) ) ;
continue ;
}
2011-03-30 16:30:11 +02:00
if ( params . perf_bias ) {
ret = msr_intel_set_perf_bias ( cpu , perf_bias ) ;
if ( ret ) {
fprintf ( stderr , _ ( " Error setting perf-bias "
" value on CPU %d \n " ) , cpu ) ;
break ;
}
}
}
return ret ;
}