vmm: Move the vmcall overrides to the VM struct
[akaros.git] / user / perfmon / events / intel_ivbep_unc_cbo_events.h
1 /*
2  * Copyright (c) 2014 Google Inc. All rights reserved
3  * Contributed by Stephane Eranian <eranian@gmail.com>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9  * of the Software, and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all
13  * copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
17  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
20  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * This file is part of libpfm, a performance monitoring support library for
23  * applications on Linux.
24  *
25  * PMU: ivbep_unc_cbo (Intel IvyBridge-EP C-Box uncore PMU)
26  */
27
28 #define CBO_FILT_MESIF(a, b, c, d) \
29    { .uname  = "STATE_"#a,\
30      .udesc  = #b" cacheline state",\
31      .ufilters[0] = 1ULL << (17 + (c)),\
32      .grpid = d, \
33    }
34
35 #define CBO_FILT_MESIFS(d) \
36    CBO_FILT_MESIF(I, Invalid, 0, d), \
37    CBO_FILT_MESIF(S, Shared, 1, d), \
38    CBO_FILT_MESIF(E, Exclusive, 2, d), \
39    CBO_FILT_MESIF(M, Modified, 3, d), \
40    CBO_FILT_MESIF(F, Forward, 4, d), \
41    { .uname  = "STATE_MESIF",\
42      .udesc  = "Any cache line state",\
43      .ufilters[0] = 0x3fULL << 17,\
44      .grpid = d, \
45      .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL, \
46    }
47
48 #define CBO_FILT_OPC(d) \
49    { .uname  = "OPC_RFO",\
50      .udesc  = "Demand data RFO (combine with any OPCODE umask)",\
51      .ufilters[1] = 0x180ULL << 20, \
52      .uflags = INTEL_X86_NCOMBO, \
53      .grpid = d, \
54    }, \
55    { .uname  = "OPC_CRD",\
56      .udesc  = "Demand code read (combine with any OPCODE umask)",\
57      .ufilters[1] = 0x181ULL << 20, \
58      .uflags = INTEL_X86_NCOMBO, \
59      .grpid = d, \
60    }, \
61    { .uname  = "OPC_DRD",\
62      .udesc  = "Demand data read (combine with any OPCODE umask)",\
63      .ufilters[1] = 0x182ULL << 20, \
64      .uflags = INTEL_X86_NCOMBO, \
65      .grpid = d, \
66    }, \
67    { .uname  = "OPC_PRD",\
68      .udesc  = "Partial reads (UC) (combine with any OPCODE umask)",\
69      .ufilters[1] = 0x187ULL << 20, \
70      .uflags = INTEL_X86_NCOMBO, \
71      .grpid = d, \
72    }, \
73    { .uname  = "OPC_WCILF",\
74      .udesc  = "Full Stream store (combine with any OPCODE umask)", \
75      .ufilters[1] = 0x18cULL << 20, \
76      .uflags = INTEL_X86_NCOMBO, \
77      .grpid = d, \
78    }, \
79    { .uname  = "OPC_WCIL",\
80      .udesc  = "Partial Stream store (combine with any OPCODE umask)", \
81      .ufilters[1] = 0x18dULL << 20, \
82      .uflags = INTEL_X86_NCOMBO, \
83      .grpid = d, \
84    }, \
85    { .uname  = "OPC_PF_RFO",\
86      .udesc  = "Prefetch RFO into LLC but do not pass to L2 (includes hints) (combine with any OPCODE umask)", \
87      .ufilters[1] = 0x190ULL << 20, \
88      .uflags = INTEL_X86_NCOMBO, \
89      .grpid = d, \
90    }, \
91    { .uname  = "OPC_PF_CODE",\
92      .udesc  = "Prefetch code into LLC but do not pass to L2 (includes hints) (combine with any OPCODE umask)", \
93      .ufilters[1] = 0x191ULL << 20, \
94      .uflags = INTEL_X86_NCOMBO, \
95      .grpid = d, \
96    }, \
97    { .uname  = "OPC_PF_DATA",\
98      .udesc  = "Prefetch data into LLC but do not pass to L2 (includes hints) (combine with any OPCODE umask)", \
99      .ufilters[1] = 0x192ULL << 20, \
100      .uflags = INTEL_X86_NCOMBO, \
101      .grpid = d, \
102    }, \
103    { .uname  = "OPC_PCIWILF",\
104      .udesc  = "PCIe write (non-allocating) (combine with any OPCODE umask)", \
105      .ufilters[1] = 0x194ULL << 20, \
106      .uflags = INTEL_X86_NCOMBO, \
107      .grpid = d, \
108    }, \
109    { .uname  = "OPC_PCIPRD",\
110      .udesc  = "PCIe UC read (combine with any OPCODE umask)", \
111      .ufilters[1] = 0x195ULL << 20, \
112      .uflags = INTEL_X86_NCOMBO, \
113      .grpid = d, \
114    }, \
115    { .uname  = "OPC_PCIITOM",\
116      .udesc  = "PCIe write (allocating) (combine with any OPCODE umask)", \
117      .ufilters[1] = 0x19cULL << 20, \
118      .uflags = INTEL_X86_NCOMBO, \
119      .grpid = d, \
120    }, \
121    { .uname  = "OPC_PCIRDCUR",\
122      .udesc  = "PCIe read current (combine with any OPCODE umask)", \
123      .ufilters[1] = 0x19eULL << 20, \
124      .uflags = INTEL_X86_NCOMBO, \
125      .grpid = d, \
126    }, \
127    { .uname  = "OPC_WBMTOI",\
128      .udesc  = "Request writeback modified invalidate line (combine with any OPCODE umask)", \
129      .ufilters[1] = 0x1c4ULL << 20, \
130      .uflags = INTEL_X86_NCOMBO, \
131      .grpid = d, \
132    }, \
133    { .uname  = "OPC_WBMTOE",\
134      .udesc  = "Request writeback modified set to exclusive (combine with any OPCODE umask)", \
135      .ufilters[1] = 0x1c5ULL << 20, \
136      .uflags = INTEL_X86_NCOMBO, \
137      .grpid = d, \
138    }, \
139    { .uname  = "OPC_ITOM",\
140      .udesc  = "Request invalidate line (combine with any OPCODE umask)", \
141      .ufilters[1] = 0x1c8ULL << 20, \
142      .uflags = INTEL_X86_NCOMBO, \
143      .grpid = d, \
144    }, \
145    { .uname  = "OPC_PCINSRD",\
146      .udesc  = "PCIe non-snoop read (combine with any OPCODE umask)", \
147      .ufilters[1] = 0x1e4ULL << 20, \
148      .uflags = INTEL_X86_NCOMBO, \
149      .grpid = d, \
150    }, \
151    { .uname  = "OPC_PCINSWR",\
152      .udesc  = "PCIe non-snoop write (partial) (combine with any OPCODE umask)", \
153      .ufilters[1] = 0x1e5ULL << 20, \
154      .uflags = INTEL_X86_NCOMBO, \
155      .grpid = d, \
156    }, \
157    { .uname  = "OPC_PCINSWRF",\
158      .udesc  = "PCIe non-snoop write (full) (combine with any OPCODE umask)", \
159      .ufilters[1] = 0x1e6ULL << 20, \
160      .uflags = INTEL_X86_NCOMBO, \
161      .grpid = d, \
162    }
163
164 static const intel_x86_umask_t ivbep_unc_c_llc_lookup[]={
165    { .uname  = "DATA_READ",
166      .udesc  = "Data read requests",
167      .grpid  = 0,
168      .ucode = 0x300,
169      .uflags = INTEL_X86_NCOMBO,
170    },
171    { .uname  = "WRITE",
172      .udesc  = "Write requests. Includes all write transactions (cached, uncached)",
173      .grpid  = 0,
174      .ucode = 0x500,
175      .uflags = INTEL_X86_NCOMBO,
176    },
177    { .uname  = "REMOTE_SNOOP",
178      .udesc  = "External snoop request",
179      .grpid  = 0,
180      .ucode = 0x900,
181      .uflags = INTEL_X86_NCOMBO,
182    },
183    { .uname  = "ANY",
184      .udesc  = "Any request",
185      .grpid  = 0,
186      .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
187      .ucode = 0x1100,
188    },
189    { .uname  = "NID",
190      .udesc  = "Match a given RTID destination NID (must provide nf=X modifier)",
191      .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
192      .grpid  = 1,
193      .ucode = 0x4100,
194      .uflags = INTEL_X86_GRP_DFL_NONE
195    },
196    CBO_FILT_MESIFS(2),
197 };
198
199 static const intel_x86_umask_t ivbep_unc_c_llc_victims[]={
200    { .uname  = "STATE_M",
201      .udesc  = "Lines in M state",
202      .ucode = 0x100,
203      .grpid  = 0,
204    },
205    { .uname  = "STATE_E",
206      .udesc  = "Lines in E state",
207      .ucode = 0x200,
208      .grpid  = 0,
209    },
210    { .uname  = "STATE_S",
211      .udesc  = "Lines in S state",
212      .ucode = 0x400,
213      .grpid  = 0,
214    },
215    { .uname  = "MISS",
216      .udesc  = "TBD",
217      .ucode = 0x800,
218      .grpid  = 0,
219    },
220    { .uname  = "NID",
221      .udesc  = "Victimized Lines matching the NID filter (must provide nf=X modifier)",
222      .ucode = 0x4000,
223      .uflags = INTEL_X86_GRP_DFL_NONE,
224      .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
225      .grpid  = 1,
226    },
227 };
228
229 static const intel_x86_umask_t ivbep_unc_c_ring_ad_used[]={
230    { .uname  = "UP_VR0_EVEN",
231      .udesc  = "Up and Even ring polarity filter on virtual ring 0",
232      .ucode = 0x100,
233    },
234    { .uname  = "UP_VR0_ODD",
235      .udesc  = "Up and odd ring polarity filter on virtual ring 0",
236      .ucode = 0x200,
237    },
238    { .uname  = "DOWN_VR0_EVEN",
239      .udesc  = "Down and even ring polarity filter on virtual ring 0",
240      .ucode = 0x400,
241    },
242    { .uname  = "DOWN_VR0_ODD",
243      .udesc  = "Down and odd ring polarity filter on virtual ring 0",
244      .ucode = 0x800,
245    },
246    { .uname  = "UP_VR1_EVEN",
247      .udesc  = "Up and Even ring polarity filter on virtual ring 1",
248      .ucode = 0x1000,
249    },
250    { .uname  = "UP_VR1_ODD",
251      .udesc  = "Up and odd ring polarity filter on virtual ring 1",
252      .ucode = 0x2000,
253    },
254    { .uname  = "DOWN_VR1_EVEN",
255      .udesc  = "Down and even ring polarity filter on virtual ring 1",
256      .ucode = 0x4000,
257    },
258    { .uname  = "DOWN_VR1_ODD",
259      .udesc  = "Down and odd ring polarity filter on virtual ring 1",
260      .ucode = 0x8000,
261    },
262    { .uname  = "UP",
263      .udesc  = "Up on any virtual ring",
264      .ucode = 0x3300,
265    },
266    { .uname  = "DOWN",
267      .udesc  = "Down any virtual ring",
268      .ucode = 0xcc00,
269    },
270 };
271
272 static const intel_x86_umask_t ivbep_unc_c_ring_bounces[]={
273    { .uname  = "AD_IRQ",
274      .udesc  = "TBD",
275      .ucode = 0x200,
276    },
277    { .uname  = "AK",
278      .udesc  = "Acknowledgments to core",
279      .ucode = 0x400,
280    },
281
282    { .uname  = "BL",
283      .udesc  = "Data responses to core",
284      .ucode = 0x800,
285    },
286    { .uname  = "IV",
287      .udesc  = "Snoops of processor cache",
288      .ucode = 0x1000,
289    },
290 };
291
292 static const intel_x86_umask_t ivbep_unc_c_ring_iv_used[]={
293    { .uname  = "ANY",
294      .udesc  = "Any filter",
295      .ucode = 0xf00,
296      .uflags = INTEL_X86_DFL,
297    },
298    { .uname  = "UP",
299      .udesc  = "Filter on any up polarity",
300      .ucode = 0x3300,
301    },
302    { .uname  = "DOWN",
303      .udesc  = "Filter on any down polarity",
304      .ucode = 0xcc00,
305    },
306 };
307
308 static const intel_x86_umask_t ivbep_unc_c_rxr_ext_starved[]={
309    { .uname  = "IRQ",
310      .udesc  = "Irq externally starved, therefore blocking the IPQ",
311      .ucode = 0x100,
312    },
313    { .uname  = "IPQ",
314      .udesc  = "IPQ externally starved, therefore blocking the IRQ",
315      .ucode = 0x200,
316    },
317    { .uname  = "PRQ",
318      .udesc  = "IRQ is blocking the ingress queue and causing starvation",
319      .ucode = 0x400,
320    },
321    { .uname  = "ISMQ_BIDS",
322      .udesc  = "Number of time the ISMQ bids",
323      .ucode = 0x800,
324    },
325 };
326
327 static const intel_x86_umask_t ivbep_unc_c_rxr_inserts[]={
328   { .uname = "IPQ",
329     .udesc  = "IPQ",
330     .ucode  = 0x400,
331     .uflags = INTEL_X86_NCOMBO,
332   },
333   { .uname = "IRQ",
334     .udesc  = "IRQ",
335     .ucode  = 0x100,
336     .uflags = INTEL_X86_NCOMBO,
337   },
338   { .uname = "IRQ_REJECTED",
339     .udesc  = "IRQ rejected",
340     .ucode  = 0x200,
341     .uflags = INTEL_X86_NCOMBO,
342   },
343   { .uname = "VFIFO",
344     .udesc  = "Counts the number of allocated into the IRQ ordering FIFO",
345     .ucode  = 0x1000,
346     .uflags = INTEL_X86_NCOMBO,
347   },
348 };
349
350 static const intel_x86_umask_t ivbep_unc_c_rxr_ipq_retry[]={
351   { .uname = "ADDR_CONFLICT",
352     .udesc  = "Address conflict",
353     .ucode  = 0x400,
354     .uflags = INTEL_X86_NCOMBO,
355   },
356   { .uname = "ANY",
357     .udesc  = "Any Reject",
358     .ucode  = 0x100,
359     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
360   },
361   { .uname = "FULL",
362     .udesc  = "No Egress credits",
363     .ucode  = 0x200,
364     .uflags = INTEL_X86_NCOMBO,
365   },
366   { .uname = "QPI_CREDITS",
367     .udesc  = "No QPI credits",
368     .ucode  = 0x1000,
369     .uflags = INTEL_X86_NCOMBO,
370   },
371 };
372
373 static const intel_x86_umask_t ivbep_unc_c_rxr_irq_retry[]={
374   { .uname = "ADDR_CONFLICT",
375     .udesc  = "Address conflict",
376     .ucode  = 0x400,
377     .uflags = INTEL_X86_NCOMBO,
378   },
379   { .uname = "ANY",
380     .udesc  = "Any reject",
381     .ucode  = 0x100,
382     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
383   },
384   { .uname = "FULL",
385     .udesc  = "No Egress credits",
386     .ucode  = 0x200,
387     .uflags = INTEL_X86_NCOMBO,
388   },
389   { .uname = "QPI_CREDITS",
390     .udesc  = "No QPI credits",
391     .ucode  = 0x1000,
392     .uflags = INTEL_X86_NCOMBO,
393   },
394   { .uname = "RTID",
395     .udesc  = "No RTIDs",
396     .ucode  = 0x800,
397     .uflags = INTEL_X86_NCOMBO,
398   },
399   { .uname = "IIO_CREDITS",
400     .udesc  = "No IIO Credits",
401     .ucode  = 0x2000,
402     .uflags = INTEL_X86_NCOMBO,
403   },
404 };
405
406 static const intel_x86_umask_t ivbep_unc_c_rxr_ismq_retry[]={
407   { .uname = "ANY",
408     .udesc  = "Any reject",
409     .ucode  = 0x100,
410     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
411   },
412   { .uname = "FULL",
413     .udesc  = "No Egress credits",
414     .ucode  = 0x200,
415     .uflags = INTEL_X86_NCOMBO,
416   },
417   { .uname = "IIO_CREDITS",
418     .udesc  = "No IIO credits",
419     .ucode  = 0x2000,
420     .uflags = INTEL_X86_NCOMBO,
421   },
422   { .uname = "QPI_CREDITS",
423     .udesc  = "NO QPI credits",
424     .ucode  = 0x1000,
425     .uflags = INTEL_X86_NCOMBO,
426   },
427   { .uname = "RTID",
428     .udesc  = "No RTIDs",
429     .ucode  = 0x800,
430     .uflags = INTEL_X86_NCOMBO,
431   },
432   { .uname = "WB_CREDITS",
433     .udesc  = "No WB credits",
434     .ucode  = 0x8000,
435     .uflags = INTEL_X86_NCOMBO,
436   },
437 };
438
439 static const intel_x86_umask_t ivbep_unc_c_rxr_occupancy[]={
440   { .uname = "IPQ",
441     .udesc  = "IPQ",
442     .ucode  = 0x400,
443     .uflags = INTEL_X86_NCOMBO,
444   },
445   { .uname = "IRQ",
446     .udesc  = "IRQ",
447     .ucode  = 0x100,
448     .uflags = INTEL_X86_NCOMBO,
449   },
450   { .uname = "IRQ_REJECTED",
451     .udesc  = "IRQ rejected",
452     .ucode  = 0x200,
453     .uflags = INTEL_X86_NCOMBO,
454   },
455   { .uname = "VFIFO",
456     .udesc  = "Number of used entries in the IRQ ordering FIFO in each cycle",
457     .ucode  = 0x1000,
458     .uflags = INTEL_X86_NCOMBO,
459   },
460 };
461
462 static const intel_x86_umask_t ivbep_unc_c_tor_inserts[]={
463   { .uname = "OPCODE",
464     .udesc  = "Number of transactions inserted into the TOR that match an opcode (must provide opc_* umask)",
465     .ucode  = 0x100,
466     .grpid  = 0,
467     .uflags = INTEL_X86_NCOMBO,
468   },
469   { .uname = "MISS_OPCODE",
470     .udesc  = "Number of miss transactions inserted into the TOR that match an opcode (must provide opc_* umask)",
471     .ucode  = 0x300,
472     .grpid  = 0,
473     .uflags = INTEL_X86_NCOMBO,
474   },
475   { .uname = "EVICTION",
476     .udesc  = "Number of Evictions transactions inserted into TOR",
477     .ucode  = 0x400,
478     .grpid  = 0,
479     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
480   },
481   { .uname = "ALL",
482     .udesc  = "Number of transactions inserted in TOR",
483     .ucode  = 0x800,
484     .grpid  = 0,
485     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL | INTEL_X86_EXCL_GRP_GT,
486   },
487   { .uname = "WB",
488     .udesc  = "Number of write transactions inserted into the TOR",
489     .ucode  = 0x1000,
490     .grpid  = 0,
491     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
492   },
493   { .uname = "LOCAL_OPCODE",
494     .udesc  = "Number of opcode-matched transactions inserted into the TOR that are satisfied by locally homed memory",
495     .ucode  = 0x2100,
496     .grpid  = 0,
497     .uflags = INTEL_X86_NCOMBO,
498   },
499   { .uname = "MISS_LOCAL_OPCODE",
500     .udesc  = "Number of miss opcode-matched transactions inserted into the TOR that are satisfied by locally homed memory",
501     .ucode  = 0x2300,
502     .grpid  = 0,
503     .uflags = INTEL_X86_NCOMBO,
504   },
505   { .uname = "LOCAL",
506     .udesc  = "Number of transactions inserted into the TOR that are satisfied by locally homed memory",
507     .ucode  = 0x2800,
508     .grpid  = 0,
509     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
510   },
511   { .uname = "MISS_LOCAL",
512     .udesc  = "Number of miss transactions inserted into the TOR that are satisfied by locally homed memory",
513     .ucode  = 0x2a00,
514     .grpid  = 0,
515     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
516   },
517   { .uname = "NID_OPCODE",
518     .udesc  = "Number of transactions inserted into the TOR that match a NID and opcode (must provide opc_* umask and nf=X modifier)",
519     .ucode  = 0x4100,
520     .grpid  = 0,
521     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
522     .uflags = INTEL_X86_NCOMBO,
523   },
524   { .uname = "NID_MISS_OPCODE",
525     .udesc  = "Number of NID and opcode matched miss transactions inserted into the TOR (must provide opc_* umask and nf=X modifier)",
526     .ucode  = 0x4300,
527     .grpid  = 0,
528     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
529     .uflags = INTEL_X86_NCOMBO,
530   },
531   { .uname = "NID_EVICTION",
532     .udesc  = "Number of NID-matched eviction transactions inserted into the TOR (must provide nf=X modifier)",
533     .ucode  = 0x4400,
534     .grpid  = 0,
535     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
536     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
537   },
538   { .uname = "NID_ALL",
539     .udesc  = "Number of NID-matched transactions inserted into the TOR (must provide nf=X modifier)",
540     .ucode  = 0x4800,
541     .grpid  = 0,
542     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
543     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
544   },
545   { .uname = "NID_MISS_ALL",
546     .udesc  = "Number of NID-matched miss transactions that were inserted into the TOR (must provide nf=X modifier)",
547     .ucode  = 0x4a00,
548     .grpid  = 0,
549     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
550     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
551   },
552   { .uname = "NID_WB",
553     .udesc  = "Number of NID-matched write back transactions inserted into the TOR (must provide nf=X modifier)",
554     .ucode  = 0x5000,
555     .grpid  = 0,
556     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
557     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
558   },
559   { .uname = "REMOTE_OPCODE",
560     .udesc  = "Number of opcode-matched transactions inserted into the TOR that are satisfied by remote caches or memory",
561     .ucode  = 0x8100,
562     .grpid  = 0,
563     .uflags = INTEL_X86_NCOMBO,
564   },
565   { .uname = "MISS_REMOTE_OPCODE",
566     .udesc  = "Number of miss opcode-matched transactions inserted into the TOR that are satisfied by remote caches or memory",
567     .ucode  = 0x8300,
568     .grpid  = 0,
569     .uflags = INTEL_X86_NCOMBO,
570   },
571   { .uname = "REMOTE",
572     .udesc  = "Number of transactions inserted into the TOR that are satisfied by remote caches or memory",
573     .ucode  = 0x8800,
574     .grpid  = 0,
575     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
576   },
577   { .uname = "MISS_REMOTE",
578     .udesc  = "Number of miss transactions inserted into the TOR that are satisfied by remote caches or memory",
579     .ucode  = 0x8a00,
580     .grpid  = 0,
581     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
582   },
583   CBO_FILT_OPC(1)
584 };
585
586 static const intel_x86_umask_t ivbep_unc_c_tor_occupancy[]={
587   { .uname = "OPCODE",
588     .udesc  = "Number of TOR entries that match an opcode (must provide opc_* umask)",
589     .ucode  = 0x100,
590     .grpid  = 0,
591     .uflags = INTEL_X86_NCOMBO,
592   },
593   { .uname = "MISS_OPCODE",
594     .udesc  = "Number of TOR entries that match a NID and an opcode (must provide opc_* umask)",
595     .ucode  = 0x300,
596     .grpid  = 0,
597     .uflags = INTEL_X86_NCOMBO,
598   },
599   { .uname = "EVICTION",
600     .udesc  = "Number of outstanding eviction transactions in the TOR",
601     .ucode  = 0x400,
602     .grpid  = 0,
603     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
604   },
605   { .uname = "ALL",
606     .udesc  = "All valid TOR entries",
607     .ucode  = 0x800,
608     .grpid  = 0,
609     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL | INTEL_X86_EXCL_GRP_GT,
610   },
611   { .uname = "MISS_ALL",
612     .udesc  = "Number of outstanding miss requests in the TOR",
613     .ucode  = 0xa00,
614     .grpid  = 0,
615     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
616   },
617   { .uname = "WB",
618     .udesc  = "Number of write transactions in the TOR. Does not include RFO, but actual operations that contain data being sent from the core",
619     .ucode  = 0x1000,
620     .grpid  = 0,
621     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
622   },
623   { .uname = "LOCAL_OPCODE",
624     .udesc  = "Number of opcode-matched transactions in the TOR that are satisfied by locally homed memory",
625     .ucode  = 0x2100,
626     .grpid  = 0,
627     .uflags = INTEL_X86_NCOMBO,
628   },
629   { .uname = "MISS_LOCAL_OPCODE",
630     .udesc  = "Number of miss opcode-matched transactions in the TOR that are satisfied by locally homed memory",
631     .ucode  = 0x2300,
632     .grpid  = 0,
633     .uflags = INTEL_X86_NCOMBO,
634   },
635   { .uname = "LOCAL",
636     .udesc  = "Number of transactions in the TOR that are satisfied by locally homed memory",
637     .ucode  = 0x2800,
638     .grpid  = 0,
639     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
640   },
641   { .uname = "MISS_LOCAL",
642     .udesc  = "Number of miss transactions in the TOR that are satisfied by locally homed memory",
643     .ucode  = 0x2a00,
644     .grpid  = 0,
645     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
646   },
647   { .uname = "NID_OPCODE",
648     .udesc  = "Number of NID-matched TOR entries that an opcode (must provide nf=X modifier and opc_* umask)",
649     .ucode  = 0x4100,
650     .grpid  = 0,
651     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
652     .uflags = INTEL_X86_NCOMBO,
653   },
654   { .uname = "NID_MISS_OPCODE",
655     .udesc  = "Number of NID-matched outstanding miss requests in the TOR that an opcode (must provide nf=X modifier and opc_* umask)",
656     .ucode  = 0x4300,
657     .grpid  = 0,
658     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
659     .uflags = INTEL_X86_NCOMBO,
660   },
661   { .uname = "NID_EVICTION",
662     .udesc  = "Number of NID-matched outstanding requests in the TOR (must provide a nf=X modifier)",
663     .ucode  = 0x4400,
664     .grpid  = 0,
665     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
666     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
667   },
668   { .uname = "NID_ALL",
669     .udesc  = "Number of NID-matched outstanding requests in the TOR (must provide nf=X modifier)",
670     .ucode  = 0x4800,
671     .grpid  = 0,
672     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
673     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
674   },
675   { .uname = "NID_MISS_ALL",
676     .udesc  = "Number of NID-matched outstanding miss requests in the TOR (must provide a nf=X modifier)",
677     .ucode  = 0x4a00,
678     .grpid  = 0,
679     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
680     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
681   },
682   { .uname = "NID_WB",
683     .udesc  = "Number of NID-matched write transactions in the TOR (must provide a nf=X modifier)",
684     .ucode  = 0x5000,
685     .grpid  = 0,
686     .umodmsk_req = _SNBEP_UNC_ATTR_NF1,
687     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
688   },
689   { .uname = "REMOTE_OPCODE",
690     .udesc  = "Number of opcode-matched transactions in the TOR that are satisfied by remote caches or memory",
691     .ucode  = 0x8100,
692     .grpid  = 0,
693     .uflags = INTEL_X86_NCOMBO,
694   },
695   { .uname = "MISS_REMOTE_OPCODE",
696     .udesc  = "Number of miss opcode-matched transactions in the TOR that are satisfied by remote caches or memory",
697     .ucode  = 0x8300,
698     .grpid  = 0,
699     .uflags = INTEL_X86_NCOMBO,
700   },
701   { .uname = "REMOTE",
702     .udesc  = "Number of transactions in the TOR that are satisfied by remote caches or memory",
703     .ucode  = 0x8800,
704     .grpid  = 0,
705     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
706   },
707   { .uname = "MISS_REMOTE",
708     .udesc  = "Number of miss transactions inserted into the TOR that are satisfied by remote caches or memory",
709     .ucode  = 0x8a00,
710     .grpid  = 0,
711     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
712   },
713   CBO_FILT_OPC(1)
714 };
715
716 static const intel_x86_umask_t ivbep_unc_c_txr_inserts[]={
717   { .uname = "AD_CACHE",
718     .udesc  = "Counts the number of ring transactions from Cachebo to AD ring",
719     .ucode  = 0x100,
720     .uflags = INTEL_X86_NCOMBO,
721   },
722   { .uname = "AK_CACHE",
723     .udesc  = "Counts the number of ring transactions from Cachebo to AK ring",
724     .ucode  = 0x200,
725     .uflags = INTEL_X86_NCOMBO,
726   },
727   { .uname = "BL_CACHE",
728     .udesc  = "Counts the number of ring transactions from Cachebo to BL ring",
729     .ucode  = 0x400,
730     .uflags = INTEL_X86_NCOMBO,
731   },
732   { .uname = "IV_CACHE",
733     .udesc  = "Counts the number of ring transactions from Cachebo ton IV ring",
734     .ucode  = 0x800,
735     .uflags = INTEL_X86_NCOMBO,
736   },
737   { .uname = "AD_CORE",
738     .udesc  = "Counts the number of ring transactions from Corebo to AD ring",
739     .ucode  = 0x1000,
740     .uflags = INTEL_X86_NCOMBO,
741   },
742   { .uname = "AK_CORE",
743     .udesc  = "Counts the number of ring transactions from Corebo to AK ring",
744     .ucode  = 0x2000,
745     .uflags = INTEL_X86_NCOMBO,
746   },
747   { .uname = "BL_CORE",
748     .udesc  = "Counts the number of ring transactions from Corebo to BL ring",
749     .ucode  = 0x4000,
750     .uflags = INTEL_X86_NCOMBO,
751   },
752 };
753
754 static const intel_x86_umask_t ivbep_unc_c_txr_ads_used[]={
755   { .uname = "AD",
756     .udesc  = "onto AD ring",
757     .ucode  = 0x100,
758     .uflags = INTEL_X86_NCOMBO,
759   },
760   { .uname = "AK",
761     .udesc  = "Onto AK ring",
762     .ucode  = 0x200,
763     .uflags = INTEL_X86_NCOMBO,
764   },
765   { .uname = "BL",
766     .udesc  = "Onto BL ring",
767     .ucode  = 0x400,
768     .uflags = INTEL_X86_NCOMBO,
769   }
770 };
771
772 static const intel_x86_umask_t ivbep_unc_c_misc[]={
773   { .uname = "RSPI_WAS_FSE",
774     .udesc  = "Counts the number of times when a SNoop hit in FSE states and triggered a silent eviction. This is useful because this information is lost in the PRE encodings",
775     .ucode  = 0x100,
776     .uflags = INTEL_X86_NCOMBO,
777   },
778   { .uname = "WC_ALIASING",
779     .udesc  = "Counts the number of times a USWC write (WCIL(F)) transaction hits in the LLC in M state, triggering a WBMTOI followed by the USWC write. This occurs when there is WC aliasing",
780     .ucode  = 0x200,
781     .uflags = INTEL_X86_NCOMBO,
782   },
783   { .uname = "STARTED",
784     .udesc  = "TBD",
785     .ucode  = 0x400,
786     .uflags = INTEL_X86_NCOMBO,
787   },
788   { .uname = "RFO_HIT_S",
789     .udesc  = "Counts the number of times that an RFO hits in S state. This is useful for determining if it might be good for a workload to use RSPIWB instead of RSPSWB",
790     .ucode  = 0x800,
791     .uflags = INTEL_X86_NCOMBO,
792   },
793 };
794
795 static const intel_x86_entry_t intel_ivbep_unc_c_pe[]={
796   { .name   = "UNC_C_CLOCKTICKS",
797     .desc   = "C-box Uncore clockticks",
798     .modmsk = 0x0,
799     .cntmsk = 0xf,
800     .code = 0x00,
801     .flags = INTEL_X86_FIXED,
802   },
803   { .name   = "UNC_C_COUNTER0_OCCUPANCY",
804     .desc   = "Counter 0 occupancy. Counts the occupancy related information by filtering CB0 occupancy count captured in counter 0.",
805     .modmsk = IVBEP_UNC_CBO_ATTRS,
806     .cntmsk = 0xe,
807     .code = 0x1f,
808   },
809   { .name   = "UNC_C_LLC_LOOKUP",
810     .desc   = "Cache lookups",
811     .modmsk = IVBEP_UNC_CBO_NID_ATTRS,
812     .cntmsk = 0x3,
813     .code = 0x34,
814     .ngrp = 3,
815     .flags = INTEL_X86_NO_AUTOENCODE,
816     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_llc_lookup),
817     .umasks = ivbep_unc_c_llc_lookup,
818   },
819   { .name   = "UNC_C_LLC_VICTIMS",
820     .desc   = "Lines victimized",
821     .modmsk = IVBEP_UNC_CBO_NID_ATTRS,
822     .cntmsk = 0x3,
823     .code = 0x37,
824     .flags = INTEL_X86_NO_AUTOENCODE,
825     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_llc_victims),
826     .ngrp = 2,
827     .umasks = ivbep_unc_c_llc_victims,
828   },
829   { .name   = "UNC_C_MISC",
830     .desc   = "Miscellaneous C-Box events",
831     .modmsk = IVBEP_UNC_CBO_ATTRS,
832     .cntmsk = 0x3,
833     .code = 0x39,
834     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_misc),
835     .ngrp = 1,
836     .umasks = ivbep_unc_c_misc,
837   },
838   { .name   = "UNC_C_RING_AD_USED",
839     .desc   = "Address ring in use. Counts number of cycles ring is being used at this ring stop",
840     .modmsk = IVBEP_UNC_CBO_ATTRS,
841     .cntmsk = 0xc,
842     .code = 0x1b,
843     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_ring_ad_used),
844     .ngrp = 1,
845     .umasks = ivbep_unc_c_ring_ad_used,
846   },
847   { .name   = "UNC_C_RING_AK_USED",
848     .desc   = "Acknowledgement ring in use. Counts number of cycles ring is being used at this ring stop",
849     .modmsk = IVBEP_UNC_CBO_ATTRS,
850     .cntmsk = 0xc,
851     .code = 0x1c,
852     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_ring_ad_used), /* identical to RING_AD_USED */
853     .ngrp = 1,
854     .umasks = ivbep_unc_c_ring_ad_used,
855   },
856   { .name   = "UNC_C_RING_BL_USED",
857     .desc   = "Bus or Data ring in use. Counts number of cycles ring is being used at this ring stop",
858     .modmsk = IVBEP_UNC_CBO_ATTRS,
859     .cntmsk = 0xc,
860     .code = 0x1d,
861     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_ring_ad_used), /* identical to RING_AD_USED */
862     .ngrp = 1,
863     .umasks = ivbep_unc_c_ring_ad_used,
864   },
865   { .name   = "UNC_C_RING_BOUNCES",
866     .desc   = "Number of LLC responses that bounced in the ring",
867     .modmsk = IVBEP_UNC_CBO_ATTRS,
868     .cntmsk = 0x3,
869     .code = 0x05,
870     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_ring_bounces),
871     .ngrp = 1,
872     .umasks = ivbep_unc_c_ring_bounces,
873   },
874   { .name   = "UNC_C_RING_IV_USED",
875     .desc   = "Invalidate ring in use. Counts number of cycles ring is being used at this ring stop",
876     .modmsk = IVBEP_UNC_CBO_ATTRS,
877     .cntmsk = 0xc,
878     .code = 0x1e,
879     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_ring_iv_used),
880     .ngrp = 1,
881     .umasks = ivbep_unc_c_ring_iv_used,
882   },
883   { .name   = "UNC_C_RING_SRC_THRTL",
884     .desc   = "TDB",
885     .modmsk = IVBEP_UNC_CBO_ATTRS,
886     .cntmsk = 0x3,
887     .code = 0x07,
888   },
889   { .name   = "UNC_C_RXR_EXT_STARVED",
890     .desc   = "Ingress arbiter blocking cycles",
891     .modmsk = IVBEP_UNC_CBO_ATTRS,
892     .cntmsk = 0x3,
893     .code = 0x12,
894     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_rxr_ext_starved),
895     .ngrp = 1,
896     .umasks = ivbep_unc_c_rxr_ext_starved,
897   },
898   { .name = "UNC_C_RXR_INSERTS",
899     .desc = "Ingress Allocations",
900     .code = 0x13,
901     .cntmsk = 0x3,
902     .ngrp = 1,
903     .modmsk = IVBEP_UNC_CBO_ATTRS,
904     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_rxr_inserts),
905     .umasks  = ivbep_unc_c_rxr_inserts
906   },
907   { .name = "UNC_C_RXR_IPQ_RETRY",
908     .desc = "Probe Queue Retries",
909     .code = 0x31,
910     .cntmsk = 0x3,
911     .ngrp = 1,
912     .modmsk = IVBEP_UNC_CBO_ATTRS,
913     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_rxr_ipq_retry),
914     .umasks  = ivbep_unc_c_rxr_ipq_retry
915   },
916   { .name = "UNC_C_RXR_IRQ_RETRY",
917     .desc = "Ingress Request Queue Rejects",
918     .code = 0x32,
919     .cntmsk = 0x3,
920     .ngrp = 1,
921     .modmsk = IVBEP_UNC_CBO_ATTRS,
922     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_rxr_irq_retry),
923     .umasks  = ivbep_unc_c_rxr_irq_retry
924   },
925   { .name = "UNC_C_RXR_ISMQ_RETRY",
926     .desc = "ISMQ Retries",
927     .code = 0x33,
928     .cntmsk = 0x3,
929     .ngrp = 1,
930     .modmsk = IVBEP_UNC_CBO_ATTRS,
931     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_rxr_ismq_retry),
932     .umasks  = ivbep_unc_c_rxr_ismq_retry
933   },
934   { .name = "UNC_C_RXR_OCCUPANCY",
935     .desc = "Ingress Occupancy",
936     .code = 0x11,
937     .cntmsk = 0x1,
938     .ngrp = 1,
939     .modmsk = IVBEP_UNC_CBO_ATTRS,
940     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_rxr_inserts),
941     .umasks  = ivbep_unc_c_rxr_inserts, /* identical to ivbep_unc_c_rxr_inserts */
942   },
943   { .name = "UNC_C_TOR_INSERTS",
944     .desc = "TOR Inserts",
945     .code = 0x35,
946     .cntmsk = 0x3,
947     .ngrp = 2,
948     .modmsk = IVBEP_UNC_CBO_NID_ATTRS | _SNBEP_UNC_ATTR_ISOC | _SNBEP_UNC_ATTR_NC,
949     .flags  = INTEL_X86_NO_AUTOENCODE,
950     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_tor_inserts),
951     .umasks  = ivbep_unc_c_tor_inserts
952   },
953   { .name = "UNC_C_TOR_OCCUPANCY",
954     .desc = "TOR Occupancy",
955     .code = 0x36,
956     .cntmsk = 0x1,
957     .ngrp = 2,
958     .modmsk = IVBEP_UNC_CBO_NID_ATTRS | _SNBEP_UNC_ATTR_ISOC | _SNBEP_UNC_ATTR_NC,
959     .flags  = INTEL_X86_NO_AUTOENCODE,
960     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_tor_occupancy),
961     .umasks  = ivbep_unc_c_tor_occupancy
962   },
963   { .name = "UNC_C_TXR_ADS_USED",
964     .desc = "Egress events",
965     .code = 0x04,
966     .cntmsk = 0x3,
967     .ngrp = 1,
968     .modmsk = IVBEP_UNC_CBO_ATTRS,
969     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_txr_ads_used),
970     .umasks  = ivbep_unc_c_txr_ads_used
971   },
972   { .name = "UNC_C_TXR_INSERTS",
973     .desc = "Egress allocations",
974     .code = 0x02,
975     .cntmsk = 0x3,
976     .ngrp = 1,
977     .modmsk = IVBEP_UNC_CBO_ATTRS,
978     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_c_txr_inserts),
979     .umasks  = ivbep_unc_c_txr_inserts
980   },
981 };