Skip to content

Commit 7cf901b

Browse files
committed
Merge tag 'media/v4.16-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media fixes from Mauro Carvalho Chehab: - some build fixes with randconfigs - an m88ds3103 fix to prevent an OOPS if the chip doesn't provide the right version during probe (with can happen if the hardware hangs) - a potential out of array bounds reference in tvp5150 - some fixes and improvements in the DVB memory mapped API (added for kernel 4.16) * tag 'media/v4.16-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: media: vb2: Makefile: place vb2-trace together with vb2-core media: Don't let tvp5150_get_vbi() go out of vbi_ram_default array media: dvb: update buffer mmaped flags and frame counter media: dvb: add continuity error indicators for memory mapped buffers media: dmxdev: Fix the logic that enables DMA mmap support media: dmxdev: fix error code for invalid ioctls media: m88ds3103: don't call a non-initalized function media: au0828: add VIDEO_V4L2 dependency media: dvb: fix DVB_MMAP dependency media: dvb: fix DVB_MMAP symbol name media: videobuf2: fix build issues with vb2-trace media: videobuf2: Add VIDEOBUF2_V4L2 Kconfig option for VB2 V4L2 part
2 parents d6d0972 + 7dbdd16 commit 7cf901b

File tree

24 files changed

+329
-175
lines changed

24 files changed

+329
-175
lines changed

Documentation/media/dmx.h.rst.exceptions

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,15 @@ replace typedef dmx_filter_t :c:type:`dmx_filter`
5050
replace typedef dmx_pes_type_t :c:type:`dmx_pes_type`
5151
replace typedef dmx_input_t :c:type:`dmx_input`
5252

53-
ignore symbol DMX_OUT_DECODER
54-
ignore symbol DMX_OUT_TAP
55-
ignore symbol DMX_OUT_TS_TAP
56-
ignore symbol DMX_OUT_TSDEMUX_TAP
53+
replace symbol DMX_BUFFER_FLAG_HAD_CRC32_DISCARD :c:type:`dmx_buffer_flags`
54+
replace symbol DMX_BUFFER_FLAG_TEI :c:type:`dmx_buffer_flags`
55+
replace symbol DMX_BUFFER_PKT_COUNTER_MISMATCH :c:type:`dmx_buffer_flags`
56+
replace symbol DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED :c:type:`dmx_buffer_flags`
57+
replace symbol DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR :c:type:`dmx_buffer_flags`
58+
59+
replace symbol DMX_OUT_DECODER :c:type:`dmx_output`
60+
replace symbol DMX_OUT_TAP :c:type:`dmx_output`
61+
replace symbol DMX_OUT_TS_TAP :c:type:`dmx_output`
62+
replace symbol DMX_OUT_TSDEMUX_TAP :c:type:`dmx_output`
5763

5864
replace ioctl DMX_DQBUF dmx_qbuf

Documentation/media/uapi/dvb/dmx-qbuf.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ out to disk. Buffers remain locked until dequeued, until the
5151
the device is closed.
5252
5353
Applications call the ``DMX_DQBUF`` ioctl to dequeue a filled
54-
(capturing) buffer from the driver's outgoing queue. They just set the ``reserved`` field array to zero. When ``DMX_DQBUF`` is called with a
55-
pointer to this structure, the driver fills the remaining fields or
56-
returns an error code.
54+
(capturing) buffer from the driver's outgoing queue.
55+
They just set the ``index`` field withe the buffer ID to be queued.
56+
When ``DMX_DQBUF`` is called with a pointer to struct :c:type:`dmx_buffer`,
57+
the driver fills the remaining fields or returns an error code.
5758
5859
By default ``DMX_DQBUF`` blocks when no buffer is in the outgoing
5960
queue. When the ``O_NONBLOCK`` flag was given to the

drivers/media/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ config DVB_CORE
147147
config DVB_MMAP
148148
bool "Enable DVB memory-mapped API (EXPERIMENTAL)"
149149
depends on DVB_CORE
150+
depends on VIDEO_V4L2=y || VIDEO_V4L2=DVB_CORE
151+
select VIDEOBUF2_VMALLOC
150152
default n
151153
help
152154
This option enables DVB experimental memory-mapped API, with

drivers/media/common/videobuf2/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ config VIDEOBUF2_CORE
33
select DMA_SHARED_BUFFER
44
tristate
55

