30
30
#include <sched.h>
31
31
#include <time.h>
32
32
#include <cpuid.h>
33
- #include <linux /capability.h>
33
+ #include <sys /capability.h>
34
34
#include <errno.h>
35
35
#include <math.h>
36
36
@@ -304,6 +304,10 @@ int *irqs_per_cpu; /* indexed by cpu_num */
304
304
305
305
void setup_all_buffers (void );
306
306
307
+ char * sys_lpi_file ;
308
+ char * sys_lpi_file_sysfs = "/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us" ;
309
+ char * sys_lpi_file_debugfs = "/sys/kernel/debug/pmc_core/slp_s0_residency_usec" ;
310
+
307
311
int cpu_is_not_present (int cpu )
308
312
{
309
313
return !CPU_ISSET_S (cpu , cpu_present_setsize , cpu_present_set );
@@ -2916,8 +2920,6 @@ int snapshot_gfx_mhz(void)
2916
2920
*
2917
2921
* record snapshot of
2918
2922
* /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us
2919
- *
2920
- * return 1 if config change requires a restart, else return 0
2921
2923
*/
2922
2924
int snapshot_cpu_lpi_us (void )
2923
2925
{
@@ -2941,17 +2943,14 @@ int snapshot_cpu_lpi_us(void)
2941
2943
/*
2942
2944
* snapshot_sys_lpi()
2943
2945
*
2944
- * record snapshot of
2945
- * /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us
2946
- *
2947
- * return 1 if config change requires a restart, else return 0
2946
+ * record snapshot of sys_lpi_file
2948
2947
*/
2949
2948
int snapshot_sys_lpi_us (void )
2950
2949
{
2951
2950
FILE * fp ;
2952
2951
int retval ;
2953
2952
2954
- fp = fopen_or_die ("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us" , "r" );
2953
+ fp = fopen_or_die (sys_lpi_file , "r" );
2955
2954
2956
2955
retval = fscanf (fp , "%lld" , & cpuidle_cur_sys_lpi_us );
2957
2956
if (retval != 1 ) {
@@ -3151,28 +3150,42 @@ void check_dev_msr()
3151
3150
err (-5 , "no /dev/cpu/0/msr, Try \"# modprobe msr\" " );
3152
3151
}
3153
3152
3154
- void check_permissions ()
3153
+ /*
3154
+ * check for CAP_SYS_RAWIO
3155
+ * return 0 on success
3156
+ * return 1 on fail
3157
+ */
3158
+ int check_for_cap_sys_rawio (void )
3155
3159
{
3156
- struct __user_cap_header_struct cap_header_data ;
3157
- cap_user_header_t cap_header = & cap_header_data ;
3158
- struct __user_cap_data_struct cap_data_data ;
3159
- cap_user_data_t cap_data = & cap_data_data ;
3160
- extern int capget (cap_user_header_t hdrp , cap_user_data_t datap );
3161
- int do_exit = 0 ;
3162
- char pathname [32 ];
3160
+ cap_t caps ;
3161
+ cap_flag_value_t cap_flag_value ;
3163
3162
3164
- /* check for CAP_SYS_RAWIO */
3165
- cap_header -> pid = getpid ();
3166
- cap_header -> version = _LINUX_CAPABILITY_VERSION ;
3167
- if (capget (cap_header , cap_data ) < 0 )
3168
- err (-6 , "capget(2) failed" );
3163
+ caps = cap_get_proc ();
3164
+ if (caps == NULL )
3165
+ err (-6 , "cap_get_proc\n" );
3169
3166
3170
- if ((cap_data -> effective & (1 << CAP_SYS_RAWIO )) == 0 ) {
3171
- do_exit ++ ;
3167
+ if (cap_get_flag (caps , CAP_SYS_RAWIO , CAP_EFFECTIVE , & cap_flag_value ))
3168
+ err (-6 , "cap_get\n" );
3169
+
3170
+ if (cap_flag_value != CAP_SET ) {
3172
3171
warnx ("capget(CAP_SYS_RAWIO) failed,"
3173
3172
" try \"# setcap cap_sys_rawio=ep %s\"" , progname );
3173
+ return 1 ;
3174
3174
}
3175
3175
3176
+ if (cap_free (caps ) == -1 )
3177
+ err (-6 , "cap_free\n" );
3178
+
3179
+ return 0 ;
3180
+ }
3181
+ void check_permissions (void )
3182
+ {
3183
+ int do_exit = 0 ;
3184
+ char pathname [32 ];
3185
+
3186
+ /* check for CAP_SYS_RAWIO */
3187
+ do_exit += check_for_cap_sys_rawio ();
3188
+
3176
3189
/* test file permissions */
3177
3190
sprintf (pathname , "/dev/cpu/%d/msr" , base_cpu );
3178
3191
if (euidaccess (pathname , R_OK )) {
@@ -3265,6 +3278,7 @@ int probe_nhm_msrs(unsigned int family, unsigned int model)
3265
3278
case INTEL_FAM6_ATOM_GOLDMONT : /* BXT */
3266
3279
case INTEL_FAM6_ATOM_GOLDMONT_PLUS :
3267
3280
case INTEL_FAM6_ATOM_GOLDMONT_D : /* DNV */
3281
+ case INTEL_FAM6_ATOM_TREMONT : /* EHL */
3268
3282
pkg_cstate_limits = glm_pkg_cstate_limits ;
3269
3283
break ;
3270
3284
default :
@@ -3336,6 +3350,17 @@ int is_skx(unsigned int family, unsigned int model)
3336
3350
}
3337
3351
return 0 ;
3338
3352
}
3353
+ int is_ehl (unsigned int family , unsigned int model )
3354
+ {
3355
+ if (!genuine_intel )
3356
+ return 0 ;
3357
+
3358
+ switch (model ) {
3359
+ case INTEL_FAM6_ATOM_TREMONT :
3360
+ return 1 ;
3361
+ }
3362
+ return 0 ;
3363
+ }
3339
3364
3340
3365
int has_turbo_ratio_limit (unsigned int family , unsigned int model )
3341
3366
{
@@ -3478,6 +3503,23 @@ dump_cstate_pstate_config_info(unsigned int family, unsigned int model)
3478
3503
dump_nhm_cst_cfg ();
3479
3504
}
3480
3505
3506
+ static void dump_sysfs_file (char * path )
3507
+ {
3508
+ FILE * input ;
3509
+ char cpuidle_buf [64 ];
3510
+
3511
+ input = fopen (path , "r" );
3512
+ if (input == NULL ) {
3513
+ if (debug )
3514
+ fprintf (outf , "NSFOD %s\n" , path );
3515
+ return ;
3516
+ }
3517
+ if (!fgets (cpuidle_buf , sizeof (cpuidle_buf ), input ))
3518
+ err (1 , "%s: failed to read file" , path );
3519
+ fclose (input );
3520
+
3521
+ fprintf (outf , "%s: %s" , strrchr (path , '/' ) + 1 , cpuidle_buf );
3522
+ }
3481
3523
static void
3482
3524
dump_sysfs_cstate_config (void )
3483
3525
{
@@ -3491,6 +3533,15 @@ dump_sysfs_cstate_config(void)
3491
3533
if (!DO_BIC (BIC_sysfs ))
3492
3534
return ;
3493
3535
3536
+ if (access ("/sys/devices/system/cpu/cpuidle" , R_OK )) {
3537
+ fprintf (outf , "cpuidle not loaded\n" );
3538
+ return ;
3539
+ }
3540
+
3541
+ dump_sysfs_file ("/sys/devices/system/cpu/cpuidle/current_driver" );
3542
+ dump_sysfs_file ("/sys/devices/system/cpu/cpuidle/current_governor" );
3543
+ dump_sysfs_file ("/sys/devices/system/cpu/cpuidle/current_governor_ro" );
3544
+
3494
3545
for (state = 0 ; state < 10 ; ++ state ) {
3495
3546
3496
3547
sprintf (path , "/sys/devices/system/cpu/cpu%d/cpuidle/state%d/name" ,
@@ -3894,6 +3945,20 @@ void rapl_probe_intel(unsigned int family, unsigned int model)
3894
3945
else
3895
3946
BIC_PRESENT (BIC_PkgWatt );
3896
3947
break ;
3948
+ case INTEL_FAM6_ATOM_TREMONT : /* EHL */
3949
+ do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO ;
3950
+ if (rapl_joules ) {
3951
+ BIC_PRESENT (BIC_Pkg_J );
3952
+ BIC_PRESENT (BIC_Cor_J );
3953
+ BIC_PRESENT (BIC_RAM_J );
3954
+ BIC_PRESENT (BIC_GFX_J );
3955
+ } else {
3956
+ BIC_PRESENT (BIC_PkgWatt );
3957
+ BIC_PRESENT (BIC_CorWatt );
3958
+ BIC_PRESENT (BIC_RAMWatt );
3959
+ BIC_PRESENT (BIC_GFXWatt );
3960
+ }
3961
+ break ;
3897
3962
case INTEL_FAM6_SKYLAKE_L : /* SKL */
3898
3963
case INTEL_FAM6_CANNONLAKE_L : /* CNL */
3899
3964
do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO ;
@@ -4295,6 +4360,7 @@ int has_snb_msrs(unsigned int family, unsigned int model)
4295
4360
case INTEL_FAM6_ATOM_GOLDMONT : /* BXT */
4296
4361
case INTEL_FAM6_ATOM_GOLDMONT_PLUS :
4297
4362
case INTEL_FAM6_ATOM_GOLDMONT_D : /* DNV */
4363
+ case INTEL_FAM6_ATOM_TREMONT : /* EHL */
4298
4364
return 1 ;
4299
4365
}
4300
4366
return 0 ;
@@ -4324,6 +4390,7 @@ int has_c8910_msrs(unsigned int family, unsigned int model)
4324
4390
case INTEL_FAM6_CANNONLAKE_L : /* CNL */
4325
4391
case INTEL_FAM6_ATOM_GOLDMONT : /* BXT */
4326
4392
case INTEL_FAM6_ATOM_GOLDMONT_PLUS :
4393
+ case INTEL_FAM6_ATOM_TREMONT : /* EHL */
4327
4394
return 1 ;
4328
4395
}
4329
4396
return 0 ;
@@ -4610,14 +4677,24 @@ unsigned int intel_model_duplicates(unsigned int model)
4610
4677
case INTEL_FAM6_SKYLAKE :
4611
4678
case INTEL_FAM6_KABYLAKE_L :
4612
4679
case INTEL_FAM6_KABYLAKE :
4680
+ case INTEL_FAM6_COMETLAKE_L :
4681
+ case INTEL_FAM6_COMETLAKE :
4613
4682
return INTEL_FAM6_SKYLAKE_L ;
4614
4683
4615
4684
case INTEL_FAM6_ICELAKE_L :
4616
4685
case INTEL_FAM6_ICELAKE_NNPI :
4686
+ case INTEL_FAM6_TIGERLAKE_L :
4687
+ case INTEL_FAM6_TIGERLAKE :
4617
4688
return INTEL_FAM6_CANNONLAKE_L ;
4618
4689
4619
4690
case INTEL_FAM6_ATOM_TREMONT_D :
4620
4691
return INTEL_FAM6_ATOM_GOLDMONT_D ;
4692
+
4693
+ case INTEL_FAM6_ATOM_TREMONT_L :
4694
+ return INTEL_FAM6_ATOM_TREMONT ;
4695
+
4696
+ case INTEL_FAM6_ICELAKE_X :
4697
+ return INTEL_FAM6_SKYLAKE_X ;
4621
4698
}
4622
4699
return model ;
4623
4700
}
@@ -4872,7 +4949,8 @@ void process_cpuid()
4872
4949
do_slm_cstates = is_slm (family , model );
4873
4950
do_knl_cstates = is_knl (family , model );
4874
4951
4875
- if (do_slm_cstates || do_knl_cstates || is_cnl (family , model ))
4952
+ if (do_slm_cstates || do_knl_cstates || is_cnl (family , model ) ||
4953
+ is_ehl (family , model ))
4876
4954
BIC_NOT_PRESENT (BIC_CPU_c3 );
4877
4955
4878
4956
if (!quiet )
@@ -4907,10 +4985,16 @@ void process_cpuid()
4907
4985
else
4908
4986
BIC_NOT_PRESENT (BIC_CPU_LPI );
4909
4987
4910
- if (!access ("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us" , R_OK ))
4988
+ if (!access (sys_lpi_file_sysfs , R_OK )) {
4989
+ sys_lpi_file = sys_lpi_file_sysfs ;
4911
4990
BIC_PRESENT (BIC_SYS_LPI );
4912
- else
4991
+ } else if (!access (sys_lpi_file_debugfs , R_OK )) {
4992
+ sys_lpi_file = sys_lpi_file_debugfs ;
4993
+ BIC_PRESENT (BIC_SYS_LPI );
4994
+ } else {
4995
+ sys_lpi_file_sysfs = NULL ;
4913
4996
BIC_NOT_PRESENT (BIC_SYS_LPI );
4997
+ }
4914
4998
4915
4999
if (!quiet )
4916
5000
decode_misc_feature_control ();
@@ -5306,7 +5390,7 @@ int get_and_dump_counters(void)
5306
5390
}
5307
5391
5308
5392
void print_version () {
5309
- fprintf (outf , "turbostat version 19.08.31 "
5393
+ fprintf (outf , "turbostat version 20.03.20 "
5310
5394
" - Len Brown <[email protected] >\n" );
5311
5395
}
5312
5396
@@ -5323,9 +5407,9 @@ int add_counter(unsigned int msr_num, char *path, char *name,
5323
5407
}
5324
5408
5325
5409
msrp -> msr_num = msr_num ;
5326
- strncpy (msrp -> name , name , NAME_BYTES );
5410
+ strncpy (msrp -> name , name , NAME_BYTES - 1 );
5327
5411
if (path )
5328
- strncpy (msrp -> path , path , PATH_BYTES );
5412
+ strncpy (msrp -> path , path , PATH_BYTES - 1 );
5329
5413
msrp -> width = width ;
5330
5414
msrp -> type = type ;
5331
5415
msrp -> format = format ;
0 commit comments