1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM v4l2 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_V4L2_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/tracepoint.h> 9*4882a593Smuzhiyun #include <media/videobuf2-v4l2.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Enums require being exported to userspace, for user tool parsing */ 12*4882a593Smuzhiyun #undef EM 13*4882a593Smuzhiyun #undef EMe 14*4882a593Smuzhiyun #define EM(a, b) TRACE_DEFINE_ENUM(a); 15*4882a593Smuzhiyun #define EMe(a, b) TRACE_DEFINE_ENUM(a); 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define show_type(type) \ 18*4882a593Smuzhiyun __print_symbolic(type, SHOW_TYPE) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define SHOW_TYPE \ 21*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VIDEO_CAPTURE, "VIDEO_CAPTURE" ) \ 22*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VIDEO_OUTPUT, "VIDEO_OUTPUT" ) \ 23*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VIDEO_OVERLAY, "VIDEO_OVERLAY" ) \ 24*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VBI_CAPTURE, "VBI_CAPTURE" ) \ 25*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VBI_OUTPUT, "VBI_OUTPUT" ) \ 26*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, "SLICED_VBI_CAPTURE" ) \ 27*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, "SLICED_VBI_OUTPUT" ) \ 28*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, "VIDEO_OUTPUT_OVERLAY" ) \ 29*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, "VIDEO_CAPTURE_MPLANE" ) \ 30*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, "VIDEO_OUTPUT_MPLANE" ) \ 31*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_SDR_CAPTURE, "SDR_CAPTURE" ) \ 32*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_SDR_OUTPUT, "SDR_OUTPUT" ) \ 33*4882a593Smuzhiyun EM( V4L2_BUF_TYPE_META_CAPTURE, "META_CAPTURE" ) \ 34*4882a593Smuzhiyun EMe(V4L2_BUF_TYPE_PRIVATE, "PRIVATE" ) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun SHOW_TYPE 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define show_field(field) \ 39*4882a593Smuzhiyun __print_symbolic(field, SHOW_FIELD) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define SHOW_FIELD \ 42*4882a593Smuzhiyun EM( V4L2_FIELD_ANY, "ANY" ) \ 43*4882a593Smuzhiyun EM( V4L2_FIELD_NONE, "NONE" ) \ 44*4882a593Smuzhiyun EM( V4L2_FIELD_TOP, "TOP" ) \ 45*4882a593Smuzhiyun EM( V4L2_FIELD_BOTTOM, "BOTTOM" ) \ 46*4882a593Smuzhiyun EM( V4L2_FIELD_INTERLACED, "INTERLACED" ) \ 47*4882a593Smuzhiyun EM( V4L2_FIELD_SEQ_TB, "SEQ_TB" ) \ 48*4882a593Smuzhiyun EM( V4L2_FIELD_SEQ_BT, "SEQ_BT" ) \ 49*4882a593Smuzhiyun EM( V4L2_FIELD_ALTERNATE, "ALTERNATE" ) \ 50*4882a593Smuzhiyun EM( V4L2_FIELD_INTERLACED_TB, "INTERLACED_TB" ) \ 51*4882a593Smuzhiyun EMe( V4L2_FIELD_INTERLACED_BT, "INTERLACED_BT" ) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun SHOW_FIELD 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* 56*4882a593Smuzhiyun * Now redefine the EM() and EMe() macros to map the enums to the strings 57*4882a593Smuzhiyun * that will be printed in the output. 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun #undef EM 60*4882a593Smuzhiyun #undef EMe 61*4882a593Smuzhiyun #define EM(a, b) {a, b}, 62*4882a593Smuzhiyun #define EMe(a, b) {a, b} 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* V4L2_TC_TYPE_* are macros, not defines, they do not need processing */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define show_timecode_type(type) \ 67*4882a593Smuzhiyun __print_symbolic(type, \ 68*4882a593Smuzhiyun { V4L2_TC_TYPE_24FPS, "24FPS" }, \ 69*4882a593Smuzhiyun { V4L2_TC_TYPE_25FPS, "25FPS" }, \ 70*4882a593Smuzhiyun { V4L2_TC_TYPE_30FPS, "30FPS" }, \ 71*4882a593Smuzhiyun { V4L2_TC_TYPE_50FPS, "50FPS" }, \ 72*4882a593Smuzhiyun { V4L2_TC_TYPE_60FPS, "60FPS" }) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define show_flags(flags) \ 75*4882a593Smuzhiyun __print_flags(flags, "|", \ 76*4882a593Smuzhiyun { V4L2_BUF_FLAG_MAPPED, "MAPPED" }, \ 77*4882a593Smuzhiyun { V4L2_BUF_FLAG_QUEUED, "QUEUED" }, \ 78*4882a593Smuzhiyun { V4L2_BUF_FLAG_DONE, "DONE" }, \ 79*4882a593Smuzhiyun { V4L2_BUF_FLAG_KEYFRAME, "KEYFRAME" }, \ 80*4882a593Smuzhiyun { V4L2_BUF_FLAG_PFRAME, "PFRAME" }, \ 81*4882a593Smuzhiyun { V4L2_BUF_FLAG_BFRAME, "BFRAME" }, \ 82*4882a593Smuzhiyun { V4L2_BUF_FLAG_ERROR, "ERROR" }, \ 83*4882a593Smuzhiyun { V4L2_BUF_FLAG_TIMECODE, "TIMECODE" }, \ 84*4882a593Smuzhiyun { V4L2_BUF_FLAG_PREPARED, "PREPARED" }, \ 85*4882a593Smuzhiyun { V4L2_BUF_FLAG_NO_CACHE_INVALIDATE, "NO_CACHE_INVALIDATE" }, \ 86*4882a593Smuzhiyun { V4L2_BUF_FLAG_NO_CACHE_CLEAN, "NO_CACHE_CLEAN" }, \ 87*4882a593Smuzhiyun { V4L2_BUF_FLAG_TIMESTAMP_MASK, "TIMESTAMP_MASK" }, \ 88*4882a593Smuzhiyun { V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN, "TIMESTAMP_UNKNOWN" }, \ 89*4882a593Smuzhiyun { V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC, "TIMESTAMP_MONOTONIC" }, \ 90*4882a593Smuzhiyun { V4L2_BUF_FLAG_TIMESTAMP_COPY, "TIMESTAMP_COPY" }, \ 91*4882a593Smuzhiyun { V4L2_BUF_FLAG_LAST, "LAST" }) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define show_timecode_flags(flags) \ 94*4882a593Smuzhiyun __print_flags(flags, "|", \ 95*4882a593Smuzhiyun { V4L2_TC_FLAG_DROPFRAME, "DROPFRAME" }, \ 96*4882a593Smuzhiyun { V4L2_TC_FLAG_COLORFRAME, "COLORFRAME" }, \ 97*4882a593Smuzhiyun { V4L2_TC_USERBITS_USERDEFINED, "USERBITS_USERDEFINED" }, \ 98*4882a593Smuzhiyun { V4L2_TC_USERBITS_8BITCHARS, "USERBITS_8BITCHARS" }) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun DECLARE_EVENT_CLASS(v4l2_event_class, 101*4882a593Smuzhiyun TP_PROTO(int minor, struct v4l2_buffer *buf), 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_ARGS(minor, buf), 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun TP_STRUCT__entry( 106*4882a593Smuzhiyun __field(int, minor) 107*4882a593Smuzhiyun __field(u32, index) 108*4882a593Smuzhiyun __field(u32, type) 109*4882a593Smuzhiyun __field(u32, bytesused) 110*4882a593Smuzhiyun __field(u32, flags) 111*4882a593Smuzhiyun __field(u32, field) 112*4882a593Smuzhiyun __field(s64, timestamp) 113*4882a593Smuzhiyun __field(u32, timecode_type) 114*4882a593Smuzhiyun __field(u32, timecode_flags) 115*4882a593Smuzhiyun __field(u8, timecode_frames) 116*4882a593Smuzhiyun __field(u8, timecode_seconds) 117*4882a593Smuzhiyun __field(u8, timecode_minutes) 118*4882a593Smuzhiyun __field(u8, timecode_hours) 119*4882a593Smuzhiyun __field(u8, timecode_userbits0) 120*4882a593Smuzhiyun __field(u8, timecode_userbits1) 121*4882a593Smuzhiyun __field(u8, timecode_userbits2) 122*4882a593Smuzhiyun __field(u8, timecode_userbits3) 123*4882a593Smuzhiyun __field(u32, sequence) 124*4882a593Smuzhiyun ), 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun TP_fast_assign( 127*4882a593Smuzhiyun __entry->minor = minor; 128*4882a593Smuzhiyun __entry->index = buf->index; 129*4882a593Smuzhiyun __entry->type = buf->type; 130*4882a593Smuzhiyun __entry->bytesused = buf->bytesused; 131*4882a593Smuzhiyun __entry->flags = buf->flags; 132*4882a593Smuzhiyun __entry->field = buf->field; 133*4882a593Smuzhiyun __entry->timestamp = v4l2_buffer_get_timestamp(buf); 134*4882a593Smuzhiyun __entry->timecode_type = buf->timecode.type; 135*4882a593Smuzhiyun __entry->timecode_flags = buf->timecode.flags; 136*4882a593Smuzhiyun __entry->timecode_frames = buf->timecode.frames; 137*4882a593Smuzhiyun __entry->timecode_seconds = buf->timecode.seconds; 138*4882a593Smuzhiyun __entry->timecode_minutes = buf->timecode.minutes; 139*4882a593Smuzhiyun __entry->timecode_hours = buf->timecode.hours; 140*4882a593Smuzhiyun __entry->timecode_userbits0 = buf->timecode.userbits[0]; 141*4882a593Smuzhiyun __entry->timecode_userbits1 = buf->timecode.userbits[1]; 142*4882a593Smuzhiyun __entry->timecode_userbits2 = buf->timecode.userbits[2]; 143*4882a593Smuzhiyun __entry->timecode_userbits3 = buf->timecode.userbits[3]; 144*4882a593Smuzhiyun __entry->sequence = buf->sequence; 145*4882a593Smuzhiyun ), 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun TP_printk("minor = %d, index = %u, type = %s, bytesused = %u, " 148*4882a593Smuzhiyun "flags = %s, field = %s, timestamp = %llu, " 149*4882a593Smuzhiyun "timecode = { type = %s, flags = %s, frames = %u, " 150*4882a593Smuzhiyun "seconds = %u, minutes = %u, hours = %u, " 151*4882a593Smuzhiyun "userbits = { %u %u %u %u } }, sequence = %u", __entry->minor, 152*4882a593Smuzhiyun __entry->index, show_type(__entry->type), 153*4882a593Smuzhiyun __entry->bytesused, 154*4882a593Smuzhiyun show_flags(__entry->flags), 155*4882a593Smuzhiyun show_field(__entry->field), 156*4882a593Smuzhiyun __entry->timestamp, 157*4882a593Smuzhiyun show_timecode_type(__entry->timecode_type), 158*4882a593Smuzhiyun show_timecode_flags(__entry->timecode_flags), 159*4882a593Smuzhiyun __entry->timecode_frames, 160*4882a593Smuzhiyun __entry->timecode_seconds, 161*4882a593Smuzhiyun __entry->timecode_minutes, 162*4882a593Smuzhiyun __entry->timecode_hours, 163*4882a593Smuzhiyun __entry->timecode_userbits0, 164*4882a593Smuzhiyun __entry->timecode_userbits1, 165*4882a593Smuzhiyun __entry->timecode_userbits2, 166*4882a593Smuzhiyun __entry->timecode_userbits3, 167*4882a593Smuzhiyun __entry->sequence 168*4882a593Smuzhiyun ) 169*4882a593Smuzhiyun ) 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun DEFINE_EVENT(v4l2_event_class, v4l2_dqbuf, 172*4882a593Smuzhiyun TP_PROTO(int minor, struct v4l2_buffer *buf), 173*4882a593Smuzhiyun TP_ARGS(minor, buf) 174*4882a593Smuzhiyun ); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun DEFINE_EVENT(v4l2_event_class, v4l2_qbuf, 177*4882a593Smuzhiyun TP_PROTO(int minor, struct v4l2_buffer *buf), 178*4882a593Smuzhiyun TP_ARGS(minor, buf) 179*4882a593Smuzhiyun ); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun DECLARE_EVENT_CLASS(vb2_v4l2_event_class, 182*4882a593Smuzhiyun TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 183*4882a593Smuzhiyun TP_ARGS(q, vb), 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun TP_STRUCT__entry( 186*4882a593Smuzhiyun __field(int, minor) 187*4882a593Smuzhiyun __field(u32, flags) 188*4882a593Smuzhiyun __field(u32, field) 189*4882a593Smuzhiyun __field(u64, timestamp) 190*4882a593Smuzhiyun __field(u32, timecode_type) 191*4882a593Smuzhiyun __field(u32, timecode_flags) 192*4882a593Smuzhiyun __field(u8, timecode_frames) 193*4882a593Smuzhiyun __field(u8, timecode_seconds) 194*4882a593Smuzhiyun __field(u8, timecode_minutes) 195*4882a593Smuzhiyun __field(u8, timecode_hours) 196*4882a593Smuzhiyun __field(u8, timecode_userbits0) 197*4882a593Smuzhiyun __field(u8, timecode_userbits1) 198*4882a593Smuzhiyun __field(u8, timecode_userbits2) 199*4882a593Smuzhiyun __field(u8, timecode_userbits3) 200*4882a593Smuzhiyun __field(u32, sequence) 201*4882a593Smuzhiyun ), 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun TP_fast_assign( 204*4882a593Smuzhiyun struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 205*4882a593Smuzhiyun struct v4l2_fh *owner = q->owner; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun __entry->minor = owner ? owner->vdev->minor : -1; 208*4882a593Smuzhiyun __entry->flags = vbuf->flags; 209*4882a593Smuzhiyun __entry->field = vbuf->field; 210*4882a593Smuzhiyun __entry->timestamp = vb->timestamp; 211*4882a593Smuzhiyun __entry->timecode_type = vbuf->timecode.type; 212*4882a593Smuzhiyun __entry->timecode_flags = vbuf->timecode.flags; 213*4882a593Smuzhiyun __entry->timecode_frames = vbuf->timecode.frames; 214*4882a593Smuzhiyun __entry->timecode_seconds = vbuf->timecode.seconds; 215*4882a593Smuzhiyun __entry->timecode_minutes = vbuf->timecode.minutes; 216*4882a593Smuzhiyun __entry->timecode_hours = vbuf->timecode.hours; 217*4882a593Smuzhiyun __entry->timecode_userbits0 = vbuf->timecode.userbits[0]; 218*4882a593Smuzhiyun __entry->timecode_userbits1 = vbuf->timecode.userbits[1]; 219*4882a593Smuzhiyun __entry->timecode_userbits2 = vbuf->timecode.userbits[2]; 220*4882a593Smuzhiyun __entry->timecode_userbits3 = vbuf->timecode.userbits[3]; 221*4882a593Smuzhiyun __entry->sequence = vbuf->sequence; 222*4882a593Smuzhiyun ), 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun TP_printk("minor=%d flags = %s, field = %s, " 225*4882a593Smuzhiyun "timestamp = %llu, timecode = { type = %s, flags = %s, " 226*4882a593Smuzhiyun "frames = %u, seconds = %u, minutes = %u, hours = %u, " 227*4882a593Smuzhiyun "userbits = { %u %u %u %u } }, sequence = %u", __entry->minor, 228*4882a593Smuzhiyun show_flags(__entry->flags), 229*4882a593Smuzhiyun show_field(__entry->field), 230*4882a593Smuzhiyun __entry->timestamp, 231*4882a593Smuzhiyun show_timecode_type(__entry->timecode_type), 232*4882a593Smuzhiyun show_timecode_flags(__entry->timecode_flags), 233*4882a593Smuzhiyun __entry->timecode_frames, 234*4882a593Smuzhiyun __entry->timecode_seconds, 235*4882a593Smuzhiyun __entry->timecode_minutes, 236*4882a593Smuzhiyun __entry->timecode_hours, 237*4882a593Smuzhiyun __entry->timecode_userbits0, 238*4882a593Smuzhiyun __entry->timecode_userbits1, 239*4882a593Smuzhiyun __entry->timecode_userbits2, 240*4882a593Smuzhiyun __entry->timecode_userbits3, 241*4882a593Smuzhiyun __entry->sequence 242*4882a593Smuzhiyun ) 243*4882a593Smuzhiyun ) 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_buf_done, 246*4882a593Smuzhiyun TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 247*4882a593Smuzhiyun TP_ARGS(q, vb) 248*4882a593Smuzhiyun ); 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_buf_queue, 251*4882a593Smuzhiyun TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 252*4882a593Smuzhiyun TP_ARGS(q, vb) 253*4882a593Smuzhiyun ); 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_dqbuf, 256*4882a593Smuzhiyun TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 257*4882a593Smuzhiyun TP_ARGS(q, vb) 258*4882a593Smuzhiyun ); 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun DEFINE_EVENT(vb2_v4l2_event_class, vb2_v4l2_qbuf, 261*4882a593Smuzhiyun TP_PROTO(struct vb2_queue *q, struct vb2_buffer *vb), 262*4882a593Smuzhiyun TP_ARGS(q, vb) 263*4882a593Smuzhiyun ); 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun #endif /* if !defined(_TRACE_V4L2_H) || defined(TRACE_HEADER_MULTI_READ) */ 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* This part must be outside protection */ 268*4882a593Smuzhiyun #include <trace/define_trace.h> 269