Commit 7cb8d38a authored by Jakub Pawlak's avatar Jakub Pawlak Committed by Jacek Lawrynowicz
Browse files

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

parent 3e521803
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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)
+3 −0
Original line number Diff line number Diff line
@@ -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);
+4 −0
Original line number Diff line number Diff line
@@ -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);
+9 −0
Original line number Diff line number Diff line
@@ -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;
}
+73 −0
Original line number Diff line number Diff line
/* 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>
Loading