6+
config VIDEOBUF2_V4L2
7+
tristate
8+
69
config VIDEOBUF2_MEMOPS
710
tristate
811
select FRAME_VECTOR

drivers/media/common/videobuf2/Makefile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
# SPDX-License-Identifier: GPL-2.0
2+
videobuf2-common-objs := videobuf2-core.o
13

2-
obj-$(CONFIG_VIDEOBUF2_CORE) += videobuf2-core.o videobuf2-v4l2.o
4+
ifeq ($(CONFIG_TRACEPOINTS),y)
5+
videobuf2-common-objs += vb2-trace.o
6+
endif
7+
8+
obj-$(CONFIG_VIDEOBUF2_CORE) += videobuf2-common.o
9+
obj-$(CONFIG_VIDEOBUF2_V4L2) += videobuf2-v4l2.o
310
obj-$(CONFIG_VIDEOBUF2_MEMOPS) += videobuf2-memops.o
411
obj-$(CONFIG_VIDEOBUF2_VMALLOC) += videobuf2-vmalloc.o
512
obj-$(CONFIG_VIDEOBUF2_DMA_CONTIG) += videobuf2-dma-contig.o

drivers/media/dvb-core/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55

66
dvb-net-$(CONFIG_DVB_NET) := dvb_net.o
7-
dvb-vb2-$(CONFIG_DVB_MMSP) := dvb_vb2.o
7+
dvb-vb2-$(CONFIG_DVB_MMAP) := dvb_vb2.o
88

99
dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \
1010
dvb_ca_en50221.o dvb_frontend.o \

drivers/media/dvb-core/dmxdev.c

Lines changed: 65 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
128128
struct dvb_device *dvbdev = file->private_data;
129129
struct dmxdev *dmxdev = dvbdev->priv;
130130
struct dmx_frontend *front;
131-
#ifndef DVB_MMAP
132131
bool need_ringbuffer = false;
133-
#else
134-
const bool need_ringbuffer = true;
135-
#endif
136132

137133
dprintk("%s\n", __func__);
138134

@@ -144,17 +140,31 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
144140
return -ENODEV;
145141
}
146142

147-
#ifndef DVB_MMAP
143+
dmxdev->may_do_mmap = 0;
144+
145+
/*
146+
* The logic here is a little tricky due to the ifdef.
147+
*
148+
* The ringbuffer is used for both read and mmap.
149+
*
150+
* It is not needed, however, on two situations:
151+
* - Write devices (access with O_WRONLY);
152+
* - For duplex device nodes, opened with O_RDWR.
153+
*/
154+
148155
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
149156
need_ringbuffer = true;
150-
#else
151-
if ((file->f_flags & O_ACCMODE) == O_RDWR) {
157+
else if ((file->f_flags & O_ACCMODE) == O_RDWR) {
152158
if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) {
159+
#ifdef CONFIG_DVB_MMAP
160+
dmxdev->may_do_mmap = 1;
161+
need_ringbuffer = true;
162+
#else
153163
mutex_unlock(&dmxdev->mutex);
154164
return -EOPNOTSUPP;
165+
#endif
155166
}
156167
}
157-
#endif
158168

159169
if (need_ringbuffer) {
160170
void *mem;
@@ -169,8 +179,9 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
169179
return -ENOMEM;
170180
}
171181
dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
172-
dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr",
173-
file->f_flags & O_NONBLOCK);
182+
if (dmxdev->may_do_mmap)
183+
dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr",
184+
file->f_flags & O_NONBLOCK);
174185
dvbdev->readers--;
175186
}
176187

@@ -200,11 +211,6 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
200211
{
201212
struct dvb_device *dvbdev = file->private_data;
202213
struct dmxdev *dmxdev = dvbdev->priv;
203-
#ifndef DVB_MMAP
204-
bool need_ringbuffer = false;
205-
#else
206-
const bool need_ringbuffer = true;
207-
#endif
208214

209215
mutex_lock(&dmxdev->mutex);
210216

@@ -213,15 +219,14 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
213219
dmxdev->demux->connect_frontend(dmxdev->demux,
214220
dmxdev->dvr_orig_fe);
215221
}
216-
#ifndef DVB_MMAP
217-
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
218-
need_ringbuffer = true;
219-
#endif
220222

