xref: /OK3568_Linux_fs/kernel/include/trace/events/v4l2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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