Added libpfm4 library support
[akaros.git] / user / perfmon / events / intel_snbep_unc_cbo_events.h
1 /*
2  * Copyright (c) 2012 Google, Inc
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: snbep_unc_cbo (Intel SandyBridge-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 << (18 + (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] = 0x1fULL << 18,\
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[0] = 0x180ULL << 23, \
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[0] = 0x181ULL << 23, \
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[0] = 0x182ULL << 23, \
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[0] = 0x187ULL << 23, \
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[0] = 0x18cULL << 23, \
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[0] = 0x18dULL << 23, \
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[0] = 0x190ULL << 23, \
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[0] = 0x191ULL << 23, \
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[0] = 0x192ULL << 23, \
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[0] = 0x194ULL << 23, \
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[0] = 0x195ULL << 23, \
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[0] = 0x19cULL << 23, \
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[0] = 0x19eULL << 23, \
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[0] = 0x1c4ULL << 23, \
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[0] = 0x1c5ULL << 23, \
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[0] = 0x1c8ULL << 23, \
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[0] = 0x1e4ULL << 23, \
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[0] = 0x1e5ULL << 23, \
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[0] = 0x1e6ULL << 23, \
160      .uflags = INTEL_X86_NCOMBO, \
161      .grpid = d, \
162    }
163
164 static const intel_x86_umask_t snbep_unc_c_llc_lookup[]={
165    { .uname  = "ANY",
166      .udesc  = "Any request",
167      .grpid  = 0,
168      .uflags = INTEL_X86_NCOMBO,
169      .ucode = 0x1f00,
170    },
171    { .uname  = "DATA_READ",
172      .udesc  = "Data read requests",
173      .grpid  = 0,
174      .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
175      .ucode = 0x300,
176    },
177    { .uname  = "WRITE",
178      .udesc  = "Write requests. Includes all write transactions (cached, uncached)",
179      .grpid  = 0,
180      .uflags = INTEL_X86_NCOMBO,
181      .ucode = 0x500,
182    },
183    { .uname  = "REMOTE_SNOOP",
184      .udesc  = "External snoop request",
185      .grpid  = 0,
186      .uflags = INTEL_X86_NCOMBO,
187      .ucode = 0x900,
188    },
189    { .uname  = "NID",
190      .udesc  = "Match a given RTID destination NID (must provide nf=X modifier)",
191      .uflags = INTEL_X86_NCOMBO | INTEL_X86_GRP_DFL_NONE,
192      .umodmsk_req = _SNBEP_UNC_ATTR_NF,
193      .grpid  = 1,
194      .ucode = 0x4100,
195    },
196    CBO_FILT_MESIFS(2),
197 };
198
199 static const intel_x86_umask_t snbep_unc_c_llc_victims[]={
200    { .uname  = "M_STATE",
201      .udesc  = "Lines in M state",
202      .ucode = 0x100,
203    },
204    { .uname  = "E_STATE",
205      .udesc  = "Lines in E state",
206      .ucode = 0x200,
207    },
208    { .uname  = "S_STATE",
209      .udesc  = "Lines in S state",
210      .ucode = 0x400,
211    },
212    { .uname  = "MISS",
213      .udesc  = "TBD",
214      .ucode = 0x800,
215    },
216    { .uname  = "NID",
217      .udesc  = "Victimized Lines matching the NID filter (must provide nf=X modifier)",
218      .uflags = INTEL_X86_NCOMBO,
219      .umodmsk_req = _SNBEP_UNC_ATTR_NF,
220      .ucode = 0x4000,
221    },
222 };
223
224 static const intel_x86_umask_t snbep_unc_c_misc[]={
225    { .uname  = "RSPI_WAS_FSE",
226      .udesc  = "Silent snoop eviction",
227      .ucode = 0x100,
228    },
229    { .uname  = "WC_ALIASING",
230      .udesc  = "Write combining aliasing",
231      .ucode = 0x200,
232    },
233    { .uname  = "STARTED",
234      .udesc  = "TBD",
235      .ucode = 0x400,
236    },
237    { .uname  = "RFO_HIT_S",
238      .udesc  = "RFO hits in S state",
239      .ucode = 0x800,
240    },
241 };
242
243 static const intel_x86_umask_t snbep_unc_c_ring_ad_used[]={
244    { .uname  = "UP_EVEN",
245      .udesc  = "Up and Even ring polarity filter",
246      .ucode = 0x100,
247    },
248    { .uname  = "UP_ODD",
249      .udesc  = "Up and odd ring polarity filter",
250      .ucode = 0x200,
251    },
252    { .uname  = "DOWN_EVEN",
253      .udesc  = "Down and even ring polarity filter",
254      .ucode = 0x400,
255    },
256    { .uname  = "DOWN_ODD",
257      .udesc  = "Down and odd ring polarity filter",
258      .ucode = 0x800,
259    },
260 };
261
262 static const intel_x86_umask_t snbep_unc_c_ring_bounces[]={
263    { .uname  = "AK_CORE",
264      .udesc  = "Acknowledgment to core",
265      .ucode = 0x200,
266    },
267    { .uname  = "BL_CORE",
268      .udesc  = "Data response to core",
269      .ucode = 0x400,
270    },
271    { .uname  = "IV_CORE",
272      .udesc  = "Snoops of processor cache",
273      .ucode = 0x800,
274    },
275 };
276
277 static const intel_x86_umask_t snbep_unc_c_ring_iv_used[]={
278    { .uname  = "ANY",
279      .udesc  = "Any filter",
280      .ucode = 0xf00,
281      .uflags = INTEL_X86_DFL,
282    },
283 };
284
285 static const intel_x86_umask_t snbep_unc_c_rxr_ext_starved[]={
286    { .uname  = "IRQ",
287      .udesc  = "Irq externally starved, therefore blocking the IPQ",
288      .ucode = 0x100,
289    },
290    { .uname  = "IPQ",
291      .udesc  = "IPQ externally starved, therefore blocking the IRQ",
292      .ucode = 0x200,
293    },
294    { .uname  = "ISMQ",
295      .udesc  = "ISMQ externally starved, therefore blocking both IRQ and IPQ",
296      .ucode = 0x400,
297    },
298    { .uname  = "ISMQ_BIDS",
299      .udesc  = "Number of time the ISMQ bids",
300      .ucode = 0x800,
301    },
302 };
303
304 static const intel_x86_umask_t snbep_unc_c_rxr_inserts[]={
305   { .uname = "IPQ",
306     .udesc  = "IPQ",
307     .ucode  = 0x400,
308     .uflags = INTEL_X86_NCOMBO,
309   },
310   { .uname = "IRQ",
311     .udesc  = "IRQ",
312     .ucode  = 0x100,
313     .uflags = INTEL_X86_NCOMBO,
314   },
315   { .uname = "IRQ_REJECTED",
316     .udesc  = "IRQ rejected",
317     .ucode  = 0x200,
318     .uflags = INTEL_X86_NCOMBO,
319   },
320   { .uname = "VFIFO",
321     .udesc  = "Counts the number of allocated into the IRQ ordering FIFO",
322     .ucode  = 0x1000,
323     .uflags = INTEL_X86_NCOMBO,
324   },
325 };
326
327 static const intel_x86_umask_t snbep_unc_c_rxr_ipq_retry[]={
328   { .uname = "ADDR_CONFLICT",
329     .udesc  = "Address conflict",
330     .ucode  = 0x400,
331     .uflags = INTEL_X86_NCOMBO,
332   },
333   { .uname = "ANY",
334     .udesc  = "Any Reject",
335     .ucode  = 0x100,
336     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
337   },
338   { .uname = "FULL",
339     .udesc  = "No Egress credits",
340     .ucode  = 0x200,
341     .uflags = INTEL_X86_NCOMBO,
342   },
343   { .uname = "QPI_CREDITS",
344     .udesc  = "No QPI credits",
345     .ucode  = 0x1000,
346     .uflags = INTEL_X86_NCOMBO,
347   },
348 };
349
350 static const intel_x86_umask_t snbep_unc_c_rxr_irq_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   { .uname = "RTID",
372     .udesc  = "No RTIDs",
373     .ucode  = 0x800,
374     .uflags = INTEL_X86_NCOMBO,
375   },
376 };
377
378 static const intel_x86_umask_t snbep_unc_c_rxr_ismq_retry[]={
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 = "IIO_CREDITS",
390     .udesc  = "No IIO credits",
391     .ucode  = 0x2000,
392     .uflags = INTEL_X86_NCOMBO,
393   },
394   { .uname = "QPI_CREDITS",
395     .udesc  = "NO QPI credits",
396     .ucode  = 0x1000,
397     .uflags = INTEL_X86_NCOMBO,
398   },
399   { .uname = "RTID",
400     .udesc  = "No RTIDs",
401     .ucode  = 0x800,
402     .uflags = INTEL_X86_NCOMBO,
403   },
404 };
405
406 static const intel_x86_umask_t snbep_unc_c_rxr_occupancy[]={
407   { .uname = "IPQ",
408     .udesc  = "IPQ",
409     .ucode  = 0x400,
410     .uflags = INTEL_X86_NCOMBO,
411   },
412   { .uname = "IRQ",
413     .udesc  = "IRQ",
414     .ucode  = 0x100,
415     .uflags = INTEL_X86_NCOMBO,
416   },
417   { .uname = "IRQ_REJECTED",
418     .udesc  = "IRQ rejected",
419     .ucode  = 0x200,
420     .uflags = INTEL_X86_NCOMBO,
421   },
422   { .uname = "VFIFO",
423     .udesc  = "Number of used entries in the IRQ ordering FIFO in each cycle",
424     .ucode  = 0x1000,
425     .uflags = INTEL_X86_NCOMBO,
426   },
427 };
428
429 static const intel_x86_umask_t snbep_unc_c_tor_inserts[]={
430   { .uname = "EVICTION",
431     .udesc  = "Number of Evictions transactions inserted into TOR",
432     .ucode  = 0x400,
433     .grpid  = 0,
434     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
435   },
436   { .uname = "MISS_ALL",
437     .udesc  = "Number of miss requests inserted into the TOR",
438     .ucode  = 0xa00,
439     .grpid  = 0,
440     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
441   },
442   { .uname = "MISS_OPCODE",
443     .udesc  = "Number of miss transactions inserted into the TOR that match an opcode (must provide opc_* umask)",
444     .ucode  = 0x300,
445     .grpid  = 0,
446     .uflags = INTEL_X86_NCOMBO,
447   },
448   { .uname = "NID_ALL",
449     .udesc  = "Number of NID-matched transactions inserted into the TOR (must provide nf=X modifier)",
450     .ucode  = 0x4800,
451     .grpid  = 0,
452     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
453     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
454   },
455   { .uname = "NID_EVICTION",
456     .udesc  = "Number of NID-matched eviction transactions inserted into the TOR (must provide nf=X modifier)",
457     .ucode  = 0x4400,
458     .grpid  = 0,
459     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
460     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
461   },
462   { .uname = "NID_MISS_ALL",
463     .udesc  = "Number of NID-matched miss transactions that were inserted into the TOR (must provide nf=X modifier)",
464     .ucode  = 0x4a00,
465     .grpid  = 0,
466     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
467     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
468   },
469   { .uname = "NID_MISS_OPCODE",
470     .udesc  = "Number of NID and opcode matched miss transactions inserted into the TOR (must provide opc_* umask and nf=X modifier)",
471     .ucode  = 0x4300,
472     .grpid  = 0,
473     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
474     .uflags = INTEL_X86_NCOMBO,
475   },
476   { .uname = "NID_OPCODE",
477     .udesc  = "Number of transactions inserted into the TOR that match a NID and opcode (must provide opc_* umask and nf=X modifier)",
478     .ucode  = 0x4100,
479     .grpid  = 0,
480     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
481     .uflags = INTEL_X86_NCOMBO,
482   },
483   { .uname = "NID_WB",
484     .udesc  = "Number of NID-matched write back transactions inserted into the TOR (must provide nf=X modifier)",
485     .ucode  = 0x5000,
486     .grpid  = 0,
487     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
488     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
489   },
490   { .uname = "OPCODE",
491     .udesc  = "Number of transactions inserted into the TOR that match an opcode (must provide opc_* umask)",
492     .ucode  = 0x100,
493     .grpid  = 0,
494     .uflags = INTEL_X86_NCOMBO,
495   },
496   { .uname = "WB",
497     .udesc  = "Number of write transactions inserted into the TOR",
498     .ucode  = 0x1000,
499     .grpid  = 0,
500     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
501   },
502   CBO_FILT_OPC(1)
503 };
504
505 static const intel_x86_umask_t snbep_unc_c_tor_occupancy[]={
506   { .uname = "ALL",
507     .udesc  = "All valid TOR entries",
508     .ucode  = 0x800,
509     .grpid  = 0,
510     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL | INTEL_X86_EXCL_GRP_GT,
511   },
512   { .uname = "EVICTION",
513     .udesc  = "Number of outstanding eviction transactions in the TOR",
514     .ucode  = 0x400,
515     .grpid  = 0,
516     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
517   },
518   { .uname = "MISS_ALL",
519     .udesc  = "Number of outstanding miss requests in the TOR",
520     .ucode  = 0xa00,
521     .grpid  = 0,
522     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
523   },
524   { .uname = "MISS_OPCODE",
525     .udesc  = "Number of TOR entries that match a NID and an opcode (must provide opc_* umask)",
526     .ucode  = 0x300,
527     .grpid  = 0,
528     .uflags = INTEL_X86_NCOMBO,
529   },
530   { .uname = "NID_ALL",
531     .udesc  = "Number of NID-matched outstanding requests in the TOR (must provide nf=X modifier)",
532     .ucode  = 0x4800,
533     .grpid  = 0,
534     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
535     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
536   },
537   { .uname = "NID_EVICTION",
538     .udesc  = "Number of NID-matched outstanding requests in the TOR (must provide a nf=X modifier)",
539     .ucode  = 0x4400,
540     .grpid  = 0,
541     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
542     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
543   },
544   { .uname = "NID_MISS_ALL",
545     .udesc  = "Number of NID-matched outstanding miss requests in the TOR (must provide a nf=X modifier)",
546     .ucode  = 0x4a00,
547     .grpid  = 0,
548     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
549     .uflags = INTEL_X86_NCOMBO | INTEL_X86_EXCL_GRP_GT,
550   },
551   { .uname = "NID_MISS_OPCODE",
552     .udesc  = "Number of NID-matched outstanding miss requests in the TOR that an opcode (must provide nf=X modifier and opc_* umask)",
553     .ucode  = 0x4300,
554     .grpid  = 0,
555     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
556     .uflags = INTEL_X86_NCOMBO,
557   },
558   { .uname = "NID_OPCODE",
559     .udesc  = "Number of NID-matched TOR entries that an opcode (must provide nf=X modifier and opc_* umask)",
560     .ucode  = 0x4100,
561     .grpid  = 0,
562     .umodmsk_req = _SNBEP_UNC_ATTR_NF,
563     .uflags = INTEL_X86_NCOMBO,
564   },
565   { .uname = "OPCODE",
566     .udesc  = "Number of TOR entries that match an opcode (must provide opc_* umask)",
567     .ucode  = 0x100,
568     .grpid  = 0,
569     .uflags = INTEL_X86_NCOMBO,
570   },
571   CBO_FILT_OPC(1)
572 };
573
574 static const intel_x86_umask_t snbep_unc_c_txr_inserts[]={
575   { .uname = "AD_CACHE",
576     .udesc  = "Counts the number of ring transactions from Cachebo to AD ring",
577     .ucode  = 0x100,
578     .uflags = INTEL_X86_NCOMBO,
579   },
580   { .uname = "AK_CACHE",
581     .udesc  = "Counts the number of ring transactions from Cachebo to AK ring",
582     .ucode  = 0x200,
583     .uflags = INTEL_X86_NCOMBO,
584   },
585   { .uname = "BL_CACHE",
586     .udesc  = "Counts the number of ring transactions from Cachebo to BL ring",
587     .ucode  = 0x400,
588     .uflags = INTEL_X86_NCOMBO,
589   },
590   { .uname = "IV_CACHE",
591     .udesc  = "Counts the number of ring transactions from Cachebo to IV ring",
592     .ucode  = 0x800,
593     .uflags = INTEL_X86_NCOMBO,
594   },
595   { .uname = "AD_CORE",
596     .udesc  = "Counts the number of ring transactions from Corebo to AD ring",
597     .ucode  = 0x1000,
598     .uflags = INTEL_X86_NCOMBO,
599   },
600   { .uname = "AK_CORE",
601     .udesc  = "Counts the number of ring transactions from Corebo to AK ring",
602     .ucode  = 0x2000,
603     .uflags = INTEL_X86_NCOMBO,
604   },
605   { .uname = "BL_CORE",
606     .udesc  = "Counts the number of ring transactions from Corebo to BL ring",
607     .ucode  = 0x4000,
608     .uflags = INTEL_X86_NCOMBO,
609   },
610 };
611
612 static const intel_x86_entry_t intel_snbep_unc_c_pe[]={
613   { .name   = "UNC_C_CLOCKTICKS",
614     .desc   = "C-box Uncore clockticks",
615     .modmsk = 0x0,
616     .cntmsk = 0xf,
617     .code = 0x00,
618     .flags = INTEL_X86_FIXED,
619   },
620   { .name   = "UNC_C_COUNTER0_OCCUPANCY",
621     .desc   = "Counter 0 occupancy. Counts the occupancy related information by filtering CB0 occupancy count captured in counter 0.",
622     .modmsk = SNBEP_UNC_CBO_ATTRS,
623     .cntmsk = 0xe,
624     .code = 0x1f,
625   },
626   { .name   = "UNC_C_ISMQ_DRD_MISS_OCC",
627     .desc   = "TBD",
628     .modmsk = SNBEP_UNC_CBO_ATTRS,
629     .cntmsk = 0x3,
630     .code = 0x21,
631   },
632   { .name   = "UNC_C_LLC_LOOKUP",
633     .desc   = "Cache lookups. Counts number of times the LLC is accessed from L2 for code, data, prefetches (Must set filter mask bit 0 and select )",
634     .modmsk = SNBEP_UNC_CBO_NID_ATTRS,
635     .cntmsk = 0x3,
636     .code = 0x34,
637     .ngrp = 3,
638     .flags = INTEL_X86_NO_AUTOENCODE,
639     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_llc_lookup),
640     .umasks = snbep_unc_c_llc_lookup,
641   },
642   { .name   = "UNC_C_LLC_VICTIMS",
643     .desc   = "Lines victimized",
644     .modmsk = SNBEP_UNC_CBO_NID_ATTRS,
645     .cntmsk = 0x3,
646     .code = 0x37,
647     .flags = INTEL_X86_NO_AUTOENCODE,
648     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_llc_victims),
649     .ngrp = 1,
650     .umasks = snbep_unc_c_llc_victims,
651   },
652   { .name   = "UNC_C_MISC",
653     .desc   = "Miscellaneous C-Box events",
654     .modmsk = SNBEP_UNC_CBO_ATTRS,
655     .cntmsk = 0x3,
656     .code = 0x39,
657     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_misc),
658     .ngrp = 1,
659     .umasks = snbep_unc_c_misc,
660   },
661   { .name   = "UNC_C_RING_AD_USED",
662     .desc   = "Address ring in use. Counts number of cycles ring is being used at this ring stop",
663     .modmsk = SNBEP_UNC_CBO_ATTRS,
664     .cntmsk = 0xc,
665     .code = 0x1b,
666     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_ring_ad_used),
667     .ngrp = 1,
668     .umasks = snbep_unc_c_ring_ad_used,
669   },
670   { .name   = "UNC_C_RING_AK_USED",
671     .desc   = "Acknowledgment ring in use. Counts number of cycles ring is being used at this ring stop",
672     .modmsk = SNBEP_UNC_CBO_ATTRS,
673     .cntmsk = 0xc,
674     .code = 0x1c,
675     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_ring_ad_used), /* identical to RING_AD_USED */
676     .ngrp = 1,
677     .umasks = snbep_unc_c_ring_ad_used,
678   },
679   { .name   = "UNC_C_RING_BL_USED",
680     .desc   = "Bus or Data ring in use. Counts number of cycles ring is being used at this ring stop",
681     .modmsk = SNBEP_UNC_CBO_ATTRS,
682     .cntmsk = 0xc,
683     .code = 0x1d,
684     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_ring_ad_used), /* identical to RING_AD_USED */
685     .ngrp = 1,
686     .umasks = snbep_unc_c_ring_ad_used,
687   },
688   { .name   = "UNC_C_RING_BOUNCES",
689     .desc   = "Number of LLC responses that bounced in the ring",
690     .modmsk = SNBEP_UNC_CBO_ATTRS,
691     .cntmsk = 0x3,
692     .code = 0x05,
693     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_ring_bounces),
694     .ngrp = 1,
695     .umasks = snbep_unc_c_ring_bounces,
696   },
697   { .name   = "UNC_C_RING_IV_USED",
698     .desc   = "Invalidate ring in use. Counts number of cycles ring is being used at this ring stop",
699     .modmsk = SNBEP_UNC_CBO_ATTRS,
700     .cntmsk = 0xc,
701     .code = 0x1e,
702     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_ring_iv_used),
703     .ngrp = 1,
704     .umasks = snbep_unc_c_ring_iv_used,
705   },
706   { .name   = "UNC_C_RING_SRC_THRTL",
707     .desc   = "TDB",
708     .modmsk = SNBEP_UNC_CBO_ATTRS,
709     .cntmsk = 0x3,
710     .code = 0x07,
711   },
712   { .name   = "UNC_C_RXR_EXT_STARVED",
713     .desc   = "Ingress arbiter blocking cycles",
714     .modmsk = SNBEP_UNC_CBO_ATTRS,
715     .cntmsk = 0x3,
716     .code = 0x12,
717     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_rxr_ext_starved),
718     .ngrp = 1,
719     .umasks = snbep_unc_c_rxr_ext_starved,
720   },
721   { .name = "UNC_C_RXR_INSERTS",
722     .desc = "Ingress Allocations",
723     .code = 0x13,
724     .cntmsk = 0x3,
725     .ngrp = 1,
726     .modmsk = SNBEP_UNC_CBO_ATTRS,
727     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_rxr_inserts),
728     .umasks  = snbep_unc_c_rxr_inserts
729   },
730   { .name = "UNC_C_RXR_IPQ_RETRY",
731     .desc = "Probe Queue Retries",
732     .code = 0x31,
733     .cntmsk = 0x3,
734     .ngrp = 1,
735     .modmsk = SNBEP_UNC_CBO_ATTRS,
736     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_rxr_ipq_retry),
737     .umasks  = snbep_unc_c_rxr_ipq_retry
738   },
739   { .name = "UNC_C_RXR_IRQ_RETRY",
740     .desc = "Ingress Request Queue Rejects",
741     .code = 0x32,
742     .cntmsk = 0x3,
743     .ngrp = 1,
744     .modmsk = SNBEP_UNC_CBO_ATTRS,
745     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_rxr_irq_retry),
746     .umasks  = snbep_unc_c_rxr_irq_retry
747   },
748   { .name = "UNC_C_RXR_ISMQ_RETRY",
749     .desc = "ISMQ Retries",
750     .code = 0x33,
751     .cntmsk = 0x3,
752     .ngrp = 1,
753     .modmsk = SNBEP_UNC_CBO_ATTRS,
754     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_rxr_ismq_retry),
755     .umasks  = snbep_unc_c_rxr_ismq_retry
756   },
757   { .name = "UNC_C_RXR_OCCUPANCY",
758     .desc = "Ingress Occupancy",
759     .code = 0x11,
760     .cntmsk = 0x1,
761     .ngrp = 1,
762     .modmsk = SNBEP_UNC_CBO_ATTRS,
763     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_rxr_inserts),
764     .umasks  = snbep_unc_c_rxr_inserts, /* identical to snbep_unc_c_rxr_inserts */
765   },
766   { .name = "UNC_C_TOR_INSERTS",
767     .desc = "TOR Inserts",
768     .code = 0x35,
769     .cntmsk = 0x3,
770     .ngrp = 2,
771     .modmsk = SNBEP_UNC_CBO_NID_ATTRS,
772     .flags  = INTEL_X86_NO_AUTOENCODE,
773     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_tor_inserts),
774     .umasks  = snbep_unc_c_tor_inserts
775   },
776   { .name = "UNC_C_TOR_OCCUPANCY",
777     .desc = "TOR Occupancy",
778     .code = 0x36,
779     .cntmsk = 0x1,
780     .ngrp = 2,
781     .modmsk = SNBEP_UNC_CBO_NID_ATTRS,
782     .flags  = INTEL_X86_NO_AUTOENCODE,
783     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_tor_occupancy),
784     .umasks  = snbep_unc_c_tor_occupancy
785   },
786   { .name = "UNC_C_TXR_ADS_USED",
787     .desc = "Egress events",
788     .code = 0x04,
789     .cntmsk = 0x3,
790     .modmsk = SNBEP_UNC_CBO_ATTRS,
791   },
792   { .name = "UNC_C_TXR_INSERTS",
793     .desc = "Egress allocations",
794     .code = 0x02,
795     .cntmsk = 0x3,
796     .ngrp = 1,
797     .modmsk = SNBEP_UNC_CBO_ATTRS,
798     .numasks = LIBPFM_ARRAY_SIZE(snbep_unc_c_txr_inserts),
799     .umasks  = snbep_unc_c_txr_inserts
800   },
801 };