1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef LINUX_POWERPC_PERF_HV_COMMON_H_ 3*4882a593Smuzhiyun #define LINUX_POWERPC_PERF_HV_COMMON_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/perf_event.h> 6*4882a593Smuzhiyun #include <linux/types.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun struct hv_perf_caps { 9*4882a593Smuzhiyun u16 version; 10*4882a593Smuzhiyun u16 collect_privileged:1, 11*4882a593Smuzhiyun ga:1, 12*4882a593Smuzhiyun expanded:1, 13*4882a593Smuzhiyun lab:1, 14*4882a593Smuzhiyun unused:12; 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun unsigned long hv_perf_caps_get(struct hv_perf_caps *caps); 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define EVENT_DEFINE_RANGE_FORMAT(name, attr_var, bit_start, bit_end) \ 21*4882a593Smuzhiyun PMU_FORMAT_ATTR(name, #attr_var ":" #bit_start "-" #bit_end); \ 22*4882a593Smuzhiyun EVENT_DEFINE_RANGE(name, attr_var, bit_start, bit_end) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* 25*4882a593Smuzhiyun * The EVENT_DEFINE_RANGE_FORMAT() macro above includes helper functions 26*4882a593Smuzhiyun * for the fields (eg: event_get_starting_index()). For some fields we 27*4882a593Smuzhiyun * need the bit-range definition, but no the helper functions. Define a 28*4882a593Smuzhiyun * lite version of the above macro without the helpers and silence 29*4882a593Smuzhiyun * compiler warnings unused static functions. 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun #define EVENT_DEFINE_RANGE_FORMAT_LITE(name, attr_var, bit_start, bit_end) \ 32*4882a593Smuzhiyun PMU_FORMAT_ATTR(name, #attr_var ":" #bit_start "-" #bit_end); 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define EVENT_DEFINE_RANGE(name, attr_var, bit_start, bit_end) \ 35*4882a593Smuzhiyun static u64 event_get_##name##_max(void) \ 36*4882a593Smuzhiyun { \ 37*4882a593Smuzhiyun BUILD_BUG_ON((bit_start > bit_end) \ 38*4882a593Smuzhiyun || (bit_end >= (sizeof(1ull) * 8))); \ 39*4882a593Smuzhiyun return (((1ull << (bit_end - bit_start)) - 1) << 1) + 1; \ 40*4882a593Smuzhiyun } \ 41*4882a593Smuzhiyun static u64 event_get_##name(struct perf_event *event) \ 42*4882a593Smuzhiyun { \ 43*4882a593Smuzhiyun return (event->attr.attr_var >> (bit_start)) & \ 44*4882a593Smuzhiyun event_get_##name##_max(); \ 45*4882a593Smuzhiyun } 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #endif 48