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