/*
 * Copyright (c) 2016 Intel Corp. All rights reserved
 * Contributed by Peinan Zhang <peinan.zhang@intel.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * This file is part of libpfm, a performance monitoring support library for
 * applications on Linux.
 *
 * PMU: knl_unc_cha (Intel Knights Landing CHA uncore PMU)
 */

static const intel_x86_umask_t knl_unc_cha_llc_lookup[]={
   { .uname  = "DATA_READ",
     .udesc  = "Data read requests",
     .ucode  = 0x0300,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "WRITE",
     .udesc  = "Write requests. Includes all write transactions (cached, uncached)",
     .ucode  = 0x0500,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "REMOTE_SNOOP",
     .udesc  = "External snoop request",
     .ucode  = 0x0900,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "ANY",
     .udesc  = "Any request",
     .ucode  = 0x1100,
     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
   },
};

static const intel_x86_umask_t knl_unc_cha_llc_victims[]={
   { .uname  = "M_STATE",
     .udesc  = "Lines in M state",
     .ucode  = 0x0100,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "E_STATE",
     .udesc  = "Lines in E state",
     .ucode  = 0x0200,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "S_STATE",
     .udesc  = "Lines in S state",
     .ucode  = 0x0400,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "F_STATE",
     .udesc  = "Lines in F state",
     .ucode  = 0x0800,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "LOCAL",
     .udesc  = "Victimized Lines matching the NID filter.",
     .ucode  = 0x2000,
     .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
   },
   { .uname  = "REMOTE",
     .udesc  = "Victimized Lines does not matching the NID.",
     .ucode  = 0x8000,
     .uflags = INTEL_X86_NCOMBO,
   },
};


static const intel_x86_umask_t knl_unc_cha_ingress_int_starved[]={
   { .uname  = "IRQ",
     .udesc  = "Internal starved with IRQ.",
     .ucode  = 0x0100,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "IPQ",
     .udesc  = "Internal starved with IPQ.",
     .ucode  = 0x0400,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "ISMQ",
     .udesc  = "Internal starved with ISMQ.",
     .ucode  = 0x0800,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "PRQ",
     .udesc  = "Internal starved with PRQ.",
     .ucode  = 0x1000,
     .uflags = INTEL_X86_NCOMBO,
   },
};

static const intel_x86_umask_t knl_unc_cha_ingress_ext[]={
   { .uname  = "IRQ",
     .udesc  = "IRQ",
     .ucode  = 0x0100,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "IRQ_REJ",
     .udesc  = "IRQ rejected",
     .ucode  = 0x0200,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "IPQ",
     .udesc  = "IPQ",
     .ucode  = 0x0400,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "PRQ",
     .udesc  = "PRQ",
     .ucode  = 0x1000,
     .uflags = INTEL_X86_NCOMBO,
   },
   { .uname  = "PRQ_REJ",
     .udesc  = "PRQ rejected",
     .ucode  = 0x2000,
     .uflags = INTEL_X86_NCOMBO,
   },
};


