Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | /* SPDX-License-Identifier: GPL-2.0 */ #ifndef LINUX_POWERPC_PERF_HV_24X7_H_ #define LINUX_POWERPC_PERF_HV_24X7_H_ #include <linux/types.h> enum hv_perf_domains { #define DOMAIN(n, v, x, c) HV_PERF_DOMAIN_##n = v, #include "hv-24x7-domains.h" #undef DOMAIN HV_PERF_DOMAIN_MAX, }; #define H24x7_REQUEST_SIZE(iface_version) (iface_version == 1 ? 16 : 32) struct hv_24x7_request { /* PHYSICAL domains require enabling via phyp/hmc. */ __u8 performance_domain; __u8 reserved[0x1]; /* bytes to read starting at @data_offset. must be a multiple of 8 */ __be16 data_size; /* * byte offset within the perf domain to read from. must be 8 byte * aligned */ __be32 data_offset; /* * only valid for VIRTUAL_PROCESSOR domains, ignored for others. * -1 means "current partition only" * Enabling via phyp/hmc required for non-"-1" values. 0 forbidden * unless requestor is 0. */ __be16 starting_lpar_ix; /* * Ignored when @starting_lpar_ix == -1 * Ignored when @performance_domain is not VIRTUAL_PROCESSOR_* * -1 means "infinite" or all */ __be16 max_num_lpars; /* chip, core, or virtual processor based on @performance_domain */ __be16 starting_ix; __be16 max_ix; /* The following fields were added in v2 of the 24x7 interface. */ __u8 starting_thread_group_ix; /* -1 means all thread groups starting at @starting_thread_group_ix */ __u8 max_num_thread_groups; __u8 reserved2[0xE]; } __packed; struct hv_24x7_request_buffer { /* 0 - ? */ /* 1 - ? */ __u8 interface_version; __u8 num_requests; __u8 reserved[0xE]; struct hv_24x7_request requests[]; } __packed; struct hv_24x7_result_element_v1 { __be16 lpar_ix; /* * represents the core, chip, or virtual processor based on the * request's @performance_domain */ __be16 domain_ix; /* -1 if @performance_domain does not refer to a virtual processor */ __be32 lpar_cfg_instance_id; /* size = @result_element_data_size of containing result. */ __u64 element_data[]; } __packed; /* * We need a separate struct for v2 because the offset of @element_data changed * between versions. */ struct hv_24x7_result_element_v2 { __be16 lpar_ix; /* * represents the core, chip, or virtual processor based on the * request's @performance_domain */ __be16 domain_ix; /* -1 if @performance_domain does not refer to a virtual processor */ __be32 lpar_cfg_instance_id; __u8 thread_group_ix; __u8 reserved[7]; /* size = @result_element_data_size of containing result. */ __u64 element_data[]; } __packed; struct hv_24x7_result { /* * The index of the 24x7 Request Structure in the 24x7 Request Buffer * used to request this result. */ __u8 result_ix; /* * 0 = not all result elements fit into the buffer, additional requests * required * 1 = all result elements were returned */ __u8 results_complete; __be16 num_elements_returned; /* * This is a copy of @data_size from the corresponding hv_24x7_request * * Warning: to obtain the size of each element in @elements you have * to add the size of the other members of the result_element struct. */ __be16 result_element_data_size; __u8 reserved[0x2]; /* * Either * struct hv_24x7_result_element_v1[@num_elements_returned] * or * struct hv_24x7_result_element_v2[@num_elements_returned] * * depending on the interface_version field of the * struct hv_24x7_data_result_buffer containing this result. */ char elements[]; } __packed; struct hv_24x7_data_result_buffer { /* See versioning for request buffer */ __u8 interface_version; __u8 num_results; __u8 reserved[0x1]; __u8 failing_request_ix; __be32 detailed_rc; __be64 cec_cfg_instance_id; __be64 catalog_version_num; __u8 reserved2[0x8]; /* WARNING: only valid for the first result due to variable sizes of * results */ struct hv_24x7_result results[]; /* [@num_results] */ } __packed; #endif |