1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2015 Samsung Electronics
7 * Author: jh1009.sung@samsung.com
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation.
14 #include <linux/err.h>
15 #include <linux/kernel.h>
16 #include <linux/module.h>
19 #include <media/dvbdev.h>
20 #include <media/dvb_vb2.h>
22 #define DVB_V2_MAX_SIZE (4096 * 188)
25 module_param(vb2_debug
, int, 0644);
27 #define dprintk(level, fmt, arg...) \
29 if (vb2_debug >= level) \
30 pr_info("vb2: %s: " fmt, __func__, ## arg); \
33 static int _queue_setup(struct vb2_queue
*vq
,
34 unsigned int *nbuffers
, unsigned int *nplanes
,
35 unsigned int sizes
[], struct device
*alloc_devs
[])
37 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vq
);
39 ctx
->buf_cnt
= *nbuffers
;
41 sizes
[0] = ctx
->buf_siz
;
44 * videobuf2-vmalloc allocator is context-less so no need to set
48 dprintk(3, "[%s] count=%d, size=%d\n", ctx
->name
,
54 static int _buffer_prepare(struct vb2_buffer
*vb
)
56 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
57 unsigned long size
= ctx
->buf_siz
;
59 if (vb2_plane_size(vb
, 0) < size
) {
60 dprintk(1, "[%s] data will not fit into plane (%lu < %lu)\n",
61 ctx
->name
, vb2_plane_size(vb
, 0), size
);
65 vb2_set_plane_payload(vb
, 0, size
);
66 dprintk(3, "[%s]\n", ctx
->name
);
71 static void _buffer_queue(struct vb2_buffer
*vb
)
73 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
74 struct dvb_buffer
*buf
= container_of(vb
, struct dvb_buffer
, vb
);
75 unsigned long flags
= 0;
77 spin_lock_irqsave(&ctx
->slock
, flags
);
78 list_add_tail(&buf
->list
, &ctx
->dvb_q
);
79 spin_unlock_irqrestore(&ctx
->slock
, flags
);
81 dprintk(3, "[%s]\n", ctx
->name
);
84 static int _start_streaming(struct vb2_queue
*vq
, unsigned int count
)
86 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vq
);
88 dprintk(3, "[%s] count=%d\n", ctx
->name
, count
);
92 static void _stop_streaming(struct vb2_queue
*vq
)
94 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vq
);
95 struct dvb_buffer
*buf
;
96 unsigned long flags
= 0;
98 dprintk(3, "[%s]\n", ctx
->name
);
100 spin_lock_irqsave(&ctx
->slock
, flags
);
101 while (!list_empty(&ctx
->dvb_q
)) {
102 buf
= list_entry(ctx
->dvb_q
.next
,
103 struct dvb_buffer
, list
);
104 vb2_buffer_done(&buf
->vb
, VB2_BUF_STATE_ERROR
);
105 list_del(&buf
->list
);
107 spin_unlock_irqrestore(&ctx
->slock
, flags
);
110 static void _dmxdev_lock(struct vb2_queue
*vq
)
112 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vq
);
114 mutex_lock(&ctx
->mutex
);
115 dprintk(3, "[%s]\n", ctx
->name
);
118 static void _dmxdev_unlock(struct vb2_queue
*vq
)
120 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vq
);
122 if (mutex_is_locked(&ctx
->mutex
))
123 mutex_unlock(&ctx
->mutex
);
124 dprintk(3, "[%s]\n", ctx
->name
);
127 static const struct vb2_ops dvb_vb2_qops
= {
128 .queue_setup
= _queue_setup
,
129 .buf_prepare
= _buffer_prepare
,
130 .buf_queue
= _buffer_queue
,
131 .start_streaming
= _start_streaming
,
132 .stop_streaming
= _stop_streaming
,
133 .wait_prepare
= _dmxdev_unlock
,
134 .wait_finish
= _dmxdev_lock
,
137 static void _fill_dmx_buffer(struct vb2_buffer
*vb
, void *pb
)
139 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
140 struct dmx_buffer
*b
= pb
;
142 b
->index
= vb
->index
;
143 b
->length
= vb
->planes
[0].length
;
144 b
->bytesused
= vb
->planes
[0].bytesused
;
145 b
->offset
= vb
->planes
[0].m
.offset
;
146 dprintk(3, "[%s]\n", ctx
->name
);
149 static int _fill_vb2_buffer(struct vb2_buffer
*vb
,
150 const void *pb
, struct vb2_plane
*planes
)
152 struct dvb_vb2_ctx
*ctx
= vb2_get_drv_priv(vb
->vb2_queue
);
154 planes
[0].bytesused
= 0;
155 dprintk(3, "[%s]\n", ctx
->name
);
160 static const struct vb2_buf_ops dvb_vb2_buf_ops
= {
161 .fill_user_buffer
= _fill_dmx_buffer
,
162 .fill_vb2_buffer
= _fill_vb2_buffer
,
166 * Videobuf operations
168 int dvb_vb2_init(struct dvb_vb2_ctx
*ctx
, const char *name
, int nonblocking
)
170 struct vb2_queue
*q
= &ctx
->vb_q
;
173 memset(ctx
, 0, sizeof(struct dvb_vb2_ctx
));
174 q
->type
= DVB_BUF_TYPE_CAPTURE
;
177 /**only mmap is supported currently*/
178 q
->io_modes
= VB2_MMAP
;
180 q
->buf_struct_size
= sizeof(struct dvb_buffer
);
181 q
->min_buffers_needed
= 1;
182 q
->ops
= &dvb_vb2_qops
;
183 q
->mem_ops
= &vb2_vmalloc_memops
;
184 q
->buf_ops
= &dvb_vb2_buf_ops
;
186 ret
= vb2_core_queue_init(q
);
188 ctx
->state
= DVB_VB2_STATE_NONE
;
189 dprintk(1, "[%s] errno=%d\n", ctx
->name
, ret
);
193 mutex_init(&ctx
->mutex
);
194 spin_lock_init(&ctx
->slock
);
195 INIT_LIST_HEAD(&ctx
->dvb_q
);
197 strlcpy(ctx
->name
, name
, DVB_VB2_NAME_MAX
);
198 ctx
->nonblocking
= nonblocking
;
199 ctx
->state
= DVB_VB2_STATE_INIT
;
201 dprintk(3, "[%s]\n", ctx
->name
);
206 int dvb_vb2_release(struct dvb_vb2_ctx
*ctx
)
208 struct vb2_queue
*q
= (struct vb2_queue
*)&ctx
->vb_q
;
210 if (ctx
->state
& DVB_VB2_STATE_INIT
)
211 vb2_core_queue_release(q
);
213 ctx
->state
= DVB_VB2_STATE_NONE
;
214 dprintk(3, "[%s]\n", ctx
->name
);
219 int dvb_vb2_stream_on(struct dvb_vb2_ctx
*ctx
)
221 struct vb2_queue
*q
= &ctx
->vb_q
;
224 ret
= vb2_core_streamon(q
, q
->type
);
226 ctx
->state
= DVB_VB2_STATE_NONE
;
227 dprintk(1, "[%s] errno=%d\n", ctx
->name
, ret
);
230 ctx
->state
|= DVB_VB2_STATE_STREAMON
;
231 dprintk(3, "[%s]\n", ctx
->name
);
236 int dvb_vb2_stream_off(struct dvb_vb2_ctx
*ctx
)
238 struct vb2_queue
*q
= (struct vb2_queue
*)&ctx
->vb_q
;
241 ctx
->state
&= ~DVB_VB2_STATE_STREAMON
;
242 ret
= vb2_core_streamoff(q
, q
->type
);
244 ctx
->state
= DVB_VB2_STATE_NONE
;
245 dprintk(1, "[%s] errno=%d\n", ctx
->name
, ret
);
248 dprintk(3, "[%s]\n", ctx
->name
);
253 int dvb_vb2_is_streaming(struct dvb_vb2_ctx
*ctx
)
255 return (ctx
->state
& DVB_VB2_STATE_STREAMON
);
258 int dvb_vb2_fill_buffer(struct dvb_vb2_ctx
*ctx
,
259 const unsigned char *src
, int len
,
260 enum dmx_buffer_flags
*buffer_flags
)
262 unsigned long flags
= 0;
265 unsigned char *psrc
= (unsigned char *)src
;
269 * normal case: This func is called twice from demux driver
270 * one with valid src pointer, second time with NULL pointer
274 spin_lock_irqsave(&ctx
->slock
, flags
);
275 if (buffer_flags
&& *buffer_flags
) {
276 ctx
->flags
|= *buffer_flags
;
281 if (list_empty(&ctx
->dvb_q
)) {
282 dprintk(3, "[%s] Buffer overflow!!!\n",
287 ctx
->buf
= list_entry(ctx
->dvb_q
.next
,
288 struct dvb_buffer
, list
);
289 ctx
->remain
= vb2_plane_size(&ctx
->buf
->vb
, 0);
293 if (!dvb_vb2_is_streaming(ctx
)) {
294 vb2_buffer_done(&ctx
->buf
->vb
, VB2_BUF_STATE_ERROR
);
295 list_del(&ctx
->buf
->list
);
301 ll
= min(todo
, ctx
->remain
);
302 vbuf
= vb2_plane_vaddr(&ctx
->buf
->vb
, 0);
303 memcpy(vbuf
+ ctx
->offset
, psrc
, ll
);
310 if (ctx
->remain
== 0) {
311 vb2_buffer_done(&ctx
->buf
->vb
, VB2_BUF_STATE_DONE
);
312 list_del(&ctx
->buf
->list
);
317 if (ctx
->nonblocking
&& ctx
->buf
) {
318 vb2_set_plane_payload(&ctx
->buf
->vb
, 0, ll
);
319 vb2_buffer_done(&ctx
->buf
->vb
, VB2_BUF_STATE_DONE
);
320 list_del(&ctx
->buf
->list
);
323 spin_unlock_irqrestore(&ctx
->slock
, flags
);
326 dprintk(1, "[%s] %d bytes are dropped.\n", ctx
->name
, todo
);
328 dprintk(3, "[%s]\n", ctx
->name
);
330 dprintk(3, "[%s] %d bytes are copied\n", ctx
->name
, len
- todo
);
334 int dvb_vb2_reqbufs(struct dvb_vb2_ctx
*ctx
, struct dmx_requestbuffers
*req
)
338 /* Adjust size to a sane value */
339 if (req
->size
> DVB_V2_MAX_SIZE
)
340 req
->size
= DVB_V2_MAX_SIZE
;
342 /* FIXME: round req->size to a 188 or 204 multiple */
344 ctx
->buf_siz
= req
->size
;
345 ctx
->buf_cnt
= req
->count
;
346 ret
= vb2_core_reqbufs(&ctx
->vb_q
, VB2_MEMORY_MMAP
, &req
->count
);
348 ctx
->state
= DVB_VB2_STATE_NONE
;
349 dprintk(1, "[%s] count=%d size=%d errno=%d\n", ctx
->name
,
350 ctx
->buf_cnt
, ctx
->buf_siz
, ret
);
353 ctx
->state
|= DVB_VB2_STATE_REQBUFS
;
354 dprintk(3, "[%s] count=%d size=%d\n", ctx
->name
,
355 ctx
->buf_cnt
, ctx
->buf_siz
);
360 int dvb_vb2_querybuf(struct dvb_vb2_ctx
*ctx
, struct dmx_buffer
*b
)
362 vb2_core_querybuf(&ctx
->vb_q
, b
->index
, b
);
363 dprintk(3, "[%s] index=%d\n", ctx
->name
, b
->index
);
367 int dvb_vb2_expbuf(struct dvb_vb2_ctx
*ctx
, struct dmx_exportbuffer
*exp
)
369 struct vb2_queue
*q
= &ctx
->vb_q
;
372 ret
= vb2_core_expbuf(&ctx
->vb_q
, &exp
->fd
, q
->type
, exp
->index
,
375 dprintk(1, "[%s] index=%d errno=%d\n", ctx
->name
,
379 dprintk(3, "[%s] index=%d fd=%d\n", ctx
->name
, exp
->index
, exp
->fd
);
384 int dvb_vb2_qbuf(struct dvb_vb2_ctx
*ctx
, struct dmx_buffer
*b
)
388 ret
= vb2_core_qbuf(&ctx
->vb_q
, b
->index
, b
);
390 dprintk(1, "[%s] index=%d errno=%d\n", ctx
->name
,
394 dprintk(5, "[%s] index=%d\n", ctx
->name
, b
->index
);
399 int dvb_vb2_dqbuf(struct dvb_vb2_ctx
*ctx
, struct dmx_buffer
*b
)
404 ret
= vb2_core_dqbuf(&ctx
->vb_q
, &b
->index
, b
, ctx
->nonblocking
);
406 dprintk(1, "[%s] errno=%d\n", ctx
->name
, ret
);
410 spin_lock_irqsave(&ctx
->slock
, flags
);
411 b
->count
= ctx
->count
++;
412 b
->flags
= ctx
->flags
;
414 spin_unlock_irqrestore(&ctx
->slock
, flags
);
416 dprintk(5, "[%s] index=%d, count=%d, flags=%d\n",
417 ctx
->name
, b
->index
, ctx
->count
, b
->flags
);
423 int dvb_vb2_mmap(struct dvb_vb2_ctx
*ctx
, struct vm_area_struct
*vma
)
427 ret
= vb2_mmap(&ctx
->vb_q
, vma
);
429 dprintk(1, "[%s] errno=%d\n", ctx
->name
, ret
);
432 dprintk(3, "[%s] ret=%d\n", ctx
->name
, ret
);
437 __poll_t
dvb_vb2_poll(struct dvb_vb2_ctx
*ctx
, struct file
*file
,
440 dprintk(3, "[%s]\n", ctx
->name
);
441 return vb2_core_poll(&ctx
->vb_q
, file
, wait
);