0001
0002 #ifndef LINUX_POWERPC_PERF_REQ_GEN_PERF_H_
0003 #define LINUX_POWERPC_PERF_REQ_GEN_PERF_H_
0004
0005 #include <linux/perf_event.h>
0006 #include <linux/stringify.h>
0007
0008 #ifndef REQUEST_FILE
0009 #error "REQUEST_FILE must be defined before including"
0010 #endif
0011
0012 #ifndef NAME_LOWER
0013 #error "NAME_LOWER must be defined before including"
0014 #endif
0015
0016 #ifndef NAME_UPPER
0017 #error "NAME_UPPER must be defined before including"
0018 #endif
0019
0020 #define BE_TYPE_b1 __u8
0021 #define BE_TYPE_b2 __be16
0022 #define BE_TYPE_b4 __be32
0023 #define BE_TYPE_b8 __be64
0024
0025 #define BYTES_TO_BE_TYPE(bytes) \
0026 BE_TYPE_b##bytes
0027
0028 #define CAT2_(a, b) a ## b
0029 #define CAT2(a, b) CAT2_(a, b)
0030 #define CAT3_(a, b, c) a ## b ## c
0031 #define CAT3(a, b, c) CAT3_(a, b, c)
0032
0033
0034
0035
0036
0037 #define REQUEST_VALUE__(name_upper, r_name) name_upper ## _ ## r_name
0038 #define REQUEST_VALUE_(name_upper, r_name) REQUEST_VALUE__(name_upper, r_name)
0039 #define REQUEST_VALUE(r_name) REQUEST_VALUE_(NAME_UPPER, r_name)
0040
0041 #include "_clear.h"
0042 #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
0043 REQUEST_VALUE(r_name) = r_value,
0044 enum CAT2(NAME_LOWER, _requests) {
0045 #include REQUEST_FILE
0046 };
0047
0048
0049
0050
0051
0052
0053
0054 #include "_clear.h"
0055 #define STRUCT_NAME__(name_lower, r_name) name_lower ## _ ## r_name
0056 #define STRUCT_NAME_(name_lower, r_name) STRUCT_NAME__(name_lower, r_name)
0057 #define STRUCT_NAME(r_name) STRUCT_NAME_(NAME_LOWER, r_name)
0058 #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
0059 struct STRUCT_NAME(r_name) { \
0060 r_fields \
0061 };
0062 #define __field_(r_name, r_value, r_idx_1, f_offset, f_bytes, f_name) \
0063 BYTES_TO_BE_TYPE(f_bytes) f_name;
0064 #define __count_(r_name, r_value, r_idx_1, f_offset, f_bytes, f_name) \
0065 __field_(r_name, r_value, r_idx_1, f_offset, f_bytes, f_name)
0066 #define __array_(r_name, r_value, r_idx_1, a_offset, a_bytes, a_name) \
0067 __u8 a_name[a_bytes];
0068
0069 #include REQUEST_FILE
0070
0071
0072
0073
0074
0075 #include "_clear.h"
0076 #define REQUEST_(r_name, r_value, index, r_fields) \
0077 r_fields
0078 #define __field_(r_name, r_value, r_idx_1, f_offset, f_size, f_name) \
0079 BUILD_BUG_ON(offsetof(struct STRUCT_NAME(r_name), f_name) != f_offset);
0080 #define __count_(r_name, r_value, r_idx_1, c_offset, c_size, c_name) \
0081 __field_(r_name, r_value, r_idx_1, c_offset, c_size, c_name)
0082 #define __array_(r_name, r_value, r_idx_1, a_offset, a_size, a_name) \
0083 __field_(r_name, r_value, r_idx_1, a_offset, a_size, a_name)
0084
0085 static inline void CAT2(NAME_LOWER, _assert_offsets_correct)(void)
0086 {
0087 #include REQUEST_FILE
0088 }
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103 #define EVENT_ATTR_NAME__(name, r_name, c_name) \
0104 name ## _event_attr_ ## r_name ## _ ## c_name
0105 #define EVENT_ATTR_NAME_(name, r_name, c_name) \
0106 EVENT_ATTR_NAME__(name, r_name, c_name)
0107 #define EVENT_ATTR_NAME(r_name, c_name) \
0108 EVENT_ATTR_NAME_(NAME_LOWER, r_name, c_name)
0109
0110 #include "_clear.h"
0111 #define __field_(r_name, r_value, r_idx_1, f_offset, f_size, f_name)
0112 #define __array_(r_name, r_value, r_idx_1, a_offset, a_size, a_name)
0113 #define __count_(r_name, r_value, r_idx_1, c_offset, c_size, c_name) \
0114 PMU_EVENT_ATTR_STRING( \
0115 CAT3(r_name, _, c_name), \
0116 EVENT_ATTR_NAME(r_name, c_name), \
0117 "request=" __stringify(r_value) "," \
0118 r_idx_1 "," \
0119 "counter_info_version=" \
0120 __stringify(COUNTER_INFO_VERSION_CURRENT) "," \
0121 "length=" #c_size "," \
0122 "offset=" #c_offset)
0123 #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
0124 r_fields
0125
0126 #include REQUEST_FILE
0127
0128
0129
0130
0131
0132
0133
0134 #include "_clear.h"
0135 #define __field_(r_name, r_value, r_idx_1, f_offset, f_size, f_name)
0136 #define __count_(r_name, r_value, r_idx_1, c_offset, c_size, c_name) \
0137 &EVENT_ATTR_NAME(r_name, c_name).attr.attr,
0138 #define __array_(r_name, r_value, r_idx_1, a_offset, a_size, a_name)
0139 #define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
0140 r_fields
0141
0142 static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
0143 #include REQUEST_FILE
0144 NULL
0145 };
0146
0147
0148 #include "_clear.h"
0149 #undef EVENT_ATTR_NAME
0150 #undef EVENT_ATTR_NAME_
0151 #undef BIT_NAME
0152 #undef BIT_NAME_
0153 #undef STRUCT_NAME
0154 #undef REQUEST_VALUE
0155 #undef REQUEST_VALUE_
0156
0157 #endif