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