public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@infradead.org>
To: Eric Thomas <ethomas@claranet.fr>
Cc: video4linux <video4linux-list@redhat.com>,
	g.liakhovetski@pengutronix.de, Brandon Philips <bphilips@suse.de>
Subject: Re: kernel oops since changeset e3b8fb8cc214
Date: Sat, 8 Mar 2008 07:59:29 -0300	[thread overview]
Message-ID: <20080308075929.3ccbd012@gaivota> (raw)
In-Reply-To: <47D24404.9050708@claranet.fr>

[-- Attachment #1: Type: text/plain, Size: 4504 bytes --]

On Sat, 08 Mar 2008 08:45:08 +0100
Eric Thomas <ethomas@claranet.fr> wrote:

> Eric Thomas wrote:
> > Hi all,
> > 
> > My box runs with kernel 2.6.24 + main v4l-dvb tree from HG.
> > The card is a Haupauge HVR-3000 running in analog mode only. No *dvd* 
> > module loaded.
> > Since this videobuf-dma-sg patch, I face kernel oops in several
> > situations.
> > These problems occur with real tv applications, but traces below come
> > from the capture_example binary from v4l2-apps/test.

Although I don't believe that this is related to the conversion to generic DMA
API.

Anyway, I'm enclosing a patch reverting the changeset. It is valuable if people
can test to revert this and see if the issue remains.

I suspect, however, that the bug is on some other place, and it is related to
some bad locking. It seems that STREAMOFF processing here interrupted by a
video buffer arrival, at IRQ code.

PS.: I'm c/c Brandon, since he is working on fixing a bad lock on videobuf_dma.

> > capture_example called without any argument, oopses when calling STREAMOFF:
> > 
> > BUG: unable to handle kernel NULL pointer dereference at virtual address 
> > 00000200
> > printing eip: c01077e0 *pde = 00000000
> > Oops: 0000 [#1] PREEMPT
> > Modules linked in: cx8800 compat_ioctl32 cx88_alsa cx88xx ir_common 
> > videobuf_dma_sg wm8775 tuner tda9887 tuner_simple tuner_types tveeprom 
> > btcx_risc videobuf_core videodev v4l2_common v4l1_compat i2c_dev rfcomm 
> > l2cap bluetooth it87 hwmon_vid sunrpc binfmt_misc fglrx(P) snd_intel8x0 
> > usb_storage snd_ac97_codec agpgart ac97_bus i2c_nforce2 ati_remote sg 
> > sata_nv uhci_hcd ohci_hcd ehci_hcd
> > 
> > Pid: 3490, comm: capture_example Tainted: P        (2.6.24 #1)
> > EIP: 0060:[<c01077e0>] EFLAGS: 00210206 CPU: 0
> > EIP is at dma_free_coherent+0x30/0xa0
> > EAX: 00200257 EBX: 00000001 ECX: f7206000 EDX: 00001880
> > ESI: f7206000 EDI: 00000200 EBP: f78a884c ESP: f70c0d6c
> >  DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 0068
> > Process capture_example (pid: 3490, ti=f70c0000 task=f7881560 
> > task.ti=f70c0000)
> > Stack: 00200046 00000000 f887672f 00000000 00000000 37206000 f7e3ff68 
> > f886e4b2
> >        37206000 f98cbbaf f98cb3bb f7e3ff00 f7e3ff84 f7c8ee4c 00200282 
> > f990cc26
> >        00000000 00000020 f7c8ee4c f8876517 f7c8ee4c f7e3fa80 00000002 
> > f7c8ee00
> > Call Trace:
> >  [<f887672f>] videobuf_waiton+0xdf/0x110 [videobuf_core]
> >  [<f886e4b2>] btcx_riscmem_free+0x42/0x90 [btcx_risc]
> >  [<f98cbbaf>] videobuf_dma_free+0x4f/0xa0 [videobuf_dma_sg]
> >  [<f98cb3bb>] videobuf_dma_unmap+0x2b/0x60 [videobuf_dma_sg]
> >  [<f990cc26>] cx88_free_buffer+0x46/0x60 [cx88xx]
> >  [<f8876517>] videobuf_queue_cancel+0x97/0xc0 [videobuf_core]
> >  [<f88765ca>] __videobuf_streamoff+0x1a/0x30 [videobuf_core]
> >  [<f8876638>] videobuf_streamoff+0x18/0x30 [videobuf_core]
> >  [<f98ed644>] vidioc_streamoff+0x44/0x60 [cx8800]
> >  [<f98ed600>] vidioc_streamoff+0x0/0x60 [cx8800]
> >  [<f8855933>] __video_do_ioctl+0xe83/0x3820 [videodev]
> >  [<c0200e90>] bit_cursor+0x350/0x5a0
> >  [<c02401ff>] n_tty_receive_buf+0x6ff/0xef0
> >  [<c024b9a2>] do_con_write+0xaa2/0x19e0
> >  [<c013fcb5>] find_lock_page+0x95/0xe0
> >  [<f88587ad>] video_ioctl2+0xbd/0x220 [videodev]
> >  [<c0118fd3>] release_console_sem+0x1c3/0x210
> >  [<c0115880>] __wake_up+0x50/0x90
> >  [<c023ad06>] tty_ldisc_deref+0x36/0x90
> >  [<c023ccde>] tty_write+0x1be/0x1d0
> >  [<c016d008>] do_ioctl+0x78/0x90
> >  [<c016d07c>] vfs_ioctl+0x5c/0x2b0
> >  [<c023cb20>] tty_write+0x0/0x1d0
> >  [<c016d30d>] sys_ioctl+0x3d/0x70
> >  [<c0102ace>] sysenter_past_esp+0x5f/0x85
> >  =======================
> > Code: ce 53 83 ec 10 85 c0 74 06 8b b8 e0 00 00 00 8d 42 ff bb ff ff ff 
> > ff c1 e8 0b 90 43 d1 e8 75 fb 9c 58 f6 c4 02 74 3d 85 ff 74 06 <8b> 17 
> > 39 d6 73 0f 83 c4 10 89 da 89 f0 5b 5e 5f e9 eb d7 03 00
> > EIP: [<c01077e0>] dma_free_coherent+0x30/0xa0 SS:ESP 0068:f70c0d6c
> > ---[ end trace d2e4ad244a27b1e7 ]---
> > 
> > capture_example called with "-r" (read calls) oopses much earlier and
> > twice. I can provide traces if useful.
> > 
> > I'm not skilled enough to fix it myself, but I can test patches.
> > 
> > Eric
> > 
> 
> Am'I the only one to face this problem ?
> It's clearly related to the changeset e3b8fb8cc214 (Convert
> videobuf-dma-sg to generic DMA API).
> I don't get how this could only affect my card but not the others.
> Maybe this code trigs a bug elsewhere ?
> 
> Any help is welcome.
> 
> Regards,
> Eric
> 




Cheers,
Mauro

[-- Attachment #2: revert_chaneset_e3b8fb8cc214.patch --]
[-- Type: text/x-patch, Size: 26586 bytes --]

diff -r 35718f867121 linux/drivers/media/Kconfig
--- a/linux/drivers/media/Kconfig	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/Kconfig	Sat Mar 08 07:41:24 2008 -0300
@@ -160,7 +160,7 @@ config VIDEOBUF_GEN
 	tristate
 
 config VIDEOBUF_DMA_SG
-	depends on HAS_DMA
+	depends on PCI || ARCH_PXA
 	select VIDEOBUF_GEN
 	tristate
 
diff -r 35718f867121 linux/drivers/media/common/saa7146_vbi.c
--- a/linux/drivers/media/common/saa7146_vbi.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/common/saa7146_vbi.c	Sat Mar 08 07:41:24 2008 -0300
@@ -408,8 +408,8 @@ static int vbi_open(struct saa7146_dev *
 	fh->vbi_fmt.start[1] = 312;
 	fh->vbi_fmt.count[1] = 16;
 
-	videobuf_queue_sg_init(&fh->vbi_q, &vbi_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->vbi_q, &vbi_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VBI_CAPTURE,
 			    V4L2_FIELD_SEQ_TB, // FIXME: does this really work?
 			    sizeof(struct saa7146_buf),
diff -r 35718f867121 linux/drivers/media/common/saa7146_video.c
--- a/linux/drivers/media/common/saa7146_video.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/common/saa7146_video.c	Sat Mar 08 07:41:24 2008 -0300
@@ -1411,8 +1411,8 @@ static int video_open(struct saa7146_dev
 	sfmt = format_by_fourcc(dev,fh->video_fmt.pixelformat);
 	fh->video_fmt.sizeimage = (fh->video_fmt.width * fh->video_fmt.height * sfmt->depth)/8;
 
-	videobuf_queue_sg_init(&fh->video_q, &video_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->video_q, &video_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct saa7146_buf),
diff -r 35718f867121 linux/drivers/media/video/bt8xx/bttv-driver.c
--- a/linux/drivers/media/video/bt8xx/bttv-driver.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv-driver.c	Sat Mar 08 07:41:24 2008 -0300
@@ -2413,7 +2413,7 @@ static int setup_window(struct bttv_fh *
 	if (check_btres(fh, RESOURCE_OVERLAY)) {
 		struct bttv_buffer *new;
 
-		new = videobuf_sg_alloc(sizeof(*new));
+		new = videobuf_pci_alloc(sizeof(*new));
 		new->crop = btv->crop[!!fh->do_crop].rect;
 		bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
 		retval = bttv_switch_overlay(btv,fh,new);
@@ -2801,7 +2801,7 @@ static int bttv_overlay(struct file *fil
 	mutex_lock(&fh->cap.vb_lock);
 	if (on) {
 		fh->ov.tvnorm = btv->tvnorm;
-		new = videobuf_sg_alloc(sizeof(*new));
+		new = videobuf_pci_alloc(sizeof(*new));
 		new->crop = btv->crop[!!fh->do_crop].rect;
 		bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
 	} else {
@@ -2875,7 +2875,7 @@ static int bttv_s_fbuf(struct file *file
 		if (check_btres(fh, RESOURCE_OVERLAY)) {
 			struct bttv_buffer *new;
 
-			new = videobuf_sg_alloc(sizeof(*new));
+			new = videobuf_pci_alloc(sizeof(*new));
 			new->crop = btv->crop[!!fh->do_crop].rect;
 			bttv_overlay_risc(btv, &fh->ov, fh->ovfmt, new);
 			retval = bttv_switch_overlay(btv, fh, new);
@@ -3225,7 +3225,7 @@ static unsigned int bttv_poll(struct fil
 			/* need to capture a new frame */
 			if (locked_btres(fh->btv,RESOURCE_VIDEO_STREAM))
 				goto err;
-			fh->cap.read_buf = videobuf_sg_alloc(fh->cap.msize);
+			fh->cap.read_buf = videobuf_pci_alloc(fh->cap.msize);
 			if (NULL == fh->cap.read_buf)
 				goto err;
 			fh->cap.read_buf->memory = V4L2_MEMORY_USERPTR;
@@ -3292,14 +3292,14 @@ static int bttv_open(struct inode *inode
 	fh->ov.setup_ok = 0;
 	v4l2_prio_open(&btv->prio,&fh->prio);
 
-	videobuf_queue_sg_init(&fh->cap, &bttv_video_qops,
-			    &btv->c.pci->dev, &btv->s_lock,
+	videobuf_queue_pci_init(&fh->cap, &bttv_video_qops,
+			    btv->c.pci, &btv->s_lock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct bttv_buffer),
 			    fh);
-	videobuf_queue_sg_init(&fh->vbi, &bttv_vbi_qops,
-			    &btv->c.pci->dev, &btv->s_lock,
+	videobuf_queue_pci_init(&fh->vbi, &bttv_vbi_qops,
+			    btv->c.pci, &btv->s_lock,
 			    V4L2_BUF_TYPE_VBI_CAPTURE,
 			    V4L2_FIELD_SEQ_TB,
 			    sizeof(struct bttv_buffer),
diff -r 35718f867121 linux/drivers/media/video/cx23885/cx23885-dvb.c
--- a/linux/drivers/media/video/cx23885/cx23885-dvb.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/cx23885/cx23885-dvb.c	Sat Mar 08 07:41:24 2008 -0300
@@ -350,7 +350,7 @@ int cx23885_dvb_register(struct cx23885_
 
 	/* dvb stuff */
 	printk("%s: cx23885 based dvb card\n", dev->name);
-	videobuf_queue_sg_init(&port->dvb.dvbq, &dvb_qops, &dev->pci->dev, &port->slock,
+	videobuf_queue_pci_init(&port->dvb.dvbq, &dvb_qops, dev->pci, &port->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
 			    sizeof(struct cx23885_buffer), port);
 	err = dvb_register(port);
diff -r 35718f867121 linux/drivers/media/video/cx23885/cx23885-video.c
--- a/linux/drivers/media/video/cx23885/cx23885-video.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/cx23885/cx23885-video.c	Sat Mar 08 07:41:24 2008 -0300
@@ -838,8 +838,8 @@ static int video_open(struct inode *inod
 	fh->height   = 240;
 	fh->fmt      = format_by_fourcc(V4L2_PIX_FMT_BGR24);
 
-	videobuf_queue_sg_init(&fh->vidq, &cx23885_video_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->vidq, &cx23885_video_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct cx23885_buffer),
diff -r 35718f867121 linux/drivers/media/video/cx88/cx88-alsa.c
--- a/linux/drivers/media/video/cx88/cx88-alsa.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/cx88/cx88-alsa.c	Sat Mar 08 07:41:24 2008 -0300
@@ -336,7 +336,7 @@ static int dsp_buffer_free(snd_cx88_card
 	BUG_ON(!chip->dma_size);
 
 	dprintk(2,"Freeing buffer\n");
-	videobuf_sg_dma_unmap(&chip->pci->dev, chip->dma_risc);
+	videobuf_pci_dma_unmap(chip->pci, chip->dma_risc);
 	videobuf_dma_free(chip->dma_risc);
 	btcx_riscmem_free(chip->pci,&chip->buf->risc);
 	kfree(chip->buf);
@@ -438,7 +438,7 @@ static int snd_cx88_hw_params(struct snd
 	BUG_ON(!chip->dma_size);
 	BUG_ON(chip->num_periods & (chip->num_periods-1));
 
-	buf = videobuf_sg_alloc(sizeof(*buf));
+	buf = videobuf_pci_alloc(sizeof(*buf));
 	if (NULL == buf)
 		return -ENOMEM;
 
@@ -449,14 +449,14 @@ static int snd_cx88_hw_params(struct snd
 	buf->vb.height = chip->num_periods;
 	buf->vb.size   = chip->dma_size;
 
-	dma = videobuf_to_dma(&buf->vb);
+	dma=videobuf_to_dma(&buf->vb);
 	videobuf_dma_init(dma);
 	ret = videobuf_dma_init_kernel(dma, PCI_DMA_FROMDEVICE,
 			(PAGE_ALIGN(buf->vb.size) >> PAGE_SHIFT));
 	if (ret < 0)
 		goto error;
 
-	ret = videobuf_sg_dma_map(&chip->pci->dev, dma);
+	ret = videobuf_pci_dma_map(chip->pci,dma);
 	if (ret < 0)
 		goto error;
 
diff -r 35718f867121 linux/drivers/media/video/cx88/cx88-blackbird.c
--- a/linux/drivers/media/video/cx88/cx88-blackbird.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/cx88/cx88-blackbird.c	Sat Mar 08 07:41:24 2008 -0300
@@ -1113,8 +1113,8 @@ static int mpeg_open(struct inode *inode
 	file->private_data = fh;
 	fh->dev      = dev;
 
-	videobuf_queue_sg_init(&fh->mpegq, &blackbird_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->mpegq, &blackbird_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct cx88_buffer),
diff -r 35718f867121 linux/drivers/media/video/cx88/cx88-dvb.c
--- a/linux/drivers/media/video/cx88/cx88-dvb.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/cx88/cx88-dvb.c	Sat Mar 08 07:41:24 2008 -0300
@@ -909,8 +909,8 @@ static int cx8802_dvb_probe(struct cx880
 
 	/* dvb stuff */
 	printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
-	videobuf_queue_sg_init(&dev->dvb.dvbq, &dvb_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&dev->dvb.dvbq, &dvb_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_TOP,
 			    sizeof(struct cx88_buffer),
diff -r 35718f867121 linux/drivers/media/video/cx88/cx88-video.c
--- a/linux/drivers/media/video/cx88/cx88-video.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/cx88/cx88-video.c	Sat Mar 08 07:41:24 2008 -0300
@@ -1017,14 +1017,14 @@ static int video_open(struct inode *inod
 	fh->height   = 240;
 	fh->fmt      = format_by_fourcc(V4L2_PIX_FMT_BGR24);
 
-	videobuf_queue_sg_init(&fh->vidq, &cx8800_video_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->vidq, &cx8800_video_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct cx88_buffer),
 			    fh);
-	videobuf_queue_sg_init(&fh->vbiq, &cx8800_vbi_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->vbiq, &cx8800_vbi_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VBI_CAPTURE,
 			    V4L2_FIELD_SEQ_TB,
 			    sizeof(struct cx88_buffer),
diff -r 35718f867121 linux/drivers/media/video/saa7134/saa7134-alsa.c
--- a/linux/drivers/media/video/saa7134/saa7134-alsa.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/saa7134/saa7134-alsa.c	Sat Mar 08 07:41:24 2008 -0300
@@ -518,7 +518,7 @@ static int snd_card_saa7134_hw_params(st
 	/* release the old buffer */
 	if (substream->runtime->dma_area) {
 		saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
-		videobuf_sg_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
+		videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
 		dsp_buffer_free(dev);
 		substream->runtime->dma_area = NULL;
 	}
@@ -534,12 +534,12 @@ static int snd_card_saa7134_hw_params(st
 		return err;
 	}
 
-	if (0 != (err = videobuf_sg_dma_map(&dev->pci->dev, &dev->dmasound.dma))) {
+	if (0 != (err = videobuf_pci_dma_map(dev->pci, &dev->dmasound.dma))) {
 		dsp_buffer_free(dev);
 		return err;
 	}
 	if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) {
-		videobuf_sg_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
+		videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
 		dsp_buffer_free(dev);
 		return err;
 	}
@@ -548,7 +548,7 @@ static int snd_card_saa7134_hw_params(st
 						dev->dmasound.dma.sglen,
 						0))) {
 		saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
-		videobuf_sg_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
+		videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
 		dsp_buffer_free(dev);
 		return err;
 	}
@@ -584,7 +584,7 @@ static int snd_card_saa7134_hw_free(stru
 
 	if (substream->runtime->dma_area) {
 		saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
-		videobuf_sg_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
+		videobuf_pci_dma_unmap(dev->pci, &dev->dmasound.dma);
 		dsp_buffer_free(dev);
 		substream->runtime->dma_area = NULL;
 	}
diff -r 35718f867121 linux/drivers/media/video/saa7134/saa7134-dvb.c
--- a/linux/drivers/media/video/saa7134/saa7134-dvb.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/saa7134/saa7134-dvb.c	Sat Mar 08 07:41:24 2008 -0300
@@ -910,8 +910,8 @@ static int dvb_init(struct saa7134_dev *
 	dev->ts.nr_bufs    = 32;
 	dev->ts.nr_packets = 32*4;
 	dev->dvb.name = dev->name;
-	videobuf_queue_sg_init(&dev->dvb.dvbq, &saa7134_ts_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&dev->dvb.dvbq, &saa7134_ts_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_ALTERNATE,
 			    sizeof(struct saa7134_buf),
diff -r 35718f867121 linux/drivers/media/video/saa7134/saa7134-empress.c
--- a/linux/drivers/media/video/saa7134/saa7134-empress.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/saa7134/saa7134-empress.c	Sat Mar 08 07:41:24 2008 -0300
@@ -450,8 +450,8 @@ static int empress_init(struct saa7134_d
 	printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
 	       dev->name,dev->empress_dev->minor & 0x1f);
 
-	videobuf_queue_sg_init(&dev->empress_tsq, &saa7134_ts_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&dev->empress_tsq, &saa7134_ts_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_ALTERNATE,
 			    sizeof(struct saa7134_buf),
diff -r 35718f867121 linux/drivers/media/video/saa7134/saa7134-video.c
--- a/linux/drivers/media/video/saa7134/saa7134-video.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/saa7134/saa7134-video.c	Sat Mar 08 07:41:24 2008 -0300
@@ -1350,14 +1350,14 @@ static int video_open(struct inode *inod
 	fh->height   = 576;
 	v4l2_prio_open(&dev->prio,&fh->prio);
 
-	videobuf_queue_sg_init(&fh->cap, &video_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->cap, &video_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct saa7134_buf),
 			    fh);
-	videobuf_queue_sg_init(&fh->vbi, &saa7134_vbi_qops,
-			    &dev->pci->dev, &dev->slock,
+	videobuf_queue_pci_init(&fh->vbi, &saa7134_vbi_qops,
+			    dev->pci, &dev->slock,
 			    V4L2_BUF_TYPE_VBI_CAPTURE,
 			    V4L2_FIELD_SEQ_TB,
 			    sizeof(struct saa7134_buf),
diff -r 35718f867121 linux/drivers/media/video/soc_camera.c
--- a/linux/drivers/media/video/soc_camera.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/soc_camera.c	Sat Mar 08 07:41:24 2008 -0300
@@ -229,7 +229,7 @@ static int soc_camera_open(struct inode 
 
 	/* We must pass NULL as dev pointer, then all pci_* dma operations
 	 * transform to normal dma_* ones. Do we need an irqlock? */
-	videobuf_queue_sg_init(&icf->vb_vidq, ici->vbq_ops, NULL, NULL,
+	videobuf_queue_pci_init(&icf->vb_vidq, ici->vbq_ops, NULL, NULL,
 				V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
 				ici->msize, icd);
 
diff -r 35718f867121 linux/drivers/media/video/videobuf-dma-sg.c
--- a/linux/drivers/media/video/videobuf-dma-sg.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/videobuf-dma-sg.c	Sat Mar 08 07:41:24 2008 -0300
@@ -1,5 +1,5 @@
 /*
- * helper functions for SG DMA video4linux capture buffers
+ * helper functions for PCI DMA video4linux capture buffers
  *
  * The functions expect the hardware being able to scatter gatter
  * (i.e. the buffers are not linear in physical memory, but fragmented
@@ -24,7 +24,7 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 
-#include <linux/dma-mapping.h>
+#include <linux/pci.h>
 #include <linux/vmalloc.h>
 #include <linux/pagemap.h>
 #include <linux/scatterlist.h>
@@ -43,7 +43,7 @@ static int debug;
 static int debug;
 module_param(debug, int, 0644);
 
-MODULE_DESCRIPTION("helper module to manage video4linux dma sg buffers");
+MODULE_DESCRIPTION("helper module to manage video4linux pci dma sg buffers");
 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
 MODULE_LICENSE("GPL");
 
@@ -120,10 +120,10 @@ videobuf_pages_to_sg(struct page **pages
 
 struct videobuf_dmabuf *videobuf_to_dma (struct videobuf_buffer *buf)
 {
-	struct videobuf_dma_sg_memory *mem = buf->priv;
-	BUG_ON(!mem);
+	struct videbuf_pci_sg_memory *mem=buf->priv;
+	BUG_ON (!mem);
 
-	MAGIC_CHECK(mem->magic, MAGIC_SG_MEM);
+	MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
 	return &mem->dma;
 }
@@ -142,14 +142,9 @@ static int videobuf_dma_init_user_locked
 
 	dma->direction = direction;
 	switch (dma->direction) {
-	case DMA_FROM_DEVICE:
-		rw = READ;
-		break;
-	case DMA_TO_DEVICE:
-		rw = WRITE;
-		break;
-	default:
-		BUG();
+	case PCI_DMA_FROMDEVICE: rw = READ;  break;
+	case PCI_DMA_TODEVICE:   rw = WRITE; break;
+	default:                 BUG();
 	}
 
 	first = (data          & PAGE_MASK) >> PAGE_SHIFT;
@@ -222,8 +217,10 @@ int videobuf_dma_init_overlay(struct vid
 	return 0;
 }
 
-int videobuf_dma_map(struct videobuf_queue* q, struct videobuf_dmabuf *dma)
+int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma)
 {
+	void                   *dev=q->dev;
+
 	MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
 	BUG_ON(0 == dma->nr_pages);
 
@@ -249,7 +246,7 @@ int videobuf_dma_map(struct videobuf_que
 		return -ENOMEM;
 	}
 	if (!dma->bus_addr) {
-		dma->sglen = dma_map_sg(q->dev, dma->sglist,
+		dma->sglen = pci_map_sg(dev,dma->sglist,
 					dma->nr_pages, dma->direction);
 		if (0 == dma->sglen) {
 			printk(KERN_WARNING
@@ -263,26 +260,30 @@ int videobuf_dma_map(struct videobuf_que
 	return 0;
 }
 
-int videobuf_dma_sync(struct videobuf_queue *q, struct videobuf_dmabuf *dma)
+int videobuf_dma_sync(struct videobuf_queue *q,struct videobuf_dmabuf *dma)
 {
-	MAGIC_CHECK(dma->magic, MAGIC_DMABUF);
+	void                   *dev=q->dev;
+
+	MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
 	BUG_ON(!dma->sglen);
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
-	dma_sync_sg(q->dev, dma->sglist, dma->nr_pages, dma->direction);
+	pci_dma_sync_sg	(dev,dma->sglist,dma->nr_pages,dma->direction);
 #else
-	dma_sync_sg_for_cpu(q->dev, dma->sglist, dma->nr_pages, dma->direction);
+	pci_dma_sync_sg_for_cpu (dev,dma->sglist,dma->nr_pages,dma->direction);
 #endif
 	return 0;
 }
 
 int videobuf_dma_unmap(struct videobuf_queue* q,struct videobuf_dmabuf *dma)
 {
-	MAGIC_CHECK(dma->magic, MAGIC_DMABUF);
+	void                   *dev=q->dev;
+
+	MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
 	if (!dma->sglen)
 		return 0;
 
-	dma_unmap_sg(q->dev, dma->sglist, dma->nr_pages, dma->direction);
+	pci_unmap_sg (dev,dma->sglist,dma->nr_pages,dma->direction);
 
 	kfree(dma->sglist);
 	dma->sglist = NULL;
@@ -310,28 +311,28 @@ int videobuf_dma_free(struct videobuf_dm
 	if (dma->bus_addr) {
 		dma->bus_addr = 0;
 	}
-	dma->direction = DMA_NONE;
+	dma->direction = PCI_DMA_NONE;
 	return 0;
 }
 
 /* --------------------------------------------------------------------- */
 
-int videobuf_sg_dma_map(struct device *dev, struct videobuf_dmabuf *dma)
+int videobuf_pci_dma_map(struct pci_dev *pci,struct videobuf_dmabuf *dma)
 {
 	struct videobuf_queue q;
 
-	q.dev = dev;
+	q.dev=pci;
 
-	return videobuf_dma_map(&q, dma);
+	return (videobuf_dma_map(&q,dma));
 }
 
-int videobuf_sg_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma)
+int videobuf_pci_dma_unmap(struct pci_dev *pci,struct videobuf_dmabuf *dma)
 {
 	struct videobuf_queue q;
 
-	q.dev = dev;
+	q.dev=pci;
 
-	return videobuf_dma_unmap(&q, dma);
+	return (videobuf_dma_unmap(&q,dma));
 }
 
 /* --------------------------------------------------------------------- */
@@ -351,7 +352,7 @@ videobuf_vm_close(struct vm_area_struct 
 {
 	struct videobuf_mapping *map = vma->vm_private_data;
 	struct videobuf_queue *q = map->q;
-	struct videobuf_dma_sg_memory *mem;
+	struct videbuf_pci_sg_memory *mem;
 	int i;
 
 	dprintk(2,"vm_close %p [count=%d,vma=%08lx-%08lx]\n",map,
@@ -454,18 +455,18 @@ static struct vm_operations_struct video
 };
 
 /* ---------------------------------------------------------------------
- * SG handlers for the generic methods
+ * PCI handlers for the generic methods
  */
 
 /* Allocated area consists on 3 parts:
 	struct video_buffer
 	struct <driver>_buffer (cx88_buffer, saa7134_buf, ...)
-	struct videobuf_dma_sg_memory
+	struct videobuf_pci_sg_memory
  */
 
 static void *__videobuf_alloc(size_t size)
 {
-	struct videobuf_dma_sg_memory *mem;
+	struct videbuf_pci_sg_memory *mem;
 	struct videobuf_buffer *vb;
 
 	vb = kzalloc(size+sizeof(*mem),GFP_KERNEL);
@@ -488,10 +489,10 @@ static int __videobuf_iolock (struct vid
 {
 	int err,pages;
 	dma_addr_t bus;
-	struct videobuf_dma_sg_memory *mem = vb->priv;
+	struct videbuf_pci_sg_memory *mem=vb->priv;
 	BUG_ON(!mem);
 
-	MAGIC_CHECK(mem->magic, MAGIC_SG_MEM);
+	MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
 	switch (vb->memory) {
 	case V4L2_MEMORY_MMAP:
@@ -500,14 +501,14 @@ static int __videobuf_iolock (struct vid
 			/* no userspace addr -- kernel bounce buffer */
 			pages = PAGE_ALIGN(vb->size) >> PAGE_SHIFT;
 			err = videobuf_dma_init_kernel( &mem->dma,
-							DMA_FROM_DEVICE,
+							PCI_DMA_FROMDEVICE,
 							pages );
 			if (0 != err)
 				return err;
 		} else if (vb->memory == V4L2_MEMORY_USERPTR) {
 			/* dma directly to userspace */
 			err = videobuf_dma_init_user( &mem->dma,
-						      DMA_FROM_DEVICE,
+						      PCI_DMA_FROMDEVICE,
 						      vb->baddr,vb->bsize );
 			if (0 != err)
 				return err;
@@ -518,7 +519,7 @@ static int __videobuf_iolock (struct vid
 			locking inversion, so don't take it here */
 
 			err = videobuf_dma_init_user_locked(&mem->dma,
-						      DMA_FROM_DEVICE,
+						      PCI_DMA_FROMDEVICE,
 						      vb->baddr, vb->bsize);
 			if (0 != err)
 				return err;
@@ -535,7 +536,7 @@ static int __videobuf_iolock (struct vid
 		 */
 		bus   = (dma_addr_t)(unsigned long)fbuf->base + vb->boff;
 		pages = PAGE_ALIGN(vb->size) >> PAGE_SHIFT;
-		err = videobuf_dma_init_overlay(&mem->dma, DMA_FROM_DEVICE,
+		err = videobuf_dma_init_overlay(&mem->dma,PCI_DMA_FROMDEVICE,
 						bus, pages);
 		if (0 != err)
 			return err;
@@ -543,7 +544,7 @@ static int __videobuf_iolock (struct vid
 	default:
 		BUG();
 	}
-	err = videobuf_dma_map(q, &mem->dma);
+	err = videobuf_dma_map(q,&mem->dma);
 	if (0 != err)
 		return err;
 
@@ -553,8 +554,8 @@ static int __videobuf_sync(struct videob
 static int __videobuf_sync(struct videobuf_queue *q,
 			   struct videobuf_buffer *buf)
 {
-	struct videobuf_dma_sg_memory *mem = buf->priv;
-	BUG_ON(!mem);
+	struct videbuf_pci_sg_memory *mem=buf->priv;
+	BUG_ON (!mem);
 	MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
 	return	videobuf_dma_sync(q,&mem->dma);
@@ -577,7 +578,7 @@ static int __videobuf_mmap_mapper(struct
 static int __videobuf_mmap_mapper(struct videobuf_queue *q,
 			 struct vm_area_struct *vma)
 {
-	struct videobuf_dma_sg_memory *mem;
+	struct videbuf_pci_sg_memory *mem;
 	struct videobuf_mapping *map;
 	unsigned int first,last,size,i;
 	int retval;
@@ -597,7 +598,7 @@ static int __videobuf_mmap_mapper(struct
 		if (NULL == q->bufs[first])
 			continue;
 		mem=q->bufs[first]->priv;
-		BUG_ON(!mem);
+		BUG_ON (!mem);
 		MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
 		if (V4L2_MEMORY_MMAP != q->bufs[first]->memory)
@@ -660,8 +661,8 @@ static int __videobuf_copy_to_user ( str
 				char __user *data, size_t count,
 				int nonblocking )
 {
-	struct videobuf_dma_sg_memory *mem = q->read_buf->priv;
-	BUG_ON(!mem);
+	struct videbuf_pci_sg_memory *mem=q->read_buf->priv;
+	BUG_ON (!mem);
 	MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
 	/* copy to userspace */
@@ -679,8 +680,8 @@ static int __videobuf_copy_stream ( stru
 				int vbihack, int nonblocking )
 {
 	unsigned int  *fc;
-	struct videobuf_dma_sg_memory *mem = q->read_buf->priv;
-	BUG_ON(!mem);
+	struct videbuf_pci_sg_memory *mem=q->read_buf->priv;
+	BUG_ON (!mem);
 	MAGIC_CHECK(mem->magic,MAGIC_SG_MEM);
 
 	if (vbihack) {
@@ -703,7 +704,7 @@ static int __videobuf_copy_stream ( stru
 	return count;
 }
 
-static struct videobuf_qtype_ops sg_ops = {
+static struct videobuf_qtype_ops pci_ops = {
 	.magic        = MAGIC_QTYPE_OPS,
 
 	.alloc        = __videobuf_alloc,
@@ -715,21 +716,21 @@ static struct videobuf_qtype_ops sg_ops 
 	.copy_stream  = __videobuf_copy_stream,
 };
 
-void *videobuf_sg_alloc(size_t size)
+void *videobuf_pci_alloc (size_t size)
 {
 	struct videobuf_queue q;
 
 	/* Required to make generic handler to call __videobuf_alloc */
-	q.int_ops = &sg_ops;
+	q.int_ops=&pci_ops;
 
-	q.msize = size;
+	q.msize=size;
 
-	return videobuf_alloc(&q);
+	return videobuf_alloc (&q);
 }
 
-void videobuf_queue_sg_init(struct videobuf_queue* q,
+void videobuf_queue_pci_init(struct videobuf_queue* q,
 			 struct videobuf_queue_ops *ops,
-			 struct device *dev,
+			 void *dev,
 			 spinlock_t *irqlock,
 			 enum v4l2_buf_type type,
 			 enum v4l2_field field,
@@ -737,7 +738,7 @@ void videobuf_queue_sg_init(struct video
 			 void *priv)
 {
 	videobuf_queue_core_init(q, ops, dev, irqlock, type, field, msize,
-				 priv, &sg_ops);
+				 priv, &pci_ops);
 }
 
 /* --------------------------------------------------------------------- */
@@ -754,11 +755,11 @@ EXPORT_SYMBOL_GPL(videobuf_dma_unmap);
 EXPORT_SYMBOL_GPL(videobuf_dma_unmap);
 EXPORT_SYMBOL_GPL(videobuf_dma_free);
 
-EXPORT_SYMBOL_GPL(videobuf_sg_dma_map);
-EXPORT_SYMBOL_GPL(videobuf_sg_dma_unmap);
-EXPORT_SYMBOL_GPL(videobuf_sg_alloc);
+EXPORT_SYMBOL_GPL(videobuf_pci_dma_map);
+EXPORT_SYMBOL_GPL(videobuf_pci_dma_unmap);
+EXPORT_SYMBOL_GPL(videobuf_pci_alloc);
 
-EXPORT_SYMBOL_GPL(videobuf_queue_sg_init);
+EXPORT_SYMBOL_GPL(videobuf_queue_pci_init);
 
 /*
  * Local variables:
diff -r 35718f867121 linux/drivers/media/video/videobuf-vmalloc.c
--- a/linux/drivers/media/video/videobuf-vmalloc.c	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/drivers/media/video/videobuf-vmalloc.c	Sat Mar 08 07:41:24 2008 -0300
@@ -103,7 +103,7 @@ static struct vm_operations_struct video
 /* Allocated area consists on 3 parts:
 	struct video_buffer
 	struct <driver>_buffer (cx88_buffer, saa7134_buf, ...)
-	struct videobuf_dma_sg_memory
+	struct videobuf_pci_sg_memory
  */
 
 static void *__videobuf_alloc(size_t size)
diff -r 35718f867121 linux/include/media/videobuf-dma-sg.h
--- a/linux/include/media/videobuf-dma-sg.h	Sat Mar 08 06:50:17 2008 -0300
+++ b/linux/include/media/videobuf-dma-sg.h	Sat Mar 08 07:41:24 2008 -0300
@@ -1,5 +1,5 @@
 /*
- * helper functions for SG DMA video4linux capture buffers
+ * helper functions for PCI DMA video4linux capture buffers
  *
  * The functions expect the hardware being able to scatter gatter
  * (i.e. the buffers are not linear in physical memory, but fragmented
@@ -81,7 +81,7 @@ struct videobuf_dmabuf {
 	int                 direction;
 };
 
-struct videobuf_dma_sg_memory
+struct videbuf_pci_sg_memory
 {
 	u32                 magic;
 
@@ -103,11 +103,11 @@ int videobuf_dma_unmap(struct videobuf_q
 int videobuf_dma_unmap(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
 struct videobuf_dmabuf *videobuf_to_dma (struct videobuf_buffer *buf);
 
-void *videobuf_sg_alloc(size_t size);
+void *videobuf_pci_alloc (size_t size);
 
-void videobuf_queue_sg_init(struct videobuf_queue* q,
+void videobuf_queue_pci_init(struct videobuf_queue* q,
 			 struct videobuf_queue_ops *ops,
-			 struct device *dev,
+			 void *dev,
 			 spinlock_t *irqlock,
 			 enum v4l2_buf_type type,
 			 enum v4l2_field field,
@@ -117,6 +117,6 @@ void videobuf_queue_sg_init(struct video
 	/*FIXME: these variants are used only on *-alsa code, where videobuf is
 	 * used without queue
 	 */
-int videobuf_sg_dma_map(struct device *dev, struct videobuf_dmabuf *dma);
-int videobuf_sg_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma);
+int videobuf_pci_dma_map(struct pci_dev *pci,struct videobuf_dmabuf *dma);
+int videobuf_pci_dma_unmap(struct pci_dev *pci,struct videobuf_dmabuf *dma);
 

[-- Attachment #3: Type: text/plain, Size: 164 bytes --]

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

  parent reply	other threads:[~2008-03-08 11:00 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-26 12:26 kernel oops since changeset e3b8fb8cc214 Eric Thomas
2008-03-08  7:45 ` Eric Thomas
2008-03-08  9:37   ` Guennadi Liakhovetski
2008-03-09  8:41     ` Eric Thomas
2008-03-09 11:32       ` Guennadi Liakhovetski
2008-03-11 22:04         ` Guennadi Liakhovetski
2008-03-12  0:23           ` hermann pitton
2008-03-12  7:34             ` Guennadi Liakhovetski
2008-03-12 22:28               ` hermann pitton
2008-03-13 16:07                 ` Guennadi Liakhovetski
2008-03-08 10:59   ` Mauro Carvalho Chehab [this message]
2008-03-09  8:55     ` Eric Thomas
2008-03-11  9:45       ` Craig Whitmore
2008-03-11 17:39     ` Matthias Schwarzott
2008-03-12  0:26       ` hermann pitton
2008-03-13 15:55         ` Matthias Schwarzott
2008-03-13 17:59           ` Mauro Carvalho Chehab
2008-03-13 22:48             ` hermann pitton
2008-03-13 22:56               ` hermann pitton
2008-03-14 14:15               ` Mauro Carvalho Chehab
2008-03-14 14:33                 ` Guennadi Liakhovetski
2008-03-14 16:16                   ` Craig Whitmore
2008-03-15  7:22                     ` Eric Thomas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080308075929.3ccbd012@gaivota \
    --to=mchehab@infradead.org \
    --cc=bphilips@suse.de \
    --cc=ethomas@claranet.fr \
    --cc=g.liakhovetski@pengutronix.de \
    --cc=video4linux-list@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox