• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _MEDIA_VIDEOBUF2_INTERNAL_H
2 #define _MEDIA_VIDEOBUF2_INTERNAL_H
3 
4 #include <linux/err.h>
5 #include <linux/kernel.h>
6 #include <linux/module.h>
7 #include <media/videobuf2-core.h>
8 
9 extern int vb2_debug;
10 
11 #define dprintk(level, fmt, arg...)					      \
12 	do {								      \
13 		if (vb2_debug >= level)					      \
14 			pr_info("vb2: %s: " fmt, __func__, ## arg); \
15 	} while (0)
16 
17 #ifdef CONFIG_VIDEO_ADV_DEBUG
18 
19 /*
20  * If advanced debugging is on, then count how often each op is called
21  * successfully, which can either be per-buffer or per-queue.
22  *
23  * This makes it easy to check that the 'init' and 'cleanup'
24  * (and variations thereof) stay balanced.
25  */
26 
27 #define log_memop(vb, op)						\
28 	dprintk(2, "call_memop(%p, %d, %s)%s\n",			\
29 		(vb)->vb2_queue, (vb)->index, #op,			\
30 		(vb)->vb2_queue->mem_ops->op ? "" : " (nop)")
31 
32 #define call_memop(vb, op, args...)					\
33 ({									\
34 	struct vb2_queue *_q = (vb)->vb2_queue;				\
35 	int err;							\
36 									\
37 	log_memop(vb, op);						\
38 	err = _q->mem_ops->op ? _q->mem_ops->op(args) : 0;		\
39 	if (!err)							\
40 		(vb)->cnt_mem_ ## op++;					\
41 	err;								\
42 })
43 
44 #define call_ptr_memop(vb, op, args...)					\
45 ({									\
46 	struct vb2_queue *_q = (vb)->vb2_queue;				\
47 	void *ptr;							\
48 									\
49 	log_memop(vb, op);						\
50 	ptr = _q->mem_ops->op ? _q->mem_ops->op(args) : NULL;		\
51 	if (!IS_ERR_OR_NULL(ptr))					\
52 		(vb)->cnt_mem_ ## op++;					\
53 	ptr;								\
54 })
55 
56 #define call_void_memop(vb, op, args...)				\
57 ({									\
58 	struct vb2_queue *_q = (vb)->vb2_queue;				\
59 									\
60 	log_memop(vb, op);						\
61 	if (_q->mem_ops->op)						\
62 		_q->mem_ops->op(args);					\
63 	(vb)->cnt_mem_ ## op++;						\
64 })
65 
66 #define log_qop(q, op)							\
67 	dprintk(2, "call_qop(%p, %s)%s\n", q, #op,			\
68 		(q)->ops->op ? "" : " (nop)")
69 
70 #define call_qop(q, op, args...)					\
71 ({									\
72 	int err;							\
73 									\
74 	log_qop(q, op);							\
75 	err = (q)->ops->op ? (q)->ops->op(args) : 0;			\
76 	if (!err)							\
77 		(q)->cnt_ ## op++;					\
78 	err;								\
79 })
80 
81 #define call_void_qop(q, op, args...)					\
82 ({									\
83 	log_qop(q, op);							\
84 	if ((q)->ops->op)						\
85 		(q)->ops->op(args);					\
86 	(q)->cnt_ ## op++;						\
87 })
88 
89 #define log_vb_qop(vb, op, args...)					\
90 	dprintk(2, "call_vb_qop(%p, %d, %s)%s\n",			\
91 		(vb)->vb2_queue, (vb)->index, #op,			\
92 		(vb)->vb2_queue->ops->op ? "" : " (nop)")
93 
94 #define call_vb_qop(vb, op, args...)					\
95 ({									\
96 	int err;							\
97 									\
98 	log_vb_qop(vb, op);						\
99 	err = (vb)->vb2_queue->ops->op ?				\
100 		(vb)->vb2_queue->ops->op(args) : 0;			\
101 	if (!err)							\
102 		(vb)->cnt_ ## op++;					\
103 	err;								\
104 })
105 
106 #define call_void_vb_qop(vb, op, args...)				\
107 ({									\
108 	log_vb_qop(vb, op);						\
109 	if ((vb)->vb2_queue->ops->op)					\
110 		(vb)->vb2_queue->ops->op(args);				\
111 	(vb)->cnt_ ## op++;						\
112 })
113 
114 #else
115 
116 #define call_memop(vb, op, args...)					\
117 	((vb)->vb2_queue->mem_ops->op ?					\
118 		(vb)->vb2_queue->mem_ops->op(args) : 0)
119 
120 #define call_ptr_memop(vb, op, args...)					\
121 	((vb)->vb2_queue->mem_ops->op ?					\
122 		(vb)->vb2_queue->mem_ops->op(args) : NULL)
123 
124 #define call_void_memop(vb, op, args...)				\
125 	do {								\
126 		if ((vb)->vb2_queue->mem_ops->op)			\
127 			(vb)->vb2_queue->mem_ops->op(args);		\
128 	} while (0)
129 
130 #define call_qop(q, op, args...)					\
131 	((q)->ops->op ? (q)->ops->op(args) : 0)
132 
133 #define call_void_qop(q, op, args...)					\
134 	do {								\
135 		if ((q)->ops->op)					\
136 			(q)->ops->op(args);				\
137 	} while (0)
138 
139 #define call_vb_qop(vb, op, args...)					\
140 	((vb)->vb2_queue->ops->op ? (vb)->vb2_queue->ops->op(args) : 0)
141 
142 #define call_void_vb_qop(vb, op, args...)				\
143 	do {								\
144 		if ((vb)->vb2_queue->ops->op)				\
145 			(vb)->vb2_queue->ops->op(args);			\
146 	} while (0)
147 
148 #endif
149 
150 #define call_bufop(q, op, args...)					\
151 ({									\
152 	int ret = 0;							\
153 	if (q && q->buf_ops && q->buf_ops->op)				\
154 		ret = q->buf_ops->op(args);				\
155 	ret;								\
156 })
157 
158 bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb);
159 int vb2_verify_memory_type(struct vb2_queue *q,
160 		enum vb2_memory memory, unsigned int type);
161 #endif /* _MEDIA_VIDEOBUF2_INTERNAL_H */
162