[RFC PATCH 12/14] drm/qaic: Add tracepoints

From: Jeffrey Hugo
Date: Mon Aug 15 2022 - 15:34:41 EST


Add QAIC specific tracepoints which can be useful in debugging issues.

Change-Id: I8cde015990d5a3482dbba142cf0a4bbb4512cb02
Signed-off-by: Jeffrey Hugo <quic_jhugo@xxxxxxxxxxx>
---
drivers/gpu/drm/qaic/qaic_trace.h | 493 ++++++++++++++++++++++++++++++++++++++
1 file changed, 493 insertions(+)
create mode 100644 drivers/gpu/drm/qaic/qaic_trace.h

diff --git a/drivers/gpu/drm/qaic/qaic_trace.h b/drivers/gpu/drm/qaic/qaic_trace.h
new file mode 100644
index 0000000..0be824eb
--- /dev/null
+++ b/drivers/gpu/drm/qaic/qaic_trace.h
@@ -0,0 +1,493 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ */
+
+#if !defined(_TRACE_QAIC_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_QAIC_H
+#include <linux/tracepoint.h>
+#include <uapi/drm/qaic_drm.h>
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM qaic
+#define TRACE_INCLUDE_FILE qaic_trace
+#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/qaic
+
+TRACE_EVENT(qaic_ioctl,
+ TP_PROTO(struct qaic_device *qdev, struct qaic_user *usr,
+ unsigned int cmd, bool in),
+ TP_ARGS(qdev, usr, cmd, in),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(unsigned int, user)
+ __field(unsigned int, cmd)
+ __field(unsigned int, type)
+ __field(unsigned int, nr)
+ __field(unsigned int, size)
+ __field(unsigned int, dir)
+ __field(bool, in)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->user = usr->handle;
+ __entry->cmd = cmd;
+ __entry->type = _IOC_TYPE(cmd);
+ __entry->nr = _IOC_NR(cmd);
+ __entry->size = _IOC_SIZE(cmd);
+ __entry->dir = _IOC_DIR(cmd);
+ __entry->in = in;
+ ),
+ TP_printk("%s:%s user:%d cmd:0x%x (%c nr=%d len=%d dir=%d)",
+ __entry->in ? "Entry" : "Exit", __get_str(device),
+ __entry->user, __entry->cmd, __entry->type, __entry->nr,
+ __entry->size, __entry->dir)
+);
+
+TRACE_EVENT(qaic_mhi_queue_error,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ __field(int, ret)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ __entry->ret = ret;
+ ),
+ TP_printk("%s %s %d",
+ __get_str(device), __get_str(msg), __entry->ret)
+);
+
+DECLARE_EVENT_CLASS(qaic_manage_error,
+ TP_PROTO(struct qaic_device *qdev, struct qaic_user *usr,
+ const char *msg),
+ TP_ARGS(qdev, usr, msg),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(unsigned int, user)
+ __string(msg, msg)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->user = usr->handle;
+ __assign_str(msg, msg);
+ ),
+ TP_printk("%s user:%d %s",
+ __get_str(device), __entry->user, __get_str(msg))
+);
+
+DEFINE_EVENT(qaic_manage_error, manage_error,
+ TP_PROTO(struct qaic_device *qdev, struct qaic_user *usr,
+ const char *msg),
+ TP_ARGS(qdev, usr, msg)
+);
+
+DECLARE_EVENT_CLASS(qaic_encdec_error,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ ),
+ TP_printk("%s %s", __get_str(device), __get_str(msg))
+);
+
+DEFINE_EVENT(qaic_encdec_error, encode_error,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg)
+);
+
+DEFINE_EVENT(qaic_encdec_error, decode_error,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg)
+);
+
+TRACE_EVENT(qaic_control_dbg,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ __field(int, ret)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ __entry->ret = ret;
+ ),
+ TP_printk("%s %s %d",
+ __get_str(device), __get_str(msg), __entry->ret)
+);
+
+TRACE_EVENT(qaic_encode_passthrough,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_passthrough *in_trans),
+ TP_ARGS(qdev, in_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = in_trans->hdr.len;
+ ),
+ TP_printk("%s len %u", __get_str(device), __entry->len)
+);
+
+TRACE_EVENT(qaic_encode_dma,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_dma_xfer *in_trans),
+ TP_ARGS(qdev, in_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ __field(__u32, tag)
+ __field(__u32, count)
+ __field(__u64, addr)
+ __field(__u64, size)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = in_trans->hdr.len;
+ __entry->tag = in_trans->tag;
+ __entry->count = in_trans->count;
+ __entry->addr = in_trans->addr;
+ __entry->size = in_trans->size;
+ ),
+ TP_printk("%s len %u tag %u count %u address 0x%llx size %llu",
+ __get_str(device), __entry->len, __entry->tag, __entry->count,
+ __entry->addr, __entry->size)
+);
+
+TRACE_EVENT(qaic_encode_activate,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_activate_to_dev *in_trans),
+ TP_ARGS(qdev, in_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ __field(__u32, queue_size)
+ __field(__u32, eventfd)
+ __field(__u32, options)
+ __field(__u32, pad)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = in_trans->hdr.len;
+ __entry->queue_size = in_trans->queue_size;
+ __entry->eventfd = in_trans->eventfd;
+ __entry->options = in_trans->options;
+ __entry->pad = in_trans->pad;
+ ),
+ TP_printk("%s len %u queue_size %u eventfd %u options %u pad %u",
+ __get_str(device), __entry->len, __entry->queue_size,
+ __entry->eventfd, __entry->options, __entry->pad)
+);
+
+TRACE_EVENT(qaic_encode_deactivate,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_deactivate *in_trans),
+ TP_ARGS(qdev, in_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ __field(__u32, dbc_id)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = in_trans->hdr.len;
+ __entry->dbc_id = in_trans->dbc_id;
+ ),
+ TP_printk("%s len %u dbc_id %u",
+ __get_str(device), __entry->len, __entry->dbc_id)
+);
+
+TRACE_EVENT(qaic_encode_status,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_status_to_dev *in_trans),
+ TP_ARGS(qdev, in_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = in_trans->hdr.len;
+ ),
+ TP_printk("%s len %u", __get_str(device), __entry->len)
+);
+
+TRACE_EVENT(qaic_decode_passthrough,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_passthrough *out_trans),
+ TP_ARGS(qdev, out_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = out_trans->hdr.len;
+ ),
+ TP_printk("%s len %u", __get_str(device), __entry->len)
+);
+
+TRACE_EVENT(qaic_decode_activate,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_activate_from_dev *out_trans),
+ TP_ARGS(qdev, out_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ __field(__u32, status)
+ __field(__u32, dbc_id)
+ __field(__u64, options)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = out_trans->hdr.len;
+ __entry->status = out_trans->status;
+ __entry->dbc_id = out_trans->dbc_id;
+ __entry->options = out_trans->options;
+ ),
+ TP_printk("%s len %u status %u dbc_id %u options %llu",
+ __get_str(device), __entry->len, __entry->status,
+ __entry->dbc_id, __entry->options)
+);
+
+TRACE_EVENT(qaic_decode_deactivate,
+ TP_PROTO(struct qaic_device *qdev, u32 dbc_id, u32 status),
+ TP_ARGS(qdev, dbc_id, status),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(u32, dbc_id)
+ __field(u32, status)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->dbc_id = dbc_id;
+ __entry->status = status;
+ ),
+ TP_printk("%s dbc_id %u status %u",
+ __get_str(device), __entry->dbc_id, __entry->status)
+);
+
+TRACE_EVENT(qaic_decode_status,
+ TP_PROTO(struct qaic_device *qdev,
+ struct qaic_manage_trans_status_from_dev *out_trans),
+ TP_ARGS(qdev, out_trans),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __field(__u32, len)
+ __field(__u16, major)
+ __field(__u16, minor)
+ __field(__u32, status)
+ __field(__u64, status_flags)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __entry->len = out_trans->hdr.len;
+ __entry->major = out_trans->major;
+ __entry->minor = out_trans->minor;
+ __entry->status = out_trans->status;
+ __entry->status_flags = out_trans->status_flags;
+ ),
+ TP_printk("%s len %u major %u minor %u status %u flags 0x%llx",
+ __get_str(device), __entry->len, __entry->major, __entry->minor,
+ __entry->status, __entry->status_flags)
+);
+
+DECLARE_EVENT_CLASS(qaic_data_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ __field(int, ret)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ __entry->ret = ret;
+ ),
+ TP_printk("%s %s %d", __get_str(device), __get_str(msg), __entry->ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_mem_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_mmap_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_exec_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_wait_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_stats_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_util_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DEFINE_EVENT(qaic_data_err, qaic_attach_err,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, int ret),
+ TP_ARGS(qdev, msg, ret)
+);
+
+DECLARE_EVENT_CLASS(qaic_data_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ __string(msg_var1, msg_var1)
+ __field(int, ret)
+ __field(u64, var1)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ __assign_str(msg_var1, msg_var1);
+ __entry->ret = ret;
+ __entry->var1 = var1;
+ ),
+ TP_printk("%s %s Error:%d %s:%llu",
+ __get_str(device), __get_str(msg), __entry->ret,
+ __get_str(msg_var1), __entry->var1)
+);
+
+DEFINE_EVENT(qaic_data_err_1, qaic_mem_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1)
+);
+
+DEFINE_EVENT(qaic_data_err_1, qaic_mmap_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1)
+);
+
+DEFINE_EVENT(qaic_data_err_1, qaic_attach_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1)
+);
+
+DEFINE_EVENT(qaic_data_err_1, qaic_exec_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1)
+);
+
+DEFINE_EVENT(qaic_data_err_1, qaic_wait_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1)
+);
+
+DEFINE_EVENT(qaic_data_err_1, qaic_stats_err_1,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ int ret, u64 var1),
+ TP_ARGS(qdev, msg, msg_var1, ret, var1)
+);
+
+DECLARE_EVENT_CLASS(qaic_data_err_2,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ const char *msg_var2, int ret, u64 var1, u64 var2),
+ TP_ARGS(qdev, msg, msg_var1, msg_var2, ret, var1, var2),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ __string(msg_var1, msg_var1)
+ __string(msg_var2, msg_var2)
+ __field(int, ret)
+ __field(u64, var1)
+ __field(u64, var2)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ __assign_str(msg_var1, msg_var1);
+ __assign_str(msg_var2, msg_var2);
+ __entry->ret = ret;
+ __entry->var1 = var1;
+ __entry->var2 = var2;
+ ),
+ TP_printk("%s %s Error:%d %s:%llu %s:%llu",
+ __get_str(device), __get_str(msg), __entry->ret,
+ __get_str(msg_var1), __entry->var1,
+ __get_str(msg_var2), __entry->var2)
+);
+
+DEFINE_EVENT(qaic_data_err_2, qaic_mem_err_2,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ const char *msg_var2, int ret, u64 var1, u64 var2),
+ TP_ARGS(qdev, msg, msg_var1, msg_var2, ret, var1, var2)
+);
+
+DEFINE_EVENT(qaic_data_err_2, qaic_attach_err_2,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ const char *msg_var2, int ret, u64 var1, u64 var2),
+ TP_ARGS(qdev, msg, msg_var1, msg_var2, ret, var1, var2)
+);
+
+DEFINE_EVENT(qaic_data_err_2, qaic_exec_err_2,
+ TP_PROTO(struct qaic_device *qdev, const char *msg, const char *msg_var1,
+ const char *msg_var2, int ret, u64 var1, u64 var2),
+ TP_ARGS(qdev, msg, msg_var1, msg_var2, ret, var1, var2)
+);
+
+DECLARE_EVENT_CLASS(qaic_ssr,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg),
+ TP_STRUCT__entry(
+ __string(device, dev_name(&qdev->pdev->dev))
+ __string(msg, msg)
+ ),
+ TP_fast_assign(
+ __assign_str(device, dev_name(&qdev->pdev->dev));
+ __assign_str(msg, msg);
+ ),
+ TP_printk("%s %s", __get_str(device), __get_str(msg))
+);
+
+DEFINE_EVENT(qaic_ssr, qaic_ssr_cmd,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg)
+);
+
+DEFINE_EVENT(qaic_ssr, qaic_ssr_event,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg)
+);
+
+DEFINE_EVENT(qaic_ssr, qaic_ssr_dump,
+ TP_PROTO(struct qaic_device *qdev, const char *msg),
+ TP_ARGS(qdev, msg)
+);
+
+#endif /* _TRACE_QAIC_H */
+#include <trace/define_trace.h>
--
2.7.4