221-
if (need_ringbuffer) {
222-
if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
223-
dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx);
224-
dvb_vb2_release(&dmxdev->dvr_vb2_ctx);
223+
if (((file->f_flags & O_ACCMODE) == O_RDONLY) ||
224+
dmxdev->may_do_mmap) {
225+
if (dmxdev->may_do_mmap) {
226+
if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
227+
dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx);
228+
dvb_vb2_release(&dmxdev->dvr_vb2_ctx);
229+
}
225230
dvbdev->readers++;
226231
if (dmxdev->dvr_buffer.data) {
227232
void *mem = dmxdev->dvr_buffer.data;
@@ -380,7 +385,8 @@ static void dvb_dmxdev_filter_timer(struct dmxdev_filter *dmxdevfilter)
380385

381386
static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
382387
const u8 *buffer2, size_t buffer2_len,
383-
struct dmx_section_filter *filter)
388+
struct dmx_section_filter *filter,
389+
u32 *buffer_flags)
384390
{
385391
struct dmxdev_filter *dmxdevfilter = filter->priv;
386392
int ret;
@@ -399,10 +405,12 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
399405
dprintk("section callback %*ph\n", 6, buffer1);
400406
if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) {
401407
ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx,
402-
buffer1, buffer1_len);
408+
buffer1, buffer1_len,
409+
buffer_flags);
403410
if (ret == buffer1_len)
404411
ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx,
405-
buffer2, buffer2_len);
412+
buffer2, buffer2_len,
413+
buffer_flags);
406414
} else {
407415
ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer,
408416
buffer1, buffer1_len);
@@ -422,11 +430,12 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
422430

423431
static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
424432
const u8 *buffer2, size_t buffer2_len,
425-
struct dmx_ts_feed *feed)
433+
struct dmx_ts_feed *feed,
434+
u32 *buffer_flags)
426435
{
427436
struct dmxdev_filter *dmxdevfilter = feed->priv;
428437
struct dvb_ringbuffer *buffer;
429-
#ifdef DVB_MMAP
438+
#ifdef CONFIG_DVB_MMAP
430439
struct dvb_vb2_ctx *ctx;
431440
#endif
432441
int ret;
@@ -440,20 +449,22 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
440449
if (dmxdevfilter->params.pes.output == DMX_OUT_TAP ||
441450
dmxdevfilter->params.pes.output == DMX_OUT_TSDEMUX_TAP) {
442451
buffer = &dmxdevfilter->buffer;
443-
#ifdef DVB_MMAP
452+
#ifdef CONFIG_DVB_MMAP
444453
ctx = &dmxdevfilter->vb2_ctx;
445454
#endif
446455
} else {
447456
buffer = &dmxdevfilter->dev->dvr_buffer;
448-
#ifdef DVB_MMAP
457+
#ifdef CONFIG_DVB_MMAP
449458
ctx = &dmxdevfilter->dev->dvr_vb2_ctx;
450459
#endif
451460
}
452461

453462
if (dvb_vb2_is_streaming(ctx)) {
454-
ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len);
463+
ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len,
464+
buffer_flags);
455465
if (ret == buffer1_len)
456-
ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len);
466+
ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len,
467+
buffer_flags);
457468
} else {
458469
if (buffer->error) {
459470
spin_unlock(&dmxdevfilter->dev->lock);
@@ -802,6 +813,12 @@ static int dvb_demux_open(struct inode *inode, struct file *file)
802813
mutex_init(&dmxdevfilter->mutex);
803814
file->private_data = dmxdevfilter;
804815

816+
#ifdef CONFIG_DVB_MMAP
817+
dmxdev->may_do_mmap = 1;
818+
#else
819+
dmxdev->may_do_mmap = 0;
820+
#endif
821+
805822
dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192);
806823
dvb_vb2_init(&dmxdevfilter->vb2_ctx, "demux_filter",
807824
file->f_flags & O_NONBLOCK);
@@ -1111,7 +1128,7 @@ static int dvb_demux_do_ioctl(struct file *file,
11111128
mutex_unlock(&dmxdevfilter->mutex);
11121129
break;
11131130

1114-
#ifdef DVB_MMAP
1131+
#ifdef CONFIG_DVB_MMAP
11151132
case DMX_REQBUFS:
11161133
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
11171134
mutex_unlock(&dmxdev->mutex);
@@ -1160,7 +1177,7 @@ static int dvb_demux_do_ioctl(struct file *file,
11601177
break;
11611178
#endif
11621179
default:
1163-
ret = -EINVAL;
1180+
ret = -ENOTTY;
11641181
break;
11651182
}
11661183
mutex_unlock(&dmxdev->mutex);
@@ -1199,13 +1216,16 @@ static __poll_t dvb_demux_poll(struct file *file, poll_table *wait)
11991216
return mask;
12001217
}
12011218

1202-
#ifdef DVB_MMAP
1219+
#ifdef CONFIG_DVB_MMAP
12031220
static int dvb_demux_mmap(struct file *file, struct vm_area_struct *vma)
12041221
{
12051222
struct dmxdev_filter *dmxdevfilter = file->private_data;
12061223
struct dmxdev *dmxdev = dmxdevfilter->dev;
12071224
int ret;
12081225

1226+
if (!dmxdev->may_do_mmap)
1227+
return -ENOTTY;
1228+
12091229
if (mutex_lock_interruptible(&dmxdev->mutex))
12101230
return -ERESTARTSYS;
12111231

@@ -1249,7 +1269,7 @@ static const struct file_operations dvb_demux_fops = {
12491269
.release = dvb_demux_release,
12501270
.poll = dvb_demux_poll,
12511271
.llseek = default_llseek,
1252-
#ifdef DVB_MMAP
1272+
#ifdef CONFIG_DVB_MMAP
12531273
.mmap = dvb_demux_mmap,
12541274
#endif
12551275
};
@@ -1280,7 +1300,7 @@ static int dvb_dvr_do_ioctl(struct file *file,
12801300
ret = dvb_dvr_set_buffer_size(dmxdev, arg);
12811301
break;
12821302

1283-
#ifdef DVB_MMAP
1303+
#ifdef CONFIG_DVB_MMAP
12841304
case DMX_REQBUFS:
12851305
ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg);
12861306
break;
@@ -1304,7 +1324,7 @@ static int dvb_dvr_do_ioctl(struct file *file,
13041324
break;
13051325
#endif
13061326
default:
1307-
ret = -EINVAL;
1327+
ret = -ENOTTY;
13081328
break;
13091329
}
13101330
mutex_unlock(&dmxdev->mutex);
@@ -1322,11 +1342,6 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait)
13221342
struct dvb_device *dvbdev = file->private_data;
13231343
struct dmxdev *dmxdev = dvbdev->priv;
13241344
__poll_t mask = 0;
1325-
#ifndef DVB_MMAP
1326-
bool need_ringbuffer = false;
1327-
#else
1328-
const bool need_ringbuffer = true;
1329-
#endif
13301345

13311346
dprintk("%s\n", __func__);
13321347

@@ -1337,11 +1352,8 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait)
13371352

