accel/ivpu: Add tracing for IPC/PM/JOB

Add multiple trace points in couple of key places to enable tracing
with ftrace.

Signed-off-by: Jakub Pawlak <jakub.pawlak@intel.com>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930195322.461209-31-jacek.lawrynowicz@linux.intel.com
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
This commit is contained in:
Jakub Pawlak 2024-09-30 21:53:21 +02:00 committed by Jacek Lawrynowicz
parent 3e521803e5
commit 7cb8d38a06
6 changed files with 102 additions and 1 deletions

View File

@ -16,9 +16,12 @@ intel_vpu-y := \
ivpu_mmu_context.o \
ivpu_ms.o \
ivpu_pm.o \
ivpu_sysfs.o
ivpu_sysfs.o \
ivpu_trace_points.o
intel_vpu-$(CONFIG_DEBUG_FS) += ivpu_debugfs.o
intel_vpu-$(CONFIG_DEV_COREDUMP) += ivpu_coredump.o
obj-$(CONFIG_DRM_ACCEL_IVPU) += intel_vpu.o
CFLAGS_ivpu_trace_points.o = -I$(src)

View File

@ -15,6 +15,7 @@
#include "ivpu_ipc.h"
#include "ivpu_jsm_msg.h"
#include "ivpu_pm.h"
#include "ivpu_trace.h"
#define IPC_MAX_RX_MSG 128
@ -227,6 +228,7 @@ int ivpu_ipc_send(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons, stru
goto unlock;
ivpu_ipc_tx(vdev, cons->tx_vpu_addr);
trace_jsm("[tx]", req);
unlock:
mutex_unlock(&ipc->lock);
@ -284,6 +286,7 @@ int ivpu_ipc_receive(struct ivpu_device *vdev, struct ivpu_ipc_consumer *cons,
if (jsm_msg)
memcpy(jsm_msg, rx_msg->jsm_msg, size);
trace_jsm("[rx]", rx_msg->jsm_msg);
}
ivpu_ipc_rx_msg_del(vdev, rx_msg);

View File

@ -18,6 +18,7 @@
#include "ivpu_job.h"
#include "ivpu_jsm_msg.h"
#include "ivpu_pm.h"
#include "ivpu_trace.h"
#include "vpu_boot_api.h"
#define CMD_BUF_IDX 0
@ -482,6 +483,7 @@ ivpu_job_create(struct ivpu_file_priv *file_priv, u32 engine_idx, u32 bo_count)
job->file_priv = ivpu_file_priv_get(file_priv);
trace_job("create", job);
ivpu_dbg(vdev, JOB, "Job created: ctx %2d engine %d", file_priv->ctx.id, job->engine_idx);
return job;
@ -521,6 +523,7 @@ static int ivpu_job_signal_and_destroy(struct ivpu_device *vdev, u32 job_id, u32
job->bos[CMD_BUF_IDX]->job_status = job_status;
dma_fence_signal(job->done_fence);
trace_job("done", job);
ivpu_dbg(vdev, JOB, "Job complete: id %3u ctx %2d engine %d status 0x%x\n",
job->job_id, job->file_priv->ctx.id, job->engine_idx, job_status);
@ -588,6 +591,7 @@ static int ivpu_job_submit(struct ivpu_job *job, u8 priority)
vdev->busy_start_ts = ktime_get();
}
trace_job("submit", job);
ivpu_dbg(vdev, JOB, "Job submitted: id %3u ctx %2d engine %d prio %d addr 0x%llx next %d\n",
job->job_id, file_priv->ctx.id, job->engine_idx, priority,
job->cmd_buf_vpu_addr, cmdq->jobq->header.tail);

View File

@ -20,6 +20,7 @@
#include "ivpu_mmu.h"
#include "ivpu_ms.h"
#include "ivpu_pm.h"
#include "ivpu_trace.h"
#include "vpu_boot_api.h"
static bool ivpu_disable_recovery;
@ -198,6 +199,7 @@ int ivpu_pm_suspend_cb(struct device *dev)
struct ivpu_device *vdev = to_ivpu_device(drm);
unsigned long timeout;
trace_pm("suspend");
ivpu_dbg(vdev, PM, "Suspend..\n");
timeout = jiffies + msecs_to_jiffies(vdev->timeout.tdr);
@ -215,6 +217,7 @@ int ivpu_pm_suspend_cb(struct device *dev)
ivpu_pm_prepare_warm_boot(vdev);
ivpu_dbg(vdev, PM, "Suspend done.\n");
trace_pm("suspend done");
return 0;
}
@ -225,6 +228,7 @@ int ivpu_pm_resume_cb(struct device *dev)
struct ivpu_device *vdev = to_ivpu_device(drm);
int ret;
trace_pm("resume");
ivpu_dbg(vdev, PM, "Resume..\n");
ret = ivpu_resume(vdev);
@ -232,6 +236,7 @@ int ivpu_pm_resume_cb(struct device *dev)
ivpu_err(vdev, "Failed to resume: %d\n", ret);
ivpu_dbg(vdev, PM, "Resume done.\n");
trace_pm("resume done");
return ret;
}
@ -246,6 +251,7 @@ int ivpu_pm_runtime_suspend_cb(struct device *dev)
drm_WARN_ON(&vdev->drm, !xa_empty(&vdev->submitted_jobs_xa));
drm_WARN_ON(&vdev->drm, work_pending(&vdev->pm->recovery_work));
trace_pm("runtime suspend");
ivpu_dbg(vdev, PM, "Runtime suspend..\n");
ivpu_mmu_disable(vdev);
@ -272,6 +278,7 @@ int ivpu_pm_runtime_suspend_cb(struct device *dev)
}
ivpu_dbg(vdev, PM, "Runtime suspend done.\n");
trace_pm("runtime suspend done");
return 0;
}
@ -282,6 +289,7 @@ int ivpu_pm_runtime_resume_cb(struct device *dev)
struct ivpu_device *vdev = to_ivpu_device(drm);
int ret;
trace_pm("runtime resume");
ivpu_dbg(vdev, PM, "Runtime resume..\n");
ret = ivpu_resume(vdev);
@ -289,6 +297,7 @@ int ivpu_pm_runtime_resume_cb(struct device *dev)
ivpu_err(vdev, "Failed to set RESUME state: %d\n", ret);
ivpu_dbg(vdev, PM, "Runtime resume done.\n");
trace_pm("runtime resume done");
return ret;
}

