/* * Copyright (c) 2016 Intel Corp. All rights reserved * Contributed by Peinan Zhang * * 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, }, };