Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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