@@ -200,6 +200,8 @@ struct msr_counter bic[] = {
200
200
{ 0x0 , "SAMMHz" , NULL , 0 , 0 , 0 , NULL , 0 },
201
201
{ 0x0 , "SAMAMHz" , NULL , 0 , 0 , 0 , NULL , 0 },
202
202
{ 0x0 , "Die%c6" , NULL , 0 , 0 , 0 , NULL , 0 },
203
+ { 0x0 , "SysWatt" , NULL , 0 , 0 , 0 , NULL , 0 },
204
+ { 0x0 , "Sys_J" , NULL , 0 , 0 , 0 , NULL , 0 },
203
205
};
204
206
205
207
#define MAX_BIC (sizeof(bic) / sizeof(struct msr_counter))
@@ -262,14 +264,16 @@ struct msr_counter bic[] = {
262
264
#define BIC_SAMMHz (1ULL << 56)
263
265
#define BIC_SAMACTMHz (1ULL << 57)
264
266
#define BIC_Diec6 (1ULL << 58)
267
+ #define BIC_SysWatt (1ULL << 59)
268
+ #define BIC_Sys_J (1ULL << 60)
265
269
266
270
#define BIC_TOPOLOGY (BIC_Package | BIC_Node | BIC_CoreCnt | BIC_PkgCnt | BIC_Core | BIC_CPU | BIC_Die )
267
271
#define BIC_THERMAL_PWR ( BIC_CoreTmp | BIC_PkgTmp | BIC_PkgWatt | BIC_CorWatt | BIC_GFXWatt | BIC_RAMWatt | BIC_PKG__ | BIC_RAM__)
268
272
#define BIC_FREQUENCY (BIC_Avg_MHz | BIC_Busy | BIC_Bzy_MHz | BIC_TSC_MHz | BIC_GFXMHz | BIC_GFXACTMHz | BIC_SAMMHz | BIC_SAMACTMHz | BIC_UNCORE_MHZ)
269
273
#define BIC_IDLE (BIC_sysfs | BIC_CPU_c1 | BIC_CPU_c3 | BIC_CPU_c6 | BIC_CPU_c7 | BIC_GFX_rc6 | BIC_Pkgpc2 | BIC_Pkgpc3 | BIC_Pkgpc6 | BIC_Pkgpc7 | BIC_Pkgpc8 | BIC_Pkgpc9 | BIC_Pkgpc10 | BIC_CPU_LPI | BIC_SYS_LPI | BIC_Mod_c6 | BIC_Totl_c0 | BIC_Any_c0 | BIC_GFX_c0 | BIC_CPUGFX | BIC_SAM_mc6 | BIC_Diec6)
270
274
#define BIC_OTHER ( BIC_IRQ | BIC_SMI | BIC_ThreadC | BIC_CoreTmp | BIC_IPC)
271
275
272
- #define BIC_DISABLED_BY_DEFAULT (BIC_USEC | BIC_TOD | BIC_APIC | BIC_X2APIC)
276
+ #define BIC_DISABLED_BY_DEFAULT (BIC_USEC | BIC_TOD | BIC_APIC | BIC_X2APIC | BIC_SysWatt | BIC_Sys_J )
273
277
274
278
unsigned long long bic_enabled = (0xFFFFFFFFFFFFFFFFULL & ~BIC_DISABLED_BY_DEFAULT );
275
279
unsigned long long bic_present = BIC_USEC | BIC_TOD | BIC_sysfs | BIC_APIC | BIC_X2APIC ;
@@ -507,12 +511,15 @@ enum rapl_msrs {
507
511
RAPL_AMD_PWR_UNIT = BIT (14 ), /* 0xc0010299 MSR_AMD_RAPL_POWER_UNIT */
508
512
RAPL_AMD_CORE_ENERGY_STAT = BIT (15 ), /* 0xc001029a MSR_AMD_CORE_ENERGY_STATUS */
509
513
RAPL_AMD_PKG_ENERGY_STAT = BIT (16 ), /* 0xc001029b MSR_AMD_PKG_ENERGY_STATUS */
514
+ RAPL_PLATFORM_ENERGY_LIMIT = BIT (17 ), /* 0x64c MSR_PLATFORM_ENERGY_LIMIT */
515
+ RAPL_PLATFORM_ENERGY_STATUS = BIT (18 ), /* 0x64d MSR_PLATFORM_ENERGY_STATUS */
510
516
};
511
517
512
518
#define RAPL_PKG (RAPL_PKG_ENERGY_STATUS | RAPL_PKG_POWER_LIMIT)
513
519
#define RAPL_DRAM (RAPL_DRAM_ENERGY_STATUS | RAPL_DRAM_POWER_LIMIT)
514
520
#define RAPL_CORE (RAPL_CORE_ENERGY_STATUS | RAPL_CORE_POWER_LIMIT)
515
521
#define RAPL_GFX (RAPL_GFX_POWER_LIMIT | RAPL_GFX_ENERGY_STATUS)
522
+ #define RAPL_PSYS (RAPL_PLATFORM_ENERGY_STATUS | RAPL_PLATFORM_ENERGY_LIMIT)
516
523
517
524
#define RAPL_PKG_ALL (RAPL_PKG | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO)
518
525
#define RAPL_DRAM_ALL (RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_DRAM_POWER_INFO)
@@ -713,7 +720,7 @@ static const struct platform_features skl_features = {
713
720
.has_ext_cst_msrs = 1 ,
714
721
.trl_msrs = TRL_BASE ,
715
722
.tcc_offset_bits = 6 ,
716
- .rapl_msrs = RAPL_PKG_ALL | RAPL_CORE_ALL | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_GFX ,
723
+ .rapl_msrs = RAPL_PKG_ALL | RAPL_CORE_ALL | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_GFX | RAPL_PSYS ,
717
724
.enable_tsc_tweak = 1 ,
718
725
};
719
726
@@ -730,7 +737,7 @@ static const struct platform_features cnl_features = {
730
737
.has_ext_cst_msrs = 1 ,
731
738
.trl_msrs = TRL_BASE ,
732
739
.tcc_offset_bits = 6 ,
733
- .rapl_msrs = RAPL_PKG_ALL | RAPL_CORE_ALL | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_GFX ,
740
+ .rapl_msrs = RAPL_PKG_ALL | RAPL_CORE_ALL | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_GFX | RAPL_PSYS ,
734
741
.enable_tsc_tweak = 1 ,
735
742
};
736
743
@@ -797,7 +804,7 @@ static const struct platform_features icx_features = {
797
804
.has_irtl_msrs = 1 ,
798
805
.has_cst_prewake_bit = 1 ,
799
806
.trl_msrs = TRL_BASE | TRL_CORECOUNT ,
800
- .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL ,
807
+ .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL | RAPL_PSYS ,
801
808
.has_fixed_rapl_unit = 1 ,
802
809
};
803
810
@@ -813,7 +820,7 @@ static const struct platform_features spr_features = {
813
820
.has_irtl_msrs = 1 ,
814
821
.has_cst_prewake_bit = 1 ,
815
822
.trl_msrs = TRL_BASE | TRL_CORECOUNT ,
816
- .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL ,
823
+ .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL | RAPL_PSYS ,
817
824
};
818
825
819
826
static const struct platform_features srf_features = {
@@ -829,7 +836,7 @@ static const struct platform_features srf_features = {
829
836
.has_irtl_msrs = 1 ,
830
837
.has_cst_prewake_bit = 1 ,
831
838
.trl_msrs = TRL_BASE | TRL_CORECOUNT ,
832
- .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL ,
839
+ .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL | RAPL_PSYS ,
833
840
};
834
841
835
842
static const struct platform_features grr_features = {
@@ -845,7 +852,7 @@ static const struct platform_features grr_features = {
845
852
.has_irtl_msrs = 1 ,
846
853
.has_cst_prewake_bit = 1 ,
847
854
.trl_msrs = TRL_BASE | TRL_CORECOUNT ,
848
- .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL ,
855
+ .rapl_msrs = RAPL_PKG_ALL | RAPL_DRAM_ALL | RAPL_PSYS ,
849
856
};
850
857
851
858
static const struct platform_features slv_features = {
@@ -1108,6 +1115,7 @@ enum rapl_rci_index {
1108
1115
RAPL_RCI_INDEX_PKG_PERF_STATUS = 4 ,
1109
1116
RAPL_RCI_INDEX_DRAM_PERF_STATUS = 5 ,
1110
1117
RAPL_RCI_INDEX_CORE_ENERGY = 6 ,
1118
+ RAPL_RCI_INDEX_ENERGY_PLATFORM = 7 ,
1111
1119
NUM_RAPL_COUNTERS ,
1112
1120
};
1113
1121
@@ -1134,6 +1142,7 @@ struct rapl_counter_info_t {
1134
1142
struct rapl_counter_info_t * rapl_counter_info_perdomain ;
1135
1143
unsigned int rapl_counter_info_perdomain_size ;
1136
1144
1145
+ #define RAPL_COUNTER_FLAG_PLATFORM_COUNTER (1u << 0)
1137
1146
#define RAPL_COUNTER_FLAG_USE_MSR_SUM (1u << 1)
1138
1147
1139
1148
struct rapl_counter_arch_info {
@@ -1255,6 +1264,19 @@ static const struct rapl_counter_arch_info rapl_counter_arch_infos[] = {
1255
1264
.compat_scale = 1.0 ,
1256
1265
.flags = 0 ,
1257
1266
},
1267
+ {
1268
+ .feature_mask = RAPL_PSYS ,
1269
+ .perf_subsys = "power" ,
1270
+ .perf_name = "energy-psys" ,
1271
+ .msr = MSR_PLATFORM_ENERGY_STATUS ,
1272
+ .msr_mask = 0x00000000FFFFFFFF ,
1273
+ .msr_shift = 0 ,
1274
+ .platform_rapl_msr_scale = & rapl_energy_units ,
1275
+ .rci_index = RAPL_RCI_INDEX_ENERGY_PLATFORM ,
1276
+ .bic = BIC_SysWatt | BIC_Sys_J ,
1277
+ .compat_scale = 1.0 ,
1278
+ .flags = RAPL_COUNTER_FLAG_PLATFORM_COUNTER | RAPL_COUNTER_FLAG_USE_MSR_SUM ,
1279
+ },
1258
1280
};
1259
1281
1260
1282
struct rapl_counter {
@@ -1682,6 +1704,7 @@ enum {
1682
1704
IDX_PP1_ENERGY ,
1683
1705
IDX_PKG_PERF ,
1684
1706
IDX_DRAM_PERF ,
1707
+ IDX_PSYS_ENERGY ,
1685
1708
IDX_COUNT ,
1686
1709
};
1687
1710
@@ -1726,6 +1749,9 @@ off_t idx_to_offset(int idx)
1726
1749
case IDX_DRAM_PERF :
1727
1750
offset = MSR_DRAM_PERF_STATUS ;
1728
1751
break ;
1752
+ case IDX_PSYS_ENERGY :
1753
+ offset = MSR_PLATFORM_ENERGY_STATUS ;
1754
+ break ;
1729
1755
default :
1730
1756
offset = -1 ;
1731
1757
}
@@ -1756,6 +1782,9 @@ int offset_to_idx(off_t offset)
1756
1782
case MSR_DRAM_PERF_STATUS :
1757
1783
idx = IDX_DRAM_PERF ;
1758
1784
break ;
1785
+ case MSR_PLATFORM_ENERGY_STATUS :
1786
+ idx = IDX_PSYS_ENERGY ;
1787
+ break ;
1759
1788
default :
1760
1789
idx = -1 ;
1761
1790
}
@@ -1777,6 +1806,8 @@ int idx_valid(int idx)
1777
1806
return platform -> rapl_msrs & RAPL_PKG_PERF_STATUS ;
1778
1807
case IDX_DRAM_PERF :
1779
1808
return platform -> rapl_msrs & RAPL_DRAM_PERF_STATUS ;
1809
+ case IDX_PSYS_ENERGY :
1810
+ return platform -> rapl_msrs & RAPL_PSYS ;
1780
1811
default :
1781
1812
return 0 ;
1782
1813
}
@@ -1848,6 +1879,10 @@ struct system_summary {
1848
1879
struct pkg_data packages ;
1849
1880
} average ;
1850
1881
1882
+ struct platform_counters {
1883
+ struct rapl_counter energy_psys ; /* MSR_PLATFORM_ENERGY_STATUS */
1884
+ } platform_counters_odd , platform_counters_even ;
1885
+
1851
1886
struct cpu_topology {
1852
1887
int physical_package_id ;
1853
1888
int die_id ;
@@ -2512,13 +2547,19 @@ void print_header(char *delim)
2512
2547
ppmt = ppmt -> next ;
2513
2548
}
2514
2549
2550
+ if (DO_BIC (BIC_SysWatt ))
2551
+ outp += sprintf (outp , "%sSysWatt" , (printed ++ ? delim : "" ));
2552
+ if (DO_BIC (BIC_Sys_J ))
2553
+ outp += sprintf (outp , "%sSys_J" , (printed ++ ? delim : "" ));
2554
+
2515
2555
outp += sprintf (outp , "\n" );
2516
2556
}
2517
2557
2518
2558
int dump_counters (struct thread_data * t , struct core_data * c , struct pkg_data * p )
2519
2559
{
2520
2560
int i ;
2521
2561
struct msr_counter * mp ;
2562
+ struct platform_counters * pplat_cnt = p == package_odd ? & platform_counters_odd : & platform_counters_even ;
2522
2563
2523
2564
outp += sprintf (outp , "t %p, c %p, p %p\n" , t , c , p );
2524
2565
@@ -2590,6 +2631,7 @@ int dump_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p
2590
2631
outp += sprintf (outp , "Joules COR: %0llX\n" , p -> energy_cores .raw_value );
2591
2632
outp += sprintf (outp , "Joules GFX: %0llX\n" , p -> energy_gfx .raw_value );
2592
2633
outp += sprintf (outp , "Joules RAM: %0llX\n" , p -> energy_dram .raw_value );
2634
+ outp += sprintf (outp , "Joules PSYS: %0llX\n" , pplat_cnt -> energy_psys .raw_value );
2593
2635
outp += sprintf (outp , "Throttle PKG: %0llX\n" , p -> rapl_pkg_perf_status .raw_value );
2594
2636
outp += sprintf (outp , "Throttle RAM: %0llX\n" , p -> rapl_dram_perf_status .raw_value );
2595
2637
outp += sprintf (outp , "PTM: %dC\n" , p -> pkg_temp_c );
@@ -2628,6 +2670,9 @@ double rapl_counter_get_value(const struct rapl_counter *c, enum rapl_unit desir
2628
2670
*/
2629
2671
int format_counters (struct thread_data * t , struct core_data * c , struct pkg_data * p )
2630
2672
{
2673
+ static int count ;
2674
+
2675
+ struct platform_counters * pplat_cnt = NULL ;
2631
2676
double interval_float , tsc ;
2632
2677
char * fmt8 ;
2633
2678
int i ;
@@ -2637,6 +2682,11 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
2637
2682
char * delim = "\t" ;
2638
2683
int printed = 0 ;
2639
2684
2685
+ if (t == & average .threads ) {
2686
+ pplat_cnt = count & 1 ? & platform_counters_odd : & platform_counters_even ;
2687
+ ++ count ;
2688
+ }
2689
+
2640
2690
/* if showing only 1st thread in core and this isn't one, bail out */
2641
2691
if (show_core_only && !is_cpu_first_thread_in_core (t , c , p ))
2642
2692
return 0 ;
@@ -3093,6 +3143,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
3093
3143
}
3094
3144
}
3095
3145
3146
+ if (DO_BIC (BIC_SysWatt ) && (t == & average .threads ))
3147
+ outp += sprintf (outp , fmt8 , (printed ++ ? delim : "" ),
3148
+ rapl_counter_get_value (& pplat_cnt -> energy_psys , RAPL_UNIT_WATTS , interval_float ));
3149
+ if (DO_BIC (BIC_Sys_J ) && (t == & average .threads ))
3150
+ outp += sprintf (outp , fmt8 , (printed ++ ? delim : "" ),
3151
+ rapl_counter_get_value (& pplat_cnt -> energy_psys , RAPL_UNIT_JOULES , interval_float ));
3152
+
3096
3153
done :
3097
3154
if (* (outp - 1 ) != '\n' )
3098
3155
outp += sprintf (outp , "\n" );
@@ -3400,6 +3457,11 @@ int delta_cpu(struct thread_data *t, struct core_data *c,
3400
3457
return retval ;
3401
3458
}
3402
3459
3460
+ void delta_platform (struct platform_counters * new , struct platform_counters * old )
3461
+ {
3462
+ old -> energy_psys .raw_value = new -> energy_psys .raw_value - old -> energy_psys .raw_value ;
3463
+ }
3464
+
3403
3465
void rapl_counter_clear (struct rapl_counter * c )
3404
3466
{
3405
3467
c -> raw_value = 0 ;
@@ -4129,13 +4191,17 @@ static size_t cstate_counter_info_count_perf(const struct cstate_counter_info_t
4129
4191
4130
4192
void write_rapl_counter (struct rapl_counter * rc , struct rapl_counter_info_t * rci , unsigned int idx )
4131
4193
{
4194
+ if (rci -> source [idx ] == COUNTER_SOURCE_NONE )
4195
+ return ;
4196
+
4132
4197
rc -> raw_value = rci -> data [idx ];
4133
4198
rc -> unit = rci -> unit [idx ];
4134
4199
rc -> scale = rci -> scale [idx ];
4135
4200
}
4136
4201
4137
4202
int get_rapl_counters (int cpu , unsigned int domain , struct core_data * c , struct pkg_data * p )
4138
4203
{
4204
+ struct platform_counters * pplat_cnt = p == package_odd ? & platform_counters_odd : & platform_counters_even ;
4139
4205
unsigned long long perf_data [NUM_RAPL_COUNTERS + 1 ];
4140
4206
struct rapl_counter_info_t * rci ;
4141
4207
@@ -4163,6 +4229,7 @@ int get_rapl_counters(int cpu, unsigned int domain, struct core_data *c, struct
4163
4229
for (unsigned int i = 0 , pi = 1 ; i < NUM_RAPL_COUNTERS ; ++ i ) {
4164
4230
switch (rci -> source [i ]) {
4165
4231
case COUNTER_SOURCE_NONE :
4232
+ rci -> data [i ] = 0 ;
4166
4233
break ;
4167
4234
4168
4235
case COUNTER_SOURCE_PERF :
@@ -4201,14 +4268,15 @@ int get_rapl_counters(int cpu, unsigned int domain, struct core_data *c, struct
4201
4268
}
4202
4269
}
4203
4270
4204
- BUILD_BUG_ON (NUM_RAPL_COUNTERS != 7 );
4271
+ BUILD_BUG_ON (NUM_RAPL_COUNTERS != 8 );
4205
4272
write_rapl_counter (& p -> energy_pkg , rci , RAPL_RCI_INDEX_ENERGY_PKG );
4206
4273
write_rapl_counter (& p -> energy_cores , rci , RAPL_RCI_INDEX_ENERGY_CORES );
4207
4274
write_rapl_counter (& p -> energy_dram , rci , RAPL_RCI_INDEX_DRAM );
4208
4275
write_rapl_counter (& p -> energy_gfx , rci , RAPL_RCI_INDEX_GFX );
4209
4276
write_rapl_counter (& p -> rapl_pkg_perf_status , rci , RAPL_RCI_INDEX_PKG_PERF_STATUS );
4210
4277
write_rapl_counter (& p -> rapl_dram_perf_status , rci , RAPL_RCI_INDEX_DRAM_PERF_STATUS );
4211
4278
write_rapl_counter (& c -> core_energy , rci , RAPL_RCI_INDEX_CORE_ENERGY );
4279
+ write_rapl_counter (& pplat_cnt -> energy_psys , rci , RAPL_RCI_INDEX_ENERGY_PLATFORM );
4212
4280
4213
4281
return 0 ;
4214
4282
}
@@ -6144,6 +6212,7 @@ void turbostat_loop()
6144
6212
re_initialize ();
6145
6213
goto restart ;
6146
6214
}
6215
+ delta_platform (& platform_counters_odd , & platform_counters_even );
6147
6216
compute_average (EVEN_COUNTERS );
6148
6217
format_all_counters (EVEN_COUNTERS );
6149
6218
flush_output_stdout ();
@@ -6167,6 +6236,7 @@ void turbostat_loop()
6167
6236
re_initialize ();
6168
6237
goto restart ;
6169
6238
}
6239
+ delta_platform (& platform_counters_even , & platform_counters_odd );
6170
6240
compute_average (ODD_COUNTERS );
6171
6241
format_all_counters (ODD_COUNTERS );
6172
6242
flush_output_stdout ();
@@ -6945,8 +7015,8 @@ void rapl_probe_intel(void)
6945
7015
unsigned long long msr ;
6946
7016
unsigned int time_unit ;
6947
7017
double tdp ;
6948
- const unsigned long long bic_watt_bits = BIC_PkgWatt | BIC_CorWatt | BIC_RAMWatt | BIC_GFXWatt ;
6949
- const unsigned long long bic_joules_bits = BIC_Pkg_J | BIC_Cor_J | BIC_RAM_J | BIC_GFX_J ;
7018
+ const unsigned long long bic_watt_bits = BIC_SysWatt | BIC_PkgWatt | BIC_CorWatt | BIC_RAMWatt | BIC_GFXWatt ;
7019
+ const unsigned long long bic_joules_bits = BIC_Sys_J | BIC_Pkg_J | BIC_Cor_J | BIC_RAM_J | BIC_GFX_J ;
6950
7020
6951
7021
if (rapl_joules )
6952
7022
bic_enabled &= ~bic_watt_bits ;
@@ -7606,6 +7676,9 @@ void rapl_perf_init(void)
7606
7676
7607
7677
domain_visited [next_domain ] = 1 ;
7608
7678
7679
+ if ((cai -> flags & RAPL_COUNTER_FLAG_PLATFORM_COUNTER ) && (cpu != base_cpu ))
7680
+ continue ;
7681
+
7609
7682
struct rapl_counter_info_t * rci = & rapl_counter_info_perdomain [next_domain ];
7610
7683
7611
7684
/* Check if the counter is enabled and accessible */
0 commit comments