| /* |
| * pfmlib_intel_snbep_unc_priv.c : Intel SandyBridge/IvyBridge-EP common definitions |
| * |
| * Copyright (c) 2012 Google, Inc |
| * Contributed by Stephane Eranian <eranian@gmail.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. |
| */ |
| #ifndef __PFMLIB_INTEL_SNBEP_UNC_PRIV_H__ |
| #define __PFMLIB_INTEL_SNBEP_UNC_PRIV_H__ |
| |
| /* |
| * Intel x86 specific pmu flags (pmu->flags 16 MSB) |
| */ |
| #define INTEL_PMU_FL_UNC_OCC 0x10000 /* PMU has occupancy counter filters */ |
| #define INTEL_PMU_FL_UNC_CBO 0x20000 /* PMU is Cbox */ |
| |
| |
| #define SNBEP_UNC_ATTR_E 0 |
| #define SNBEP_UNC_ATTR_I 1 |
| #define SNBEP_UNC_ATTR_T8 2 |
| #define SNBEP_UNC_ATTR_T5 3 |
| #define SNBEP_UNC_ATTR_TF 4 |
| #define SNBEP_UNC_ATTR_CF 5 |
| #define SNBEP_UNC_ATTR_NF 6 /* for filter0 */ |
| #define SNBEP_UNC_ATTR_FF 7 |
| #define SNBEP_UNC_ATTR_A 8 |
| #define SNBEP_UNC_ATTR_NF1 9 /* for filter1 */ |
| #define SNBEP_UNC_ATTR_ISOC 10 /* isochronous */ |
| #define SNBEP_UNC_ATTR_NC 11 /* non-coherent */ |
| |
| #define _SNBEP_UNC_ATTR_I (1 << SNBEP_UNC_ATTR_I) |
| #define _SNBEP_UNC_ATTR_E (1 << SNBEP_UNC_ATTR_E) |
| #define _SNBEP_UNC_ATTR_T8 (1 << SNBEP_UNC_ATTR_T8) |
| #define _SNBEP_UNC_ATTR_T5 (1 << SNBEP_UNC_ATTR_T5) |
| #define _SNBEP_UNC_ATTR_TF (1 << SNBEP_UNC_ATTR_TF) |
| #define _SNBEP_UNC_ATTR_CF (1 << SNBEP_UNC_ATTR_CF) |
| #define _SNBEP_UNC_ATTR_NF (1 << SNBEP_UNC_ATTR_NF) |
| #define _SNBEP_UNC_ATTR_FF (1 << SNBEP_UNC_ATTR_FF) |
| #define _SNBEP_UNC_ATTR_A (1 << SNBEP_UNC_ATTR_A) |
| #define _SNBEP_UNC_ATTR_NF1 (1 << SNBEP_UNC_ATTR_NF1) |
| #define _SNBEP_UNC_ATTR_ISOC (1 << SNBEP_UNC_ATTR_ISOC) |
| #define _SNBEP_UNC_ATTR_NC (1 << SNBEP_UNC_ATTR_NC) |
| |
| #define SNBEP_UNC_IRP_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define SNBEP_UNC_R3QPI_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define IVBEP_UNC_R3QPI_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define SNBEP_UNC_R2PCIE_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define IVBEP_UNC_R2PCIE_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define SNBEP_UNC_QPI_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define IVBEP_UNC_QPI_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define SNBEP_UNC_UBO_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define IVBEP_UNC_UBO_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| |
| #define SNBEP_UNC_PCU_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T5) |
| |
| #define IVBEP_UNC_PCU_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T5) |
| |
| #define SNBEP_UNC_PCU_BAND_ATTRS \ |
| (SNBEP_UNC_PCU_ATTRS | _SNBEP_UNC_ATTR_FF) |
| |
| #define IVBEP_UNC_PCU_BAND_ATTRS \ |
| (IVBEP_UNC_PCU_ATTRS | _SNBEP_UNC_ATTR_FF) |
| |
| #define SNBEP_UNC_IMC_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define IVBEP_UNC_IMC_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define SNBEP_UNC_CBO_ATTRS \ |
| (_SNBEP_UNC_ATTR_I |\ |
| _SNBEP_UNC_ATTR_E |\ |
| _SNBEP_UNC_ATTR_T8 |\ |
| _SNBEP_UNC_ATTR_CF |\ |
| _SNBEP_UNC_ATTR_TF) |
| |
| #define IVBEP_UNC_CBO_ATTRS \ |
| (_SNBEP_UNC_ATTR_E |\ |
| _SNBEP_UNC_ATTR_T8 |\ |
| _SNBEP_UNC_ATTR_CF |\ |
| _SNBEP_UNC_ATTR_TF) |
| |
| #define SNBEP_UNC_CBO_NID_ATTRS \ |
| (SNBEP_UNC_CBO_ATTRS|_SNBEP_UNC_ATTR_NF) |
| |
| #define IVBEP_UNC_CBO_NID_ATTRS \ |
| (IVBEP_UNC_CBO_ATTRS|_SNBEP_UNC_ATTR_NF1) |
| |
| #define SNBEP_UNC_HA_ATTRS \ |
| (_SNBEP_UNC_ATTR_I|_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define IVBEP_UNC_HA_ATTRS \ |
| (_SNBEP_UNC_ATTR_E|_SNBEP_UNC_ATTR_T8) |
| |
| #define SNBEP_UNC_HA_OPC_ATTRS \ |
| (SNBEP_UNC_HA_ATTRS|_SNBEP_UNC_ATTR_A) |
| |
| typedef union { |
| uint64_t val; |
| struct { |
| unsigned long unc_event:8; /* event code */ |
| unsigned long unc_umask:8; /* unit mask */ |
| unsigned long unc_res1:1; /* reserved */ |
| unsigned long unc_rst:1; /* reset */ |
| unsigned long unc_edge:1; /* edge detec */ |
| unsigned long unc_res2:3; /* reserved */ |
| unsigned long unc_en:1; /* enable */ |
| unsigned long unc_inv:1; /* invert counter mask */ |
| unsigned long unc_thres:8; /* counter mask */ |
| unsigned long unc_res3:32; /* reserved */ |
| } com; /* covers common fields for cbox, ha, imc, ubox, r2pcie, r3qpi */ |
| struct { |
| unsigned long unc_event:8; /* event code */ |
| unsigned long unc_umask:8; /* unit mask */ |
| unsigned long unc_res1:1; /* reserved */ |
| unsigned long unc_rst:1; /* reset */ |
| unsigned long unc_edge:1; /* edge detect */ |
| unsigned long unc_tid:1; /* tid filter enable */ |
| unsigned long unc_res2:2; /* reserved */ |
| unsigned long unc_en:1; /* enable */ |
| unsigned long unc_inv:1; /* invert counter mask */ |
| unsigned long unc_thres:8; /* counter mask */ |
| unsigned long unc_res3:32; /* reserved */ |
| } cbo; /* covers c-box */ |
| struct { |
| unsigned long unc_event:8; /* event code */ |
| unsigned long unc_res1:6; /* reserved */ |
| unsigned long unc_occ:2; /* occ select */ |
| unsigned long unc_res2:1; /* reserved */ |
| unsigned long unc_rst:1; /* reset */ |
| unsigned long unc_edge:1; /* edge detec */ |
| unsigned long unc_res3:1; /* reserved */ |
| unsigned long unc_res4:2; /* reserved */ |
| unsigned long unc_en:1; /* enable */ |
| unsigned long unc_inv:1; /* invert counter mask */ |
| unsigned long unc_thres:5; /* threshold */ |
| unsigned long unc_res5:1; /* reserved */ |
| unsigned long unc_occ_inv:1; /* occupancy invert */ |
| unsigned long unc_occ_edge:1; /* occupancy edge detect */ |
| unsigned long unc_res6:32; /* reserved */ |
| } pcu; /* covers pcu */ |
| struct { |
| unsigned long unc_event:8; /* event code */ |
| unsigned long unc_res1:6; /* reserved */ |
| unsigned long unc_occ:2; /* occ select */ |
| unsigned long unc_res2:1; /* reserved */ |
| unsigned long unc_rst:1; /* reset */ |
| unsigned long unc_edge:1; /* edge detec */ |
| unsigned long unc_res3:1; /* reserved */ |
| unsigned long unc_ov_en:1; /* overflow enable */ |
| unsigned long unc_sel_ext:1; /* event_sel extension */ |
| unsigned long unc_en:1; /* enable */ |
| unsigned long unc_res4:1; /* reserved */ |
| unsigned long unc_thres:5; /* threshold */ |
| unsigned long unc_res5:1; /* reserved */ |
| unsigned long unc_occ_inv:1; /* occupancy invert */ |
| unsigned long unc_occ_edge:1; /* occupancy edge detect */ |
| unsigned long unc_res6:32; /* reserved */ |
| } ivbep_pcu; /* covers ivb-ep pcu */ |
| struct { |
| unsigned long unc_event:8; /* event code */ |
| unsigned long unc_umask:8; /* unit maks */ |
| unsigned long unc_res1:1; /* reserved */ |
| unsigned long unc_rst:1; /* reset */ |
| unsigned long unc_edge:1; /* edge detec */ |
| unsigned long unc_res2:1; /* reserved */ |
| unsigned long unc_res3:1; /* reserved */ |
| unsigned long unc_event_ext:1; /* event code extension */ |
| unsigned long unc_en:1; /* enable */ |
| unsigned long unc_inv:1; /* invert counter mask */ |
| unsigned long unc_thres:8; /* threshold */ |
| unsigned long unc_res4:32; /* reserved */ |
| } qpi; /* covers qpi */ |
| struct { |
| unsigned long tid:1; |
| unsigned long cid:3; |
| unsigned long res0:1; |
| unsigned long res1:3; |
| unsigned long res2:2; |
| unsigned long nid:8; |
| unsigned long state:5; |
| unsigned long opc:9; |
| unsigned long res3:1; |
| unsigned long res4:32; |
| } cbo_filt; /* cbox filter */ |
| struct { |
| unsigned long tid:1; |
| unsigned long cid:4; |
| unsigned long res0:12; |
| unsigned long state:6; |
| unsigned long res1:9; |
| unsigned long res2:32; |
| } ivbep_cbo_filt0; /* ivbep cbox filter0 */ |
| struct { |
| unsigned long nid:16; |
| unsigned long res0:4; |
| unsigned long opc:9; |
| unsigned long res1:1; |
| unsigned long nc:1; |
| unsigned long isoc:1; |
| unsigned long res2:32; |
| } ivbep_cbo_filt1; /* ivbep cbox filter1 */ |
| struct { |
| unsigned long filt0:8; /* band0 freq filter */ |
| unsigned long filt1:8; /* band1 freq filter */ |
| unsigned long filt2:8; /* band2 freq filter */ |
| unsigned long filt3:8; /* band3 freq filter */ |
| unsigned long res1:32; /* reserved */ |
| } pcu_filt; |
| struct { |
| unsigned long res1:6; |
| unsigned long lo_addr:26; /* lo order 26b */ |
| unsigned long hi_addr:14; /* hi order 14b */ |
| unsigned long res2:18; /* reserved */ |
| } ha_addr; |
| struct { |
| unsigned long opc:6; /* opcode match */ |
| unsigned long res1:26; /* reserved */ |
| unsigned long res2:32; /* reserved */ |
| } ha_opc; |
| struct { |
| unsigned long unc_event:8; /* event code */ |
| unsigned long unc_umask:8; /* unit mask */ |
| unsigned long unc_res1:1; /* reserved */ |
| unsigned long unc_rst:1; /* reset */ |
| unsigned long unc_edge:1; /* edge detec */ |
| unsigned long unc_res2:3; /* reserved */ |
| unsigned long unc_en:1; /* enable */ |
| unsigned long unc_res3:1; /* reserved */ |
| unsigned long unc_thres:8; /* counter mask */ |
| unsigned long unc_res4:32; /* reserved */ |
| } irp; /* covers irp */ |
| } pfm_snbep_unc_reg_t; |
| |
| extern void pfm_intel_snbep_unc_perf_validate_pattrs(void *this, pfmlib_event_desc_t *e); |
| extern int pfm_intel_snbep_unc_get_encoding(void *this, pfmlib_event_desc_t *e); |
| extern const pfmlib_attr_desc_t snbep_unc_mods[]; |
| extern int pfm_intel_snbep_unc_detect(void *this); |
| extern int pfm_intel_ivbep_unc_detect(void *this); |
| extern int pfm_intel_snbep_unc_get_perf_encoding(void *this, pfmlib_event_desc_t *e); |
| extern int pfm_intel_snbep_unc_can_auto_encode(void *this, int pidx, int uidx); |
| extern int pfm_intel_snbep_unc_get_event_attr_info(void *this, int pidx, int attr_idx, pfm_event_attr_info_t *info); |
| |
| static inline int |
| is_cbo_filt_event(void *this, pfm_intel_x86_reg_t reg) |
| { |
| pfmlib_pmu_t *pmu = this; |
| uint64_t sel = reg.sel_event_select; |
| /* |
| * umask bit 0 must be 1 (OPCODE) |
| * TOR_INSERT: event code 0x35 |
| * TOR_OCCUPANCY: event code 0x36 |
| * LLC_LOOKUP : event code 0x34 |
| */ |
| return (pmu->flags & INTEL_PMU_FL_UNC_CBO) |
| && (reg.sel_unit_mask & 0x1) |
| && (sel == 0x35 || sel == 0x36 || sel == 0x34); |
| } |
| |
| #endif /* __PFMLIB_INTEL_SNBEP_UNC_PRIV_H__ */ |