static const intel_x86_umask_t knl_unc_cha_ingress_entry_reject_q0[]={
  { .uname  = "AD_REQ_VN0",
    .udesc  = "AD Request",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AD_RSP_VN0",
    .udesc  = "AD Response",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_RSP_VN0",
    .udesc  = "BL Response",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_WB_VN0",
    .udesc  = "BL WB",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_NCB_VN0",
    .udesc  = "BL NCB",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_NCS_VN0",
    .udesc  = "BL NCS",
    .ucode  = 0x2000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AK_NON_UPI",
    .udesc  = "AK non upi",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IV_NON_UPI",
    .udesc  = "IV non upi",
    .ucode  = 0x8000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ingress_entry_reject_q1[]={
  { .uname  = "ANY_REJECT",
    .udesc  = "Any reject from request queue0",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO | INTEL_X86_DFL,
  },
  { .uname  = "SF_VICTIM",
    .udesc  = "SF victim",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "SF_WAY",
    .udesc  = "SF way",
    .ucode  = 0x2000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "ALLOW_SNP",
    .udesc  = "allow snoop",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "PA_MATCH",
    .udesc  = "PA match",
    .ucode  = 0x8000,
    .uflags = INTEL_X86_NCOMBO,
  },
};


static const intel_x86_umask_t knl_unc_cha_tor_subevent[]={
  { .uname  = "IRQ",
    .udesc  = " -IRQ.",
    .ucode  = 0x3100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "EVICT",
    .udesc  = " -SF/LLC Evictions.",
    .ucode  = 0x3200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "PRQ",
    .udesc  = " -PRQ.",
    .ucode  = 0x3400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IPQ",
    .udesc  = " -IPQ.",
    .ucode  = 0x3800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "HIT",
    .udesc  = " -Hit (Not a Miss).",
    .ucode  = 0x1f00,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "MISS",
    .udesc  = " -Miss.",
    .ucode  = 0x2f00,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IRQ_HIT",
    .udesc  = " -IRQ HIT.",
    .ucode  = 0x1100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IRQ_MISS",
    .udesc  = " -IRQ MISS.",
    .ucode  = 0x2100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "PRQ_HIT",
    .udesc  = " -PRQ HIT.",
    .ucode  = 0x1400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "PRQ_MISS",
    .udesc  = " -PRQ MISS.",
    .ucode  = 0x2400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IPQ_HIT",
    .udesc  = " -IPQ HIT",
    .ucode  = 0x1800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IPQ_MISS",
    .udesc  = " -IPQ MISS",
    .ucode  = 0x2800,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_misc[]={
  { .uname  = "RSPI_WAS_FSE",
    .udesc  = "Silent Snoop Eviction",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "WC_ALIASING",
    .udesc  = "Write Combining Aliasing.",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "RFO_HIT_S",
    .udesc  = "Counts the number of times that an RFO hits in S state.",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "CV0_PREF_VIC",
    .udesc  = "CV0 Prefetch Victim.",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "CV0_PREF_MISS",
    .udesc  = "CV0 Prefetch Miss.",
    .ucode  = 0x2000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_tgr_ext[]={
  { .uname  = "TGR0",
    .udesc  = "for Transgress 0",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR1",
    .udesc  = "for Transgress 1",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR2",
    .udesc  = "for Transgress 2",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR3",
    .udesc  = "for Transgress 3",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR4",
    .udesc  = "for Transgress 4",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR5",
    .udesc  = "for Transgress 5",
    .ucode  = 0x2000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR6",
    .udesc  = "for Transgress 6",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "TGR7",
    .udesc  = "for Transgress 7",
    .ucode  = 0x8000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_tgr_ext1[]={
  { .uname  = "TGR8",
    .udesc  = "for Transgress 8",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "ANY_OF_TGR0_THRU_TGR7",
    .udesc  = "for Transgress 0-7",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ring_type_agent[]={
  { .uname  = "AD_AG0",
    .udesc  = "AD - Agent 0",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AK_AG0",
    .udesc  = "AK - Agent 0",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_AG0",
    .udesc  = "BL - Agent 0",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IV_AG0",
    .udesc  = "IV - Agent 0",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AD_AG1",
    .udesc  = "AD - Agent 1",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AK_AG1",
    .udesc  = "AK - Agent 1",
    .ucode  = 0x2000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_AG1",
    .udesc  = "BL - Agent 1",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ring_type[]={
  { .uname  = "AD",
    .udesc  = " - AD ring",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AK",
    .udesc  = " - AK ring",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL",
    .udesc  = " - BL ring",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IV",
    .udesc  = " - IV ring",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_dire_ext[]={
  { .uname  = "VERT",
    .udesc  = " - vertical",
    .ucode  = 0x0000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "HORZ",
    .udesc  = " - horizontal",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ring_use_vert[]={
  { .uname  = "UP_EVEN",
    .udesc  = "UP_EVEN",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "UP_ODD",
    .udesc  = "UP_ODD",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "DN_EVEN",
    .udesc  = "DN_EVEN",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "DN_ODD",
    .udesc  = "DN_ODD",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ring_use_hori[]={
  { .uname  = "LEFT_EVEN",
    .udesc  = "LEFT_EVEN",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "LEFT_ODD",
    .udesc  = "LEFT_ODD",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "RIGHT_EVEN",
    .udesc  = "RIGHT_EVEN",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "RIGHT_ODD",
    .udesc  = "RIGHT_ODD",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ring_use_updn[]={
  { .uname  = "UP",
    .udesc  = "up",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "DN",
    .udesc  = "down",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_ring_use_lfrt[]={
  { .uname  = "LEFT",
    .udesc  = "left",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "RIGHT",
    .udesc  = "right",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_iv_snp[]={
  { .uname  = "IV_SNP_GO_UP",
    .udesc  = "IV_SNP_GO_UP",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IV_SNP_GO_DN",
    .udesc  = "IV_SNP_GO_DN",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_cms_ext[]={
  { .uname  = "AD_BNC",
    .udesc  = "AD_BNC",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AK_BNC",
    .udesc  = "AK_BNC",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_BNC",
    .udesc  = "BL_BNC",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IV_BNC",
    .udesc  = "IV_BNC",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AD_CRD",
    .udesc  = "AD_CRD",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_CRD",
    .udesc  = "AD_CRD",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_cms_crd_starved[]={
  { .uname  = "AD_BNC",
    .udesc  = "AD_BNC",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AK_BNC",
    .udesc  = "AK_BNC",
    .ucode  = 0x0200,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_BNC",
    .udesc  = "BL_BNC",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IV_BNC",
    .udesc  = "IV_BNC",
    .ucode  = 0x0800,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AD_CRD",
    .udesc  = "AD_CRD",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_CRD",
    .udesc  = "AD_CRD",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "IVF",
    .udesc  = "IVF",
    .ucode  = 0x8000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_umask_t knl_unc_cha_cms_busy_starved[]={
  { .uname  = "AD_BNC",
    .udesc  = "AD_BNC",
    .ucode  = 0x0100,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_BNC",
    .udesc  = "BL_BNC",
    .ucode  = 0x0400,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "AD_CRD",
    .udesc  = "AD_CRD",
    .ucode  = 0x1000,
    .uflags = INTEL_X86_NCOMBO,
  },
  { .uname  = "BL_CRD",
    .udesc  = "AD_CRD",
    .ucode  = 0x4000,
    .uflags = INTEL_X86_NCOMBO,
  },
};

static const intel_x86_entry_t intel_knl_unc_cha_pe[]={
  { .name    = "UNC_H_U_CLOCKTICKS",
    .desc    = "Uncore clockticks",
    .modmsk = 0x0,
    .cntmsk  = 0xf,
    .code    = 0x00,
    .flags = INTEL_X86_FIXED,
  },
  { .name    = "UNC_H_INGRESS_OCCUPANCY",
    .desc    = "Ingress Occupancy. Ingress Occupancy. Counts number of entries in the specified Ingress queue in each cycle",
    .cntmsk  = 0xf,
    .code    = 0x11,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_ext),
    .umasks  = knl_unc_cha_ingress_ext,
  },
  { .name    = "UNC_H_INGRESS_INSERTS",
    .desc    = "Ingress Allocations. Counts number of allocations per cycle into the specified Ingress queue",
    .cntmsk  = 0xf,
    .code    = 0x13,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_ext),
    .umasks  = knl_unc_cha_ingress_ext,
  },
  { .name    = "UNC_H_INGRESS_INT_STARVED",
    .desc    = "Cycles Internal Starvation",
    .cntmsk  = 0xf,
    .code    = 0x14,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_int_starved),
    .umasks  = knl_unc_cha_ingress_int_starved,
  },
  { .name    = "UNC_H_INGRESS_RETRY_IRQ0_REJECT",
    .desc    = "Ingress Request Queue Rejects",
    .cntmsk  = 0xf,
    .code    = 0x18,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_IRQ01_REJECT",
    .desc    = "Ingress Request Queue Rejects",
    .cntmsk  = 0xf,
    .code    = 0x19,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q1),
    .umasks  = knl_unc_cha_ingress_entry_reject_q1,
  },
  { .name    = "UNC_H_INGRESS_RETRY_PRQ0_REJECT",
    .desc    = "Ingress Request Queue Rejects",
    .cntmsk  = 0xf,
    .code    = 0x20,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_PRQ1_REJECT",
    .desc    = "Ingress Request Queue Rejects",
    .cntmsk  = 0xf,
    .code    = 0x21,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q1),
    .umasks  = knl_unc_cha_ingress_entry_reject_q1,
  },
  { .name    = "UNC_H_INGRESS_RETRY_IPQ0_REJECT",
    .desc    = "Ingress Request Queue Rejects",
    .cntmsk  = 0xf,
    .code    = 0x22,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_IPQ1_REJECT",
    .desc    = "Ingress Request Queue Rejects",
    .cntmsk  = 0xf,
    .code    = 0x23,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q1),
    .umasks  = knl_unc_cha_ingress_entry_reject_q1,
  },
  { .name    = "UNC_H_INGRESS_RETRY_ISMQ0_REJECT",
    .desc    = "ISMQ Rejects",
    .cntmsk  = 0xf,
    .code    = 0x24,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_REQ_Q0_RETRY",
    .desc    = "REQUESTQ includes:  IRQ, PRQ, IPQ, RRQ, WBQ (everything except for ISMQ)",
    .cntmsk  = 0xf,
    .code    = 0x2a,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_REQ_Q1_RETRY",
    .desc    = "REQUESTQ includes:  IRQ, PRQ, IPQ, RRQ, WBQ (everything except for ISMQ)",
    .cntmsk  = 0xf,
    .code    = 0x2b,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q1),
    .umasks  = knl_unc_cha_ingress_entry_reject_q1,
  },
  { .name    = "UNC_H_INGRESS_RETRY_ISMQ0_RETRY",
    .desc    = "ISMQ retries",
    .cntmsk  = 0xf,
    .code    = 0x2c,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_OTHER0_RETRY",
    .desc    = "Other Queue Retries",
    .cntmsk  = 0xf,
    .code    = 0x2e,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q0),
    .umasks  = knl_unc_cha_ingress_entry_reject_q0,
  },
  { .name    = "UNC_H_INGRESS_RETRY_OTHER1_RETRY",
    .desc    = "Other Queue Retries",
    .cntmsk  = 0xf,
    .code    = 0x2f,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ingress_entry_reject_q1),
    .umasks  = knl_unc_cha_ingress_entry_reject_q1,
  },
  { .name    = "UNC_H_SF_LOOKUP",
    .desc    = "Cache Lookups. Counts the number of times the LLC was accessed.",
    .cntmsk  = 0xf,
    .code    = 0x34,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_llc_lookup),
    .umasks  = knl_unc_cha_llc_lookup,
  },
  { .name    = "UNC_H_CACHE_LINES_VICTIMIZED",
    .desc    = "Cache Lookups. Counts the number of times the LLC was accessed.",
    .cntmsk  = 0xf,
    .code    = 0x37,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_llc_victims),
    .umasks  = knl_unc_cha_llc_victims,
  },
  { .name    = "UNC_H_TOR_INSERTS",
    .desc = "Counts the number of entries successfully inserted into the TOR that match  qualifications specified by the subevent.",
    .modmsk = KNL_UNC_CHA_TOR_ATTRS,
    .cntmsk  = 0xf,
    .code    = 0x35,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tor_subevent),
    .umasks  = knl_unc_cha_tor_subevent
  },
  { .name    = "UNC_H_TOR_OCCUPANCY",
    .desc    = "For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent",
    .modmsk = KNL_UNC_CHA_TOR_ATTRS,
    .cntmsk  = 0xf,
    .code    = 0x36,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tor_subevent),
    .umasks  = knl_unc_cha_tor_subevent
  },
  { .name    = "UNC_H_MISC",
    .desc    = "Miscellaneous events in the Cha",
    .cntmsk  = 0xf,
    .code    = 0x39,
    .ngrp    = 1,
    .flags   = INTEL_X86_NO_AUTOENCODE,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_misc),
    .umasks  = knl_unc_cha_misc,
  },
  { .name    = "UNC_H_AG0_AD_CRD_ACQUIRED",
    .desc    = "CMS Agent0 AD Credits Acquired.",
    .cntmsk  = 0xf,
    .code    = 0x80,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG0_AD_CRD_ACQUIRED_EXT",
    .desc    = "CMS Agent0 AD Credits Acquired.",
    .cntmsk  = 0xf,
    .code    = 0x81,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG0_AD_CRD_OCCUPANCY",
    .desc    = "CMS Agent0 AD Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x82,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG0_AD_CRD_OCCUPANCY_EXT",
    .desc    = "CMS Agent0 AD Credits Acquired For Transgress.",
    .cntmsk  = 0xf,
    .code    = 0x83,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG1_AD_CRD_ACQUIRED",
    .desc    = "CMS Agent1 AD Credits Acquired .",
    .cntmsk  = 0xf,
    .code    = 0x84,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG1_AD_CRD_ACQUIRED_EXT",
    .desc    = "CMS Agent1 AD Credits Acquired .",
    .cntmsk  = 0xf,
    .code    = 0x85,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG1_AD_CRD_OCCUPANCY",
    .desc    = "CMS Agent1 AD Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x86,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG1_AD_CRD_OCCUPANCY_EXT",
    .desc    = "CMS Agent1 AD Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x87,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG0_BL_CRD_ACQUIRED",
    .desc    = "CMS Agent0 BL Credits Acquired.",
    .cntmsk  = 0xf,
    .code    = 0x88,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG0_BL_CRD_ACQUIRED_EXT",
    .desc    = "CMS Agent0 BL Credits Acquired.",
    .cntmsk  = 0xf,
    .code    = 0x89,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG0_BL_CRD_OCCUPANCY",
    .desc    = "CMS Agent0 BL Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x8a,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG0_BL_CRD_OCCUPANCY_EXT",
    .desc    = "CMS Agent0 BL Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x8b,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG1_BL_CRD_ACQUIRED",
    .desc    = "CMS Agent1 BL Credits Acquired.",
    .cntmsk  = 0xf,
    .code    = 0x8c,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG1_BL_CRD_ACQUIRED_EXT",
    .desc    = "CMS Agent1 BL Credits Acquired.",
    .cntmsk  = 0xf,
    .code    = 0x8d,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG1_BL_CRD_OCCUPANCY",
    .desc    = "CMS Agent1 BL Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x8e,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG1_BL_CRD_OCCUPANCY_EXT",
    .desc    = "CMS Agent1 BL Credits Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x8f,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG0_STALL_NO_CRD_EGRESS_HORZ_AD",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD0,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG0_STALL_NO_CRD_EGRESS_HORZ_AD_EXT",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD1,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG1_STALL_NO_CRD_EGRESS_HORZ_AD",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD2,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG1_STALL_NO_CRD_EGRESS_HORZ_AD_EXT",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD3,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG0_STALL_NO_CRD_EGRESS_HORZ_BL",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD4,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG0_STALL_NO_CRD_EGRESS_HORZ_BL_EXT",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD5,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_AG1_STALL_NO_CRD_EGRESS_HORZ_BL",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD6,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext),
    .umasks  = knl_unc_cha_tgr_ext,
  },
  { .name    = "UNC_H_AG1_STALL_NO_CRD_EGRESS_HORZ_BL_EXT",
    .desc    = "Stall on No AD Transgress Credits.",
    .cntmsk  = 0xf,
    .code    = 0xD7,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_tgr_ext1),
    .umasks  = knl_unc_cha_tgr_ext1,
  },
  { .name    = "UNC_H_EGRESS_VERT_OCCUPANCY",
    .desc    = "CMS Vert Egress Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x90,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_INSERTS",
    .desc    = "CMS Vert Egress Allocations.",
    .cntmsk  = 0xf,
    .code    = 0x91,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_CYCLES_FULL",
    .desc    = "Cycles CMS Vertical Egress Queue Is Full.",
    .cntmsk  = 0xf,
    .code    = 0x92,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_CYCLES_NE",
    .desc    = "Cycles CMS Vertical Egress Queue Is Not Empty.",
    .cntmsk  = 0xf,
    .code    = 0x93,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_NACK",
    .desc    = "CMS Vertical Egress NACKs.",
    .cntmsk  = 0xf,
    .code    = 0x98,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_STARVED",
    .desc    = "CMS Vertical Egress Injection Starvation.",
    .cntmsk  = 0xf,
    .code    = 0x9a,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_ADS_USED",
    .desc    = "CMS Vertical ADS Used.",
    .cntmsk  = 0xf,
    .code    = 0x9c,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_VERT_BYPASS",
    .desc    = "CMS Vertical Egress Bypass.",
    .cntmsk  = 0xf,
    .code    = 0x9e,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type_agent),
    .umasks  = knl_unc_cha_ring_type_agent,
  },
  { .name    = "UNC_H_EGRESS_HORZ_OCCUPANCY",
    .desc    = "CMS Horizontal Egress Occupancy.",
    .cntmsk  = 0xf,
    .code    = 0x94,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_INSERTS",
    .desc    = "CMS Horizontal Egress Inserts.",
    .cntmsk  = 0xf,
    .code    = 0x95,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_CYCLES_FULL",
    .desc    = "Cycles CMS Horizontal Egress Queue is Full.",
    .cntmsk  = 0xf,
    .code    = 0x96,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_CYCLES_NE",
    .desc    = "Cycles CMS Horizontal Egress Queue is Not Empty.",
    .cntmsk  = 0xf,
    .code    = 0x97,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_NACK",
    .desc    = "CMS Horizontal Egress NACKs.",
    .cntmsk  = 0xf,
    .code    = 0x99,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_STARVED",
    .desc    = "CMS Horizontal Egress Injection Starvation.",
    .cntmsk  = 0xf,
    .code    = 0x9b,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_ADS_USED",
    .desc    = "CMS Horizontal ADS Used.",
    .cntmsk  = 0xf,
    .code    = 0x9d,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_EGRESS_HORZ_BYPASS",
    .desc    = "CMS Horizontal Egress Bypass.",
    .cntmsk  = 0xf,
    .code    = 0x9f,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_RING_BOUNCES_VERT",
    .desc    = "Number of incoming messages from the Vertical ring that were bounced, by ring type.",
    .cntmsk  = 0xf,
    .code    = 0xa0,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_RING_BOUNCES_HORZ",
    .desc    = "Number of incoming messages from the Horizontal ring that were bounced, by ring type.",
    .cntmsk  = 0xf,
    .code    = 0xa1,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_RING_SINK_STARVED_VERT",
    .desc    = "Vertical ring sink starvation count.",
    .cntmsk  = 0xf,
    .code    = 0xa2,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_RING_SINK_STARVED_HORZ",
    .desc    = "Horizontal ring sink starvation count.",
    .cntmsk  = 0xf,
    .code    = 0xa3,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_type),
    .umasks  = knl_unc_cha_ring_type,
  },
  { .name    = "UNC_H_RING_SRC_THRT",
    .desc    = "Counts cycles in throttle mode.",
    .cntmsk  = 0xf,
    .code    = 0xa4,
  },
  { .name    = "UNC_H_FAST_ASSERTED",
    .desc    = "Counts cycles source throttling is asserted",
    .cntmsk  = 0xf,
    .code    = 0xa5,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_dire_ext),
    .umasks  = knl_unc_cha_dire_ext,
  },
  { .name    = "UNC_H_VERT_RING_AD_IN_USE",
    .desc    = "Counts the number of cycles that the Vertical AD ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xa6,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_vert),
    .umasks  = knl_unc_cha_ring_use_vert,
  },
  { .name    = "UNC_H_HORZ_RING_AD_IN_USE",
    .desc    = "Counts the number of cycles that the Horizontal AD ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xa7,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_hori),
    .umasks  = knl_unc_cha_ring_use_hori,
  },
  { .name    = "UNC_H_VERT_RING_AK_IN_USE",
    .desc    = "Counts the number of cycles that the Vertical AK ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xa8,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_vert),
    .umasks  = knl_unc_cha_ring_use_vert,
  },
  { .name    = "UNC_H_HORZ_RING_AK_IN_USE",
    .desc    = "Counts the number of cycles that the Horizontal AK ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xa9,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_hori),
    .umasks  = knl_unc_cha_ring_use_hori,
  },
  { .name    = "UNC_H_VERT_RING_BL_IN_USE",
    .desc    = "Counts the number of cycles that the Vertical BL ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xaa,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_vert),
    .umasks  = knl_unc_cha_ring_use_vert,
  },
  { .name    = "UNC_H_HORZ_RING_BL_IN_USE",
    .desc    = "Counts the number of cycles that the Horizontal BL ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xab,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_hori),
    .umasks  = knl_unc_cha_ring_use_hori,
  },
  { .name    = "UNC_H_VERT_RING_IV_IN_USE",
    .desc    = "Counts the number of cycles that the Vertical IV ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xac,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_updn),
    .umasks  = knl_unc_cha_ring_use_updn,
  },
  { .name    = "UNC_H_HORZ_RING_IV_IN_USE",
    .desc    = "Counts the number of cycles that the Horizontal IV ring is being used at this ring stop.",
    .cntmsk  = 0xf,
    .code    = 0xad,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_ring_use_lfrt),
    .umasks  = knl_unc_cha_ring_use_lfrt,
  },
  { .name    = "UNC_H_EGRESS_ORDERING",
    .desc    = "Counts number of cycles IV was blocked in the TGR Egress due to SNP/GO Ordering requirements.",
    .cntmsk  = 0xf,
    .code    = 0xae,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_iv_snp),
    .umasks  = knl_unc_cha_iv_snp,
  },
  { .name    = "UNC_H_TG_INGRESS_OCCUPANCY",
    .desc    = "Transgress Ingress Occupancy. Occupancy event for the Ingress buffers in the CMS  The Ingress is used to queue up requests received from the mesh.",
    .cntmsk  = 0xf,
    .code    = 0xb0,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_cms_ext),
    .umasks  = knl_unc_cha_cms_ext,
  },
  { .name    = "UNC_H_TG_INGRESS_INSERTS",
    .desc    = "Transgress Ingress Allocations. Number of allocations into the CMS Ingress  The Ingress is used to queue up requests received from the mesh.",
    .cntmsk  = 0xf,
    .code    = 0xb1,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_cms_ext),
    .umasks  = knl_unc_cha_cms_ext,
  },
  { .name    = "UNC_H_TG_INGRESS_BYPASS",
    .desc    = "Transgress Ingress Bypass. Number of packets bypassing the CMS Ingress.",
    .cntmsk  = 0xf,
    .code    = 0xb2,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_cms_ext),
    .umasks  = knl_unc_cha_cms_ext,
  },
  { .name    = "UNC_H_TG_INGRESS_CRD_STARVED",
    .desc    = "Transgress Injection Starvation. Counts cycles under injection starvation mode.  This starvation is triggered when the CMS Ingress cannot send a transaction onto the mesh for a long period of time.  In this case, the Ingress is unable to forward to the Egress due to a lack of credit.",
    .cntmsk  = 0xf,
    .code    = 0xb3,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_cms_crd_starved),
    .umasks  = knl_unc_cha_cms_crd_starved,
  },
  { .name    = "UNC_H_TG_INGRESS_BUSY_STARVED",
    .desc    = "Transgress Injection Starvation. Counts cycles under injection starvation mode.  This starvation is triggered when the CMS Ingress cannot send a transaction onto the mesh for a long period of time.  In this case, because a message from the other queue has higher priority.",
    .cntmsk  = 0xf,
    .code    = 0xb4,
    .ngrp    = 1,
    .numasks = LIBPFM_ARRAY_SIZE(knl_unc_cha_cms_busy_starved),
    .umasks  = knl_unc_cha_cms_busy_starved,
  },
};