View File

@ -0,0 +1,73 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2020-2024 Intel Corporation
*/
#if !defined(__IVPU_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ)
#define __IVPU_TRACE_H__
#include <linux/tracepoint.h>
#include "ivpu_drv.h"
#include "ivpu_job.h"
#include "vpu_jsm_api.h"
#include "ivpu_jsm_msg.h"
#include "ivpu_ipc.h"
#undef TRACE_SYSTEM
#define TRACE_SYSTEM vpu
#define TRACE_INCLUDE_FILE ivpu_trace
TRACE_EVENT(pm,
TP_PROTO(const char *event),
TP_ARGS(event),
TP_STRUCT__entry(__field(const char *, event)),
TP_fast_assign(__entry->event = event;),
TP_printk("%s", __entry->event)
);
TRACE_EVENT(job,
TP_PROTO(const char *event, struct ivpu_job *job),
TP_ARGS(event, job),
TP_STRUCT__entry(__field(const char *, event)
__field(u32, ctx_id)
__field(u32, engine_id)
__field(u32, job_id)
),
TP_fast_assign(__entry->event = event;
__entry->ctx_id = job->file_priv->ctx.id;
__entry->engine_id = job->engine_idx;
__entry->job_id = job->job_id;),
TP_printk("%s context:%d engine:%d job:%d",
__entry->event,
__entry->ctx_id,
__entry->engine_id,
__entry->job_id)
);
TRACE_EVENT(jsm,
TP_PROTO(const char *event, struct vpu_jsm_msg *msg),
TP_ARGS(event, msg),
TP_STRUCT__entry(__field(const char *, event)
__field(const char *, type)
__field(enum vpu_ipc_msg_status, status)
__field(u32, request_id)
__field(u32, result)
),
TP_fast_assign(__entry->event = event;
__entry->type = ivpu_jsm_msg_type_to_str(msg->type);
__entry->status = msg->status;
__entry->request_id = msg->request_id;
__entry->result = msg->result;),
TP_printk("%s type:%s, status:%#x, id:%#x, result:%#x",
__entry->event,
__entry->type,
__entry->status,
__entry->request_id,
__entry->result)
);
#endif /* __IVPU_TRACE_H__ */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#include <trace/define_trace.h>

View File

@ -0,0 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2020-2024 Intel Corporation
*/
#ifndef __CHECKER__
#define CREATE_TRACE_POINTS
#include "ivpu_trace.h"
#endif