@@ -193,6 +193,7 @@ struct msr_counter bic[] = {
193193 { 0x0 , "SAM%mc6" , NULL , 0 , 0 , 0 , NULL , 0 },
194194 { 0x0 , "SAMMHz" , NULL , 0 , 0 , 0 , NULL , 0 },
195195 { 0x0 , "SAMAMHz" , NULL , 0 , 0 , 0 , NULL , 0 },
196+ { 0x0 , "Die%c6" , NULL , 0 , 0 , 0 , NULL , 0 },
196197};
197198
198199#define MAX_BIC (sizeof(bic) / sizeof(struct msr_counter))
@@ -254,11 +255,12 @@ struct msr_counter bic[] = {
254255#define BIC_SAM_mc6 (1ULL << 55)
255256#define BIC_SAMMHz (1ULL << 56)
256257#define BIC_SAMACTMHz (1ULL << 57)
258+ #define BIC_Diec6 (1ULL << 58)
257259
258260#define BIC_TOPOLOGY (BIC_Package | BIC_Node | BIC_CoreCnt | BIC_PkgCnt | BIC_Core | BIC_CPU | BIC_Die )
259261#define BIC_THERMAL_PWR ( BIC_CoreTmp | BIC_PkgTmp | BIC_PkgWatt | BIC_CorWatt | BIC_GFXWatt | BIC_RAMWatt | BIC_PKG__ | BIC_RAM__)
260262#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 )
262264#define BIC_OTHER ( BIC_IRQ | BIC_SMI | BIC_ThreadC | BIC_CoreTmp | BIC_IPC)
263265
264266#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[] = {
14751477#define SYSFS_TELEM_PATH "/sys/class/intel_pmt"
14761478#endif
14771479
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+
14781485#define PMT_COUNTER_NAME_SIZE_BYTES 16
14791486#define PMT_COUNTER_TYPE_NAME_SIZE_BYTES 32
14801487
@@ -1496,6 +1503,7 @@ struct pmt_mmio {
14961503
14971504enum pmt_datatype {
14981505 PMT_TYPE_RAW ,
1506+ PMT_TYPE_XTAL_TIME ,
14991507};
15001508
15011509struct pmt_domain_info {
@@ -1630,6 +1638,7 @@ struct pkg_data {
16301638 struct rapl_counter rapl_dram_perf_status ; /* MSR_DRAM_PERF_STATUS */
16311639 unsigned int pkg_temp_c ;
16321640 unsigned int uncore_mhz ;
1641+ unsigned long long die_c6 ;
16331642 unsigned long long counter [MAX_ADDED_PACKAGE_COUNTERS ];
16341643 unsigned long long perf_counter [MAX_ADDED_PACKAGE_COUNTERS ];
16351644 unsigned long long pmt_counter [PMT_MAX_ADDED_PACKAGE_COUNTERS ];
@@ -2281,6 +2290,10 @@ void print_header(char *delim)
22812290 outp += sprintf (outp , "%s%18.18s" , (printed ++ ? delim : "" ), ppmt -> name );
22822291
22832292 break ;
2293+
2294+ case PMT_TYPE_XTAL_TIME :
2295+ outp += sprintf (outp , "%s%s" , delim , ppmt -> name );
2296+ break ;
22842297 }
22852298
22862299 ppmt = ppmt -> next ;
@@ -2351,6 +2364,10 @@ void print_header(char *delim)
23512364 outp += sprintf (outp , "%s%18.18s" , (printed ++ ? delim : "" ), ppmt -> name );
23522365
23532366 break ;
2367+
2368+ case PMT_TYPE_XTAL_TIME :
2369+ outp += sprintf (outp , "%s%s" , delim , ppmt -> name );
2370+ break ;
23542371 }
23552372
23562373 ppmt = ppmt -> next ;
@@ -2400,6 +2417,8 @@ void print_header(char *delim)
24002417 outp += sprintf (outp , "%sPkg%%pc9" , (printed ++ ? delim : "" ));
24012418 if (DO_BIC (BIC_Pkgpc10 ))
24022419 outp += sprintf (outp , "%sPk%%pc10" , (printed ++ ? delim : "" ));
2420+ if (DO_BIC (BIC_Diec6 ))
2421+ outp += sprintf (outp , "%sDie%%c6" , (printed ++ ? delim : "" ));
24032422 if (DO_BIC (BIC_CPU_LPI ))
24042423 outp += sprintf (outp , "%sCPU%%LPI" , (printed ++ ? delim : "" ));
24052424 if (DO_BIC (BIC_SYS_LPI ))
@@ -2476,6 +2495,10 @@ void print_header(char *delim)
24762495 outp += sprintf (outp , "%s%18.18s" , (printed ++ ? delim : "" ), ppmt -> name );
24772496
24782497 break ;
2498+
2499+ case PMT_TYPE_XTAL_TIME :
2500+ outp += sprintf (outp , "%s%s" , delim , ppmt -> name );
2501+ break ;
24792502 }
24802503
24812504 ppmt = ppmt -> next ;
@@ -2775,6 +2798,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
27752798 outp += sprintf (outp , "%s0x%016llx" , (printed ++ ? delim : "" ), t -> pmt_counter [i ]);
27762799
27772800 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 ;
27782808 }
27792809 }
27802810
@@ -2849,6 +2879,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
28492879 outp += sprintf (outp , "%s0x%016llx" , (printed ++ ? delim : "" ), c -> pmt_counter [i ]);
28502880
28512881 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 ;
28522889 }
28532890 }
28542891
@@ -2931,6 +2968,9 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
29312968 if (DO_BIC (BIC_Pkgpc10 ))
29322969 outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), 100.0 * p -> pc10 / tsc );
29332970
2971+ if (DO_BIC (BIC_Diec6 ))
2972+ outp += sprintf (outp , "%s%.2f" , (printed ++ ? delim : "" ), 100.0 * p -> die_c6 / crystal_hz / interval_float );
2973+
29342974 if (DO_BIC (BIC_CPU_LPI )) {
29352975 if (p -> cpu_lpi >= 0 )
29362976 outp +=
@@ -3037,6 +3077,13 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
30373077 outp += sprintf (outp , "%s0x%016llx" , (printed ++ ? delim : "" ), p -> pmt_counter [i ]);
30383078
30393079 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 ;
30403087 }
30413088 }
30423089
@@ -3115,6 +3162,7 @@ int delta_package(struct pkg_data *new, struct pkg_data *old)
31153162 old -> pc8 = new -> pc8 - old -> pc8 ;
31163163 old -> pc9 = new -> pc9 - old -> pc9 ;
31173164 old -> pc10 = new -> pc10 - old -> pc10 ;
3165+ old -> die_c6 = new -> die_c6 - old -> die_c6 ;
31183166 old -> cpu_lpi = new -> cpu_lpi - old -> cpu_lpi ;
31193167 old -> sys_lpi = new -> sys_lpi - old -> sys_lpi ;
31203168 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
33983446 p -> pc8 = 0 ;
33993447 p -> pc9 = 0 ;
34003448 p -> pc10 = 0 ;
3449+ p -> die_c6 = 0 ;
34013450 p -> cpu_lpi = 0 ;
34023451 p -> sys_lpi = 0 ;
34033452
@@ -3547,6 +3596,7 @@ int sum_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
35473596 average .packages .pc8 += p -> pc8 ;
35483597 average .packages .pc9 += p -> pc9 ;
35493598 average .packages .pc10 += p -> pc10 ;
3599+ average .packages .die_c6 += p -> die_c6 ;
35503600
35513601 average .packages .cpu_lpi = p -> cpu_lpi ;
35523602 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
36423692 average .packages .pc8 /= topo .allowed_packages ;
36433693 average .packages .pc9 /= topo .allowed_packages ;
36443694 average .packages .pc10 /= topo .allowed_packages ;
3695+ average .packages .die_c6 /= topo .allowed_packages ;
36453696
36463697 for (i = 0 , mp = sys .tp ; mp ; i ++ , mp = mp -> next ) {
36473698 if (mp -> format == FORMAT_RAW )
@@ -5505,6 +5556,7 @@ void msr_perf_init(void);
55055556void rapl_perf_init (void );
55065557void cstate_perf_init (void );
55075558void added_perf_counters_init (void );
5559+ void pmt_init (void );
55085560
55095561void re_initialize (void )
55105562{
@@ -5515,6 +5567,7 @@ void re_initialize(void)
55155567 rapl_perf_init ();
55165568 cstate_perf_init ();
55175569 added_perf_counters_init ();
5570+ pmt_init ();
55185571 fprintf (outf , "turbostat: re-initialized with num_cpus %d, allowed_cpus %d\n" , topo .num_cpus ,
55195572 topo .allowed_cpus );
55205573}
@@ -8864,6 +8917,15 @@ int pmt_add_counter(unsigned int guid, const char *name, enum pmt_datatype type,
88648917 return 0 ;
88658918}
88668919
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+
88678929void turbostat_init ()
88688930{
88698931 setup_all_buffers (true);
@@ -8878,6 +8940,7 @@ void turbostat_init()
88788940 rapl_perf_init ();
88798941 cstate_perf_init ();
88808942 added_perf_counters_init ();
8943+ pmt_init ();
88818944
88828945 for_all_cpus (get_cpu_type , ODD_COUNTERS );
88838946 for_all_cpus (get_cpu_type , EVEN_COUNTERS );
@@ -9465,6 +9528,11 @@ void parse_add_command_pmt(char *add_command)
94659528 has_type = true;
94669529 }
94679530
9531+ if (strcmp ("txtal_time" , type_name ) == 0 ) {
9532+ type = PMT_TYPE_XTAL_TIME ;
9533+ has_type = true;
9534+ }
9535+
94689536 if (!has_type ) {
94699537 printf ("%s: invalid %s: %s\n" , __func__ , "type" , type_name );
94709538 exit (1 );
0 commit comments