/*
* Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. 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_capture
#if !defined(_TRACE_TEGRA_CAPTURE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_TEGRA_CAPTURE_H
#include
/*
* Classes
*/
#ifndef IVC_NAME_LEN
#define IVC_NAME_LEN 16
#endif
DECLARE_EVENT_CLASS(capture__msg,
TP_PROTO(const char *ivc_name, u32 msg_id, u32 ch_id),
TP_ARGS(ivc_name, msg_id, ch_id),
TP_STRUCT__entry(
__array(char, ivc_name, IVC_NAME_LEN)
__field(u32, msg_id)
__field(u32, ch_id)
),
TP_fast_assign(
strlcpy(__entry->ivc_name, ivc_name, sizeof(__entry->ivc_name));
__entry->msg_id = msg_id;
__entry->ch_id = ch_id;
),
TP_printk("ivc:\"%s\" msg:0x%02x ch:0x%02x",
__entry->ivc_name,
__entry->msg_id,
__entry->ch_id)
);
/*
* Events for capture and capture control protocol
*/
TRACE_EVENT(capture_ivc_notify,
TP_PROTO(const char *ivc_name),
TP_ARGS(ivc_name),
TP_STRUCT__entry(
__array(char, ivc_name, IVC_NAME_LEN)
),
TP_fast_assign(
strlcpy(__entry->ivc_name, ivc_name, sizeof(__entry->ivc_name));
),
TP_printk("ivc:\"%s\"", __entry->ivc_name)
);
DEFINE_EVENT(capture__msg, capture_ivc_recv,
TP_PROTO(const char *ivc_name, u32 msg_id, u32 ch_id),
TP_ARGS(ivc_name, msg_id, ch_id)
);
DEFINE_EVENT(capture__msg, capture_ivc_send,
TP_PROTO(const char *ivc_name, u32 msg_id, u32 ch_id),
TP_ARGS(ivc_name, msg_id, ch_id)
);
TRACE_EVENT(capture_ivc_send_error,
TP_PROTO(const char *ivc_name, u32 msg_id, u32 ch_id, int err),
TP_ARGS(ivc_name, msg_id, ch_id, err),
TP_STRUCT__entry(
__array(char, ivc_name, IVC_NAME_LEN)
__field(u32, msg_id)
__field(u32, ch_id)
__field(int, err)
),
TP_fast_assign(
strlcpy(__entry->ivc_name, ivc_name, sizeof(__entry->ivc_name));
__entry->msg_id = msg_id;
__entry->ch_id = ch_id;
__entry->err = err;
),
TP_printk("ivc:\"%s\" msg:0x%02x ch:0x%02x: err:%d",
__entry->ivc_name,
__entry->msg_id,
__entry->ch_id,
__entry->err)
);
/*
* Capture scheduler events from RCE
*/
DECLARE_EVENT_CLASS(capture__progress_event,
TP_PROTO(u64 ts, u32 channel_id, u32 sequence),
TP_ARGS(ts, channel_id, sequence),
TP_STRUCT__entry(
__field(u64, ts)
__field(u32, channel_id)
__field(u32, sequence)
),
TP_fast_assign(
__entry->ts = ts;
__entry->channel_id = channel_id;
__entry->sequence = sequence;
),
TP_printk("ts:%llu ch:0x%02x seq:%u",
__entry->ts,
__entry->channel_id,
__entry->sequence)
);
DECLARE_EVENT_CLASS(capture__isp_event,
TP_PROTO(u64 ts, u32 channel_id, u32 cap_sequence, u32 prog_sequence,
u8 isp_settings_id, u8 vi_channel_id),
TP_ARGS(ts, channel_id, cap_sequence, prog_sequence, isp_settings_id, vi_channel_id),
TP_STRUCT__entry(
__field(u64, ts)
__field(u32, channel_id)
__field(u32, prog_sequence)
__field(u32, cap_sequence)
__field(u8, isp_settings_id)
__field(u8, vi_channel_id)
),
TP_fast_assign(
__entry->ts = ts;
__entry->channel_id = channel_id;
__entry->prog_sequence = prog_sequence;
),
TP_printk("ts:%llu ch:0x%02x seq:%u prog:%u set:%u vi:%u",
__entry->ts,
__entry->channel_id,
__entry->cap_sequence,
__entry->prog_sequence,
__entry->isp_settings_id,
__entry->vi_channel_id)
);
DECLARE_EVENT_CLASS(capture__suspend_event,
TP_PROTO(u64 ts, bool suspend),
TP_ARGS(ts, suspend),
TP_STRUCT__entry(
__field(u64, ts)
__field(bool, suspend)
),
TP_fast_assign(
__entry->ts = ts;
__entry->suspend = suspend;
),
TP_printk("ts:%llu suspend:%s",
__entry->ts,
__entry->suspend ? "true" : "false")
);
DEFINE_EVENT(capture__progress_event, capture_event_sof,
TP_PROTO(u64 ts, u32 channel_id, u32 sequence),
TP_ARGS(ts, channel_id, sequence)
);
DEFINE_EVENT(capture__progress_event, capture_event_eof,
TP_PROTO(u64 ts, u32 channel_id, u32 sequence),
TP_ARGS(ts, channel_id, sequence)
);
DEFINE_EVENT(capture__progress_event, capture_event_error,
TP_PROTO(u64 ts, u32 channel_id, u32 sequence),
TP_ARGS(ts, channel_id, sequence)
);
DEFINE_EVENT(capture__progress_event, capture_event_reschedule,
TP_PROTO(u64 ts, u32 channel_id, u32 sequence),
TP_ARGS(ts, channel_id, sequence)
);
DEFINE_EVENT(capture__isp_event, capture_event_reschedule_isp,
TP_PROTO(u64 ts, u32 channel_id, u32 cap_sequence, u32 prog_sequence,
u8 isp_settings_id, u8 vi_channel_id),
TP_ARGS(ts, channel_id, cap_sequence, prog_sequence, isp_settings_id, vi_channel_id)
);
DEFINE_EVENT(capture__isp_event, capture_event_isp_done,
TP_PROTO(u64 ts, u32 channel_id, u32 cap_sequence, u32 prog_sequence,
u8 isp_settings_id, u8 vi_channel_id),
TP_ARGS(ts, channel_id, cap_sequence, prog_sequence, isp_settings_id, vi_channel_id)
);
DEFINE_EVENT(capture__isp_event, capture_event_isp_error,
TP_PROTO(u64 ts, u32 channel_id, u32 cap_sequence, u32 prog_sequence,
u8 isp_settings_id, u8 vi_channel_id),
TP_ARGS(ts, channel_id, cap_sequence, prog_sequence, isp_settings_id, vi_channel_id)
);
DEFINE_EVENT(capture__progress_event, capture_event_report_program,
TP_PROTO(u64 ts, u32 channel_id, u32 sequence),
TP_ARGS(ts, channel_id, sequence)
);
TRACE_EVENT(capture_event_wdt,
TP_PROTO(u64 ts),
TP_ARGS(ts),
TP_STRUCT__entry(
__field(u64, ts)
),
TP_fast_assign(
__entry->ts = ts;
),
TP_printk("ts:%llu",
__entry->ts)
);
DEFINE_EVENT(capture__suspend_event, capture_event_suspend,
TP_PROTO(u64 ts, bool suspend),
TP_ARGS(ts, suspend)
);
DEFINE_EVENT(capture__suspend_event, capture_event_suspend_isp,
TP_PROTO(u64 ts, bool suspend),
TP_ARGS(ts, suspend)
);
#endif /* _TRACE_TEGRA_CAPTURE_H */
#include