/*
* Copyright (c) 2016-2020, 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#undef TRACE_SYSTEM
#define TRACE_SYSTEM tegra_rtcpu
#if !defined(_TRACE_TEGRA_RTCPU_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_TEGRA_RTCPU_H
#include
/*
* Classes
*/
DECLARE_EVENT_CLASS(rtcpu__noarg,
TP_PROTO(u64 tstamp),
TP_ARGS(tstamp),
TP_STRUCT__entry(
__field(u64, tstamp)
),
TP_fast_assign(
__entry->tstamp = tstamp;
),
TP_printk("tstamp:%llu", __entry->tstamp)
);
DECLARE_EVENT_CLASS(rtcpu__arg1,
TP_PROTO(u64 tstamp, u32 data1),
TP_ARGS(tstamp, data1),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u32, data1)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->data1 = data1;
),
TP_printk("tstamp:%llu, data:%u", __entry->tstamp,
__entry->data1)
);
DECLARE_EVENT_CLASS(rtcpu__dump,
TP_PROTO(u64 tstamp, u32 id, u32 len, void *data),
TP_ARGS(tstamp, id, len, data),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u32, id)
__field(u32, len)
__dynamic_array(__u8, data, len)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->id = id;
__entry->len = len;
memcpy(__get_dynamic_array(data), data, len);
),
TP_printk("tstamp:%llu id:0x%08x len:%u data:%s",
__entry->tstamp, __entry->id, __entry->len,
__print_hex(__get_dynamic_array(data), __entry->len))
);
/*
* Unknown events
*/
DEFINE_EVENT(rtcpu__dump, rtcpu_unknown,
TP_PROTO(u64 tstamp, u32 id, u32 len, void *data),
TP_ARGS(tstamp, id, len, data)
);
/*
* Non ARRAY event types
*/
TRACE_EVENT(rtcpu_armv7_exception,
TP_PROTO(u64 tstamp, u32 type),
TP_ARGS(tstamp, type),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u32, type)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->type = type;
),
TP_printk("tstamp:%llu type:%u", __entry->tstamp, __entry->type)
);
TRACE_EVENT(rtcpu_start,
TP_PROTO(u64 tstamp),
TP_ARGS(tstamp),
TP_STRUCT__entry(
__field(u64, tstamp)
),
TP_fast_assign(
__entry->tstamp = tstamp;
),
TP_printk("tstamp:%llu", __entry->tstamp)
);
#ifndef TEGRA_RTCPU_TRACE_STRING_SIZE
#define TEGRA_RTCPU_TRACE_STRING_SIZE 48
#endif
TRACE_EVENT(rtcpu_string,
TP_PROTO(u64 tstamp, u32 id, u32 len, const char *data),
TP_ARGS(tstamp, id, len, data),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u32, id)
__field(u32, len)
__array(char, data, TEGRA_RTCPU_TRACE_STRING_SIZE)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->id = id;
__entry->len = len;
strlcpy(__entry->data, data, sizeof(__entry->data));
),
TP_printk("tstamp:%llu id:0x%08x str:\"%.*s\"",
__entry->tstamp, __entry->id,
(int)__entry->len, __entry->data)
);
DEFINE_EVENT(rtcpu__dump, rtcpu_bulk,
TP_PROTO(u64 tstamp, u32 id, u32 len, void *data),
TP_ARGS(tstamp, id, len, data)
);
/*
* Base events
*/
DEFINE_EVENT(rtcpu__noarg, rtcpu_target_init,
TP_PROTO(u64 tstamp),
TP_ARGS(tstamp)
);
DEFINE_EVENT(rtcpu__noarg, rtcpu_start_scheduler,
TP_PROTO(u64 tstamp),
TP_ARGS(tstamp)
);
/*
* Debug interface
*/
DEFINE_EVENT(rtcpu__arg1, rtcpu_dbg_unknown,
TP_PROTO(u64 tstamp, u32 data1),
TP_ARGS(tstamp, data1)
);
DEFINE_EVENT(rtcpu__arg1, rtcpu_dbg_enter,
TP_PROTO(u64 tstamp, u32 req_type),
TP_ARGS(tstamp, req_type)
);
DEFINE_EVENT(rtcpu__noarg, rtcpu_dbg_exit,
TP_PROTO(u64 tstamp),
TP_ARGS(tstamp)
);
TRACE_EVENT(rtcpu_dbg_set_loglevel,
TP_PROTO(u64 tstamp, u32 old_level, u32 new_level),
TP_ARGS(tstamp, old_level, new_level),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u32, old_level)
__field(u32, new_level)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->old_level = old_level;
__entry->new_level = new_level;
),
TP_printk("tstamp:%llu old:%u new:%u", __entry->tstamp,
__entry->old_level, __entry->new_level)
);
/*
* VI Notify events
*/
extern const char * const g_trace_vinotify_tag_strs[];
extern const unsigned int g_trace_vinotify_tag_str_count;
TRACE_EVENT(rtcpu_vinotify_handle_msg,
TP_PROTO(u64 tstamp, u8 tag, u32 ch_frame, u32 vi_tstamp, u32 data),
TP_ARGS(tstamp, tag, ch_frame, vi_tstamp, data),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u8, tag)
__field(u32, ch_frame)
__field(u32, vi_tstamp)
__field(u32, data)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->tag = tag;
__entry->ch_frame = ch_frame;
__entry->vi_tstamp = vi_tstamp;
__entry->data = data;
),
TP_printk(
"tstamp:%llu tag:%s channel:0x%02x frame:%u vi_tstamp:%u data:0x%08x",
__entry->tstamp,
(__entry->tag < g_trace_vinotify_tag_str_count) ?
g_trace_vinotify_tag_strs[__entry->tag] :
__print_hex(&__entry->tag, 1),
(__entry->ch_frame >> 8) & 0xff,
(__entry->ch_frame >> 16) & 0xffff,
__entry->vi_tstamp, __entry->data)
);
TRACE_EVENT(rtcpu_vinotify_event,
TP_PROTO(u64 tstamp, u8 tag, u32 ch_frame, u64 vi_tstamp, u32 data),
TP_ARGS(tstamp, tag, ch_frame, vi_tstamp, data),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u8, tag)
__field(u32, ch_frame)
__field(u64, vi_tstamp)
__field(u32, data)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->tag = tag;
__entry->ch_frame = ch_frame;
__entry->vi_tstamp = vi_tstamp;
__entry->data = data;
),
TP_printk(
"tstamp:%llu tag:%s channel:0x%02x frame:%u vi_tstamp:%llu data:0x%08x",
__entry->tstamp,
(__entry->tag < g_trace_vinotify_tag_str_count) ?
g_trace_vinotify_tag_strs[__entry->tag] :
__print_hex(&__entry->tag, 1),
(__entry->ch_frame >> 8) & 0xff,
(__entry->ch_frame >> 16) & 0xffff,
__entry->vi_tstamp, __entry->data)
);
TRACE_EVENT(rtcpu_vinotify_error,
TP_PROTO(u64 tstamp, u8 tag, u32 ch_frame, u64 vi_tstamp, u32 data),
TP_ARGS(tstamp, tag, ch_frame, vi_tstamp, data),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u8, tag)
__field(u32, ch_frame)
__field(u64, vi_tstamp)
__field(u32, data)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->tag = tag;
__entry->ch_frame = ch_frame;
__entry->vi_tstamp = vi_tstamp;
__entry->data = data;
),
TP_printk(
"tstamp:%llu tag:%s channel:0x%02x frame:%u vi_tstamp:%llu data:0x%08x",
__entry->tstamp,
(__entry->tag < g_trace_vinotify_tag_str_count) ?
g_trace_vinotify_tag_strs[__entry->tag] :
__print_hex(&__entry->tag, 1),
(__entry->ch_frame >> 8) & 0xff,
(__entry->ch_frame >> 16) & 0xffff,
__entry->vi_tstamp, __entry->data)
);
/*
* NVCSI events
*/
extern const char * const g_trace_nvcsi_intr_class_strs[];
extern const unsigned int g_trace_nvcsi_intr_class_str_count;
extern const char * const g_trace_nvcsi_intr_type_strs[];
extern const unsigned int g_trace_nvcsi_intr_type_str_count;
TRACE_EVENT(rtcpu_nvcsi_intr,
TP_PROTO(u64 tstamp, u8 intr_class, u8 intr_type, u32 index,
u32 status),
TP_ARGS(tstamp, intr_class, intr_type, index, status),
TP_STRUCT__entry(
__field(u64, tstamp)
__field(u8, intr_class)
__field(u8, intr_type)
__field(u32, index)
__field(u32, status)
),
TP_fast_assign(
__entry->tstamp = tstamp;
__entry->intr_class = intr_class;
__entry->intr_type = intr_type;
__entry->index = index;
__entry->status = status;
),
TP_printk(
"tstamp:%llu class:%s type:%s phy:%u cil:%u st:%u vc:%u status:0x%08x",
__entry->tstamp,
(__entry->intr_class < g_trace_nvcsi_intr_class_str_count) ?
g_trace_nvcsi_intr_class_strs[__entry->intr_class] :
__print_hex(&__entry->intr_class, 1),
(__entry->intr_type < g_trace_nvcsi_intr_type_str_count) ?
g_trace_nvcsi_intr_type_strs[__entry->intr_type] :
__print_hex(&__entry->intr_type, 1),
(__entry->index >> 24) & 0xff,
(__entry->index >> 16) & 0xff,
(__entry->index >> 8) & 0xff,
__entry->index & 0xff,
__entry->status)
);
#endif /* _TRACE_TEGRA_RTCPU_H */
#include