@@ -193,6 +193,7 @@ struct msr_counter bic[] = {
193
193
{ 0x0 , "SAM%mc6" , NULL , 0 , 0 , 0 , NULL , 0 },
194
194
{ 0x0 , "SAMMHz" , NULL , 0 , 0 , 0 , NULL , 0 },
195
195
{ 0x0 , "SAMAMHz" , NULL , 0 , 0 , 0 , NULL , 0 },
196
+ { 0x0 , "Die%c6" , NULL , 0 , 0 , 0 , NULL , 0 },
196
197
};
197
198
198
199
#define MAX_BIC (sizeof(bic) / sizeof(struct msr_counter))
@@ -254,11 +255,12 @@ struct msr_counter bic[] = {
254
255
#define BIC_SAM_mc6 (1ULL << 55)
255
256
#define BIC_SAMMHz (1ULL << 56)
256
257
#define BIC_SAMACTMHz (1ULL << 57)
258
+ #define BIC_Diec6 (1ULL << 58)
257
259
258
260
#define BIC_TOPOLOGY (BIC_Package | BIC_Node | BIC_CoreCnt | BIC_PkgCnt | BIC_Core | BIC_CPU | BIC_Die )
259
261
#define BIC_THERMAL_PWR ( BIC_CoreTmp | BIC_PkgTmp | BIC_PkgWatt | BIC_CorWatt | BIC_GFXWatt | BIC_RAMWatt | BIC_PKG__ | BIC_RAM__)
260
262
#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)
261
- #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)
263
+ #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 )
262
264
#define BIC_OTHER ( BIC_IRQ | BIC_SMI | BIC_ThreadC | BIC_CoreTmp | BIC_IPC)
263
265
264
266
#define BIC_DISABLED_BY_DEFAULT (BIC_USEC | BIC_TOD | BIC_APIC | BIC_X2APIC)
@@ -1475,6 +1477,11 @@ static struct msr_counter_arch_info msr_counter_arch_infos[] = {
1475
1477
#define SYSFS_TELEM_PATH "/sys/class/intel_pmt"
1476
1478
#endif
1477
1479
1480
+ #define PMT_COUNTER_MTL_DC6_OFFSET 120
1481
+ #define PMT_COUNTER_MTL_DC6_LSB 0
1482
+ #define PMT_COUNTER_MTL_DC6_MSB 63
1483
+ #define PMT_MTL_DC6_GUID 0x1a067102
1484
+
1478
1485
#define PMT_COUNTER_NAME_SIZE_BYTES 16
1479
1486
#define PMT_COUNTER_TYPE_NAME_SIZE_BYTES 32
1480
1487
@@ -1496,6 +1503,7 @@ struct pmt_mmio {
1496
1503
1497
1504
enum pmt_datatype {
1498
1505
PMT_TYPE_RAW ,
1506
+ PMT_TYPE_XTAL_TIME ,
1499
1507
};
1500
1508
1501
1509
struct pmt_domain_info {
@@ -1630,6 +1638,7 @@ struct pkg_data {
1630
1638
struct rapl_counter rapl_dram_perf_status ; /* MSR_DRAM_PERF_STATUS */
1631
1639
unsigned int pkg_temp_c ;
1632
1640
unsigned int uncore_mhz ;
1641
+ unsigned long long die_c6 ;
1633
1642
unsigned long long counter [MAX_ADDED_PACKAGE_COUNTERS ];
1634
1643
unsigned long long perf_counter [MAX_ADDED_PACKAGE_COUNTERS ];
1635
1644
unsigned long long pmt_counter [PMT_MAX_ADDED_PACKAGE_COUNTERS ];
@@ -2281,6 +2290,10 @@ void print_header(char *delim)
2281
2290
outp += sprintf (outp , "%s%18.18s" , (printed ++ ? delim : "" ), ppmt -> name );
2282
2291
2283
2292
break ;
2293
+
2294
+ case PMT_TYPE_XTAL_TIME :
2295
+ outp += sprintf (outp , "%s%s" , delim , ppmt -> name );
2296
+ break ;
2284
2297
}
2285
2298
2286
2299
ppmt = ppmt -> next ;
@@ -2351,6 +2364,10 @@ void print_header(char *delim)
2351
2364
outp += sprintf (outp , "%s%18.18s" , (printed ++ ? delim : "" ), ppmt -> name );
2352
2365
2353
2366
break ;
2367
+
2368
+ case PMT_TYPE_XTAL_TIME :
2369
+ outp += sprintf (outp , "%s%s" , delim , ppmt -> name );
2370
+ break ;
2354
2371
}
2355
2372
2356
2373
ppmt = ppmt -> next ;
@@ -2400,6 +2417,8 @@ void print_header(char *delim)
2400
2417
outp += sprintf (outp , "%sPkg%%pc9" , (printed ++ ? delim : "" ));
2401
2418
if (DO_BIC (BIC_Pkgpc10 ))
2402
2419
outp += sprintf (outp , "%sPk%%pc10" , (printed ++ ? delim : "" ));
2420
+ if (DO_BIC (BIC_Diec6 ))
2421
+ outp += sprintf (outp , "%sDie%%c6" , (printed ++ ? delim : "" ));
2403
2422
if (DO_BIC (BIC_CPU_LPI ))
2404
2423
outp += sprintf (outp , "%sCPU%%LPI" , (printed ++ ? delim : "" ));
2405
2424
if (DO_BIC (BIC_SYS_LPI ))
@@ -2476,6 +2495,10 @@ void print_header(char *delim)
2476
2495
outp += sprintf (outp , "%s%18.18s" , (printed ++ ? delim : "" ), ppmt -> name );
2477
2496
2478
2497
break ;
2498
+
2499
+ case PMT_TYPE_XTAL_TIME :
2500
+ outp += sprintf (outp , "%s%s" , delim , ppmt -> name );
2501
+ break ;
2479
2502
}
2480
2503
2481
2504
ppmt = ppmt -> next ;
@@ -2775,6 +2798,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
2775
2798
outp += sprintf (outp , "%s0x%016llx" , (printed ++ ? delim : "" ), t -> pmt_counter [i ]);
2776
2799
2777
2800
break ;
2801
+
2802
+ case PMT_TYPE_XTAL_TIME :
2803
+ const unsigned long value_raw = t -> pmt_counter [i ];
2804
+ const double value_converted = 100.0 * value_raw / crystal_hz / interval_float ;
2805
+
2806
+ outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), value_converted );
2807
+ break ;
2778
2808
}
2779
2809
}
2780
2810
@@ -2849,6 +2879,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
2849
2879
outp += sprintf (outp , "%s0x%016llx" , (printed ++ ? delim : "" ), c -> pmt_counter [i ]);
2850
2880
2851
2881
break ;
2882
+
2883
+ case PMT_TYPE_XTAL_TIME :
2884
+ const unsigned long value_raw = c -> pmt_counter [i ];
2885
+ const double value_converted = 100.0 * value_raw / crystal_hz / interval_float ;
2886
+
2887
+ outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), value_converted );
2888
+ break ;
2852
2889
}
2853
2890
}
2854
2891
@@ -2931,6 +2968,9 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
2931
2968
if (DO_BIC (BIC_Pkgpc10 ))
2932
2969
outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), 100.0 * p -> pc10 / tsc );
2933
2970
2971
+ if (DO_BIC (BIC_Diec6 ))
2972
+ outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), 100.0 * p -> die_c6 / crystal_hz / interval_float );
2973
+
2934
2974
if (DO_BIC (BIC_CPU_LPI )) {
2935
2975
if (p -> cpu_lpi >= 0 )
2936
2976
outp +=
@@ -3037,6 +3077,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
3037
3077
outp += sprintf (outp , "%s0x%016llx" , (printed ++ ? delim : "" ), p -> pmt_counter [i ]);
3038
3078
3039
3079
break ;
3080
+
3081
+ case PMT_TYPE_XTAL_TIME :
3082
+ const unsigned long value_raw = p -> pmt_counter [i ];
3083
+ const double value_converted = 100.0 * value_raw / crystal_hz / interval_float ;
3084
+
3085
+ outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), value_converted );
3086
+ break ;
3040
3087
}
3041
3088
}
3042
3089
@@ -3115,6 +3162,7 @@ int delta_package(struct pkg_data *new, struct pkg_data *old)
3115
3162
old -> pc8 = new -> pc8 - old -> pc8 ;
3116
3163
old -> pc9 = new -> pc9 - old -> pc9 ;
3117
3164
old -> pc10 = new -> pc10 - old -> pc10 ;
3165
+ old -> die_c6 = new -> die_c6 - old -> die_c6 ;
3118
3166
old -> cpu_lpi = new -> cpu_lpi - old -> cpu_lpi ;
3119
3167
old -> sys_lpi = new -> sys_lpi - old -> sys_lpi ;
3120
3168
old -> pkg_temp_c = new -> pkg_temp_c ;
@@ -3398,6 +3446,7 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data
3398
3446
p -> pc8 = 0 ;
3399
3447
p -> pc9 = 0 ;
3400
3448
p -> pc10 = 0 ;
3449
+ p -> die_c6 = 0 ;
3401
3450
p -> cpu_lpi = 0 ;
3402
3451
p -> sys_lpi = 0 ;
3403
3452
@@ -3547,6 +3596,7 @@ int sum_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
3547
3596
average .packages .pc8 += p -> pc8 ;
3548
3597
average .packages .pc9 += p -> pc9 ;
3549
3598
average .packages .pc10 += p -> pc10 ;
3599
+ average .packages .die_c6 += p -> die_c6 ;
3550
3600
3551
3601
average .packages .cpu_lpi = p -> cpu_lpi ;
3552
3602
average .packages .sys_lpi = p -> sys_lpi ;
@@ -3642,6 +3692,7 @@ void compute_average(struct thread_data *t, struct core_data *c, struct pkg_data
3642
3692
average .packages .pc8 /= topo .allowed_packages ;
3643
3693
average .packages .pc9 /= topo .allowed_packages ;
3644
3694
average .packages .pc10 /= topo .allowed_packages ;
3695
+ average .packages .die_c6 /= topo .allowed_packages ;
3645
3696
3646
3697
for (i = 0 , mp = sys .tp ; mp ; i ++ , mp = mp -> next ) {
3647
3698
if (mp -> format == FORMAT_RAW )
@@ -5505,6 +5556,7 @@ void msr_perf_init(void);
5505
5556
void rapl_perf_init (void );
5506
5557
void cstate_perf_init (void );
5507
5558
void added_perf_counters_init (void );
5559
+ void pmt_init (void );
5508
5560
5509
5561
void re_initialize (void )
5510
5562
{
@@ -5515,6 +5567,7 @@ void re_initialize(void)
5515
5567
rapl_perf_init ();
5516
5568
cstate_perf_init ();
5517
5569
added_perf_counters_init ();
5570
+ pmt_init ();
5518
5571
fprintf (outf , "turbostat: re-initialized with num_cpus %d, allowed_cpus %d\n" , topo .num_cpus ,
5519
5572
topo .allowed_cpus );
5520
5573
}
@@ -8864,6 +8917,15 @@ int pmt_add_counter(unsigned int guid, const char *name, enum pmt_datatype type,
8864
8917
return 0 ;
8865
8918
}
8866
8919
8920
+ void pmt_init (void )
8921
+ {
8922
+ if (BIC_IS_ENABLED (BIC_Diec6 )) {
8923
+ pmt_add_counter (PMT_MTL_DC6_GUID , "Die%c6" , PMT_TYPE_XTAL_TIME , PMT_COUNTER_MTL_DC6_LSB ,
8924
+ PMT_COUNTER_MTL_DC6_MSB , PMT_COUNTER_MTL_DC6_OFFSET , SCOPE_PACKAGE , FORMAT_DELTA ,
8925
+ 0 , PMT_OPEN_TRY );
8926
+ }
8927
+ }
8928
+
8867
8929
void turbostat_init ()
8868
8930
{
8869
8931
setup_all_buffers (true);
@@ -8878,6 +8940,7 @@ void turbostat_init()
8878
8940
rapl_perf_init ();
8879
8941
cstate_perf_init ();
8880
8942
added_perf_counters_init ();
8943
+ pmt_init ();
8881
8944
8882
8945
for_all_cpus (get_cpu_type , ODD_COUNTERS );
8883
8946
for_all_cpus (get_cpu_type , EVEN_COUNTERS );
@@ -9465,6 +9528,11 @@ void parse_add_command_pmt(char *add_command)
9465
9528
has_type = true;
9466
9529
}
9467
9530
9531
+ if (strcmp ("txtal_time" , type_name ) == 0 ) {
9532
+ type = PMT_TYPE_XTAL_TIME ;
9533
+ has_type = true;
9534
+ }
9535
+
9468
9536
if (!has_type ) {
9469
9537
printf ("%s: invalid %s: %s\n" , __func__ , "type" , type_name );
9470
9538
exit (1 );
0 commit comments