19f17508dSLike Xu #ifndef _X86_PMU_H_ 29f17508dSLike Xu #define _X86_PMU_H_ 39f17508dSLike Xu 49f17508dSLike Xu #include "processor.h" 59f17508dSLike Xu #include "libcflat.h" 69f17508dSLike Xu 79f17508dSLike Xu #define FIXED_CNT_INDEX 32 89f17508dSLike Xu #define MAX_NUM_LBR_ENTRY 32 99f17508dSLike Xu 109f17508dSLike Xu /* Performance Counter Vector for the LVT PC Register */ 119f17508dSLike Xu #define PMI_VECTOR 32 129f17508dSLike Xu 139f17508dSLike Xu #define DEBUGCTLMSR_LBR (1UL << 0) 149f17508dSLike Xu 159f17508dSLike Xu #define PMU_CAP_LBR_FMT 0x3f 169f17508dSLike Xu #define PMU_CAP_FW_WRITES (1ULL << 13) 179f17508dSLike Xu 189f17508dSLike Xu #define EVNSEL_EVENT_SHIFT 0 199f17508dSLike Xu #define EVNTSEL_UMASK_SHIFT 8 209f17508dSLike Xu #define EVNTSEL_USR_SHIFT 16 219f17508dSLike Xu #define EVNTSEL_OS_SHIFT 17 229f17508dSLike Xu #define EVNTSEL_EDGE_SHIFT 18 239f17508dSLike Xu #define EVNTSEL_PC_SHIFT 19 249f17508dSLike Xu #define EVNTSEL_INT_SHIFT 20 259f17508dSLike Xu #define EVNTSEL_EN_SHIF 22 269f17508dSLike Xu #define EVNTSEL_INV_SHIF 23 279f17508dSLike Xu #define EVNTSEL_CMASK_SHIFT 24 289f17508dSLike Xu 299f17508dSLike Xu #define EVNTSEL_EN (1 << EVNTSEL_EN_SHIF) 309f17508dSLike Xu #define EVNTSEL_USR (1 << EVNTSEL_USR_SHIFT) 319f17508dSLike Xu #define EVNTSEL_OS (1 << EVNTSEL_OS_SHIFT) 329f17508dSLike Xu #define EVNTSEL_PC (1 << EVNTSEL_PC_SHIFT) 339f17508dSLike Xu #define EVNTSEL_INT (1 << EVNTSEL_INT_SHIFT) 349f17508dSLike Xu #define EVNTSEL_INV (1 << EVNTSEL_INV_SHIF) 359f17508dSLike Xu 36879e7f07SLike Xu struct pmu_caps { 37*f85e94a2SSean Christopherson u8 version; 38*f85e94a2SSean Christopherson u8 nr_fixed_counters; 39*f85e94a2SSean Christopherson u8 fixed_counter_width; 40*f85e94a2SSean Christopherson u8 nr_gp_counters; 41*f85e94a2SSean Christopherson u8 gp_counter_width; 42*f85e94a2SSean Christopherson u8 gp_counter_mask_length; 43*f85e94a2SSean Christopherson u32 gp_counter_available; 44879e7f07SLike Xu u64 perf_cap; 45879e7f07SLike Xu }; 46879e7f07SLike Xu 47879e7f07SLike Xu extern struct pmu_caps pmu; 48879e7f07SLike Xu 49879e7f07SLike Xu void pmu_init(void); 50879e7f07SLike Xu 519f17508dSLike Xu static inline u8 pmu_version(void) 529f17508dSLike Xu { 53*f85e94a2SSean Christopherson return pmu.version; 549f17508dSLike Xu } 559f17508dSLike Xu 569f17508dSLike Xu static inline bool this_cpu_has_pmu(void) 579f17508dSLike Xu { 589f17508dSLike Xu return !!pmu_version(); 599f17508dSLike Xu } 609f17508dSLike Xu 619f17508dSLike Xu static inline bool this_cpu_has_perf_global_ctrl(void) 629f17508dSLike Xu { 639f17508dSLike Xu return pmu_version() > 1; 649f17508dSLike Xu } 659f17508dSLike Xu 669f17508dSLike Xu static inline u8 pmu_nr_gp_counters(void) 679f17508dSLike Xu { 68*f85e94a2SSean Christopherson return pmu.nr_gp_counters; 699f17508dSLike Xu } 709f17508dSLike Xu 719f17508dSLike Xu static inline u8 pmu_gp_counter_width(void) 729f17508dSLike Xu { 73*f85e94a2SSean Christopherson return pmu.gp_counter_width; 749f17508dSLike Xu } 759f17508dSLike Xu 769f17508dSLike Xu static inline u8 pmu_gp_counter_mask_length(void) 779f17508dSLike Xu { 78*f85e94a2SSean Christopherson return pmu.gp_counter_mask_length; 799f17508dSLike Xu } 809f17508dSLike Xu 819f17508dSLike Xu static inline u8 pmu_nr_fixed_counters(void) 829f17508dSLike Xu { 83*f85e94a2SSean Christopherson return pmu.nr_fixed_counters; 849f17508dSLike Xu } 859f17508dSLike Xu 869f17508dSLike Xu static inline u8 pmu_fixed_counter_width(void) 879f17508dSLike Xu { 88*f85e94a2SSean Christopherson return pmu.fixed_counter_width; 899f17508dSLike Xu } 909f17508dSLike Xu 919f17508dSLike Xu static inline bool pmu_gp_counter_is_available(int i) 929f17508dSLike Xu { 93*f85e94a2SSean Christopherson return pmu.gp_counter_available & BIT(i); 949f17508dSLike Xu } 959f17508dSLike Xu 969f17508dSLike Xu static inline u64 this_cpu_perf_capabilities(void) 979f17508dSLike Xu { 98879e7f07SLike Xu return pmu.perf_cap; 99879e7f07SLike Xu } 1009f17508dSLike Xu 101879e7f07SLike Xu static inline u64 pmu_lbr_version(void) 102879e7f07SLike Xu { 103879e7f07SLike Xu return this_cpu_perf_capabilities() & PMU_CAP_LBR_FMT; 104879e7f07SLike Xu } 105879e7f07SLike Xu 106879e7f07SLike Xu static inline bool pmu_has_full_writes(void) 107879e7f07SLike Xu { 108879e7f07SLike Xu return this_cpu_perf_capabilities() & PMU_CAP_FW_WRITES; 1099f17508dSLike Xu } 1109f17508dSLike Xu 1119f17508dSLike Xu #endif /* _X86_PMU_H_ */ 112