perf.h 5.5 KB

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