1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 22d012373SWade Farnsworth #undef TRACE_SYSTEM 32d012373SWade Farnsworth #define TRACE_SYSTEM v4l2 42d012373SWade Farnsworth 52d012373SWade Farnsworth #if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) 62d012373SWade Farnsworth #define _TRACE_V4L2_H 72d012373SWade Farnsworth 82d012373SWade Farnsworth #include <linux/tracepoint.h> 9bed04f93SJunghak Sung #include <media/videobuf2-v4l2.h> 102d012373SWade Farnsworth 1143d0f71fSSteven Rostedt (Red Hat) /* Enums require being exported to userspace, for user tool parsing */ 1243d0f71fSSteven Rostedt (Red Hat) #undef EM 1343d0f71fSSteven Rostedt (Red Hat) #undef EMe 1443d0f71fSSteven Rostedt (Red Hat) #define EM(a, b) TRACE_DEFINE_ENUM(a); 1543d0f71fSSteven Rostedt (Red Hat) #define EMe(a, b) TRACE_DEFINE_ENUM(a); 1643d0f71fSSteven Rostedt (Red Hat) 172d012373SWade Farnsworth #define show_type(type) \ 1843d0f71fSSteven Rostedt (Red Hat) __print_symbolic(type, SHOW_TYPE) 1943d0f71fSSteven Rostedt (Red Hat) 2043d0f71fSSteven Rostedt (Red Hat) #define SHOW_TYPE \ 2143d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VIDEO_CAPTURE, "VIDEO_CAPTURE" ) \ 2243d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VIDEO_OUTPUT, "VIDEO_OUTPUT" ) \ 2343d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VIDEO_OVERLAY, "VIDEO_OVERLAY" ) \ 2443d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VBI_CAPTURE, "VBI_CAPTURE" ) \ 2543d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VBI_OUTPUT, "VBI_OUTPUT" ) \ 2643d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, "SLICED_VBI_CAPTURE" ) \ 2743d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, "SLICED_VBI_OUTPUT" ) \ 2843d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, "VIDEO_OUTPUT_OVERLAY" ) \ 2943d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, "VIDEO_CAPTURE_MPLANE" ) \ 3043d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, "VIDEO_OUTPUT_MPLANE" ) \ 3143d0f71fSSteven Rostedt (Red Hat) EM( V4L2_BUF_TYPE_SDR_CAPTURE, "SDR_CAPTURE" ) \ 329effc72fSAntti Palosaari EM( V4L2_BUF_TYPE_SDR_OUTPUT, "SDR_OUTPUT" ) \ 33fb9ffa6aSLaurent Pinchart EM( V4L2_BUF_TYPE_META_CAPTURE, "META_CAPTURE" ) \ 3443d0f71fSSteven Rostedt (Red Hat) EMe(V4L2_BUF_TYPE_PRIVATE, "PRIVATE" ) 3543d0f71fSSteven Rostedt (Red Hat) 3643d0f71fSSteven Rostedt (Red Hat) SHOW_TYPE 372d012373SWade Farnsworth 382d012373SWade Farnsworth #define show_field(field) \ 3943d0f71fSSteven Rostedt (Red Hat) __print_symbolic(field, SHOW_FIELD) 4043d0f71fSSteven Rostedt (Red Hat) 4143d0f71fSSteven Rostedt (Red Hat) #define SHOW_FIELD \ 4243d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_ANY, "ANY" ) \ 4343d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_NONE, "NONE" ) \ 4443d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_TOP, "TOP" ) \ 4543d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_BOTTOM, "BOTTOM" ) \ 4643d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_INTERLACED, "INTERLACED" ) \ 4743d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_SEQ_TB, "SEQ_TB" ) \ 4843d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_SEQ_BT, "SEQ_BT" ) \ 4943d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_ALTERNATE, "ALTERNATE" ) \ 5043d0f71fSSteven Rostedt (Red Hat) EM( V4L2_FIELD_INTERLACED_TB, "INTERLACED_TB" ) \ 5143d0f71fSSteven Rostedt (Red Hat) EMe( V4L2_FIELD_INTERLACED_BT, "INTERLACED_BT" ) 5243d0f71fSSteven Rostedt (Red Hat) 5343d0f71fSSteven Rostedt (Red Hat) SHOW_FIELD 5443d0f71fSSteven Rostedt (Red Hat) 5543d0f71fSSteven Rostedt (Red Hat) /* 5643d0f71fSSteven Rostedt (Red Hat) * Now redefine the EM() and EMe() macros to map the enums to the strings 5743d0f71fSSteven Rostedt (Red Hat) * that will be printed in the output. 5843d0f71fSSteven Rostedt (Red Hat) */ 5943d0f71fSSteven Rostedt (Red Hat) #undef EM 6043d0f71fSSteven Rostedt (Red Hat) #undef EMe 6143d0f71fSSteven Rostedt (Red Hat) #define EM(a, b) {a, b}, 6243d0f71fSSteven Rostedt (Red Hat) #define EMe(a, b) {a, b} 6343d0f71fSSteven Rostedt (Red Hat) 6443d0f71fSSteven Rostedt (Red Hat) /* V4L2_TC_TYPE_* are macros, not defines, they do not need processing */ 652d012373SWade Farnsworth 662d012373SWade Farnsworth #define show_timecode_type(type) \ 672d012373SWade Farnsworth __print_symbolic(type, \ 682d012373SWade Farnsworth { V4L2_TC_TYPE_24FPS, "24FPS" }, \ 692d012373SWade Farnsworth { V4L2_TC_TYPE_25FPS, "25FPS" }, \ 702d012373SWade Farnsworth { V4L2_TC_TYPE_30FPS, "30FPS" }, \ 712d012373SWade Farnsworth { V4L2_TC_TYPE_50FPS, "50FPS" }, \ 722d012373SWade Farnsworth { V4L2_TC_TYPE_60FPS, "60FPS" }) 732d012373SWade Farnsworth 742d012373SWade Farnsworth #define show_flags(flags) \ 752d012373SWade Farnsworth __print_flags(flags, "|", \ 762d012373SWade Farnsworth { V4L2_BUF_FLAG_MAPPED, "MAPPED" }, \ 772d012373SWade Farnsworth { V4L2_BUF_FLAG_QUEUED, "QUEUED" }, \ 782d012373SWade Farnsworth { V4L2_BUF_FLAG_DONE, "DONE" }, \ 792d012373SWade Farnsworth { V4L2_BUF_FLAG_KEYFRAME, "KEYFRAME" }, \ 802d012373SWade Farnsworth { V4L2_BUF_FLAG_PFRAME, "PFRAME" }, \ 812d012373SWade Farnsworth { V4L2_BUF_FLAG_BFRAME, "BFRAME" }, \ 822d012373SWade Farnsworth { V4L2_BUF_FLAG_ERROR, "ERROR" }, \ 832d012373SWade Farnsworth { V4L2_BUF_FLAG_TIMECODE, "TIMECODE" }, \ 842d012373SWade Farnsworth { V4L2_BUF_FLAG_PREPARED, "PREPARED" }, \ 852d012373SWade Farnsworth { V4L2_BUF_FLAG_NO_CACHE_INVALIDATE, "NO_CACHE_INVALIDATE" }, \ 862d012373SWade Farnsworth { V4L2_BUF_FLAG_NO_CACHE_CLEAN, "NO_CACHE_CLEAN" }, \ 872d012373SWade Farnsworth { V4L2_BUF_FLAG_TIMESTAMP_MASK, "TIMESTAMP_MASK" }, \ 882d012373SWade Farnsworth { V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN, "TIMESTAMP_UNKNOWN" }, \ 892d012373SWade Farnsworth { V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC, "TIMESTAMP_MONOTONIC" }, \ 90dc199241SPeter Seiderer { V4L2_BUF_FLAG_TIMESTAMP_COPY, "TIMESTAMP_COPY" }, \ 91dc199241SPeter Seiderer { V4L2_BUF_FLAG_LAST, "LAST" }) 922d012373SWade Farnsworth 932d012373SWade Farnsworth #define show_timecode_flags(flags) \ 942d012373SWade Farnsworth __print_flags(flags, "|", \ 952d012373SWade Farnsworth { V4L2_TC_FLAG_DROPFRAME, "DROPFRAME" }, \ 962d012373SWade Farnsworth { V4L2_TC_FLAG_COLORFRAME, "COLORFRAME" }, \ 972d012373SWade Farnsworth { V4L2_TC_USERBITS_USERDEFINED, "USERBITS_USERDEFINED" }, \ 982d012373SWade Farnsworth { V4L2_TC_USERBITS_8BITCHARS, "USERBITS_8BITCHARS" }) 992d012373SWade Farnsworth 10085efe4e5SPhilipp Zabel DECLARE_EVENT_CLASS(v4l2_event_class, 10185efe4e5SPhilipp Zabel TP_PROTO(int minor, struct v4l2_buffer *buf), 10285efe4e5SPhilipp Zabel 10385efe4e5SPhilipp Zabel TP_ARGS(minor, buf), 10485efe4e5SPhilipp Zabel 10585efe4e5SPhilipp Zabel TP_STRUCT__entry( 10685efe4e5SPhilipp Zabel __field(int, minor) 10785efe4e5SPhilipp Zabel __field(u32, index) 10885efe4e5SPhilipp Zabel __field(u32, type) 10985efe4e5SPhilipp Zabel __field(u32, bytesused) 11085efe4e5SPhilipp Zabel __field(u32, flags) 11185efe4e5SPhilipp Zabel __field(u32, field) 11285efe4e5SPhilipp Zabel __field(s64, timestamp) 11385efe4e5SPhilipp Zabel __field(u32, timecode_type) 11485efe4e5SPhilipp Zabel __field(u32, timecode_flags) 11585efe4e5SPhilipp Zabel __field(u8, timecode_frames) 11685efe4e5SPhilipp Zabel __field(u8, timecode_seconds) 11785efe4e5SPhilipp Zabel __field(u8, timecode_minutes) 11885efe4e5SPhilipp Zabel __field(u8, timecode_hours) 11985efe4e5SPhilipp Zabel __field(u8, timecode_userbits0) 12085efe4e5SPhilipp Zabel __field(u8, timecode_userbits1) 12185efe4e5SPhilipp Zabel __field(u8, timecode_userbits2) 12285efe4e5SPhilipp Zabel __field(u8, timecode_userbits3) 12385efe4e5SPhilipp Zabel __field(u32, sequence) 12485efe4e5SPhilipp Zabel ), 12585efe4e5SPhilipp Zabel 12685efe4e5SPhilipp Zabel TP_fast_assign( 12785efe4e5SPhilipp Zabel __entry->minor = minor; 12885efe4e5SPhilipp Zabel __entry->index = buf->index; 12985efe4e5SPhilipp Zabel __entry->type = buf->type; 13085efe4e5SPhilipp Zabel __entry->bytesused = buf->bytesused; 13185efe4e5SPhilipp Zabel __entry->flags = buf->flags; 13285efe4e5SPhilipp Zabel __entry->field = buf->field; 133*77cdffcbSArnd Bergmann __entry->timestamp = v4l2_buffer_get_timestamp(buf); 13485efe4e5SPhilipp Zabel __entry->timecode_type = buf->timecode.type; 13585efe4e5SPhilipp Zabel __entry->timecode_flags = buf->timecode.flags; 13685efe4e5SPhilipp Zabel __entry->timecode_frames = buf->timecode.frames; 13785efe4e5SPhilipp Zabel __entry->timecode_seconds = buf->timecode.seconds; 13885efe4e5SPhilipp Zabel __entry->timecode_minutes = buf->timecode.minutes; 13985efe4e5SPhilipp Zabel __entry->timecode_hours = buf->timecode.hours; 14085efe4e5SPhilipp Zabel __entry->timecode_userbits0 = buf->timecode.userbits[0]; 14185efe4e5SPhilipp Zabel __entry->timecode_userbits1 = buf->timecode.userbits[1]; 14285efe4e5SPhilipp Zabel __entry->timecode_userbits2 = buf->timecode.userbits[2]; 14385efe4e5SPhilipp Zabel __entry->timecode_userbits3 = buf->timecode.userbits[3]; 14485efe4e5SPhilipp Zabel __entry->sequence = buf->sequence; 14585efe4e5SPhilipp Zabel ), 14685efe4e5SPhilipp Zabel 14785efe4e5SPhilipp Zabel TP_printk("minor = %d, index = %u, type = %s, bytesused = %u, " 14885efe4e5SPhilipp Zabel "flags = %s, field = %s, timestamp = %llu, " 14985efe4e5SPhilipp Zabel "timecode = { type = %s, flags = %s, frames = %u, " 15085efe4e5SPhilipp Zabel "seconds = %u, minutes = %u, hours = %u, " 15185efe4e5SPhilipp Zabel "userbits = { %u %u %u %u } }, sequence = %u", __entry->minor, 15285efe4e5SPhilipp Zabel __entry->index, show_type(__entry->type), 15385efe4e5SPhilipp Zabel __entry->bytesused, 15485efe4e5SPhilipp Zabel show_flags(__entry->flags), 15585efe4e5SPhilipp Zabel show_field(__entry->field), 15685efe4e5SPhilipp Zabel __entry->timestamp, 15785efe4e5SPhilipp Zabel show_timecode_type(__entry->timecode_type), 15885efe4e5SPhilipp Zabel show_timecode_flags(__entry->timecode_flags), 15985efe4e5SPhilipp Zabel __entry->timecode_frames, 16085efe4e5SPhilipp Zabel __entry->timecode_seconds, 16185efe4e5SPhilipp Zabel __entry->timecode_minutes, 16285efe4e5SPhilipp Zabel __entry->timecode_hours, 16385efe4e5SPhilipp Zabel __entry->timecode_userbits0, 16485efe4e5SPhilipp Zabel __entry->timecode_userbits1, 16585efe4e5SPhilipp Zabel __entry->timecode_userbits2, 16685efe4e5SPhilipp Zabel __entry->timecode_userbits3, 16785efe4e5SPhilipp Zabel __entry->sequence 16885efe4e5SPhilipp Zabel ) 1692d012373SWade Farnsworth ) 1702d012373SWade Farnsworth 17185efe4e5SPhilipp Zabel DEFINE_EVENT(v4l2_event_class, v4l2_dqbuf, 17285efe4e5SPhilipp Zabel TP_PROTO(int minor, struct v4l2_buffer *buf), 17385efe4e5SPhilipp Zabel TP_ARGS(minor, buf) 17485efe4e5SPhilipp Zabel ); 17585efe4e5SPhilipp Zabel 17685efe4e5SPhilipp Zabel DEFINE_EVENT(v4l2_event_class, v4l2_qbuf, 17785efe4e5SPhilipp Zabel TP_PROTO(int minor, struct v4l2_buffer *buf), 17885efe4e5SPhilipp Zabel TP_ARGS(minor, buf) 17985efe4e5SPhilipp Zabel ); 1802d012373SWade Farnsworth 181b0e0e1f8SJunghak Sung DECLARE_EVENT_CLASS(vb2_v4l2_event_class, 1822091f518SPhilipp Zabel TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 1832091f518SPhilipp Zabel TP_ARGS(q, vb), 1842091f518SPhilipp Zabel 1852091f518SPhilipp Zabel TP_STRUCT__entry( 1862091f518SPhilipp Zabel __field(int, minor) 1872091f518SPhilipp Zabel __field(u32, flags) 1882091f518SPhilipp Zabel __field(u32, field) 189d6dd645eSJunghak Sung __field(u64, timestamp) 1902091f518SPhilipp Zabel __field(u32, timecode_type) 1912091f518SPhilipp Zabel __field(u32, timecode_flags) 1922091f518SPhilipp Zabel __field(u8, timecode_frames) 1932091f518SPhilipp Zabel __field(u8, timecode_seconds) 1942091f518SPhilipp Zabel __field(u8, timecode_minutes) 1952091f518SPhilipp Zabel __field(u8, timecode_hours) 1962091f518SPhilipp Zabel __field(u8, timecode_userbits0) 1972091f518SPhilipp Zabel __field(u8, timecode_userbits1) 1982091f518SPhilipp Zabel __field(u8, timecode_userbits2) 1992091f518SPhilipp Zabel __field(u8, timecode_userbits3) 2002091f518SPhilipp Zabel __field(u32, sequence) 2012091f518SPhilipp Zabel ), 2022091f518SPhilipp Zabel 2032091f518SPhilipp Zabel TP_fast_assign( 2042d700715SJunghak Sung struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 205bed04f93SJunghak Sung struct v4l2_fh *owner = q->owner; 206bed04f93SJunghak Sung 207bed04f93SJunghak Sung __entry->minor = owner ? owner->vdev->minor : -1; 2082d700715SJunghak Sung __entry->flags = vbuf->flags; 2092d700715SJunghak Sung __entry->field = vbuf->field; 210d6dd645eSJunghak Sung __entry->timestamp = vb->timestamp; 2112d700715SJunghak Sung __entry->timecode_type = vbuf->timecode.type; 2122d700715SJunghak Sung __entry->timecode_flags = vbuf->timecode.flags; 2132d700715SJunghak Sung __entry->timecode_frames = vbuf->timecode.frames; 2142d700715SJunghak Sung __entry->timecode_seconds = vbuf->timecode.seconds; 2152d700715SJunghak Sung __entry->timecode_minutes = vbuf->timecode.minutes; 2162d700715SJunghak Sung __entry->timecode_hours = vbuf->timecode.hours; 2172d700715SJunghak Sung __entry->timecode_userbits0 = vbuf->timecode.userbits[0]; 2182d700715SJunghak Sung __entry->timecode_userbits1 = vbuf->timecode.userbits[1]; 2192d700715SJunghak Sung __entry->timecode_userbits2 = vbuf->timecode.userbits[2]; 2202d700715SJunghak Sung __entry->timecode_userbits3 = vbuf->timecode.userbits[3]; 2212d700715SJunghak Sung __entry->sequence = vbuf->sequence; 2222091f518SPhilipp Zabel ), 2232091f518SPhilipp Zabel 224b0e0e1f8SJunghak Sung TP_printk("minor=%d flags = %s, field = %s, " 2252091f518SPhilipp Zabel "timestamp = %llu, timecode = { type = %s, flags = %s, " 2262091f518SPhilipp Zabel "frames = %u, seconds = %u, minutes = %u, hours = %u, " 2272091f518SPhilipp Zabel "userbits = { %u %u %u %u } }, sequence = %u", __entry->minor, 2282091f518SPhilipp Zabel show_flags(__entry->flags), 2292091f518SPhilipp Zabel show_field(__entry->field), 2302091f518SPhilipp Zabel __entry->timestamp, 2312091f518SPhilipp Zabel show_timecode_type(__entry->timecode_type), 2322091f518SPhilipp Zabel show_timecode_flags(__entry->timecode_flags), 2332091f518SPhilipp Zabel __entry->timecode_frames, 2342091f518SPhilipp Zabel __entry->timecode_seconds, 2352091f518SPhilipp Zabel __entry->timecode_minutes, 2362091f518SPhilipp Zabel __entry->timecode_hours, 2372091f518SPhilipp Zabel __entry->timecode_userbits0, 2382091f518SPhilipp Zabel __entry->timecode_userbits1, 2392091f518SPhilipp Zabel __entry->timecode_userbits2, 2402091f518SPhilipp Zabel __entry->timecode_userbits3, 2412091f518SPhilipp Zabel __entry->sequence 2422091f518SPhilipp Zabel ) 2432091f518SPhilipp Zabel ) 2442091f518SPhilipp Zabel 245b0e0e1f8SJunghak Sung DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_buf_done, 2462091f518SPhilipp Zabel TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 2472091f518SPhilipp Zabel TP_ARGS(q, vb) 2482091f518SPhilipp Zabel ); 2492091f518SPhilipp Zabel 250b0e0e1f8SJunghak Sung DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_buf_queue, 2512091f518SPhilipp Zabel TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 2522091f518SPhilipp Zabel TP_ARGS(q, vb) 2532091f518SPhilipp Zabel ); 2542091f518SPhilipp Zabel 255b0e0e1f8SJunghak Sung DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_dqbuf, 2562091f518SPhilipp Zabel TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 2572091f518SPhilipp Zabel TP_ARGS(q, vb) 2582091f518SPhilipp Zabel ); 2592091f518SPhilipp Zabel 260b0e0e1f8SJunghak Sung DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_qbuf, 2612091f518SPhilipp Zabel TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 2622091f518SPhilipp Zabel TP_ARGS(q, vb) 2632091f518SPhilipp Zabel ); 2642091f518SPhilipp Zabel 2652d012373SWade Farnsworth #endif /* if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) */ 2662d012373SWade Farnsworth 2672d012373SWade Farnsworth /* This part must be outside protection */ 2682d012373SWade Farnsworth #include <trace/define_trace.h> 269