18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef LINUX_POWERPC_PERF_HV_24X7_H_ 38c2ecf20Sopenharmony_ci#define LINUX_POWERPC_PERF_HV_24X7_H_ 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/types.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cienum hv_perf_domains { 88c2ecf20Sopenharmony_ci#define DOMAIN(n, v, x, c) HV_PERF_DOMAIN_##n = v, 98c2ecf20Sopenharmony_ci#include "hv-24x7-domains.h" 108c2ecf20Sopenharmony_ci#undef DOMAIN 118c2ecf20Sopenharmony_ci HV_PERF_DOMAIN_MAX, 128c2ecf20Sopenharmony_ci}; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#define H24x7_REQUEST_SIZE(iface_version) (iface_version == 1 ? 16 : 32) 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistruct hv_24x7_request { 178c2ecf20Sopenharmony_ci /* PHYSICAL domains require enabling via phyp/hmc. */ 188c2ecf20Sopenharmony_ci __u8 performance_domain; 198c2ecf20Sopenharmony_ci __u8 reserved[0x1]; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci /* bytes to read starting at @data_offset. must be a multiple of 8 */ 228c2ecf20Sopenharmony_ci __be16 data_size; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci /* 258c2ecf20Sopenharmony_ci * byte offset within the perf domain to read from. must be 8 byte 268c2ecf20Sopenharmony_ci * aligned 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ci __be32 data_offset; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci /* 318c2ecf20Sopenharmony_ci * only valid for VIRTUAL_PROCESSOR domains, ignored for others. 328c2ecf20Sopenharmony_ci * -1 means "current partition only" 338c2ecf20Sopenharmony_ci * Enabling via phyp/hmc required for non-"-1" values. 0 forbidden 348c2ecf20Sopenharmony_ci * unless requestor is 0. 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_ci __be16 starting_lpar_ix; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci /* 398c2ecf20Sopenharmony_ci * Ignored when @starting_lpar_ix == -1 408c2ecf20Sopenharmony_ci * Ignored when @performance_domain is not VIRTUAL_PROCESSOR_* 418c2ecf20Sopenharmony_ci * -1 means "infinite" or all 428c2ecf20Sopenharmony_ci */ 438c2ecf20Sopenharmony_ci __be16 max_num_lpars; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci /* chip, core, or virtual processor based on @performance_domain */ 468c2ecf20Sopenharmony_ci __be16 starting_ix; 478c2ecf20Sopenharmony_ci __be16 max_ix; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci /* The following fields were added in v2 of the 24x7 interface. */ 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci __u8 starting_thread_group_ix; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci /* -1 means all thread groups starting at @starting_thread_group_ix */ 548c2ecf20Sopenharmony_ci __u8 max_num_thread_groups; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci __u8 reserved2[0xE]; 578c2ecf20Sopenharmony_ci} __packed; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistruct hv_24x7_request_buffer { 608c2ecf20Sopenharmony_ci /* 0 - ? */ 618c2ecf20Sopenharmony_ci /* 1 - ? */ 628c2ecf20Sopenharmony_ci __u8 interface_version; 638c2ecf20Sopenharmony_ci __u8 num_requests; 648c2ecf20Sopenharmony_ci __u8 reserved[0xE]; 658c2ecf20Sopenharmony_ci struct hv_24x7_request requests[]; 668c2ecf20Sopenharmony_ci} __packed; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistruct hv_24x7_result_element_v1 { 698c2ecf20Sopenharmony_ci __be16 lpar_ix; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci /* 728c2ecf20Sopenharmony_ci * represents the core, chip, or virtual processor based on the 738c2ecf20Sopenharmony_ci * request's @performance_domain 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_ci __be16 domain_ix; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci /* -1 if @performance_domain does not refer to a virtual processor */ 788c2ecf20Sopenharmony_ci __be32 lpar_cfg_instance_id; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci /* size = @result_element_data_size of containing result. */ 818c2ecf20Sopenharmony_ci __u64 element_data[]; 828c2ecf20Sopenharmony_ci} __packed; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci/* 858c2ecf20Sopenharmony_ci * We need a separate struct for v2 because the offset of @element_data changed 868c2ecf20Sopenharmony_ci * between versions. 878c2ecf20Sopenharmony_ci */ 888c2ecf20Sopenharmony_cistruct hv_24x7_result_element_v2 { 898c2ecf20Sopenharmony_ci __be16 lpar_ix; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci /* 928c2ecf20Sopenharmony_ci * represents the core, chip, or virtual processor based on the 938c2ecf20Sopenharmony_ci * request's @performance_domain 948c2ecf20Sopenharmony_ci */ 958c2ecf20Sopenharmony_ci __be16 domain_ix; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci /* -1 if @performance_domain does not refer to a virtual processor */ 988c2ecf20Sopenharmony_ci __be32 lpar_cfg_instance_id; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci __u8 thread_group_ix; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci __u8 reserved[7]; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci /* size = @result_element_data_size of containing result. */ 1058c2ecf20Sopenharmony_ci __u64 element_data[]; 1068c2ecf20Sopenharmony_ci} __packed; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistruct hv_24x7_result { 1098c2ecf20Sopenharmony_ci /* 1108c2ecf20Sopenharmony_ci * The index of the 24x7 Request Structure in the 24x7 Request Buffer 1118c2ecf20Sopenharmony_ci * used to request this result. 1128c2ecf20Sopenharmony_ci */ 1138c2ecf20Sopenharmony_ci __u8 result_ix; 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci /* 1168c2ecf20Sopenharmony_ci * 0 = not all result elements fit into the buffer, additional requests 1178c2ecf20Sopenharmony_ci * required 1188c2ecf20Sopenharmony_ci * 1 = all result elements were returned 1198c2ecf20Sopenharmony_ci */ 1208c2ecf20Sopenharmony_ci __u8 results_complete; 1218c2ecf20Sopenharmony_ci __be16 num_elements_returned; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci /* 1248c2ecf20Sopenharmony_ci * This is a copy of @data_size from the corresponding hv_24x7_request 1258c2ecf20Sopenharmony_ci * 1268c2ecf20Sopenharmony_ci * Warning: to obtain the size of each element in @elements you have 1278c2ecf20Sopenharmony_ci * to add the size of the other members of the result_element struct. 1288c2ecf20Sopenharmony_ci */ 1298c2ecf20Sopenharmony_ci __be16 result_element_data_size; 1308c2ecf20Sopenharmony_ci __u8 reserved[0x2]; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci /* 1338c2ecf20Sopenharmony_ci * Either 1348c2ecf20Sopenharmony_ci * struct hv_24x7_result_element_v1[@num_elements_returned] 1358c2ecf20Sopenharmony_ci * or 1368c2ecf20Sopenharmony_ci * struct hv_24x7_result_element_v2[@num_elements_returned] 1378c2ecf20Sopenharmony_ci * 1388c2ecf20Sopenharmony_ci * depending on the interface_version field of the 1398c2ecf20Sopenharmony_ci * struct hv_24x7_data_result_buffer containing this result. 1408c2ecf20Sopenharmony_ci */ 1418c2ecf20Sopenharmony_ci char elements[]; 1428c2ecf20Sopenharmony_ci} __packed; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_cistruct hv_24x7_data_result_buffer { 1458c2ecf20Sopenharmony_ci /* See versioning for request buffer */ 1468c2ecf20Sopenharmony_ci __u8 interface_version; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci __u8 num_results; 1498c2ecf20Sopenharmony_ci __u8 reserved[0x1]; 1508c2ecf20Sopenharmony_ci __u8 failing_request_ix; 1518c2ecf20Sopenharmony_ci __be32 detailed_rc; 1528c2ecf20Sopenharmony_ci __be64 cec_cfg_instance_id; 1538c2ecf20Sopenharmony_ci __be64 catalog_version_num; 1548c2ecf20Sopenharmony_ci __u8 reserved2[0x8]; 1558c2ecf20Sopenharmony_ci /* WARNING: only valid for the first result due to variable sizes of 1568c2ecf20Sopenharmony_ci * results */ 1578c2ecf20Sopenharmony_ci struct hv_24x7_result results[]; /* [@num_results] */ 1588c2ecf20Sopenharmony_ci} __packed; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci#endif 161