vmm: Fix use-after-free in load_elf()
[akaros.git] / user / perfmon / events / intel_ivbep_unc_imc_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_imc (Intel IvyBridge-EP IMC uncore PMU)
26  */
27
28 static const intel_x86_umask_t ivbep_unc_m_cas_count[]={
29   { .uname = "ALL",
30     .udesc  = "Counts total number of DRAM CAS commands issued on this channel",
31     .ucode  = 0xf00,
32     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
33   },
34   { .uname = "RD",
35     .udesc  = "Counts all DRAM reads on this channel, incl. underfills",
36     .ucode  = 0x300,
37     .uflags = INTEL_X86_NCOMBO,
38   },
39   { .uname = "RD_REG",
40     .udesc  = "Counts number of DRAM read CAS commands issued on this channel, incl. regular read CAS and those with implicit precharge",
41     .ucode  = 0x100,
42   },
43   { .uname = "RD_UNDERFILL",
44     .udesc  = "Counts number of underfill reads issued by the memory controller",
45     .ucode  = 0x200,
46   },
47   { .uname = "WR",
48     .udesc  = "Counts number of DRAM write CAS commands on this channel",
49     .ucode  = 0xc00,
50     .uflags = INTEL_X86_NCOMBO,
51   },
52   { .uname = "WR_RMM",
53     .udesc  = "Counts Number of opportunistic DRAM write CAS commands issued on this channel",
54     .ucode  = 0x800,
55   },
56   { .uname = "WR_WMM",
57     .udesc  = "Counts number of DRAM write CAS commands issued on this channel while in Write-Major mode",
58     .ucode  = 0x400,
59   },
60   { .uname = "RD_RMM",
61     .udesc  = "Counts Number of opportunistic DRAM read CAS commands issued on this channel",
62     .ucode  = 0x1000,
63   },
64   { .uname = "RD_WMM",
65     .udesc  = "Counts number of DRAM read CAS commands issued on this channel while in Write-Major mode",
66     .ucode  = 0x2000,
67   },
68 };
69
70 static const intel_x86_umask_t ivbep_unc_m_dram_refresh[]={
71   { .uname = "HIGH",
72     .udesc  = "TBD",
73     .ucode  = 0x400,
74   },
75   { .uname = "PANIC",
76     .udesc  = "TBD",
77     .ucode  = 0x200,
78   },
79 };
80
81 static const intel_x86_umask_t ivbep_unc_m_major_modes[]={
82   { .uname = "ISOCH",
83     .udesc  = "Counts cycles in ISOCH Major mode",
84     .ucode  = 0x800,
85   },
86   { .uname = "PARTIAL",
87     .udesc  = "Counts cycles in Partial Major mode",
88     .ucode  = 0x400,
89   },
90   { .uname = "READ",
91     .udesc  = "Counts cycles in Read Major mode",
92     .ucode  = 0x100,
93   },
94   { .uname = "WRITE",
95     .udesc  = "Counts cycles in Write Major mode",
96     .ucode  = 0x200,
97   },
98 };
99
100 static const intel_x86_umask_t ivbep_unc_m_power_cke_cycles[]={
101   { .uname = "RANK0",
102     .udesc  = "Count cycles for rank 0",
103     .ucode  = 0x100,
104     .uflags = INTEL_X86_NCOMBO,
105   },
106   { .uname = "RANK1",
107     .udesc  = "Count cycles for rank 1",
108     .ucode  = 0x200,
109     .uflags = INTEL_X86_NCOMBO,
110   },
111   { .uname = "RANK2",
112     .udesc  = "Count cycles for rank 2",
113     .ucode  = 0x400,
114     .uflags = INTEL_X86_NCOMBO,
115   },
116   { .uname = "RANK3",
117     .udesc  = "Count cycles for rank 3",
118     .ucode  = 0x800,
119     .uflags = INTEL_X86_NCOMBO,
120   },
121   { .uname = "RANK4",
122     .udesc  = "Count cycles for rank 4",
123     .ucode  = 0x1000,
124     .uflags = INTEL_X86_NCOMBO,
125   },
126   { .uname = "RANK5",
127     .udesc  = "Count cycles for rank 5",
128     .ucode  = 0x2000,
129     .uflags = INTEL_X86_NCOMBO,
130   },
131   { .uname = "RANK6",
132     .udesc  = "Count cycles for rank 6",
133     .ucode  = 0x4000,
134     .uflags = INTEL_X86_NCOMBO,
135   },
136   { .uname = "RANK7",
137     .udesc  = "Count cycles for rank 7",
138     .ucode  = 0x8000,
139     .uflags = INTEL_X86_NCOMBO,
140   },
141 };
142
143 static const intel_x86_umask_t ivbep_unc_m_preemption[]={
144   { .uname = "RD_PREEMPT_RD",
145     .udesc  = "Counts read over read preemptions",
146     .ucode  = 0x100,
147   },
148   { .uname = "RD_PREEMPT_WR",
149     .udesc  = "Counts read over write preemptions",
150     .ucode  = 0x200,
151   },
152 };
153
154 static const intel_x86_umask_t ivbep_unc_m_pre_count[]={
155   { .uname = "PAGE_CLOSE",
156     .udesc  = "Counts number of DRAM precharge commands sent on this channel as a result of the page close counter expiring",
157     .ucode  = 0x200,
158   },
159   { .uname = "PAGE_MISS",
160     .udesc  = "Counts number of DRAM precharge commands sent on this channel as a result of page misses",
161     .ucode  = 0x100,
162   },
163   { .uname = "RD",
164     .udesc  = "Precharge due to read",
165     .ucode  = 0x100,
166   },
167   { .uname = "WR",
168     .udesc  = "Precharhe due to write",
169     .ucode  = 0x200,
170   },
171   { .uname = "BYP",
172     .udesc  = "Precharge due to bypass",
173     .ucode  = 0x800,
174   },
175 };
176
177 static const intel_x86_umask_t ivbep_unc_m_act_count[]={
178   { .uname = "RD",
179     .udesc  = "Activate due to read",
180     .ucode  = 0x100,
181   },
182   { .uname = "WR",
183     .udesc  = "Activate due to write",
184     .ucode  = 0x200,
185   },
186   { .uname = "BYP",
187     .udesc  = "Activate due to bypass",
188     .ucode  = 0x800,
189   },
190 };
191
192 static const intel_x86_umask_t ivbep_unc_m_byp_cmds[]={
193   { .uname = "ACT",
194     .udesc  = "ACT command issued by 2 cycle bypass",
195     .ucode  = 0x100,
196   },
197   { .uname = "CAS",
198     .udesc  = "CAS command issued by 2 cycle bypass",
199     .ucode  = 0x200,
200   },
201   { .uname = "PRE",
202     .udesc  = "PRE command issued by 2 cycle bypass",
203     .ucode  = 0x400,
204   },
205 };
206
207 static const intel_x86_umask_t ivbep_unc_m_rd_cas_prio[]={
208   { .uname = "LOW",
209     .udesc  = "Read CAS issued with low priority",
210     .ucode  = 0x100,
211   },
212   { .uname = "MED",
213     .udesc  = "Read CAS issued with medium priority",
214     .ucode  = 0x200,
215   },
216   { .uname = "HIGH",
217     .udesc  = "Read CAS issued with high priority",
218     .ucode  = 0x400,
219   },
220   { .uname = "PANIC",
221     .udesc  = "Read CAS issued with panic non isoch priority (starved)",
222     .ucode  = 0x800,
223   },
224 };
225
226 static const intel_x86_umask_t ivbep_unc_m_rd_cas_rank0[]={
227   { .uname = "BANK0",
228     .udesc  = "Bank 0",
229     .ucode  = 0x100,
230   },
231   { .uname = "BANK1",
232     .udesc  = "Bank 1",
233     .ucode  = 0x200,
234   },
235   { .uname = "BANK2",
236     .udesc  = "Bank 2",
237     .ucode  = 0x400,
238   },
239   { .uname = "BANK3",
240     .udesc  = "Bank 3",
241     .ucode  = 0x800,
242   },
243   { .uname = "BANK4",
244     .udesc  = "Bank 4",
245     .ucode  = 0x1000,
246   },
247   { .uname = "BANK5",
248     .udesc  = "Bank 5",
249     .ucode  = 0x2000,
250   },
251   { .uname = "BANK6",
252     .udesc  = "Bank 6",
253     .ucode  = 0x4000,
254   },
255   { .uname = "BANK7",
256     .udesc  = "Bank 7",
257     .ucode  = 0x8000,
258   }
259 };
260
261 static const intel_x86_umask_t ivbep_unc_m_vmse_wr_push[]={
262   { .uname = "WMM",
263     .udesc  = "VMSE write push issued in WMM",
264     .ucode  = 0x100,
265   },
266   { .uname = "RMM",
267     .udesc  = "VMSE write push issued in RMM",
268     .ucode  = 0x200,
269   }
270 };
271
272 static const intel_x86_umask_t ivbep_unc_m_wmm_to_rmm[]={
273   { .uname = "LOW_THRES",
274     .udesc  = "Transition from WMM to RMM because of starve counter",
275     .ucode  = 0x100,
276   },
277   { .uname = "STARVE",
278     .udesc  = "TBD",
279     .ucode  = 0x200,
280   },
281   { .uname = "VMSE_RETRY",
282     .udesc  = "TBD",
283     .ucode  = 0x400,
284   }
285 };
286
287
288 static const intel_x86_entry_t intel_ivbep_unc_m_pe[]={
289   { .name   = "UNC_M_CLOCKTICKS",
290     .desc   = "IMC Uncore clockticks (fixed counter)",
291     .modmsk = 0x0,
292     .cntmsk = 0x100000000ull,
293     .code   = 0xff, /* perf pseudo encoding for fixed counter */
294     .flags  = INTEL_X86_FIXED,
295   },
296   { .name   = "UNC_M_DCLOCKTICKS",
297     .desc   = "IMC Uncore clockticks (generic counters)",
298     .modmsk = IVBEP_UNC_IMC_ATTRS,
299     .cntmsk = 0xf,
300     .code   = 0x00, /*encoding for generic counters */
301   },
302   { .name = "UNC_M_ACT_COUNT",
303     .desc = "DRAM Activate Count",
304     .code = 0x1,
305     .cntmsk = 0xf,
306     .ngrp = 1,
307     .modmsk = IVBEP_UNC_IMC_ATTRS,
308     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_act_count),
309     .umasks  = ivbep_unc_m_act_count
310   },
311   { .name = "UNC_M_CAS_COUNT",
312     .desc = "DRAM RD_CAS and WR_CAS Commands.",
313     .code = 0x4,
314     .cntmsk = 0xf,
315     .ngrp = 1,
316     .modmsk = IVBEP_UNC_IMC_ATTRS,
317     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_cas_count),
318     .umasks  = ivbep_unc_m_cas_count
319   },
320   { .name = "UNC_M_DRAM_PRE_ALL",
321     .desc = "DRAM Precharge All Commands",
322     .code = 0x6,
323     .cntmsk = 0xf,
324     .modmsk = IVBEP_UNC_IMC_ATTRS,
325   },
326   { .name = "UNC_M_DRAM_REFRESH",
327     .desc = "Number of DRAM Refreshes Issued",
328     .code = 0x5,
329     .cntmsk = 0xf,
330     .ngrp = 1,
331     .modmsk = IVBEP_UNC_IMC_ATTRS,
332     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_dram_refresh),
333     .umasks  = ivbep_unc_m_dram_refresh
334   },
335   { .name = "UNC_M_ECC_CORRECTABLE_ERRORS",
336     .desc = "ECC Correctable Errors",
337     .code = 0x9,
338     .cntmsk = 0xf,
339     .modmsk = IVBEP_UNC_IMC_ATTRS,
340   },
341   { .name = "UNC_M_MAJOR_MODES",
342     .desc = "Cycles in a Major Mode",
343     .code = 0x7,
344     .cntmsk = 0xf,
345     .ngrp = 1,
346     .modmsk = IVBEP_UNC_IMC_ATTRS,
347     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_major_modes),
348     .umasks  = ivbep_unc_m_major_modes
349   },
350   { .name = "UNC_M_POWER_CHANNEL_DLLOFF",
351     .desc = "Channel DLLOFF Cycles",
352     .code = 0x84,
353     .cntmsk = 0xf,
354     .modmsk = IVBEP_UNC_IMC_ATTRS,
355   },
356   { .name = "UNC_M_POWER_CHANNEL_PPD",
357     .desc = "Channel PPD Cycles",
358     .code = 0x85,
359     .cntmsk = 0xf,
360     .modmsk = IVBEP_UNC_IMC_ATTRS,
361   },
362   { .name = "UNC_M_POWER_CKE_CYCLES",
363     .desc = "CKE_ON_CYCLES by Rank",
364     .code = 0x83,
365     .cntmsk = 0xf,
366     .ngrp = 1,
367     .modmsk = IVBEP_UNC_IMC_ATTRS,
368     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_power_cke_cycles),
369     .umasks  = ivbep_unc_m_power_cke_cycles
370   },
371   { .name = "UNC_M_POWER_CRITICAL_THROTTLE_CYCLES",
372     .desc = "Critical Throttle Cycles",
373     .code = 0x86,
374     .cntmsk = 0xf,
375     .modmsk = IVBEP_UNC_IMC_ATTRS,
376   },
377   { .name = "UNC_M_POWER_SELF_REFRESH",
378     .desc = "Clock-Enabled Self-Refresh",
379     .code = 0x43,
380     .cntmsk = 0xf,
381     .modmsk = IVBEP_UNC_IMC_ATTRS,
382   },
383   { .name = "UNC_M_POWER_THROTTLE_CYCLES",
384     .desc = "Throttle Cycles",
385     .code = 0x41,
386     .cntmsk = 0xf,
387     .ngrp = 1,
388     .modmsk = IVBEP_UNC_IMC_ATTRS,
389     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_power_cke_cycles),
390     .umasks  = ivbep_unc_m_power_cke_cycles /* identical to snbep_unc_m_power_cke_cycles */
391   },
392   { .name = "UNC_M_PREEMPTION",
393     .desc = "Read Preemption Count",
394     .code = 0x8,
395     .cntmsk = 0xf,
396     .ngrp = 1,
397     .modmsk = IVBEP_UNC_IMC_ATTRS,
398     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_preemption),
399     .umasks  = ivbep_unc_m_preemption
400   },
401   { .name = "UNC_M_PRE_COUNT",
402     .desc = "DRAM Precharge commands.",
403     .code = 0x2,
404     .cntmsk = 0xf,
405     .ngrp = 1,
406     .modmsk = IVBEP_UNC_IMC_ATTRS,
407     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_pre_count),
408     .umasks  = ivbep_unc_m_pre_count
409   },
410   { .name = "UNC_M_RPQ_CYCLES_NE",
411     .desc = "Read Pending Queue Not Empty",
412     .code = 0x11,
413     .cntmsk = 0xf,
414     .modmsk = IVBEP_UNC_IMC_ATTRS,
415   },
416   { .name = "UNC_M_RPQ_INSERTS",
417     .desc = "Read Pending Queue Allocations",
418     .code = 0x10,
419     .cntmsk = 0xf,
420     .modmsk = IVBEP_UNC_IMC_ATTRS,
421   },
422   { .name = "UNC_M_WPQ_CYCLES_FULL",
423     .desc = "Write Pending Queue Full Cycles",
424     .code = 0x22,
425     .cntmsk = 0xf,
426     .modmsk = IVBEP_UNC_IMC_ATTRS,
427   },
428   { .name = "UNC_M_WPQ_CYCLES_NE",
429     .desc = "Write Pending Queue Not Empty",
430     .code = 0x21,
431     .cntmsk = 0xf,
432     .modmsk = IVBEP_UNC_IMC_ATTRS,
433   },
434   { .name = "UNC_M_WPQ_INSERTS",
435     .desc = "Write Pending Queue Allocations",
436     .code = 0x20,
437     .cntmsk = 0xf,
438     .modmsk = IVBEP_UNC_IMC_ATTRS,
439   },
440   { .name = "UNC_M_WPQ_READ_HIT",
441     .desc = "Write Pending Queue CAM Match",
442     .code = 0x23,
443     .cntmsk = 0xf,
444     .modmsk = IVBEP_UNC_IMC_ATTRS,
445   },
446   { .name = "UNC_M_WPQ_WRITE_HIT",
447     .desc = "Write Pending Queue CAM Match",
448     .code = 0x24,
449     .cntmsk = 0xf,
450     .modmsk = IVBEP_UNC_IMC_ATTRS,
451   },
452   { .name = "UNC_M_BYP_CMDS",
453     .desc = "Bypass command event",
454     .code = 0xa1,
455     .cntmsk = 0xf,
456     .ngrp = 1,
457     .modmsk = IVBEP_UNC_IMC_ATTRS,
458     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_byp_cmds),
459     .umasks  = ivbep_unc_m_byp_cmds
460   },
461   { .name = "UNC_M_RD_CAS_PRIO",
462     .desc = "Read CAS priority",
463     .code = 0xa0,
464     .cntmsk = 0xf,
465     .ngrp = 1,
466     .modmsk = IVBEP_UNC_IMC_ATTRS,
467     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_prio),
468     .umasks  = ivbep_unc_m_rd_cas_prio
469   },
470   { .name = "UNC_M_RD_CAS_RANK0",
471     .desc = "Read CAS access to Rank 0",
472     .code = 0xb0,
473     .cntmsk = 0xf,
474     .ngrp = 1,
475     .modmsk = IVBEP_UNC_IMC_ATTRS,
476     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0),
477     .umasks  = ivbep_unc_m_rd_cas_rank0
478   },
479   { .name = "UNC_M_RD_CAS_RANK1",
480     .desc = "Read CAS access to Rank 1",
481     .code = 0xb1,
482     .cntmsk = 0xf,
483     .ngrp = 1,
484     .modmsk = IVBEP_UNC_IMC_ATTRS,
485     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
486     .umasks  = ivbep_unc_m_rd_cas_rank0
487   },
488   { .name = "UNC_M_RD_CAS_RANK2",
489     .desc = "Read CAS access to Rank 2",
490     .code = 0xb2,
491     .cntmsk = 0xf,
492     .ngrp = 1,
493     .modmsk = IVBEP_UNC_IMC_ATTRS,
494     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
495     .umasks  = ivbep_unc_m_rd_cas_rank0
496   },
497   { .name = "UNC_M_RD_CAS_RANK3",
498     .desc = "Read CAS access to Rank 3",
499     .code = 0xb3,
500     .cntmsk = 0xf,
501     .ngrp = 1,
502     .modmsk = IVBEP_UNC_IMC_ATTRS,
503     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
504     .umasks  = ivbep_unc_m_rd_cas_rank0
505   },
506   { .name = "UNC_M_RD_CAS_RANK4",
507     .desc = "Read CAS access to Rank 4",
508     .code = 0xb4,
509     .cntmsk = 0xf,
510     .ngrp = 1,
511     .modmsk = IVBEP_UNC_IMC_ATTRS,
512     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
513     .umasks  = ivbep_unc_m_rd_cas_rank0
514   },
515   { .name = "UNC_M_RD_CAS_RANK5",
516     .desc = "Read CAS access to Rank 5",
517     .code = 0xb5,
518     .cntmsk = 0xf,
519     .ngrp = 1,
520     .modmsk = IVBEP_UNC_IMC_ATTRS,
521     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
522     .umasks  = ivbep_unc_m_rd_cas_rank0
523   },
524   { .name = "UNC_M_RD_CAS_RANK6",
525     .desc = "Read CAS access to Rank 6",
526     .code = 0xb6,
527     .cntmsk = 0xf,
528     .ngrp = 1,
529     .modmsk = IVBEP_UNC_IMC_ATTRS,
530     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
531     .umasks  = ivbep_unc_m_rd_cas_rank0
532   },
533   { .name = "UNC_M_RD_CAS_RANK7",
534     .desc = "Read CAS access to Rank 7",
535     .code = 0xb7,
536     .cntmsk = 0xf,
537     .ngrp = 1,
538     .modmsk = IVBEP_UNC_IMC_ATTRS,
539     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
540     .umasks  = ivbep_unc_m_rd_cas_rank0
541   },
542   { .name = "UNC_M_VMSE_MXB_WR_OCCUPANCY",
543     .desc = "VMSE MXB write buffer occupancy",
544     .code = 0x91,
545     .cntmsk = 0xf,
546     .modmsk = IVBEP_UNC_IMC_ATTRS,
547   },
548   { .name = "UNC_M_VMSE_WR_PUSH",
549     .desc = "VMSE WR push issued",
550     .code = 0x90,
551     .cntmsk = 0xf,
552     .ngrp = 1,
553     .modmsk = IVBEP_UNC_IMC_ATTRS,
554     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_vmse_wr_push),
555     .umasks  = ivbep_unc_m_vmse_wr_push
556   },
557   { .name = "UNC_M_WMM_TO_RMM",
558     .desc = "Transitions from WMM to RMM because of low threshold",
559     .code = 0xc0,
560     .cntmsk = 0xf,
561     .ngrp = 1,
562     .modmsk = IVBEP_UNC_IMC_ATTRS,
563     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_wmm_to_rmm),
564     .umasks  = ivbep_unc_m_wmm_to_rmm
565   },
566   { .name = "UNC_M_WRONG_MM",
567     .desc = "Not getting the requested major mode",
568     .code = 0xc1,
569     .cntmsk = 0xf,
570     .modmsk = IVBEP_UNC_IMC_ATTRS,
571   },
572   { .name = "UNC_M_WR_CAS_RANK0",
573     .desc = "Write CAS access to Rank 0",
574     .code = 0xb8,
575     .cntmsk = 0xf,
576     .ngrp = 1,
577     .modmsk = IVBEP_UNC_IMC_ATTRS,
578     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
579     .umasks  = ivbep_unc_m_rd_cas_rank0
580   },
581   { .name = "UNC_M_WR_CAS_RANK1",
582     .desc = "Write CAS access to Rank 1",
583     .code = 0xb9,
584     .cntmsk = 0xf,
585     .ngrp = 1,
586     .modmsk = IVBEP_UNC_IMC_ATTRS,
587     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
588     .umasks  = ivbep_unc_m_rd_cas_rank0
589   },
590   { .name = "UNC_M_WR_CAS_RANK2",
591     .desc = "Write CAS access to Rank 2",
592     .code = 0xba,
593     .cntmsk = 0xf,
594     .ngrp = 1,
595     .modmsk = IVBEP_UNC_IMC_ATTRS,
596     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
597     .umasks  = ivbep_unc_m_rd_cas_rank0
598   },
599   { .name = "UNC_M_WR_CAS_RANK3",
600     .desc = "Write CAS access to Rank 3",
601     .code = 0xbb,
602     .cntmsk = 0xf,
603     .ngrp = 1,
604     .modmsk = IVBEP_UNC_IMC_ATTRS,
605     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
606     .umasks  = ivbep_unc_m_rd_cas_rank0
607   },
608   { .name = "UNC_M_WR_CAS_RANK4",
609     .desc = "Write CAS access to Rank 4",
610     .code = 0xbc,
611     .cntmsk = 0xf,
612     .ngrp = 1,
613     .modmsk = IVBEP_UNC_IMC_ATTRS,
614     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
615     .umasks  = ivbep_unc_m_rd_cas_rank0
616   },
617   { .name = "UNC_M_WR_CAS_RANK5",
618     .desc = "Write CAS access to Rank 5",
619     .code = 0xbd,
620     .cntmsk = 0xf,
621     .ngrp = 1,
622     .modmsk = IVBEP_UNC_IMC_ATTRS,
623     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
624     .umasks  = ivbep_unc_m_rd_cas_rank0
625   },
626   { .name = "UNC_M_WR_CAS_RANK6",
627     .desc = "Write CAS access to Rank 6",
628     .code = 0xbe,
629     .cntmsk = 0xf,
630     .ngrp = 1,
631     .modmsk = IVBEP_UNC_IMC_ATTRS,
632     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
633     .umasks  = ivbep_unc_m_rd_cas_rank0
634   },
635   { .name = "UNC_M_WR_CAS_RANK7",
636     .desc = "Write CAS access to Rank 7",
637     .code = 0xbf,
638     .cntmsk = 0xf,
639     .ngrp = 1,
640     .modmsk = IVBEP_UNC_IMC_ATTRS,
641     .numasks = LIBPFM_ARRAY_SIZE(ivbep_unc_m_rd_cas_rank0), /* shared */
642     .umasks  = ivbep_unc_m_rd_cas_rank0
643   },
644 };