13381353
poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
13391354

1340-
#ifndef DVB_MMAP
1341-
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
1342-
need_ringbuffer = true;
1343-
#endif
1344-
if (need_ringbuffer) {
1355+
if (((file->f_flags & O_ACCMODE) == O_RDONLY) ||
1356+
dmxdev->may_do_mmap) {
13451357
if (dmxdev->dvr_buffer.error)
13461358
mask |= (EPOLLIN | EPOLLRDNORM | EPOLLPRI | EPOLLERR);
13471359

@@ -1353,13 +1365,16 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait)
13531365
return mask;
13541366
}
13551367

1356-
#ifdef DVB_MMAP
1368+
#ifdef CONFIG_DVB_MMAP
13571369
static int dvb_dvr_mmap(struct file *file, struct vm_area_struct *vma)
13581370
{
13591371
struct dvb_device *dvbdev = file->private_data;
13601372
struct dmxdev *dmxdev = dvbdev->priv;
13611373
int ret;
13621374

1375+
if (!dmxdev->may_do_mmap)
1376+
return -ENOTTY;
1377+
13631378
if (dmxdev->exit)
13641379
return -ENODEV;
13651380

@@ -1381,7 +1396,7 @@ static const struct file_operations dvb_dvr_fops = {
13811396
.release = dvb_dvr_release,
13821397
.poll = dvb_dvr_poll,
13831398
.llseek = default_llseek,
1384-
#ifdef DVB_MMAP
1399+
#ifdef CONFIG_DVB_MMAP
13851400
.mmap = dvb_dvr_mmap,
13861401
#endif
13871402
};

0 commit comments

Comments
 (0)