2015-05-21 12:13:11 +05:30
/*
* POWER Data Stream Control Register ( DSCR ) sysfs interface test
*
* This test updates to system wide DSCR default through the sysfs interface
* and then verifies that all the CPU specific DSCR defaults are updated as
* well verified from their sysfs interfaces .
*
* Copyright 2015 , Anshuman Khandual , IBM Corporation .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation .
*/
# include "dscr.h"
static int check_cpu_dscr_default ( char * file , unsigned long val )
{
char buf [ 10 ] ;
int fd , rc ;
fd = open ( file , O_RDWR ) ;
if ( fd = = - 1 ) {
perror ( " open() failed " ) ;
return 1 ;
}
rc = read ( fd , buf , sizeof ( buf ) ) ;
if ( rc = = - 1 ) {
perror ( " read() failed " ) ;
return 1 ;
}
close ( fd ) ;
buf [ rc ] = ' \0 ' ;
if ( strtol ( buf , NULL , 16 ) ! = val ) {
printf ( " DSCR match failed: %ld (system) %ld (cpu) \n " ,
val , strtol ( buf , NULL , 16 ) ) ;
return 1 ;
}
return 0 ;
}
static int check_all_cpu_dscr_defaults ( unsigned long val )
{
DIR * sysfs ;
struct dirent * dp ;
char file [ LEN_MAX ] ;
sysfs = opendir ( CPU_PATH ) ;
if ( ! sysfs ) {
perror ( " opendir() failed " ) ;
return 1 ;
}
while ( ( dp = readdir ( sysfs ) ) ) {
2017-09-28 09:34:26 -04:00
int len ;
2015-05-21 12:13:11 +05:30
if ( ! ( dp - > d_type & DT_DIR ) )
continue ;
if ( ! strcmp ( dp - > d_name , " cpuidle " ) )
continue ;
if ( ! strstr ( dp - > d_name , " cpu " ) )
continue ;
2017-09-28 09:34:26 -04:00
len = snprintf ( file , LEN_MAX , " %s%s/dscr " , CPU_PATH , dp - > d_name ) ;
if ( len > = LEN_MAX )
continue ;
2015-05-21 12:13:11 +05:30
if ( access ( file , F_OK ) )
continue ;
if ( check_cpu_dscr_default ( file , val ) )
return 1 ;
}
closedir ( sysfs ) ;
return 0 ;
}
int dscr_sysfs ( void )
{
unsigned long orig_dscr_default ;
int i , j ;
orig_dscr_default = get_default_dscr ( ) ;
for ( i = 0 ; i < COUNT ; i + + ) {
for ( j = 0 ; j < DSCR_MAX ; j + + ) {
set_default_dscr ( j ) ;
if ( check_all_cpu_dscr_defaults ( j ) )
goto fail ;
}
}
set_default_dscr ( orig_dscr_default ) ;
return 0 ;
fail :
set_default_dscr ( orig_dscr_default ) ;
return 1 ;
}
int main ( int argc , char * argv [ ] )
{
return test_harness ( dscr_sysfs , " dscr_sysfs_test " ) ;
}