Processor Counter Monitor
types.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: BSD-3-Clause
2 // Copyright (c) 2009-2020, Intel Corporation
3 // written by Roman Dementiev
4 //
5 
6 #ifndef CPUCounters_TYPES_H
7 #define CPUCounters_TYPES_H
8 
9 
14 #undef PCM_DEBUG
15 
16 #include <iostream>
17 #include <istream>
18 #include <sstream>
19 #include <iomanip>
20 #include <string.h>
21 
22 #ifdef _MSC_VER
23 #include <windows.h>
24 #endif
25 
26 namespace pcm {
27 
28 typedef unsigned long long uint64;
29 typedef signed long long int64;
30 typedef unsigned int uint32;
31 typedef signed int int32;
32 
33 #define PCM_ULIMIT_RECOMMENDATION ("try executing 'ulimit -n 1000000' to increase the limit on the number of open files.\n")
34 
35 /*
36  MSR addresses from
37  "Intel 64 and IA-32 Architectures Software Developers Manual Volume 3B:
38  System Programming Guide, Part 2", Appendix A "PERFORMANCE-MONITORING EVENTS"
39 */
40 
41 #define INST_RETIRED_ADDR (0x309)
42 #define CPU_CLK_UNHALTED_THREAD_ADDR (0x30A)
43 #define CPU_CLK_UNHALTED_REF_ADDR (0x30B)
44 #define TOPDOWN_SLOTS_ADDR (0x30C)
45 #define PERF_METRICS_ADDR (0x329)
46 #define IA32_CR_PERF_GLOBAL_CTRL (0x38F)
47 #define IA32_CR_FIXED_CTR_CTRL (0x38D)
48 #define IA32_PERFEVTSEL0_ADDR (0x186)
49 #define IA32_PERFEVTSEL1_ADDR (IA32_PERFEVTSEL0_ADDR + 1)
50 #define IA32_PERFEVTSEL2_ADDR (IA32_PERFEVTSEL0_ADDR + 2)
51 #define IA32_PERFEVTSEL3_ADDR (IA32_PERFEVTSEL0_ADDR + 3)
52 
53 constexpr auto IA32_PERF_GLOBAL_STATUS = 0x38E;
54 constexpr auto IA32_PERF_GLOBAL_OVF_CTRL = 0x390;
55 
56 #define PERF_MAX_FIXED_COUNTERS (3)
57 #define PERF_MAX_CUSTOM_COUNTERS (8)
58 #define PERF_TOPDOWN_COUNTERS (5)
59 #define PERF_MAX_COUNTERS (PERF_MAX_FIXED_COUNTERS + PERF_MAX_CUSTOM_COUNTERS + PERF_TOPDOWN_COUNTERS)
60 
61 #define IA32_DEBUGCTL (0x1D9)
62 
63 #define IA32_PMC0 (0xC1)
64 #define IA32_PMC1 (0xC1 + 1)
65 #define IA32_PMC2 (0xC1 + 2)
66 #define IA32_PMC3 (0xC1 + 3)
67 
68 #define MSR_OFFCORE_RSP0 (0x1A6)
69 #define MSR_OFFCORE_RSP1 (0x1A7)
70 
71 constexpr auto MSR_LOAD_LATENCY = 0x3F6;
72 constexpr auto MSR_FRONTEND = 0x3F7;
73 
74 /* From Table B-5. of the above mentioned document */
75 #define PLATFORM_INFO_ADDR (0xCE)
76 
77 #define IA32_TIME_STAMP_COUNTER (0x10)
78 
79 // Event IDs
80 
81 // Nehalem/Westmere on-core events
82 #define MEM_LOAD_RETIRED_L3_MISS_EVTNR (0xCB)
83 #define MEM_LOAD_RETIRED_L3_MISS_UMASK (0x10)
84 
85 #define MEM_LOAD_RETIRED_L3_UNSHAREDHIT_EVTNR (0xCB)
86 #define MEM_LOAD_RETIRED_L3_UNSHAREDHIT_UMASK (0x04)
87 
88 #define MEM_LOAD_RETIRED_L2_HITM_EVTNR (0xCB)
89 #define MEM_LOAD_RETIRED_L2_HITM_UMASK (0x08)
90 
91 #define MEM_LOAD_RETIRED_L2_HIT_EVTNR (0xCB)
92 #define MEM_LOAD_RETIRED_L2_HIT_UMASK (0x02)
93 
94 // Sandy Bridge on-core events
95 
96 #define MEM_LOAD_UOPS_MISC_RETIRED_LLC_MISS_EVTNR (0xD4)
97 #define MEM_LOAD_UOPS_MISC_RETIRED_LLC_MISS_UMASK (0x02)
98 
99 #define MEM_LOAD_UOPS_LLC_HIT_RETIRED_XSNP_NONE_EVTNR (0xD2)
100 #define MEM_LOAD_UOPS_LLC_HIT_RETIRED_XSNP_NONE_UMASK (0x08)
101 
102 #define MEM_LOAD_UOPS_LLC_HIT_RETIRED_XSNP_HITM_EVTNR (0xD2)
103 #define MEM_LOAD_UOPS_LLC_HIT_RETIRED_XSNP_HITM_UMASK (0x04)
104 
105 #define MEM_LOAD_UOPS_LLC_HIT_RETIRED_XSNP_EVTNR (0xD2)
106 #define MEM_LOAD_UOPS_LLC_HIT_RETIRED_XSNP_UMASK (0x07)
107 
108 #define MEM_LOAD_UOPS_RETIRED_L2_HIT_EVTNR (0xD1)
109 #define MEM_LOAD_UOPS_RETIRED_L2_HIT_UMASK (0x02)
110 
111 // Skylake on-core events
112 
113 #define SKL_MEM_LOAD_RETIRED_L3_MISS_EVTNR (0xD1)
114 #define SKL_MEM_LOAD_RETIRED_L3_MISS_UMASK (0x20)
115 
116 #define SKL_MEM_LOAD_RETIRED_L3_HIT_EVTNR (0xD1)
117 #define SKL_MEM_LOAD_RETIRED_L3_HIT_UMASK (0x04)
118 
119 #define SKL_MEM_LOAD_RETIRED_L2_MISS_EVTNR (0xD1)
120 #define SKL_MEM_LOAD_RETIRED_L2_MISS_UMASK (0x10)
121 
122 #define SKL_MEM_LOAD_RETIRED_L2_HIT_EVTNR (0xD1)
123 #define SKL_MEM_LOAD_RETIRED_L2_HIT_UMASK (0x02)
124 
125 // architectural on-core events
126 
127 #define ARCH_LLC_REFERENCE_EVTNR (0x2E)
128 #define ARCH_LLC_REFERENCE_UMASK (0x4F)
129 
130 #define ARCH_LLC_MISS_EVTNR (0x2E)
131 #define ARCH_LLC_MISS_UMASK (0x41)
132 
133 // Atom on-core events
134 
135 #define ATOM_MEM_LOAD_RETIRED_L2_HIT_EVTNR (0xCB)
136 #define ATOM_MEM_LOAD_RETIRED_L2_HIT_UMASK (0x01)
137 
138 #define ATOM_MEM_LOAD_RETIRED_L2_MISS_EVTNR (0xCB)
139 #define ATOM_MEM_LOAD_RETIRED_L2_MISS_UMASK (0x02)
140 
141 #define ATOM_MEM_LOAD_RETIRED_L2_HIT_EVTNR (0xCB)
142 #define ATOM_MEM_LOAD_RETIRED_L2_HIT_UMASK (0x01)
143 
144 #define ATOM_MEM_LOAD_RETIRED_L2_MISS_EVTNR (0xCB)
145 #define ATOM_MEM_LOAD_RETIRED_L2_MISS_UMASK (0x02)
146 
147 #define ATOM_MEM_LOAD_RETIRED_L2_HIT_EVTNR (0xCB)
148 #define ATOM_MEM_LOAD_RETIRED_L2_HIT_UMASK (0x01)
149 
150 #define ATOM_MEM_LOAD_RETIRED_L2_MISS_EVTNR (0xCB)
151 #define ATOM_MEM_LOAD_RETIRED_L2_MISS_UMASK (0x02)
152 
153 // Offcore response events
154 #define OFFCORE_RESPONSE_0_EVTNR (0xB7)
155 #define OFFCORE_RESPONSE_1_EVTNR (0xBB)
156 #define GLC_OFFCORE_RESPONSE_0_EVTNR (0x2A)
157 #define GLC_OFFCORE_RESPONSE_1_EVTNR (0x2B)
158 #define OFFCORE_RESPONSE_0_UMASK (1)
159 #define OFFCORE_RESPONSE_1_UMASK (1)
160 
161 
162 constexpr auto LOAD_LATENCY_EVTNR = 0xcd;
163 constexpr auto LOAD_LATENCY_UMASK = 0x01;
164 constexpr auto FRONTEND_EVTNR = 0xC6;
165 constexpr auto FRONTEND_UMASK = 0x01;
166 
167 /*
168  For Nehalem(-EP) processors from Intel(r) 64 and IA-32 Architectures Software Developer's Manual
169 */
170 
171 // Uncore msrs
172 
173 #define MSR_UNCORE_PERF_GLOBAL_CTRL_ADDR (0x391)
174 
175 #define MSR_UNCORE_PERFEVTSEL0_ADDR (0x3C0)
176 #define MSR_UNCORE_PERFEVTSEL1_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 1)
177 #define MSR_UNCORE_PERFEVTSEL2_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 2)
178 #define MSR_UNCORE_PERFEVTSEL3_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 3)
179 #define MSR_UNCORE_PERFEVTSEL4_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 4)
180 #define MSR_UNCORE_PERFEVTSEL5_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 5)
181 #define MSR_UNCORE_PERFEVTSEL6_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 6)
182 #define MSR_UNCORE_PERFEVTSEL7_ADDR (MSR_UNCORE_PERFEVTSEL0_ADDR + 7)
183 
184 
185 #define MSR_UNCORE_PMC0 (0x3B0)
186 #define MSR_UNCORE_PMC1 (MSR_UNCORE_PMC0 + 1)
187 #define MSR_UNCORE_PMC2 (MSR_UNCORE_PMC0 + 2)
188 #define MSR_UNCORE_PMC3 (MSR_UNCORE_PMC0 + 3)
189 #define MSR_UNCORE_PMC4 (MSR_UNCORE_PMC0 + 4)
190 #define MSR_UNCORE_PMC5 (MSR_UNCORE_PMC0 + 5)
191 #define MSR_UNCORE_PMC6 (MSR_UNCORE_PMC0 + 6)
192 #define MSR_UNCORE_PMC7 (MSR_UNCORE_PMC0 + 7)
193 
194 // Uncore event IDs
195 
196 #define UNC_QMC_WRITES_FULL_ANY_EVTNR (0x2F)
197 #define UNC_QMC_WRITES_FULL_ANY_UMASK (0x07)
198 
199 #define UNC_QMC_NORMAL_READS_ANY_EVTNR (0x2C)
200 #define UNC_QMC_NORMAL_READS_ANY_UMASK (0x07)
201 
202 #define UNC_QHL_REQUESTS_EVTNR (0x20)
203 
204 #define UNC_QHL_REQUESTS_IOH_READS_UMASK (0x01)
205 #define UNC_QHL_REQUESTS_IOH_WRITES_UMASK (0x02)
206 #define UNC_QHL_REQUESTS_REMOTE_READS_UMASK (0x04)
207 #define UNC_QHL_REQUESTS_REMOTE_WRITES_UMASK (0x08)
208 #define UNC_QHL_REQUESTS_LOCAL_READS_UMASK (0x10)
209 #define UNC_QHL_REQUESTS_LOCAL_WRITES_UMASK (0x20)
210 
211 /*
212  From "Intel(r) Xeon(r) Processor 7500 Series Uncore Programming Guide"
213 */
214 
215 // Beckton uncore event IDs
216 
217 #define U_MSR_PMON_GLOBAL_CTL (0x0C00)
218 
219 #define MB0_MSR_PERF_GLOBAL_CTL (0x0CA0)
220 #define MB0_MSR_PMU_CNT_0 (0x0CB1)
221 #define MB0_MSR_PMU_CNT_CTL_0 (0x0CB0)
222 #define MB0_MSR_PMU_CNT_1 (0x0CB3)
223 #define MB0_MSR_PMU_CNT_CTL_1 (0x0CB2)
224 #define MB0_MSR_PMU_ZDP_CTL_FVC (0x0CAB)
225 
226 
227 #define MB1_MSR_PERF_GLOBAL_CTL (0x0CE0)
228 #define MB1_MSR_PMU_CNT_0 (0x0CF1)
229 #define MB1_MSR_PMU_CNT_CTL_0 (0x0CF0)
230 #define MB1_MSR_PMU_CNT_1 (0x0CF3)
231 #define MB1_MSR_PMU_CNT_CTL_1 (0x0CF2)
232 #define MB1_MSR_PMU_ZDP_CTL_FVC (0x0CEB)
233 
234 #define BB0_MSR_PERF_GLOBAL_CTL (0x0C20)
235 #define BB0_MSR_PERF_CNT_1 (0x0C33)
236 #define BB0_MSR_PERF_CNT_CTL_1 (0x0C32)
237 
238 #define BB1_MSR_PERF_GLOBAL_CTL (0x0C60)
239 #define BB1_MSR_PERF_CNT_1 (0x0C73)
240 #define BB1_MSR_PERF_CNT_CTL_1 (0x0C72)
241 
242 #define R_MSR_PMON_CTL0 (0x0E10)
243 #define R_MSR_PMON_CTR0 (0x0E11)
244 #define R_MSR_PMON_CTL1 (0x0E12)
245 #define R_MSR_PMON_CTR1 (0x0E13)
246 #define R_MSR_PMON_CTL2 (0x0E14)
247 #define R_MSR_PMON_CTR2 (0x0E15)
248 #define R_MSR_PMON_CTL3 (0x0E16)
249 #define R_MSR_PMON_CTR3 (0x0E17)
250 #define R_MSR_PMON_CTL4 (0x0E18)
251 #define R_MSR_PMON_CTR4 (0x0E19)
252 #define R_MSR_PMON_CTL5 (0x0E1A)
253 #define R_MSR_PMON_CTR5 (0x0E1B)
254 #define R_MSR_PMON_CTL6 (0x0E1C)
255 #define R_MSR_PMON_CTR6 (0x0E1D)
256 #define R_MSR_PMON_CTL7 (0x0E1E)
257 #define R_MSR_PMON_CTR7 (0x0E1F)
258 #define R_MSR_PMON_CTL8 (0x0E30)
259 #define R_MSR_PMON_CTR8 (0x0E31)
260 #define R_MSR_PMON_CTL9 (0x0E32)
261 #define R_MSR_PMON_CTR9 (0x0E33)
262 #define R_MSR_PMON_CTL10 (0x0E34)
263 #define R_MSR_PMON_CTR10 (0x0E35)
264 #define R_MSR_PMON_CTL11 (0x0E36)
265 #define R_MSR_PMON_CTR11 (0x0E37)
266 #define R_MSR_PMON_CTL12 (0x0E38)
267 #define R_MSR_PMON_CTR12 (0x0E39)
268 #define R_MSR_PMON_CTL13 (0x0E3A)
269 #define R_MSR_PMON_CTR13 (0x0E3B)
270 #define R_MSR_PMON_CTL14 (0x0E3C)
271 #define R_MSR_PMON_CTR14 (0x0E3D)
272 #define R_MSR_PMON_CTL15 (0x0E3E)
273 #define R_MSR_PMON_CTR15 (0x0E3F)
274 
275 #define R_MSR_PORT0_IPERF_CFG0 (0x0E04)
276 #define R_MSR_PORT1_IPERF_CFG0 (0x0E05)
277 #define R_MSR_PORT2_IPERF_CFG0 (0x0E06)
278 #define R_MSR_PORT3_IPERF_CFG0 (0x0E07)
279 #define R_MSR_PORT4_IPERF_CFG0 (0x0E08)
280 #define R_MSR_PORT5_IPERF_CFG0 (0x0E09)
281 #define R_MSR_PORT6_IPERF_CFG0 (0x0E0A)
282 #define R_MSR_PORT7_IPERF_CFG0 (0x0E0B)
283 
284 #define R_MSR_PORT0_IPERF_CFG1 (0x0E24)
285 #define R_MSR_PORT1_IPERF_CFG1 (0x0E25)
286 #define R_MSR_PORT2_IPERF_CFG1 (0x0E26)
287 #define R_MSR_PORT3_IPERF_CFG1 (0x0E27)
288 #define R_MSR_PORT4_IPERF_CFG1 (0x0E28)
289 #define R_MSR_PORT5_IPERF_CFG1 (0x0E29)
290 #define R_MSR_PORT6_IPERF_CFG1 (0x0E2A)
291 #define R_MSR_PORT7_IPERF_CFG1 (0x0E2B)
292 
293 #define R_MSR_PMON_GLOBAL_CTL_7_0 (0x0E00)
294 #define R_MSR_PMON_GLOBAL_CTL_15_8 (0x0E20)
295 
296 #define W_MSR_PMON_GLOBAL_CTL (0xC80)
297 #define W_MSR_PMON_FIXED_CTR_CTL (0x395)
298 #define W_MSR_PMON_FIXED_CTR (0x394)
299 
300 /*
301  * Platform QoS MSRs
302  */
303 
304 #define IA32_PQR_ASSOC (0xc8f)
305 #define IA32_QM_EVTSEL (0xc8d)
306 #define IA32_QM_CTR (0xc8e)
307 
308 #define PCM_INVALID_QOS_MONITORING_DATA ((std::numeric_limits<uint64>::max)())
309 
310 /* \brief Event Select Register format
311 
312  According to
313  "Intel 64 and IA-32 Architectures Software Developers Manual Volume 3B:
314  System Programming Guide, Part 2", Figure 30-6. Layout of IA32_PERFEVTSELx
315  MSRs Supporting Architectural Performance Monitoring Version 3
316 */
318 {
319  union
320  {
321  struct
322  {
323  uint64 event_select : 8;
324  uint64 umask : 8;
325  uint64 usr : 1;
326  uint64 os : 1;
327  uint64 edge : 1;
328  uint64 pin_control : 1;
329  uint64 apic_int : 1;
330  uint64 any_thread : 1;
331  uint64 enable : 1;
332  uint64 invert : 1;
333  uint64 cmask : 8;
334  uint64 in_tx : 1;
335  uint64 in_txcp : 1;
336  uint64 reservedX : 30;
337  } fields;
338  uint64 value;
339  };
340 
341  EventSelectRegister() : value(0) {}
342 };
343 
344 
345 /* \brief Fixed Event Control Register format
346 
347  According to
348  "Intel 64 and IA-32 Architectures Software Developers Manual Volume 3B:
349  System Programming Guide, Part 2", Figure 30-7. Layout of
350  IA32_FIXED_CTR_CTRL MSR Supporting Architectural Performance Monitoring Version 3
351 */
353 {
354  union
355  {
356  struct
357  {
358  // CTR0
359  uint64 os0 : 1;
360  uint64 usr0 : 1;
361  uint64 any_thread0 : 1;
362  uint64 enable_pmi0 : 1;
363  // CTR1
364  uint64 os1 : 1;
365  uint64 usr1 : 1;
366  uint64 any_thread1 : 1;
367  uint64 enable_pmi1 : 1;
368  // CTR2
369  uint64 os2 : 1;
370  uint64 usr2 : 1;
371  uint64 any_thread2 : 1;
372  uint64 enable_pmi2 : 1;
373  // CTR3
374  uint64 os3 : 1;
375  uint64 usr3 : 1;
376  uint64 any_thread3 : 1;
377  uint64 enable_pmi3 : 1;
378 
379  uint64 reserved1 : 48;
380  } fields;
381  uint64 value;
382  };
383  FixedEventControlRegister() : value(0) {}
384 };
385 
386 inline std::ostream & operator << (std::ostream & o, const FixedEventControlRegister & reg)
387 {
388  o << "os0\t\t" << reg.fields.os0 << "\n";
389  o << "usr0\t\t" << reg.fields.usr0 << "\n";
390  o << "any_thread0\t" << reg.fields.any_thread0 << "\n";
391  o << "enable_pmi0\t" << reg.fields.enable_pmi0 << "\n";
392 
393  o << "os1\t\t" << reg.fields.os1 << "\n";
394  o << "usr1\t\t" << reg.fields.usr1 << "\n";
395  o << "any_thread1\t" << reg.fields.any_thread1 << "\n";
396  o << "enable_pmi10\t" << reg.fields.enable_pmi1 << "\n";
397 
398  o << "os2\t\t" << reg.fields.os2 << "\n";
399  o << "usr2\t\t" << reg.fields.usr2 << "\n";
400  o << "any_thread2\t" << reg.fields.any_thread2 << "\n";
401  o << "enable_pmi2\t" << reg.fields.enable_pmi2 << "\n";
402 
403  o << "reserved1\t" << reg.fields.reserved1 << "\n";
404  return o;
405 }
406 
407 // UNCORE COUNTER CONTROL
408 
409 /* \brief Uncore Event Select Register Register format
410 
411  According to
412  "Intel 64 and IA-32 Architectures Software Developers Manual Volume 3B:
413  System Programming Guide, Part 2", Figure 30-20. Layout of MSR_UNCORE_PERFEVTSELx MSRs
414 */
416 {
417  union
418  {
419  struct
420  {
421  uint64 event_select : 8;
422  uint64 umask : 8;
423  uint64 reserved1 : 1;
424  uint64 occ_ctr_rst : 1;
425  uint64 edge : 1;
426  uint64 reserved2 : 1;
427  uint64 enable_pmi : 1;
428  uint64 reserved3 : 1;
429  uint64 enable : 1;
430  uint64 invert : 1;
431  uint64 cmask : 8;
432  uint64 reservedx : 32;
433  } fields;
434  uint64 value;
435  };
436 };
437 
438 /* \brief Beckton Uncore PMU ZDP FVC Control Register format
439 
440  From "Intel(r) Xeon(r) Processor 7500 Series Uncore Programming Guide"
441  Table 2-80. M_MSR_PMU_ZDP_CTL_FVC Register - Field Definitions
442 */
444 {
445  union
446  {
447  struct
448  {
449  uint64 fvid : 5;
450  uint64 bcmd : 3;
451  uint64 resp : 3;
452  uint64 evnt0 : 3;
453  uint64 evnt1 : 3;
454  uint64 evnt2 : 3;
455  uint64 evnt3 : 3;
456  uint64 pbox_init_err : 1;
457  } fields; // nehalem-ex version
458  struct
459  {
460  uint64 fvid : 6;
461  uint64 bcmd : 3;
462  uint64 resp : 3;
463  uint64 evnt0 : 3;
464  uint64 evnt1 : 3;
465  uint64 evnt2 : 3;
466  uint64 evnt3 : 3;
467  uint64 pbox_init_err : 1;
468  } fields_wsm; // westmere-ex version
469  uint64 value;
470  };
471 };
472 
473 /* \brief Beckton Uncore PMU Counter Control Register format
474 
475  From "Intel(r) Xeon(r) Processor 7500 Series Uncore Programming Guide"
476  Table 2-67. M_MSR_PMU_CNT_CTL{5-0} Register - Field Definitions
477 */
479 {
480  union
481  {
482  struct
483  {
484  uint64 en : 1;
485  uint64 pmi_en : 1;
486  uint64 count_mode : 2;
487  uint64 storage_mode : 2;
488  uint64 wrap_mode : 1;
489  uint64 flag_mode : 1;
490  uint64 rsv1 : 1;
491  uint64 inc_sel : 5;
492  uint64 rsv2 : 5;
493  uint64 set_flag_sel : 3;
494  } fields;
495  uint64 value;
496  };
497 };
498 
499 #define MSR_SMI_COUNT (0x34)
500 
501 /* \brief Sandy Bridge energy counters
502 */
503 
504 #define MSR_PKG_ENERGY_STATUS (0x611)
505 #define MSR_RAPL_POWER_UNIT (0x606)
506 #define MSR_PKG_POWER_INFO (0x614)
507 
508 #define PCM_INTEL_PCI_VENDOR_ID (0x8086)
509 #define PCM_PCI_VENDOR_ID_OFFSET (0)
510 
511 // server PCICFG uncore counters
512 
513 #define JKTIVT_MC0_CH0_REGISTER_DEV_ADDR (16)
514 #define JKTIVT_MC0_CH1_REGISTER_DEV_ADDR (16)
515 #define JKTIVT_MC0_CH2_REGISTER_DEV_ADDR (16)
516 #define JKTIVT_MC0_CH3_REGISTER_DEV_ADDR (16)
517 #define JKTIVT_MC0_CH0_REGISTER_FUNC_ADDR (4)
518 #define JKTIVT_MC0_CH1_REGISTER_FUNC_ADDR (5)
519 #define JKTIVT_MC0_CH2_REGISTER_FUNC_ADDR (0)
520 #define JKTIVT_MC0_CH3_REGISTER_FUNC_ADDR (1)
521 
522 #define JKTIVT_MC1_CH0_REGISTER_DEV_ADDR (30)
523 #define JKTIVT_MC1_CH1_REGISTER_DEV_ADDR (30)
524 #define JKTIVT_MC1_CH2_REGISTER_DEV_ADDR (30)
525 #define JKTIVT_MC1_CH3_REGISTER_DEV_ADDR (30)
526 #define JKTIVT_MC1_CH0_REGISTER_FUNC_ADDR (4)
527 #define JKTIVT_MC1_CH1_REGISTER_FUNC_ADDR (5)
528 #define JKTIVT_MC1_CH2_REGISTER_FUNC_ADDR (0)
529 #define JKTIVT_MC1_CH3_REGISTER_FUNC_ADDR (1)
530 
531 #define HSX_MC0_CH0_REGISTER_DEV_ADDR (20)
532 #define HSX_MC0_CH1_REGISTER_DEV_ADDR (20)
533 #define HSX_MC0_CH2_REGISTER_DEV_ADDR (21)
534 #define HSX_MC0_CH3_REGISTER_DEV_ADDR (21)
535 #define HSX_MC0_CH0_REGISTER_FUNC_ADDR (0)
536 #define HSX_MC0_CH1_REGISTER_FUNC_ADDR (1)
537 #define HSX_MC0_CH2_REGISTER_FUNC_ADDR (0)
538 #define HSX_MC0_CH3_REGISTER_FUNC_ADDR (1)
539 
540 #define HSX_MC1_CH0_REGISTER_DEV_ADDR (23)
541 #define HSX_MC1_CH1_REGISTER_DEV_ADDR (23)
542 #define HSX_MC1_CH2_REGISTER_DEV_ADDR (24)
543 #define HSX_MC1_CH3_REGISTER_DEV_ADDR (24)
544 #define HSX_MC1_CH0_REGISTER_FUNC_ADDR (0)
545 #define HSX_MC1_CH1_REGISTER_FUNC_ADDR (1)
546 #define HSX_MC1_CH2_REGISTER_FUNC_ADDR (0)
547 #define HSX_MC1_CH3_REGISTER_FUNC_ADDR (1)
548 
549 #define KNL_MC0_CH0_REGISTER_DEV_ADDR (8)
550 #define KNL_MC0_CH1_REGISTER_DEV_ADDR (8)
551 #define KNL_MC0_CH2_REGISTER_DEV_ADDR (8)
552 #define KNL_MC0_CH0_REGISTER_FUNC_ADDR (2)
553 #define KNL_MC0_CH1_REGISTER_FUNC_ADDR (3)
554 #define KNL_MC0_CH2_REGISTER_FUNC_ADDR (4)
555 
556 #define SKX_MC0_CH0_REGISTER_DEV_ADDR (10)
557 #define SKX_MC0_CH1_REGISTER_DEV_ADDR (10)
558 #define SKX_MC0_CH2_REGISTER_DEV_ADDR (11)
559 #define SKX_MC0_CH3_REGISTER_DEV_ADDR (-1) //Does not exist
560 #define SKX_MC0_CH0_REGISTER_FUNC_ADDR (2)
561 #define SKX_MC0_CH1_REGISTER_FUNC_ADDR (6)
562 #define SKX_MC0_CH2_REGISTER_FUNC_ADDR (2)
563 #define SKX_MC0_CH3_REGISTER_FUNC_ADDR (-1) //Does not exist
564 
565 #define SKX_MC1_CH0_REGISTER_DEV_ADDR (12)
566 #define SKX_MC1_CH1_REGISTER_DEV_ADDR (12)
567 #define SKX_MC1_CH2_REGISTER_DEV_ADDR (13)
568 #define SKX_MC1_CH3_REGISTER_DEV_ADDR (-1) //Does not exist
569 #define SKX_MC1_CH0_REGISTER_FUNC_ADDR (2)
570 #define SKX_MC1_CH1_REGISTER_FUNC_ADDR (6)
571 #define SKX_MC1_CH2_REGISTER_FUNC_ADDR (2)
572 #define SKX_MC1_CH3_REGISTER_FUNC_ADDR (-1) //Does not exist
573 
574 #define SERVER_UBOX0_REGISTER_DEV_ADDR (0)
575 #define SERVER_UBOX0_REGISTER_FUNC_ADDR (1)
576 
577 #define KNL_MC1_CH0_REGISTER_DEV_ADDR (9)
578 #define KNL_MC1_CH1_REGISTER_DEV_ADDR (9)
579 #define KNL_MC1_CH2_REGISTER_DEV_ADDR (9)
580 #define KNL_MC1_CH0_REGISTER_FUNC_ADDR (2)
581 #define KNL_MC1_CH1_REGISTER_FUNC_ADDR (3)
582 #define KNL_MC1_CH2_REGISTER_FUNC_ADDR (4)
583 
584 #define KNL_EDC0_ECLK_REGISTER_DEV_ADDR (24)
585 #define KNL_EDC0_ECLK_REGISTER_FUNC_ADDR (2)
586 #define KNL_EDC1_ECLK_REGISTER_DEV_ADDR (25)
587 #define KNL_EDC1_ECLK_REGISTER_FUNC_ADDR (2)
588 #define KNL_EDC2_ECLK_REGISTER_DEV_ADDR (26)
589 #define KNL_EDC2_ECLK_REGISTER_FUNC_ADDR (2)
590 #define KNL_EDC3_ECLK_REGISTER_DEV_ADDR (27)
591 #define KNL_EDC3_ECLK_REGISTER_FUNC_ADDR (2)
592 #define KNL_EDC4_ECLK_REGISTER_DEV_ADDR (28)
593 #define KNL_EDC4_ECLK_REGISTER_FUNC_ADDR (2)
594 #define KNL_EDC5_ECLK_REGISTER_DEV_ADDR (29)
595 #define KNL_EDC5_ECLK_REGISTER_FUNC_ADDR (2)
596 #define KNL_EDC6_ECLK_REGISTER_DEV_ADDR (30)
597 #define KNL_EDC6_ECLK_REGISTER_FUNC_ADDR (2)
598 #define KNL_EDC7_ECLK_REGISTER_DEV_ADDR (31)
599 #define KNL_EDC7_ECLK_REGISTER_FUNC_ADDR (2)
600 
601 #define HSX_HA0_REGISTER_DEV_ADDR (18)
602 #define HSX_HA0_REGISTER_FUNC_ADDR (1)
603 #define HSX_HA1_REGISTER_DEV_ADDR (18)
604 #define HSX_HA1_REGISTER_FUNC_ADDR (5)
605 
606 #define XPF_HA_PCI_PMON_BOX_CTL_ADDR (0xF4)
607 #define XPF_HA_PCI_PMON_CTL0_ADDR (0xD8 + 4*0)
608 #define XPF_HA_PCI_PMON_CTL1_ADDR (0xD8 + 4*1)
609 #define XPF_HA_PCI_PMON_CTL2_ADDR (0xD8 + 4*2)
610 #define XPF_HA_PCI_PMON_CTL3_ADDR (0xD8 + 4*3)
611 #define XPF_HA_PCI_PMON_CTR0_ADDR (0xA0 + 8*0)
612 #define XPF_HA_PCI_PMON_CTR1_ADDR (0xA0 + 8*1)
613 #define XPF_HA_PCI_PMON_CTR2_ADDR (0xA0 + 8*2)
614 #define XPF_HA_PCI_PMON_CTR3_ADDR (0xA0 + 8*3)
615 
620 #define XPF_MC_CH_PCI_PMON_BOX_CTL_ADDR (0x0F4)
621 #define KNX_MC_CH_PCI_PMON_BOX_CTL_ADDR (0xB30)
622 #define KNX_EDC_CH_PCI_PMON_BOX_CTL_ADDR (0xA30)
623 
625 #define XPF_MC_CH_PCI_PMON_FIXED_CTL_ADDR (0x0F0)
626 #define XPF_MC_CH_PCI_PMON_CTL3_ADDR (0x0E4)
627 #define XPF_MC_CH_PCI_PMON_CTL2_ADDR (0x0E0)
628 #define XPF_MC_CH_PCI_PMON_CTL1_ADDR (0x0DC)
629 #define XPF_MC_CH_PCI_PMON_CTL0_ADDR (0x0D8)
630 
632 #define KNX_MC_CH_PCI_PMON_FIXED_CTL_ADDR (0xB44)
633 #define KNX_MC_CH_PCI_PMON_CTL3_ADDR (0xB2C)
634 #define KNX_MC_CH_PCI_PMON_CTL2_ADDR (0xB28)
635 #define KNX_MC_CH_PCI_PMON_CTL1_ADDR (0xB24)
636 #define KNX_MC_CH_PCI_PMON_CTL0_ADDR (0xB20)
637 
639 #define KNX_EDC_CH_PCI_PMON_FIXED_CTL_ADDR (0xA44)
640 #define KNX_EDC_CH_PCI_PMON_CTL3_ADDR (0xA2C)
641 #define KNX_EDC_CH_PCI_PMON_CTL2_ADDR (0xA28)
642 #define KNX_EDC_CH_PCI_PMON_CTL1_ADDR (0xA24)
643 #define KNX_EDC_CH_PCI_PMON_CTL0_ADDR (0xA20)
644 #define KNX_EDC_ECLK_PMON_UNIT_CTL_REG (0xA30)
645 
647 #define XPF_MC_CH_PCI_PMON_FIXED_CTR_ADDR (0x0D0)
648 #define XPF_MC_CH_PCI_PMON_CTR3_ADDR (0x0B8)
649 #define XPF_MC_CH_PCI_PMON_CTR2_ADDR (0x0B0)
650 #define XPF_MC_CH_PCI_PMON_CTR1_ADDR (0x0A8)
651 #define XPF_MC_CH_PCI_PMON_CTR0_ADDR (0x0A0)
652 
654 #define KNX_MC_CH_PCI_PMON_FIXED_CTR_ADDR (0xB3C)
655 #define KNX_MC_CH_PCI_PMON_CTR3_ADDR (0xB18)
656 #define KNX_MC_CH_PCI_PMON_CTR2_ADDR (0xB10)
657 #define KNX_MC_CH_PCI_PMON_CTR1_ADDR (0xB08)
658 #define KNX_MC_CH_PCI_PMON_CTR0_ADDR (0xB00)
659 
661 #define KNX_EDC_CH_PCI_PMON_FIXED_CTR_ADDR (0xA3C)
662 #define KNX_EDC_CH_PCI_PMON_CTR3_ADDR (0xA18)
663 #define KNX_EDC_CH_PCI_PMON_CTR2_ADDR (0xA10)
664 #define KNX_EDC_CH_PCI_PMON_CTR1_ADDR (0xA08)
665 #define KNX_EDC_CH_PCI_PMON_CTR0_ADDR (0xA00)
666 
667 #define SERVER_MC_CH_PMON_BASE_ADDR (0x22800)
668 #define SERVER_MC_CH_PMON_STEP (0x4000)
669 #define SERVER_MC_CH_PMON_SIZE (0x1000)
670 #define SERVER_MC_CH_PMON_BOX_CTL_OFFSET (0x00)
671 #define SERVER_MC_CH_PMON_CTL0_OFFSET (0x40)
672 #define SERVER_MC_CH_PMON_CTL1_OFFSET (SERVER_MC_CH_PMON_CTL0_OFFSET + 4*1)
673 #define SERVER_MC_CH_PMON_CTL2_OFFSET (SERVER_MC_CH_PMON_CTL0_OFFSET + 4*2)
674 #define SERVER_MC_CH_PMON_CTL3_OFFSET (SERVER_MC_CH_PMON_CTL0_OFFSET + 4*3)
675 #define SERVER_MC_CH_PMON_CTR0_OFFSET (0x08)
676 #define SERVER_MC_CH_PMON_CTR1_OFFSET (SERVER_MC_CH_PMON_CTR0_OFFSET + 8*1)
677 #define SERVER_MC_CH_PMON_CTR2_OFFSET (SERVER_MC_CH_PMON_CTR0_OFFSET + 8*2)
678 #define SERVER_MC_CH_PMON_CTR3_OFFSET (SERVER_MC_CH_PMON_CTR0_OFFSET + 8*3)
679 #define SERVER_MC_CH_PMON_FIXED_CTL_OFFSET (0x54)
680 #define SERVER_MC_CH_PMON_FIXED_CTR_OFFSET (0x38)
681 
682 #define JKTIVT_QPI_PORT0_REGISTER_DEV_ADDR (8)
683 #define JKTIVT_QPI_PORT0_REGISTER_FUNC_ADDR (2)
684 #define JKTIVT_QPI_PORT1_REGISTER_DEV_ADDR (9)
685 #define JKTIVT_QPI_PORT1_REGISTER_FUNC_ADDR (2)
686 #define JKTIVT_QPI_PORT2_REGISTER_DEV_ADDR (24)
687 #define JKTIVT_QPI_PORT2_REGISTER_FUNC_ADDR (2)
688 
689 #define HSX_QPI_PORT0_REGISTER_DEV_ADDR (8)
690 #define HSX_QPI_PORT0_REGISTER_FUNC_ADDR (2)
691 #define HSX_QPI_PORT1_REGISTER_DEV_ADDR (9)
692 #define HSX_QPI_PORT1_REGISTER_FUNC_ADDR (2)
693 #define HSX_QPI_PORT2_REGISTER_DEV_ADDR (10)
694 #define HSX_QPI_PORT2_REGISTER_FUNC_ADDR (2)
695 
696 #define SKX_QPI_PORT0_REGISTER_DEV_ADDR (14)
697 #define SKX_QPI_PORT0_REGISTER_FUNC_ADDR (0)
698 #define SKX_QPI_PORT1_REGISTER_DEV_ADDR (15)
699 #define SKX_QPI_PORT1_REGISTER_FUNC_ADDR (0)
700 #define SKX_QPI_PORT2_REGISTER_DEV_ADDR (16)
701 #define SKX_QPI_PORT2_REGISTER_FUNC_ADDR (0)
702 
703 #define CPX_QPI_PORT3_REGISTER_DEV_ADDR (14)
704 #define CPX_QPI_PORT3_REGISTER_FUNC_ADDR (4)
705 #define CPX_QPI_PORT4_REGISTER_DEV_ADDR (15)
706 #define CPX_QPI_PORT4_REGISTER_FUNC_ADDR (4)
707 #define CPX_QPI_PORT5_REGISTER_DEV_ADDR (16)
708 #define CPX_QPI_PORT5_REGISTER_FUNC_ADDR (4)
709 
710 #define ICX_QPI_PORT0_REGISTER_DEV_ADDR (2)
711 #define ICX_QPI_PORT0_REGISTER_FUNC_ADDR (1)
712 #define ICX_QPI_PORT1_REGISTER_DEV_ADDR (3)
713 #define ICX_QPI_PORT1_REGISTER_FUNC_ADDR (1)
714 #define ICX_QPI_PORT2_REGISTER_DEV_ADDR (4)
715 #define ICX_QPI_PORT2_REGISTER_FUNC_ADDR (1)
716 
717 #define QPI_PORT0_MISC_REGISTER_FUNC_ADDR (0)
718 #define QPI_PORT1_MISC_REGISTER_FUNC_ADDR (0)
719 #define QPI_PORT2_MISC_REGISTER_FUNC_ADDR (0)
720 
721 constexpr auto SKX_M3UPI_PORT0_REGISTER_DEV_ADDR = (0x12);
722 constexpr auto SKX_M3UPI_PORT0_REGISTER_FUNC_ADDR = (1);
723 constexpr auto SKX_M3UPI_PORT1_REGISTER_DEV_ADDR = (0x12);
724 constexpr auto SKX_M3UPI_PORT1_REGISTER_FUNC_ADDR = (2);
725 constexpr auto SKX_M3UPI_PORT2_REGISTER_DEV_ADDR = (0x12);
726 constexpr auto SKX_M3UPI_PORT2_REGISTER_FUNC_ADDR = (5);
727 
728 constexpr auto CPX_M3UPI_PORT0_REGISTER_DEV_ADDR = (0x12);
729 constexpr auto CPX_M3UPI_PORT0_REGISTER_FUNC_ADDR = (1);
730 constexpr auto CPX_M3UPI_PORT1_REGISTER_DEV_ADDR = (0x12);
731 constexpr auto CPX_M3UPI_PORT1_REGISTER_FUNC_ADDR = (2);
732 constexpr auto CPX_M3UPI_PORT2_REGISTER_DEV_ADDR = (0x13);
733 constexpr auto CPX_M3UPI_PORT2_REGISTER_FUNC_ADDR = (1);
734 constexpr auto CPX_M3UPI_PORT3_REGISTER_DEV_ADDR = (0x13);
735 constexpr auto CPX_M3UPI_PORT3_REGISTER_FUNC_ADDR = (2);
736 constexpr auto CPX_M3UPI_PORT4_REGISTER_DEV_ADDR = (0x14);
737 constexpr auto CPX_M3UPI_PORT4_REGISTER_FUNC_ADDR = (1);
738 constexpr auto CPX_M3UPI_PORT5_REGISTER_DEV_ADDR = (0x14);
739 constexpr auto CPX_M3UPI_PORT5_REGISTER_FUNC_ADDR = (2);
740 
741 constexpr auto ICX_M3UPI_PORT0_REGISTER_DEV_ADDR = (5);
742 constexpr auto ICX_M3UPI_PORT1_REGISTER_DEV_ADDR = (6);
743 constexpr auto ICX_M3UPI_PORT2_REGISTER_DEV_ADDR = (7);
744 constexpr auto ICX_M3UPI_PORT0_REGISTER_FUNC_ADDR = (1);
745 constexpr auto ICX_M3UPI_PORT1_REGISTER_FUNC_ADDR = (1);
746 constexpr auto ICX_M3UPI_PORT2_REGISTER_FUNC_ADDR = (1);
747 
748 #define SKX_M2M_0_REGISTER_DEV_ADDR (8)
749 #define SKX_M2M_0_REGISTER_FUNC_ADDR (0)
750 #define SKX_M2M_1_REGISTER_DEV_ADDR (9)
751 #define SKX_M2M_1_REGISTER_FUNC_ADDR (0)
752 
753 #define SERVER_M2M_0_REGISTER_DEV_ADDR (12)
754 #define SERVER_M2M_0_REGISTER_FUNC_ADDR (0)
755 #define SERVER_M2M_1_REGISTER_DEV_ADDR (13)
756 #define SERVER_M2M_1_REGISTER_FUNC_ADDR (0)
757 #define SERVER_M2M_2_REGISTER_DEV_ADDR (14)
758 #define SERVER_M2M_2_REGISTER_FUNC_ADDR (0)
759 #define SERVER_M2M_3_REGISTER_DEV_ADDR (15)
760 #define SERVER_M2M_3_REGISTER_FUNC_ADDR (0)
761 
762 #define SKX_M2M_PCI_PMON_BOX_CTL_ADDR (0x258)
763 
764 #define SKX_M2M_PCI_PMON_CTL0_ADDR (0x228)
765 #define SKX_M2M_PCI_PMON_CTL1_ADDR (0x230)
766 #define SKX_M2M_PCI_PMON_CTL2_ADDR (0x238)
767 #define SKX_M2M_PCI_PMON_CTL3_ADDR (0x240)
768 
769 #define SKX_M2M_PCI_PMON_CTR0_ADDR (0x200)
770 #define SKX_M2M_PCI_PMON_CTR1_ADDR (0x208)
771 #define SKX_M2M_PCI_PMON_CTR2_ADDR (0x210)
772 #define SKX_M2M_PCI_PMON_CTR3_ADDR (0x218)
773 
774 #define SERVER_M2M_PCI_PMON_BOX_CTL_ADDR (0x438)
775 
776 #define SERVER_M2M_PCI_PMON_CTL0_ADDR (0x468)
777 #define SERVER_M2M_PCI_PMON_CTL1_ADDR (SERVER_M2M_PCI_PMON_CTL0_ADDR + 1*8)
778 #define SERVER_M2M_PCI_PMON_CTL2_ADDR (SERVER_M2M_PCI_PMON_CTL0_ADDR + 2*8)
779 #define SERVER_M2M_PCI_PMON_CTL3_ADDR (SERVER_M2M_PCI_PMON_CTL0_ADDR + 3*8)
780 
781 #define SERVER_M2M_PCI_PMON_CTR0_ADDR (0x440)
782 #define SERVER_M2M_PCI_PMON_CTR1_ADDR (SERVER_M2M_PCI_PMON_CTR0_ADDR + 1*8)
783 #define SERVER_M2M_PCI_PMON_CTR2_ADDR (SERVER_M2M_PCI_PMON_CTR0_ADDR + 2*8)
784 #define SERVER_M2M_PCI_PMON_CTR3_ADDR (SERVER_M2M_PCI_PMON_CTR0_ADDR + 3*8)
785 
786 constexpr auto M3UPI_PCI_PMON_BOX_CTL_ADDR = (0xF4);
787 
788 constexpr auto M3UPI_PCI_PMON_CTL0_ADDR = (0xD8);
789 constexpr auto M3UPI_PCI_PMON_CTL1_ADDR = (0xDC);
790 constexpr auto M3UPI_PCI_PMON_CTL2_ADDR = (0xE0);
791 
792 constexpr auto M3UPI_PCI_PMON_CTR0_ADDR = (0xA0);
793 constexpr auto M3UPI_PCI_PMON_CTR1_ADDR = (0xA8);
794 constexpr auto M3UPI_PCI_PMON_CTR2_ADDR = (0xB0);
795 
796 constexpr auto ICX_M3UPI_PCI_PMON_BOX_CTL_ADDR = (0xA0);
797 
798 constexpr auto ICX_M3UPI_PCI_PMON_CTL0_ADDR = (0xD8);
799 constexpr auto ICX_M3UPI_PCI_PMON_CTL1_ADDR = (0xDC);
800 constexpr auto ICX_M3UPI_PCI_PMON_CTL2_ADDR = (0xE0);
801 constexpr auto ICX_M3UPI_PCI_PMON_CTL3_ADDR = (0xE4);
802 
803 constexpr auto ICX_M3UPI_PCI_PMON_CTR0_ADDR = (0xA8);
804 constexpr auto ICX_M3UPI_PCI_PMON_CTR1_ADDR = (0xB0);
805 constexpr auto ICX_M3UPI_PCI_PMON_CTR2_ADDR = (0xB8);
806 constexpr auto ICX_M3UPI_PCI_PMON_CTR3_ADDR = (0xC0);
807 
808 constexpr auto MSR_UNCORE_PMON_GLOBAL_CTL = 0x700;
809 
810 constexpr auto IVT_MSR_UNCORE_PMON_GLOBAL_CTL = 0x0C00;
811 
812 #define PCM_INVALID_DEV_ADDR (~(uint32)0UL)
813 #define PCM_INVALID_FUNC_ADDR (~(uint32)0UL)
814 
815 #define Q_P_PCI_PMON_BOX_CTL_ADDR (0x0F4)
816 
817 #define Q_P_PCI_PMON_CTL3_ADDR (0x0E4)
818 #define Q_P_PCI_PMON_CTL2_ADDR (0x0E0)
819 #define Q_P_PCI_PMON_CTL1_ADDR (0x0DC)
820 #define Q_P_PCI_PMON_CTL0_ADDR (0x0D8)
821 
822 #define Q_P_PCI_PMON_CTR3_ADDR (0x0B8)
823 #define Q_P_PCI_PMON_CTR2_ADDR (0x0B0)
824 #define Q_P_PCI_PMON_CTR1_ADDR (0x0A8)
825 #define Q_P_PCI_PMON_CTR0_ADDR (0x0A0)
826 
827 #define QPI_RATE_STATUS_ADDR (0x0D4)
828 
829 #define U_L_PCI_PMON_BOX_CTL_ADDR (0x378)
830 
831 #define U_L_PCI_PMON_CTL3_ADDR (0x368)
832 #define U_L_PCI_PMON_CTL2_ADDR (0x360)
833 #define U_L_PCI_PMON_CTL1_ADDR (0x358)
834 #define U_L_PCI_PMON_CTL0_ADDR (0x350)
835 
836 #define U_L_PCI_PMON_CTR3_ADDR (0x330)
837 #define U_L_PCI_PMON_CTR2_ADDR (0x328)
838 #define U_L_PCI_PMON_CTR1_ADDR (0x320)
839 #define U_L_PCI_PMON_CTR0_ADDR (0x318)
840 
841 #define ICX_UPI_PCI_PMON_BOX_CTL_ADDR (0x318)
842 
843 #define ICX_UPI_PCI_PMON_CTL3_ADDR (0x368)
844 #define ICX_UPI_PCI_PMON_CTL2_ADDR (0x360)
845 #define ICX_UPI_PCI_PMON_CTL1_ADDR (0x358)
846 #define ICX_UPI_PCI_PMON_CTL0_ADDR (0x350)
847 
848 #define ICX_UPI_PCI_PMON_CTR3_ADDR (0x338)
849 #define ICX_UPI_PCI_PMON_CTR2_ADDR (0x330)
850 #define ICX_UPI_PCI_PMON_CTR1_ADDR (0x328)
851 #define ICX_UPI_PCI_PMON_CTR0_ADDR (0x320)
852 
853 #define UCLK_FIXED_CTR_ADDR (0x704)
854 #define UCLK_FIXED_CTL_ADDR (0x703)
855 #define UBOX_MSR_PMON_CTL0_ADDR (0x705)
856 #define UBOX_MSR_PMON_CTL1_ADDR (0x706)
857 #define UBOX_MSR_PMON_CTR0_ADDR (0x709)
858 #define UBOX_MSR_PMON_CTR1_ADDR (0x70a)
859 
860 constexpr auto JKTIVT_UCLK_FIXED_CTR_ADDR = (0x0C09);
861 constexpr auto JKTIVT_UCLK_FIXED_CTL_ADDR = (0x0C08);
862 constexpr auto JKTIVT_UBOX_MSR_PMON_CTL0_ADDR = (0x0C10);
863 constexpr auto JKTIVT_UBOX_MSR_PMON_CTL1_ADDR = (0x0C11);
864 constexpr auto JKTIVT_UBOX_MSR_PMON_CTR0_ADDR = (0x0C16);
865 constexpr auto JKTIVT_UBOX_MSR_PMON_CTR1_ADDR = (0x0C17);
866 
867 #define JKTIVT_PCU_MSR_PMON_CTR3_ADDR (0x0C39)
868 #define JKTIVT_PCU_MSR_PMON_CTR2_ADDR (0x0C38)
869 #define JKTIVT_PCU_MSR_PMON_CTR1_ADDR (0x0C37)
870 #define JKTIVT_PCU_MSR_PMON_CTR0_ADDR (0x0C36)
871 
872 #define JKTIVT_PCU_MSR_PMON_BOX_FILTER_ADDR (0x0C34)
873 
874 #define JKTIVT_PCU_MSR_PMON_CTL3_ADDR (0x0C33)
875 #define JKTIVT_PCU_MSR_PMON_CTL2_ADDR (0x0C32)
876 #define JKTIVT_PCU_MSR_PMON_CTL1_ADDR (0x0C31)
877 #define JKTIVT_PCU_MSR_PMON_CTL0_ADDR (0x0C30)
878 
879 #define JKTIVT_PCU_MSR_PMON_BOX_CTL_ADDR (0x0C24)
880 
881 #define HSX_PCU_MSR_PMON_CTR3_ADDR (0x071A)
882 #define HSX_PCU_MSR_PMON_CTR2_ADDR (0x0719)
883 #define HSX_PCU_MSR_PMON_CTR1_ADDR (0x0718)
884 #define HSX_PCU_MSR_PMON_CTR0_ADDR (0x0717)
885 
886 #define HSX_PCU_MSR_PMON_BOX_FILTER_ADDR (0x0715)
887 
888 #define HSX_PCU_MSR_PMON_CTL3_ADDR (0x0714)
889 #define HSX_PCU_MSR_PMON_CTL2_ADDR (0x0713)
890 #define HSX_PCU_MSR_PMON_CTL1_ADDR (0x0712)
891 #define HSX_PCU_MSR_PMON_CTL0_ADDR (0x0711)
892 
893 #define HSX_PCU_MSR_PMON_BOX_CTL_ADDR (0x0710)
894 
895 #define UNC_PMON_UNIT_CTL_RST_CONTROL (1 << 0)
896 #define UNC_PMON_UNIT_CTL_RST_COUNTERS (1 << 1)
897 #define UNC_PMON_UNIT_CTL_FRZ (1 << 8)
898 #define UNC_PMON_UNIT_CTL_FRZ_EN (1 << 16)
899 #define UNC_PMON_UNIT_CTL_RSV ((1 << 16) + (1 << 17))
900 
901 #define UNC_PMON_UNIT_CTL_VALID_BITS_MASK ((1 << 17) - 1)
902 
903 #define MC_CH_PCI_PMON_FIXED_CTL_RST (1 << 19)
904 #define MC_CH_PCI_PMON_FIXED_CTL_EN (1 << 22)
905 #define EDC_CH_PCI_PMON_FIXED_CTL_EN (1 << 0)
906 
907 #define MC_CH_PCI_PMON_CTL_EVENT(x) (x << 0)
908 #define MC_CH_PCI_PMON_CTL_UMASK(x) (x << 8)
909 #define MC_CH_PCI_PMON_CTL_RST (1 << 17)
910 #define MC_CH_PCI_PMON_CTL_EDGE_DET (1 << 18)
911 #define MC_CH_PCI_PMON_CTL_EN (1 << 22)
912 #define MC_CH_PCI_PMON_CTL_INVERT (1 << 23)
913 #define MC_CH_PCI_PMON_CTL_THRESH(x) (x << 24UL)
914 
915 #define Q_P_PCI_PMON_CTL_EVENT(x) (x << 0)
916 #define Q_P_PCI_PMON_CTL_UMASK(x) (x << 8)
917 #define Q_P_PCI_PMON_CTL_RST (1 << 17)
918 #define Q_P_PCI_PMON_CTL_EDGE_DET (1 << 18)
919 #define Q_P_PCI_PMON_CTL_EVENT_EXT (1 << 21)
920 #define Q_P_PCI_PMON_CTL_EN (1 << 22)
921 #define Q_P_PCI_PMON_CTL_INVERT (1 << 23)
922 #define Q_P_PCI_PMON_CTL_THRESH(x) (x << 24UL)
923 
924 #define PCU_MSR_PMON_BOX_FILTER_BAND_0(x) (x << 0)
925 #define PCU_MSR_PMON_BOX_FILTER_BAND_1(x) (x << 8)
926 #define PCU_MSR_PMON_BOX_FILTER_BAND_2(x) (x << 16)
927 #define PCU_MSR_PMON_BOX_FILTER_BAND_3(x) (x << 24)
928 
929 #define PCU_MSR_PMON_CTL_EVENT(x) (x << 0)
930 #define PCU_MSR_PMON_CTL_OCC_SEL(x) (x << 14)
931 #define PCU_MSR_PMON_CTL_RST (1 << 17)
932 #define PCU_MSR_PMON_CTL_EDGE_DET (1 << 18)
933 #define PCU_MSR_PMON_CTL_EXTRA_SEL (1 << 21)
934 #define PCU_MSR_PMON_CTL_EN (1 << 22)
935 #define PCU_MSR_PMON_CTL_INVERT (1 << 23)
936 #define PCU_MSR_PMON_CTL_THRESH(x) (x << 24UL)
937 #define PCU_MSR_PMON_CTL_OCC_INVERT (1UL << 30UL)
938 #define PCU_MSR_PMON_CTL_OCC_EDGE_DET (1UL << 31UL)
939 
940 
941 #define JKT_C0_MSR_PMON_CTR3 0x0D19 // CBo 0 PMON Counter 3
942 #define JKT_C0_MSR_PMON_CTR2 0x0D18 // CBo 0 PMON Counter 2
943 #define JKT_C0_MSR_PMON_CTR1 0x0D17 // CBo 0 PMON Counter 1
944 #define JKT_C0_MSR_PMON_CTR0 0x0D16 // CBo 0 PMON Counter 0
945 #define JKT_C0_MSR_PMON_BOX_FILTER 0x0D14 // CBo 0 PMON Filter
946 #define JKT_C0_MSR_PMON_CTL3 0x0D13 // CBo 0 PMON Control for Counter 3
947 #define JKT_C0_MSR_PMON_CTL2 0x0D12 // CBo 0 PMON Control for Counter 2
948 #define JKT_C0_MSR_PMON_CTL1 0x0D11 // CBo 0 PMON Control for Counter 1
949 #define JKT_C0_MSR_PMON_CTL0 0x0D10 // CBo 0 PMON Control for Counter 0
950 #define JKT_C0_MSR_PMON_BOX_CTL 0x0D04 // CBo 0 PMON Box-Wide Control
951 
952 #define JKTIVT_CBO_MSR_STEP 0x0020 // CBo MSR Step
953 
954 #define IVT_C0_MSR_PMON_BOX_FILTER1 0x0D1A // CBo 0 PMON Filter 1
955 
956 #define HSX_C0_MSR_PMON_CTR3 0x0E0B // CBo 0 PMON Counter 3
957 #define HSX_C0_MSR_PMON_CTR2 0x0E0A // CBo 0 PMON Counter 2
958 #define HSX_C0_MSR_PMON_CTR1 0x0E09 // CBo 0 PMON Counter 1
959 #define HSX_C0_MSR_PMON_CTR0 0x0E08 // CBo 0 PMON Counter 0
960 
961 #define HSX_C0_MSR_PMON_BOX_FILTER1 0x0E06 // CBo 0 PMON Filter1
962 #define HSX_C0_MSR_PMON_BOX_FILTER 0x0E05 // CBo 0 PMON Filter0
963 
964 #define HSX_C0_MSR_PMON_CTL3 0x0E04 // CBo 0 PMON Control for Counter 3
965 #define HSX_C0_MSR_PMON_CTL2 0x0E03 // CBo 0 PMON Control for Counter 2
966 #define HSX_C0_MSR_PMON_CTL1 0x0E02 // CBo 0 PMON Control for Counter 1
967 #define HSX_C0_MSR_PMON_CTL0 0x0E01 // CBo 0 PMON Control for Counter 0
968 
969 #define HSX_C0_MSR_PMON_BOX_STATUS 0x0E07 // CBo 0 PMON Box-Wide Status
970 #define HSX_C0_MSR_PMON_BOX_CTL 0x0E00 // CBo 0 PMON Box-Wide Control
971 
972 #define HSX_CBO_MSR_STEP 0x0010 // CBo MSR Step
973 
974 #define KNL_CHA_MSR_STEP 0x000C // CHA MSR Step
975 #define KNL_CHA0_MSR_PMON_BOX_CTRL 0x0E00 // CHA 0 PMON Control
976 
977 #define KNL_CHA0_MSR_PMON_EVT_SEL0 0x0E01 // CHA 0 PMON Event Select for Counter 0
978 #define KNL_CHA0_MSR_PMON_EVT_SEL1 0x0E02 // CHA 0 PMON Event Select for Counter 1
979 #define KNL_CHA0_MSR_PMON_EVT_SEL2 0x0E03 // CHA 0 PMON Event Select for Counter 2
980 #define KNL_CHA0_MSR_PMON_EVT_SEL3 0x0E04 // CHA 0 PMON Event Select for Counter 3
981 
982 #define KNL_CHA0_MSR_PMON_BOX_CTL 0x0E05 // PERF_UNIT_CTL_CHA_0
983 #define KNL_CHA0_MSR_PMON_BOX_CTL1 0x0E06 // PERF_UNIT_CTL_1_CHA_0
984 #define KNL_CHA0_MSR_PMON_BOX_STATUS 0x0E07 // CHA 0 PMON Status
985 
986 #define KNL_CHA0_MSR_PMON_CTR0 0x0E08 // CHA 0 PMON Counter 0
987 #define KNL_CHA0_MSR_PMON_CTR1 0x0E09 // CHA 0 PMON Counter 1
988 #define KNL_CHA0_MSR_PMON_CTR2 0x0E0A // CHA 0 PMON Counter 2
989 #define KNL_CHA0_MSR_PMON_CTR3 0x0E0B // CHA 0 PMON Counter 3
990 
991 static const uint32 ICX_CHA_MSR_PMON_BOX_CTL[] = {
992  0x0E00, 0x0E0E, 0x0E1C, 0x0E2A, 0x0E38, 0x0E46, 0x0E54, 0x0E62, 0x0E70, 0x0E7E, 0x0E8C, 0x0E9A,
993  0x0EA8, 0x0EB6, 0x0EC4, 0x0ED2, 0x0EE0, 0x0EEE, 0x0F0A, 0x0F18, 0x0F26, 0x0F34, 0x0F42, 0x0F50,
994  0x0F5E, 0x0F6C, 0x0F7A, 0x0F88, 0x0F96, 0x0FA4, 0x0FB2, 0x0FC0, 0x0FCE, 0x0FDC, 0x0B60, 0x0B6E,
995  0x0B7C, 0x0B8A, 0x0B98, 0x0BA6, 0x0BB4, 0x0BC2
996 };
997 
998 static const uint32 SNR_CHA_MSR_PMON_BOX_CTL[] = {
999  0x1C00, 0x1C10, 0x1C20, 0x1C30, 0x1C40, 0x1C50
1000 };
1001 
1002 #define SERVER_CHA_MSR_PMON_CTL0_OFFSET (1)
1003 /*
1004 #define SERVER_CHA_MSR_PMON_CTL1_OFFSET (2)
1005 #define SERVER_CHA_MSR_PMON_CTL2_OFFSET (3)
1006 #define SERVER_CHA_MSR_PMON_CTL3_OFFSET (4)
1007 */
1008 
1009 #define SERVER_CHA_MSR_PMON_BOX_FILTER_OFFSET (5)
1010 
1011 #define SERVER_CHA_MSR_PMON_CTR0_OFFSET (8)
1012 /*
1013 #define SERVER_CHA_MSR_PMON_CTR1_OFFSET (9)
1014 #define SERVER_CHA_MSR_PMON_CTR2_OFFSET (10)
1015 #define SERVER_CHA_MSR_PMON_CTR3_OFFSET (11)
1016 */
1017 
1018 #define CBO_MSR_PMON_CTL_EVENT(x) (x << 0)
1019 #define CBO_MSR_PMON_CTL_UMASK(x) (x << 8)
1020 #define CBO_MSR_PMON_CTL_RST (1 << 17)
1021 #define CBO_MSR_PMON_CTL_EDGE_DET (1 << 18)
1022 #define CBO_MSR_PMON_CTL_TID_EN (1 << 19)
1023 #define CBO_MSR_PMON_CTL_EN (1 << 22)
1024 #define CBO_MSR_PMON_CTL_INVERT (1 << 23)
1025 #define CBO_MSR_PMON_CTL_THRESH(x) (x << 24UL)
1026 #define UNC_PMON_CTL_UMASK_EXT(x) (uint64(x) << 32ULL)
1027 
1028 #define JKT_CBO_MSR_PMON_BOX_FILTER_OPC(x) (x << 23UL)
1029 #define IVTHSX_CBO_MSR_PMON_BOX_FILTER1_OPC(x) (x << 20UL)
1030 #define BDX_CBO_MSR_PMON_BOX_GET_OPC0(x) ((x >> 20) & 0x3FF)
1031 #define BDX_CBO_MSR_PMON_BOX_GET_FLT(x) ((x >> 0x10) & 0x1)
1032 #define BDX_CBO_MSR_PMON_BOX_GET_TID(x) ((x >> 0x11) & 0x1)
1033 
1034 #define SKX_CHA_MSR_PMON_BOX_FILTER1_REM(x) (x << 0UL)
1035 #define SKX_CHA_MSR_PMON_BOX_FILTER1_LOC(x) (x << 1UL)
1036 #define SKX_CHA_MSR_PMON_BOX_FILTER1_NM(x) (x << 4UL)
1037 #define SKX_CHA_MSR_PMON_BOX_FILTER1_NOT_NM(x) (x << 5UL)
1038 #define SKX_CHA_MSR_PMON_BOX_FILTER1_OPC0(x) ((x) << 9UL)
1039 #define SKX_CHA_MSR_PMON_BOX_FILTER1_OPC1(x) ((x) << 19UL)
1040 #define SKX_CHA_MSR_PMON_BOX_FILTER1_NC(x) (x << 30UL)
1041 #define SKX_CHA_MSR_PMON_BOX_FILTER1_RSV(x) (x << 2UL)
1042 #define SKX_CHA_MSR_PMON_BOX_GET_OPC0(x) ((x >> 9) & 0x3FF)
1043 #define SKX_CHA_MSR_PMON_BOX_GET_NC(x) ((x >> 0x1e) & 0x1)
1044 
1045 #define SKX_CHA_TOR_INSERTS_UMASK_IRQ(x) (x << 0)
1046 #define SKX_CHA_TOR_INSERTS_UMASK_PRQ(x) (x << 2)
1047 #define SKX_CHA_TOR_INSERTS_UMASK_HIT(x) (x << 4)
1048 #define SKX_CHA_TOR_INSERTS_UMASK_MISS(x) (x << 5)
1049 
1050 /*ICX UmaskExt Filter*/
1051 #define ICX_CHA_UMASK_EXT(x) (x << 32UL)
1052 
1053 #define SKX_IIO_CBDMA_UNIT_STATUS (0x0A47)
1054 #define SKX_IIO_CBDMA_UNIT_CTL (0x0A40)
1055 #define SKX_IIO_CBDMA_CTR0 (0x0A41)
1056 #define SKX_IIO_CBDMA_CLK (0x0A45)
1057 #define SKX_IIO_CBDMA_CTL0 (0x0A48)
1058 #define SKX_IIO_PM_REG_STEP (0x0020)
1059 
1060 #define ICX_IIO_CBDMA_UNIT_STATUS (0x0A57)
1061 #define ICX_IIO_CTL_REG_OFFSET (0x0008)
1062 #define ICX_IIO_CTR_REG_OFFSET (0x0001)
1063 /*
1064  * M2IOSF MSRs in order:
1065  * M2IOSF0 - PCIe0 stack
1066  * M2IOSF1 - PCIe1 stack
1067  * M2IOSF2 - MCP stack
1068  * M2IOSF3 - PCIe2 stack
1069  * M2IOSF4 - PCIe3 stack
1070  * M2IOSF5 - CBDMA/DMI stack
1071  */
1072 static const uint32 ICX_IIO_UNIT_CTL[] = {
1073  0x0A50, 0x0A70, 0x0A90, 0x0AE0, 0x0B00, 0x0B20
1074 };
1075 
1076 static const uint32 ICX_IRP_UNIT_CTL[] = {
1077  0x0A4A,
1078  0x0A6A,
1079  0x0A8A,
1080  0x0ADA,
1081  0x0AFA,
1082  0x0B1A
1083 };
1084 
1085 #define ICX_IRP_CTL_REG_OFFSET (0x0003)
1086 #define ICX_IRP_CTR_REG_OFFSET (0x0001)
1087 
1088 
1089 static const uint32 SNR_IRP_UNIT_CTL[] = {
1090  0x1EA0,
1091  0x1EB0,
1092  0x1EC0,
1093  0x1ED0,
1094  0x1EE0
1095 };
1096 
1097 #define SNR_IRP_CTL_REG_OFFSET (0x0008)
1098 #define SNR_IRP_CTR_REG_OFFSET (0x0001)
1099 
1100 static const uint32 SKX_IRP_UNIT_CTL[] = {
1101  0x0A58,
1102  0x0A78,
1103  0x0A98,
1104  0x0AB8,
1105  0x0AD8,
1106  0x0AF8
1107 };
1108 
1109 #define SKX_IRP_CTL_REG_OFFSET (0x0003)
1110 #define SKX_IRP_CTR_REG_OFFSET (0x0001)
1111 
1112 #define SNR_IIO_CBDMA_UNIT_STATUS (0x1E07)
1113 #define SNR_IIO_CBDMA_UNIT_CTL (0x1E00)
1114 #define SNR_IIO_CBDMA_CTR0 (0x1E01)
1115 #define SNR_IIO_CBDMA_CTL0 (0x1E08)
1116 #define SNR_IIO_PM_REG_STEP (0x0010)
1117 
1118 #define IIO_MSR_PMON_CTL_EVENT(x) ((x) << 0)
1119 #define IIO_MSR_PMON_CTL_UMASK(x) ((x) << 8)
1120 #define IIO_MSR_PMON_CTL_RST (1 << 17)
1121 #define IIO_MSR_PMON_CTL_EDGE_DET (1 << 18)
1122 #define IIO_MSR_PMON_CTL_OV_EN (1 << 20)
1123 #define IIO_MSR_PMON_CTL_EN (1 << 22)
1124 #define IIO_MSR_PMON_CTL_INVERT (1 << 23)
1125 #define IIO_MSR_PMON_CTL_THRESH(x) ((x) << 24ULL)
1126 #define IIO_MSR_PMON_CTL_CH_MASK(x) ((x) << 36ULL)
1127 #define IIO_MSR_PMON_CTL_FC_MASK(x) ((x) << 44ULL)
1128 
1129 #define ICX_IIO_MSR_PMON_CTL_EVENT(x) ((x) << 0)
1130 #define ICX_IIO_MSR_PMON_CTL_UMASK(x) ((x) << 8)
1131 #define ICX_IIO_MSR_PMON_CTL_RST (1 << 17)
1132 #define ICX_IIO_MSR_PMON_CTL_EDGE_DET (1 << 18)
1133 #define ICX_IIO_MSR_PMON_CTL_OV_EN (1 << 20)
1134 #define ICX_IIO_MSR_PMON_CTL_EN (1 << 22)
1135 #define ICX_IIO_MSR_PMON_CTL_INVERT (1 << 23)
1136 #define ICX_IIO_MSR_PMON_CTL_THRESH(x) ((x) << 24ULL)
1137 #define ICX_IIO_MSR_PMON_CTL_CH_MASK(x) ((x) << 36ULL)
1138 #define ICX_IIO_MSR_PMON_CTL_FC_MASK(x) ((x) << 48ULL)
1139 
1140 #define M2M_PCI_PMON_CTL_EVENT(x) ((x) << 0)
1141 #define M2M_PCI_PMON_CTL_UMASK(x) ((x) << 8)
1142 #define M2M_PCI_PMON_CTL_RST (1 << 17)
1143 #define M2M_PCI_PMON_CTL_EDGE_DET (1 << 18)
1144 #define M2M_PCI_PMON_CTL_OV_EN (1 << 20)
1145 #define M2M_PCI_PMON_CTL_EN (1 << 22)
1146 #define M2M_PCI_PMON_CTL_INVERT (1 << 23)
1147 #define M2M_PCI_PMON_CTL_THRESH(x) ((x) << 24ULL)
1148 
1149 #define HA_PCI_PMON_CTL_EVENT(x) ((x) << 0)
1150 #define HA_PCI_PMON_CTL_UMASK(x) ((x) << 8)
1151 #define HA_PCI_PMON_CTL_RST (1 << 17)
1152 #define HA_PCI_PMON_CTL_EDGE_DET (1 << 18)
1153 #define HA_PCI_PMON_CTL_OV_EN (1 << 20)
1154 #define HA_PCI_PMON_CTL_EN (1 << 22)
1155 #define HA_PCI_PMON_CTL_INVERT (1 << 23)
1156 #define HA_PCI_PMON_CTL_THRESH(x) ((x) << 24ULL)
1157 
1158 #define UCLK_FIXED_CTL_OV_EN (1 << 20)
1159 #define UCLK_FIXED_CTL_EN (1 << 22)
1160 
1161 /* \brief IIO Performance Monitoring Control Register format
1162 
1163  IIOn_MSR_PMON_CTL{3-0} Register- Field Definitions
1164 */
1166 {
1167  union
1168  {
1169  struct
1170  {
1171  uint64 event_select : 8;
1172  uint64 umask : 8;
1173  uint64 reserved1 : 1;
1174  uint64 reset : 1;
1175  uint64 edge_det : 1;
1176  uint64 ignored : 1;
1177  uint64 overflow_enable : 1;
1178  uint64 reserved2 : 1;
1179  uint64 enable : 1;
1180  uint64 invert : 1;
1181  uint64 thresh : 12;
1182  uint64 ch_mask : 8;
1183  uint64 fc_mask : 3;
1184  uint64 reservedX : 17;
1185  } fields;
1186  uint64 value;
1187  };
1188  IIOPMUCNTCTLRegister() : value(0) { }
1189  IIOPMUCNTCTLRegister(const uint64 v) : value(v) { }
1190  operator uint64() { return value; }
1191 };
1192 
1194 {
1195  union
1196  {
1197  struct
1198  {
1199  uint64 event_select : 8;
1200  uint64 umask : 8;
1201  uint64 reserved1 : 1;
1202  uint64 reset : 1;
1203  uint64 edge_det : 1;
1204  uint64 ignored : 1;
1205  uint64 overflow_enable : 1;
1206  uint64 reserved2 : 1;
1207  uint64 enable : 1;
1208  uint64 invert : 1;
1209  uint64 thresh : 12;
1210  uint64 ch_mask : 12;
1211  uint64 fc_mask : 3;
1212  uint64 reservedX : 13;
1213  } fields;
1214  uint64 value;
1215  };
1216  ICX_IIOPMUCNTCTLRegister() : value(0) { }
1217 };
1218 
1219 #define MSR_PACKAGE_THERM_STATUS (0x01B1)
1220 #define MSR_IA32_THERM_STATUS (0x019C)
1221 #define PCM_INVALID_THERMAL_HEADROOM ((std::numeric_limits<int32>::min)())
1222 
1223 #define MSR_IA32_BIOS_SIGN_ID (0x8B)
1224 
1225 #define MSR_DRAM_ENERGY_STATUS (0x0619)
1226 
1227 #define MSR_PKG_C2_RESIDENCY (0x60D)
1228 #define MSR_PKG_C3_RESIDENCY (0x3F8)
1229 #define MSR_PKG_C6_RESIDENCY (0x3F9)
1230 #define MSR_PKG_C7_RESIDENCY (0x3FA)
1231 #define MSR_CORE_C3_RESIDENCY (0x3FC)
1232 #define MSR_CORE_C6_RESIDENCY (0x3FD)
1233 #define MSR_CORE_C7_RESIDENCY (0x3FE)
1234 
1235 #define MSR_PERF_GLOBAL_INUSE (0x392)
1236 
1237 #define MSR_IA32_SPEC_CTRL (0x48)
1238 #define MSR_IA32_ARCH_CAPABILITIES (0x10A)
1239 
1240 #define MSR_TSX_FORCE_ABORT (0x10f)
1241 
1242 #define MSR_PERF_CAPABILITIES (0x345)
1243 
1244 // data structure for converting two uint32s <-> uin64
1245 union cvt_ds
1246 {
1247 #ifndef _MSC_VER
1248  typedef uint64 UINT64;
1249  typedef uint32 DWORD;
1250 #endif
1251  UINT64 ui64;
1252  struct
1253  {
1254  DWORD low;
1255  DWORD high;
1256  } ui32;
1257 };
1258 
1260 {
1261  unsigned long long baseAddress;
1262  unsigned short PCISegmentGroupNumber;
1263  unsigned char startBusNumber;
1264  unsigned char endBusNumber;
1265  char reserved[4];
1266  MCFGRecord() : baseAddress(0), PCISegmentGroupNumber(0), startBusNumber(0), endBusNumber(0)
1267  {
1268  std::fill(reserved, reserved + 4, 0);
1269  }
1270  void print()
1271  {
1272  std::cout << "BaseAddress=" << (std::hex) << "0x" << baseAddress << " PCISegmentGroupNumber=0x" << PCISegmentGroupNumber <<
1273  " startBusNumber=0x" << (unsigned)startBusNumber << " endBusNumber=0x" << (unsigned)endBusNumber << "\n";
1274  }
1275 };
1276 
1278 {
1279  char signature[4];
1280  unsigned length;
1281  unsigned char revision;
1282  unsigned char checksum;
1283  char OEMID[6];
1284  char OEMTableID[8];
1285  unsigned OEMRevision;
1286  unsigned creatorID;
1287  unsigned creatorRevision;
1288  char reserved[8];
1289 
1290  unsigned nrecords() const
1291  {
1292  return (length - sizeof(MCFGHeader)) / sizeof(MCFGRecord);
1293  }
1294 
1295  void print()
1296  {
1297  std::cout << "Header: length=" << length << " nrecords=" << nrecords() << "\n";
1298  }
1299 };
1300 
1301 } // namespace pcm
1302 
1303 #endif
Definition: types.h:415
Definition: types.h:352
Definition: types.h:1193
Definition: bw.cpp:12
Definition: types.h:1245
Definition: types.h:1259
Definition: types.h:1277
Definition: types.h:1165
Definition: types.h:317