Commit 800c5a77 authored by Gerd Knorr's avatar Gerd Knorr Committed by Linus Torvalds

[PATCH] v4l: video-buf magic numbers

This patch adds some magic IDs and checks for them to the data structs of the
video-buf module.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e6f32f39
...@@ -28,6 +28,11 @@ ...@@ -28,6 +28,11 @@
#include <media/video-buf.h> #include <media/video-buf.h>
#define MAGIC_DMABUF 0x19721112
#define MAGIC_BUFFER 0x20040302
#define MAGIC_CHECK(is,should) if (unlikely((is) != (should))) \
{ printk(KERN_ERR "magic mismatch: %x (expected %x)\n",is,should); BUG(); }
static int debug = 0; static int debug = 0;
MODULE_DESCRIPTION("helper module to manage video4linux pci dma buffers"); MODULE_DESCRIPTION("helper module to manage video4linux pci dma buffers");
...@@ -109,6 +114,12 @@ videobuf_pages_to_sg(struct page **pages, int nr_pages, int offset) ...@@ -109,6 +114,12 @@ videobuf_pages_to_sg(struct page **pages, int nr_pages, int offset)
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
void videobuf_dma_init(struct videobuf_dmabuf *dma)
{
memset(dma,0,sizeof(*dma));
dma->magic = MAGIC_DMABUF;
}
int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction, int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction,
unsigned long data, unsigned long size) unsigned long data, unsigned long size)
{ {
...@@ -178,8 +189,8 @@ int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction, ...@@ -178,8 +189,8 @@ int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction,
int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma) int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma)
{ {
if (0 == dma->nr_pages) MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
BUG(); BUG_ON(0 == dma->nr_pages);
if (dma->pages) { if (dma->pages) {
dma->sglist = videobuf_pages_to_sg(dma->pages, dma->nr_pages, dma->sglist = videobuf_pages_to_sg(dma->pages, dma->nr_pages,
...@@ -211,8 +222,8 @@ int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma) ...@@ -211,8 +222,8 @@ int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma)
int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma) int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma)
{ {
if (!dma->sglen) MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
BUG(); BUG_ON(!dma->sglen);
if (!dma->bus_addr) if (!dma->bus_addr)
pci_dma_sync_sg_for_cpu(dev,dma->sglist,dma->nr_pages,dma->direction); pci_dma_sync_sg_for_cpu(dev,dma->sglist,dma->nr_pages,dma->direction);
...@@ -221,6 +232,7 @@ int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma) ...@@ -221,6 +232,7 @@ int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma)
int videobuf_dma_pci_unmap(struct pci_dev *dev, struct videobuf_dmabuf *dma) int videobuf_dma_pci_unmap(struct pci_dev *dev, struct videobuf_dmabuf *dma)
{ {
MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
if (!dma->sglen) if (!dma->sglen)
return 0; return 0;
...@@ -234,8 +246,8 @@ int videobuf_dma_pci_unmap(struct pci_dev *dev, struct videobuf_dmabuf *dma) ...@@ -234,8 +246,8 @@ int videobuf_dma_pci_unmap(struct pci_dev *dev, struct videobuf_dmabuf *dma)
int videobuf_dma_free(struct videobuf_dmabuf *dma) int videobuf_dma_free(struct videobuf_dmabuf *dma)
{ {
if (dma->sglen) MAGIC_CHECK(dma->magic,MAGIC_DMABUF);
BUG(); BUG_ON(dma->sglen);
if (dma->pages) { if (dma->pages) {
int i; int i;
...@@ -264,7 +276,9 @@ void* videobuf_alloc(unsigned int size) ...@@ -264,7 +276,9 @@ void* videobuf_alloc(unsigned int size)
vb = kmalloc(size,GFP_KERNEL); vb = kmalloc(size,GFP_KERNEL);
if (NULL != vb) { if (NULL != vb) {
memset(vb,0,size); memset(vb,0,size);
videobuf_dma_init(&vb->dma);
init_waitqueue_head(&vb->done); init_waitqueue_head(&vb->done);
vb->magic = MAGIC_BUFFER;
} }
return vb; return vb;
} }
...@@ -274,6 +288,7 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr) ...@@ -274,6 +288,7 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
int retval = 0; int retval = 0;
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
add_wait_queue(&vb->done, &wait); add_wait_queue(&vb->done, &wait);
while (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED) { while (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED) {
if (non_blocking) { if (non_blocking) {
...@@ -302,6 +317,7 @@ videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb, ...@@ -302,6 +317,7 @@ videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb,
int err,pages; int err,pages;
dma_addr_t bus; dma_addr_t bus;
MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
switch (vb->memory) { switch (vb->memory) {
case V4L2_MEMORY_MMAP: case V4L2_MEMORY_MMAP:
case V4L2_MEMORY_USERPTR: case V4L2_MEMORY_USERPTR:
...@@ -453,6 +469,8 @@ void ...@@ -453,6 +469,8 @@ void
videobuf_status(struct v4l2_buffer *b, struct videobuf_buffer *vb, videobuf_status(struct v4l2_buffer *b, struct videobuf_buffer *vb,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
b->index = vb->i; b->index = vb->i;
b->type = type; b->type = type;
...@@ -573,6 +591,7 @@ videobuf_qbuf(struct file *file, struct videobuf_queue *q, ...@@ -573,6 +591,7 @@ videobuf_qbuf(struct file *file, struct videobuf_queue *q,
buf = q->bufs[b->index]; buf = q->bufs[b->index];
if (NULL == buf) if (NULL == buf)
goto done; goto done;
MAGIC_CHECK(buf->magic,MAGIC_BUFFER);
if (buf->memory != b->memory) if (buf->memory != b->memory)
goto done; goto done;
if (buf->state == STATE_QUEUED || if (buf->state == STATE_QUEUED ||
...@@ -1206,6 +1225,7 @@ int videobuf_mmap_mapper(struct vm_area_struct *vma, ...@@ -1206,6 +1225,7 @@ int videobuf_mmap_mapper(struct vm_area_struct *vma,
EXPORT_SYMBOL_GPL(videobuf_vmalloc_to_sg); EXPORT_SYMBOL_GPL(videobuf_vmalloc_to_sg);
EXPORT_SYMBOL_GPL(videobuf_dma_init);
EXPORT_SYMBOL_GPL(videobuf_dma_init_user); EXPORT_SYMBOL_GPL(videobuf_dma_init_user);
EXPORT_SYMBOL_GPL(videobuf_dma_init_kernel); EXPORT_SYMBOL_GPL(videobuf_dma_init_kernel);
EXPORT_SYMBOL_GPL(videobuf_dma_init_overlay); EXPORT_SYMBOL_GPL(videobuf_dma_init_overlay);
......
...@@ -61,6 +61,8 @@ int videobuf_unlock(struct page **pages, int nr_pages); ...@@ -61,6 +61,8 @@ int videobuf_unlock(struct page **pages, int nr_pages);
*/ */
struct videobuf_dmabuf { struct videobuf_dmabuf {
u32 magic;
/* for userland buffer */ /* for userland buffer */
int offset; int offset;
struct page **pages; struct page **pages;
...@@ -78,6 +80,7 @@ struct videobuf_dmabuf { ...@@ -78,6 +80,7 @@ struct videobuf_dmabuf {
int direction; int direction;
}; };
void videobuf_dma_init(struct videobuf_dmabuf *dma);
int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction, int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction,
unsigned long data, unsigned long size); unsigned long data, unsigned long size);
int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction, int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction,
...@@ -136,6 +139,7 @@ enum videobuf_state { ...@@ -136,6 +139,7 @@ enum videobuf_state {
struct videobuf_buffer { struct videobuf_buffer {
unsigned int i; unsigned int i;
u32 magic;
/* info about the buffer */ /* info about the buffer */
unsigned int width; unsigned int width;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment