mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-25 11:04:51 +03:00
Add a couple of trace points for tracking when we need to wait for space in the gpfifo ring buffer. This wait can introduce significant latencies to rendering with large gpfifo entry inputs so it's good to be able to measure how often this path is taken. Bug 1592391 Bug 1550886 Change-Id: I7f362e9c307eeffeeecaaba268ef2e3613e54597 Signed-off-by: Janne Hellsten <jhellsten@nvidia.com> Reviewed-on: http://git-master/r/674021 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
343 lines
8.1 KiB
C
343 lines
8.1 KiB
C
/*
|
|
* gk20a event logging to ftrace.
|
|
*
|
|
* Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*/
|
|
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM gk20a
|
|
|
|
#if !defined(_TRACE_GK20A_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_GK20A_H
|
|
|
|
#include <linux/ktime.h>
|
|
#include <linux/tracepoint.h>
|
|
|
|
DECLARE_EVENT_CLASS(gk20a,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(__field(const char *, name)),
|
|
TP_fast_assign(__entry->name = name;),
|
|
TP_printk("name=%s", __entry->name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_channel_open,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_channel_release,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_pm_unrailgate,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_finalize_poweron,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_finalize_poweron_done,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_gpfifo_submit_wait_for_space,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a, gk20a_gpfifo_submit_wait_for_space_done,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_channel_update,
|
|
TP_PROTO(const void *channel),
|
|
TP_ARGS(channel),
|
|
TP_STRUCT__entry(__field(const void *, channel)),
|
|
TP_fast_assign(__entry->channel = channel;),
|
|
TP_printk("channel=%p", __entry->channel)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_push_cmdbuf,
|
|
TP_PROTO(const char *name, u32 mem_id,
|
|
u32 words, u32 offset, void *cmdbuf),
|
|
|
|
TP_ARGS(name, mem_id, words, offset, cmdbuf),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
__field(u32, mem_id)
|
|
__field(u32, words)
|
|
__field(u32, offset)
|
|
__field(bool, cmdbuf)
|
|
__dynamic_array(u32, cmdbuf, words)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
if (cmdbuf) {
|
|
memcpy(__get_dynamic_array(cmdbuf), cmdbuf+offset,
|
|
words * sizeof(u32));
|
|
}
|
|
__entry->cmdbuf = cmdbuf;
|
|
__entry->name = name;
|
|
__entry->mem_id = mem_id;
|
|
__entry->words = words;
|
|
__entry->offset = offset;
|
|
),
|
|
|
|
TP_printk("name=%s, mem_id=%08x, words=%u, offset=%d, contents=[%s]",
|
|
__entry->name, __entry->mem_id,
|
|
__entry->words, __entry->offset,
|
|
__print_hex(__get_dynamic_array(cmdbuf),
|
|
__entry->cmdbuf ? __entry->words * 4 : 0))
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_channel_submit_gpfifo,
|
|
TP_PROTO(const char *name, u32 hw_chid, u32 num_entries,
|
|
u32 flags, u32 wait_id, u32 wait_value),
|
|
|
|
TP_ARGS(name, hw_chid, num_entries, flags, wait_id, wait_value),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
__field(u32, hw_chid)
|
|
__field(u32, num_entries)
|
|
__field(u32, flags)
|
|
__field(u32, wait_id)
|
|
__field(u32, wait_value)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
__entry->hw_chid = hw_chid;
|
|
__entry->num_entries = num_entries;
|
|
__entry->flags = flags;
|
|
__entry->wait_id = wait_id;
|
|
__entry->wait_value = wait_value;
|
|
),
|
|
|
|
TP_printk("name=%s, hw_chid=%d, num_entries=%u, flags=%u, wait_id=%d,"
|
|
" wait_value=%u",
|
|
__entry->name, __entry->hw_chid, __entry->num_entries,
|
|
__entry->flags, __entry->wait_id, __entry->wait_value)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_channel_submitted_gpfifo,
|
|
TP_PROTO(const char *name, u32 hw_chid, u32 num_entries,
|
|
u32 flags, u32 incr_id, u32 incr_value),
|
|
|
|
TP_ARGS(name, hw_chid, num_entries, flags,
|
|
incr_id, incr_value),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
__field(u32, hw_chid)
|
|
__field(u32, num_entries)
|
|
__field(u32, flags)
|
|
__field(u32, incr_id)
|
|
__field(u32, incr_value)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
__entry->hw_chid = hw_chid;
|
|
__entry->num_entries = num_entries;
|
|
__entry->flags = flags;
|
|
__entry->incr_id = incr_id;
|
|
__entry->incr_value = incr_value;
|
|
),
|
|
|
|
TP_printk("name=%s, hw_chid=%d, num_entries=%u, flags=%u,"
|
|
" incr_id=%u, incr_value=%u",
|
|
__entry->name, __entry->hw_chid, __entry->num_entries,
|
|
__entry->flags, __entry->incr_id, __entry->incr_value)
|
|
);
|
|
|
|
|
|
TRACE_EVENT(gk20a_as_dev_open,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_as_dev_release,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
|
|
TRACE_EVENT(gk20a_as_ioctl_bind_channel,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
|
|
TRACE_EVENT(gk20a_as_ioctl_alloc_space,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_as_ioctl_free_space,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_as_ioctl_map_buffer,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_as_ioctl_unmap_buffer,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_as_ioctl_get_va_regions,
|
|
TP_PROTO(const char *name),
|
|
TP_ARGS(name),
|
|
TP_STRUCT__entry(
|
|
__field(const char *, name)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->name = name;
|
|
),
|
|
TP_printk("name=%s ", __entry->name)
|
|
);
|
|
|
|
TRACE_EVENT(gk20a_mmu_fault,
|
|
TP_PROTO(u32 fault_hi, u32 fault_lo,
|
|
u32 fault_info,
|
|
u32 instance,
|
|
u32 engine_id,
|
|
const char *engine,
|
|
const char *client,
|
|
const char *fault_type),
|
|
TP_ARGS(fault_hi, fault_lo, fault_info,
|
|
instance, engine_id, engine, client, fault_type),
|
|
TP_STRUCT__entry(
|
|
__field(u32, fault_hi)
|
|
__field(u32, fault_lo)
|
|
__field(u32, fault_info)
|
|
__field(u32, instance)
|
|
__field(u32, engine_id)
|
|
__field(const char *, engine)
|
|
__field(const char *, client)
|
|
__field(const char *, fault_type)
|
|
),
|
|
TP_fast_assign(
|
|
__entry->fault_hi = fault_hi;
|
|
__entry->fault_lo = fault_lo;
|
|
__entry->fault_info = fault_info;
|
|
__entry->instance = instance;
|
|
__entry->engine_id = engine_id;
|
|
__entry->engine = engine;
|
|
__entry->client = client;
|
|
__entry->fault_type = fault_type;
|
|
),
|
|
TP_printk("fault=0x%x,%08x info=0x%x instance=0x%x engine_id=%d engine=%s client=%s type=%s",
|
|
__entry->fault_hi, __entry->fault_lo,
|
|
__entry->fault_info, __entry->instance, __entry->engine_id,
|
|
__entry->engine, __entry->client, __entry->fault_type)
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(gk20a_cde,
|
|
TP_PROTO(const void *ctx),
|
|
TP_ARGS(ctx),
|
|
TP_STRUCT__entry(__field(const void *, ctx)),
|
|
TP_fast_assign(__entry->ctx = ctx;),
|
|
TP_printk("ctx=%p", __entry->ctx)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a_cde, gk20a_cde_remove_ctx,
|
|
TP_PROTO(const void *ctx),
|
|
TP_ARGS(ctx)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a_cde, gk20a_cde_release,
|
|
TP_PROTO(const void *ctx),
|
|
TP_ARGS(ctx)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a_cde, gk20a_cde_get_context,
|
|
TP_PROTO(const void *ctx),
|
|
TP_ARGS(ctx)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a_cde, gk20a_cde_allocate_context,
|
|
TP_PROTO(const void *ctx),
|
|
TP_ARGS(ctx)
|
|
);
|
|
|
|
DEFINE_EVENT(gk20a_cde, gk20a_cde_finished_ctx_cb,
|
|
TP_PROTO(const void *ctx),
|
|
TP_ARGS(ctx)
|
|
);
|
|
|
|
#endif /* _TRACE_GK20A_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|