^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef LINUX_POWERPC_PERF_REQ_GEN_PERF_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define LINUX_POWERPC_PERF_REQ_GEN_PERF_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/perf_event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/stringify.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef REQUEST_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #error "REQUEST_FILE must be defined before including"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifndef NAME_LOWER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #error "NAME_LOWER must be defined before including"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #ifndef NAME_UPPER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #error "NAME_UPPER must be defined before including"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define BE_TYPE_b1 __u8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define BE_TYPE_b2 __be16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define BE_TYPE_b4 __be32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define BE_TYPE_b8 __be64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define BYTES_TO_BE_TYPE(bytes) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) BE_TYPE_b##bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define CAT2_(a, b) a ## b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define CAT2(a, b) CAT2_(a, b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define CAT3_(a, b, c) a ## b ## c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define CAT3(a, b, c) CAT3_(a, b, c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * enumerate the request values as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * <NAME_UPPER>_<request name> = <request value>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define REQUEST_VALUE__(name_upper, r_name) name_upper ## _ ## r_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define REQUEST_VALUE_(name_upper, r_name) REQUEST_VALUE__(name_upper, r_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define REQUEST_VALUE(r_name) REQUEST_VALUE_(NAME_UPPER, r_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "_clear.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) REQUEST_VALUE(r_name) = r_value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) enum CAT2(NAME_LOWER, _requests) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include REQUEST_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * For each request:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * struct <NAME_LOWER>_<request name> {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * r_fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #include "_clear.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define STRUCT_NAME__(name_lower, r_name) name_lower ## _ ## r_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define STRUCT_NAME_(name_lower, r_name) STRUCT_NAME__(name_lower, r_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define STRUCT_NAME(r_name) STRUCT_NAME_(NAME_LOWER, r_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct STRUCT_NAME(r_name) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) r_fields \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define __field_(r_name, r_value, r_idx_1, f_offset, f_bytes, f_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) BYTES_TO_BE_TYPE(f_bytes) f_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define __count_(r_name, r_value, r_idx_1, f_offset, f_bytes, f_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) __field_(r_name, r_value, r_idx_1, f_offset, f_bytes, f_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define __array_(r_name, r_value, r_idx_1, a_offset, a_bytes, a_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) __u8 a_name[a_bytes];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #include REQUEST_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * Generate a check of the field offsets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * <NAME_LOWER>_assert_offsets_correct()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #include "_clear.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define REQUEST_(r_name, r_value, index, r_fields) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) r_fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define __field_(r_name, r_value, r_idx_1, f_offset, f_size, f_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) BUILD_BUG_ON(offsetof(struct STRUCT_NAME(r_name), f_name) != f_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define __count_(r_name, r_value, r_idx_1, c_offset, c_size, c_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) __field_(r_name, r_value, r_idx_1, c_offset, c_size, c_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define __array_(r_name, r_value, r_idx_1, a_offset, a_size, a_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) __field_(r_name, r_value, r_idx_1, a_offset, a_size, a_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static inline void CAT2(NAME_LOWER, _assert_offsets_correct)(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #include REQUEST_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * Generate event attributes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * PMU_EVENT_ATTR_STRING(<request name>_<field name>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * <NAME_LOWER>_event_attr_<request name>_<field name>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * "request=<request value>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * "starting_index=<starting index type>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * "counter_info_version=CURRENT_COUNTER_INFO_VERSION"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * "length=<f_size>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * "offset=<f_offset>")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * TODO: counter_info_version may need to vary, we should interperate the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * value to some extent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define EVENT_ATTR_NAME__(name, r_name, c_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) name ## _event_attr_ ## r_name ## _ ## c_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define EVENT_ATTR_NAME_(name, r_name, c_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) EVENT_ATTR_NAME__(name, r_name, c_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define EVENT_ATTR_NAME(r_name, c_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) EVENT_ATTR_NAME_(NAME_LOWER, r_name, c_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #include "_clear.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define __field_(r_name, r_value, r_idx_1, f_offset, f_size, f_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define __array_(r_name, r_value, r_idx_1, a_offset, a_size, a_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define __count_(r_name, r_value, r_idx_1, c_offset, c_size, c_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) PMU_EVENT_ATTR_STRING( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) CAT3(r_name, _, c_name), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) EVENT_ATTR_NAME(r_name, c_name), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) "request=" __stringify(r_value) "," \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) r_idx_1 "," \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) "counter_info_version=" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) __stringify(COUNTER_INFO_VERSION_CURRENT) "," \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) "length=" #c_size "," \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) "offset=" #c_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) r_fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #include REQUEST_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * Define event attribute array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * static struct attribute *hv_gpci_event_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * &<NAME_LOWER>_event_attr_<request name>_<field name>.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #include "_clear.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define __field_(r_name, r_value, r_idx_1, f_offset, f_size, f_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define __count_(r_name, r_value, r_idx_1, c_offset, c_size, c_name) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) &EVENT_ATTR_NAME(r_name, c_name).attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define __array_(r_name, r_value, r_idx_1, a_offset, a_size, a_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) r_fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #include REQUEST_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* cleanup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #include "_clear.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #undef EVENT_ATTR_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #undef EVENT_ATTR_NAME_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #undef BIT_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #undef BIT_NAME_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #undef STRUCT_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #undef REQUEST_VALUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #undef REQUEST_VALUE_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #endif