--- /dev/null
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023-2024 Intel Corporation
+ */
+
+#include <linux/errno.h>
+
+#include <drm/xe_drm.h>
+
+#include "xe_perf.h"
+
+/**
+ * xe_perf_ioctl - The top level perf layer ioctl
+ * @dev: @drm_device
+ * @data: pointer to struct @drm_xe_perf_param
+ * @file: @drm_file
+ *
+ * The function is called for different perf streams types and allows execution
+ * of different operations supported by those perf stream types.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_perf_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
+{
+ struct drm_xe_perf_param *arg = data;
+
+ if (arg->extensions)
+ return -EINVAL;
+
+ switch (arg->perf_type) {
+ default:
+ return -EINVAL;
+ }
+}
* - &DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY
* - &DRM_IOCTL_XE_EXEC
* - &DRM_IOCTL_XE_WAIT_USER_FENCE
+ * - &DRM_IOCTL_XE_PERF
*/
/*
#define DRM_XE_EXEC_QUEUE_GET_PROPERTY 0x08
#define DRM_XE_EXEC 0x09
#define DRM_XE_WAIT_USER_FENCE 0x0a
+#define DRM_XE_PERF 0x0b
+
/* Must be kept compact -- no holes */
#define DRM_IOCTL_XE_DEVICE_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEVICE_QUERY, struct drm_xe_device_query)
#define DRM_IOCTL_XE_EXEC_QUEUE_GET_PROPERTY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EXEC_QUEUE_GET_PROPERTY, struct drm_xe_exec_queue_get_property)
#define DRM_IOCTL_XE_EXEC DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct drm_xe_exec)
#define DRM_IOCTL_XE_WAIT_USER_FENCE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
+#define DRM_IOCTL_XE_PERF DRM_IOW(DRM_COMMAND_BASE + DRM_XE_PERF, struct drm_xe_perf_param)
/**
* DOC: Xe IOCTL Extensions
__u64 reserved[2];
};
+/**
+ * enum drm_xe_perf_type - Perf stream types
+ */
+enum drm_xe_perf_type {
+ __DRM_XE_PERF_TYPE_MAX, /* non-ABI */
+};
+
+/**
+ * enum drm_xe_perf_op - Perf stream ops
+ */
+enum drm_xe_perf_op {
+ /** @DRM_XE_PERF_OP_STREAM_OPEN: Open a perf counter stream */
+ DRM_XE_PERF_OP_STREAM_OPEN,
+
+ /** @DRM_XE_PERF_OP_ADD_CONFIG: Add perf stream config */
+ DRM_XE_PERF_OP_ADD_CONFIG,
+
+ /** @DRM_XE_PERF_OP_REMOVE_CONFIG: Remove perf stream config */
+ DRM_XE_PERF_OP_REMOVE_CONFIG,
+};
+
+/**
+ * struct drm_xe_perf_param - Input of &DRM_XE_PERF
+ *
+ * The perf layer enables multiplexing perf counter streams of multiple
+ * types. The actual params for a particular stream operation are supplied
+ * via the @param pointer (use __copy_from_user to get these params).
+ */
+struct drm_xe_perf_param {
+ /** @extensions: Pointer to the first extension struct, if any */
+ __u64 extensions;
+ /** @perf_type: Perf stream type, of enum @drm_xe_perf_type */
+ __u64 perf_type;
+ /** @perf_op: Perf op, of enum @drm_xe_perf_op */
+ __u64 perf_op;
+ /** @param: Pointer to actual stream params */
+ __u64 param;
+};
+
+/**
+ * enum drm_xe_perf_ioctls - Perf fd ioctl's
+ *
+ * Information exchanged between userspace and kernel for perf fd ioctl's
+ * is stream type specific
+ */
+enum drm_xe_perf_ioctls {
+ /** @DRM_XE_PERF_IOCTL_ENABLE: Enable data capture for a stream */
+ DRM_XE_PERF_IOCTL_ENABLE = _IO('i', 0x0),
+
+ /** @DRM_XE_PERF_IOCTL_DISABLE: Disable data capture for a stream */
+ DRM_XE_PERF_IOCTL_DISABLE = _IO('i', 0x1),
+
+ /** @DRM_XE_PERF_IOCTL_CONFIG: Change stream configuration */
+ DRM_XE_PERF_IOCTL_CONFIG = _IO('i', 0x2),
+
+ /** @DRM_XE_PERF_IOCTL_STATUS: Return stream status */
+ DRM_XE_PERF_IOCTL_STATUS = _IO('i', 0x3),
+
+ /** @DRM_XE_PERF_IOCTL_INFO: Return stream info */
+ DRM_XE_PERF_IOCTL_INFO = _IO('i', 0x4),
+};
+
#if defined(__cplusplus)
}
#endif