162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright IBM Corp. 2021
462306a36Sopenharmony_ci * Interface implementation for communication with the CPU Measurement
562306a36Sopenharmony_ci * counter facility device driver.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author(s): Thomas Richter <tmricht@linux.ibm.com>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Define for ioctl() commands to communicate with the CPU Measurement
1062306a36Sopenharmony_ci * counter facility device driver.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifndef _PERF_CPUM_CF_DIAG_H
1462306a36Sopenharmony_ci#define _PERF_CPUM_CF_DIAG_H
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <linux/ioctl.h>
1762306a36Sopenharmony_ci#include <linux/types.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define S390_HWCTR_DEVICE		"hwctr"
2062306a36Sopenharmony_ci#define S390_HWCTR_START_VERSION	1
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct s390_ctrset_start {		/* Set CPUs to operate on */
2362306a36Sopenharmony_ci	__u64 version;			/* Version of interface */
2462306a36Sopenharmony_ci	__u64 data_bytes;		/* # of bytes required */
2562306a36Sopenharmony_ci	__u64 cpumask_len;		/* Length of CPU mask in bytes */
2662306a36Sopenharmony_ci	__u64 *cpumask;			/* Pointer to CPU mask */
2762306a36Sopenharmony_ci	__u64 counter_sets;		/* Bit mask of counter sets to get */
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct s390_ctrset_setdata {		/* Counter set data */
3162306a36Sopenharmony_ci	__u32 set;			/* Counter set number */
3262306a36Sopenharmony_ci	__u32 no_cnts;			/* # of counters stored in cv[] */
3362306a36Sopenharmony_ci	__u64 cv[];			/* Counter values (variable length) */
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistruct s390_ctrset_cpudata {		/* Counter set data per CPU */
3762306a36Sopenharmony_ci	__u32 cpu_nr;			/* CPU number */
3862306a36Sopenharmony_ci	__u32 no_sets;			/* # of counters sets in data[] */
3962306a36Sopenharmony_ci	struct s390_ctrset_setdata data[];
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct s390_ctrset_read {		/* Structure to get all ctr sets */
4362306a36Sopenharmony_ci	__u64 no_cpus;			/* Total # of CPUs data taken from */
4462306a36Sopenharmony_ci	struct s390_ctrset_cpudata data[];
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define S390_HWCTR_MAGIC	'C'	/* Random magic # for ioctls */
4862306a36Sopenharmony_ci#define	S390_HWCTR_START	_IOWR(S390_HWCTR_MAGIC, 1, struct s390_ctrset_start)
4962306a36Sopenharmony_ci#define	S390_HWCTR_STOP		_IO(S390_HWCTR_MAGIC, 2)
5062306a36Sopenharmony_ci#define	S390_HWCTR_READ		_IOWR(S390_HWCTR_MAGIC, 3, struct s390_ctrset_read)
5162306a36Sopenharmony_ci#endif
52