From 2484da1c378cdd69fe6cd52d57b8c2a55a65657f Mon Sep 17 00:00:00 2001 From: Martin Michlmayr Date: Sat, 18 Mar 2006 20:29:57 +0000 Subject: [PATCH] Fix VINO drivers when using a 64-bit kernel (Mikael Nousiainen). svn path=/dists/trunk/linux-2.6/; revision=6213 --- debian/changelog | 1 + debian/patches/series/0experimental.1 | 1 + .../patches/video-vino-64-bit-fix-kernel.diff | 256 ++++++++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 debian/patches/video-vino-64-bit-fix-kernel.diff diff --git a/debian/changelog b/debian/changelog index 37299f345..5af3c5fcb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,7 @@ linux-2.6 (2.6.15+2.6.16-rc6-0experimental.1) UNRELEASED; urgency=low * [mips] SB1: Support for NAPI (Tom Rix). * [mips] SB1: DUART support (Broadcom). * [mips] Work around bad code generation for (Ralf Baechle). + * [mips] Fix VINO drivers when using a 64-bit kernel (Mikael Nousiainen). [ dann frazier ] * [ia64] use yaird on ia64 until #341181 is fixed diff --git a/debian/patches/series/0experimental.1 b/debian/patches/series/0experimental.1 index 518b74a89..e5dba9dfb 100644 --- a/debian/patches/series/0experimental.1 +++ b/debian/patches/series/0experimental.1 @@ -24,6 +24,7 @@ + mips-sb1-eth-napi.patch + mips-sb1-duart.patch + mips-io-bad-code.patch ++ video-vino-64-bit-fix-kernel.diff + s390-drivers-ccw-uevent-modalias.patch + s390-drivers-ccw-uevent-cleanup.patch + s390-drivers-subchannel-fix.patch diff --git a/debian/patches/video-vino-64-bit-fix-kernel.diff b/debian/patches/video-vino-64-bit-fix-kernel.diff new file mode 100644 index 000000000..4714ab80f --- /dev/null +++ b/debian/patches/video-vino-64-bit-fix-kernel.diff @@ -0,0 +1,256 @@ +Upstream status: will go into 2.6.17 + + +Fix VINO drivers when using a 64-bit kernel + +This patch should fix problems with VINO drivers when using a 64-bit +kernel. + +There are also other bugs which prevent V4L drivers from functioning +correctly when using 32-bit userland with a 64-bit kernel as the ioctl +compatibility layer (in drivers/media/video/compat_ioctl32.c) doesn't seem +to handle VIDIOC_CROPCAP. I'm not sure if any other ioctls are missing. + + +diff -urN a/drivers/media/video/indycam.c b/drivers/media/video/indycam.c +--- a/drivers/media/video/indycam.c 2006-03-17 14:04:42.000000000 +0200 ++++ b/drivers/media/video/indycam.c 2006-03-17 14:04:55.000000000 +0200 +@@ -2,7 +2,7 @@ + * indycam.c - Silicon Graphics IndyCam digital camera driver + * + * Copyright (C) 2003 Ladislav Michl +- * Copyright (C) 2004,2005 Mikael Nousiainen ++ * Copyright (C) 2004,2005,2006 Mikael Nousiainen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as +@@ -27,7 +27,7 @@ + + #include "indycam.h" + +-#define INDYCAM_MODULE_VERSION "0.0.5" ++#define INDYCAM_MODULE_VERSION "0.0.6" + + MODULE_DESCRIPTION("SGI IndyCam driver"); + MODULE_VERSION(INDYCAM_MODULE_VERSION); +diff -urN a/drivers/media/video/saa7191.c b/drivers/media/video/saa7191.c +--- a/drivers/media/video/saa7191.c 2006-03-17 14:04:42.000000000 +0200 ++++ b/drivers/media/video/saa7191.c 2006-03-17 14:04:55.000000000 +0200 +@@ -2,7 +2,7 @@ + * saa7191.c - Philips SAA7191 video decoder driver + * + * Copyright (C) 2003 Ladislav Michl +- * Copyright (C) 2004,2005 Mikael Nousiainen ++ * Copyright (C) 2004,2005,2006 Mikael Nousiainen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as +@@ -26,7 +26,7 @@ + + #include "saa7191.h" + +-#define SAA7191_MODULE_VERSION "0.0.5" ++#define SAA7191_MODULE_VERSION "0.0.6" + + MODULE_DESCRIPTION("Philips SAA7191 video decoder driver"); + MODULE_VERSION(SAA7191_MODULE_VERSION); +diff -urN a/drivers/media/video/vino.c b/drivers/media/video/vino.c +--- a/drivers/media/video/vino.c 2006-03-17 14:04:42.000000000 +0200 ++++ b/drivers/media/video/vino.c 2006-03-17 14:04:55.000000000 +0200 +@@ -4,7 +4,7 @@ + * This file is subject to the terms and conditions of the GNU General Public + * License version 2 as published by the Free Software Foundation. + * +- * Copyright (C) 2004,2005 Mikael Nousiainen ++ * Copyright (C) 2004,2005,2006 Mikael Nousiainen + * + * Based on the previous version of the driver for 2.4 kernels by: + * Copyright (C) 2003 Ladislav Michl +@@ -58,8 +58,8 @@ + // #define VINO_DEBUG + // #define VINO_DEBUG_INT + +-#define VINO_MODULE_VERSION "0.0.5" +-#define VINO_VERSION_CODE KERNEL_VERSION(0, 0, 5) ++#define VINO_MODULE_VERSION "0.0.6" ++#define VINO_VERSION_CODE KERNEL_VERSION(0, 0, 6) + + MODULE_DESCRIPTION("SGI VINO Video4Linux2 driver"); + MODULE_VERSION(VINO_MODULE_VERSION); +@@ -150,6 +150,9 @@ + + /* Internal data structure definitions */ + ++/* DMA addresses in VINO descriptor table are always 32-bit */ ++typedef u32 vino_dma_addr_t; ++ + struct vino_input { + char *name; + v4l2_std_id std; +@@ -190,7 +193,7 @@ + + /* cpu address for the VINO descriptor table + * (contains DMA addresses, VINO_PAGE_SIZE chunks) */ +- unsigned long *dma_cpu; ++ vino_dma_addr_t *dma_cpu; + /* dma address for the VINO descriptor table + * (contains DMA addresses, VINO_PAGE_SIZE chunks) */ + dma_addr_t dma; +@@ -817,7 +820,7 @@ + + dma_free_coherent(NULL, + VINO_PAGE_RATIO * (fb->desc_table.page_count + 4) * +- sizeof(dma_addr_t), (void *)fb->desc_table.dma_cpu, ++ sizeof(vino_dma_addr_t), (void *)fb->desc_table.dma_cpu, + fb->desc_table.dma); + kfree(fb->desc_table.virtual); + +@@ -857,7 +860,7 @@ + * (has space for four extra descriptors) */ + fb->desc_table.dma_cpu = + dma_alloc_coherent(NULL, VINO_PAGE_RATIO * (count + 4) * +- sizeof(dma_addr_t), &fb->desc_table.dma, ++ sizeof(vino_dma_addr_t), &fb->desc_table.dma, + GFP_KERNEL | GFP_DMA); + if (!fb->desc_table.dma_cpu) { + ret = -ENOMEM; +@@ -913,93 +916,6 @@ + return ret; + } + +-#if 0 +-/* user buffers not fully implemented yet */ +-static int vino_prepare_user_buffer(struct vino_framebuffer *fb, +- void *user, +- unsigned int size) +-{ +- unsigned int count, i, j; +- int ret = 0; +- +- dprintk("vino_prepare_user_buffer():\n"); +- +- if (size < 1) +- return -EINVAL; +- +- memset(fb, 0, sizeof(struct vino_framebuffer)); +- +- count = ((size / PAGE_SIZE)) & ~3; +- +- dprintk("vino_prepare_user_buffer(): size = %d, count = %d\n", +- size, count); +- +- /* allocate memory for table with virtual (page) addresses */ +- fb->desc_table.virtual = (unsigned long *) +- kmalloc(count * sizeof(unsigned long), GFP_KERNEL); +- if (!fb->desc_table.virtual) +- return -ENOMEM; +- +- /* allocate memory for table with dma addresses +- * (has space for four extra descriptors) */ +- fb->desc_table.dma_cpu = +- dma_alloc_coherent(NULL, VINO_PAGE_RATIO * (count + 4) * +- sizeof(dma_addr_t), &fb->desc_table.dma, +- GFP_KERNEL | GFP_DMA); +- if (!fb->desc_table.dma_cpu) { +- ret = -ENOMEM; +- goto out_free_virtual; +- } +- +- /* allocate pages for the buffer and acquire the according +- * dma addresses */ +- for (i = 0; i < count; i++) { +- dma_addr_t dma_data_addr; +- +- fb->desc_table.virtual[i] = +- get_zeroed_page(GFP_KERNEL | GFP_DMA); +- if (!fb->desc_table.virtual[i]) { +- ret = -ENOBUFS; +- break; +- } +- +- dma_data_addr = +- dma_map_single(NULL, +- (void *)fb->desc_table.virtual[i], +- PAGE_SIZE, DMA_FROM_DEVICE); +- +- for (j = 0; j < VINO_PAGE_RATIO; j++) { +- fb->desc_table.dma_cpu[VINO_PAGE_RATIO * i + j] = +- dma_data_addr + VINO_PAGE_SIZE * j; +- } +- +- SetPageReserved(virt_to_page(fb->desc_table.virtual[i])); +- } +- +- /* page_count needs to be set anyway, because the descriptor table has +- * been allocated according to this number */ +- fb->desc_table.page_count = count; +- +- if (ret) { +- /* the descriptor with index i doesn't contain +- * a valid address yet */ +- vino_free_buffer_with_count(fb, i); +- return ret; +- } +- +- //fb->size = size; +- fb->size = count * PAGE_SIZE; +- +- /* set the dma stop-bit for the last (count+1)th descriptor */ +- fb->desc_table.dma_cpu[VINO_PAGE_RATIO * count] = VINO_DESC_STOP; +- return 0; +- +- out_free_virtual: +- kfree(fb->desc_table.virtual); +- return ret; +-} +-#endif +- + static void vino_sync_buffer(struct vino_framebuffer *fb) + { + int i; +@@ -4394,6 +4310,7 @@ + .open = vino_open, + .release = vino_close, + .ioctl = vino_ioctl, ++ .compat_ioctl = v4l_compat_ioctl32, + .mmap = vino_mmap, + .poll = vino_poll, + .llseek = no_llseek, +@@ -4436,8 +4353,8 @@ + dma_unmap_single(NULL, + vino_drvdata->dummy_desc_table.dma_cpu[0], + PAGE_SIZE, DMA_FROM_DEVICE); +- dma_free_coherent(NULL, VINO_DUMMY_DESC_COUNT +- * sizeof(dma_addr_t), ++ dma_free_coherent(NULL, vino_drvdata->dummy_desc_table.page_count ++ * sizeof(vino_dma_addr_t), + (void *)vino_drvdata-> + dummy_desc_table.dma_cpu, + vino_drvdata->dummy_desc_table.dma); +@@ -4514,11 +4431,13 @@ + } + vino_init_stage++; + +- // TODO: use page_count in dummy_desc_table ++ vino_drvdata->dummy_desc_table.page_count = ++ VINO_DUMMY_DESC_COUNT; + + vino_drvdata->dummy_desc_table.dma_cpu = + dma_alloc_coherent(NULL, +- VINO_DUMMY_DESC_COUNT * sizeof(dma_addr_t), ++ vino_drvdata->dummy_desc_table.page_count * ++ sizeof(vino_dma_addr_t), + &vino_drvdata->dummy_desc_table.dma, + GFP_KERNEL | GFP_DMA); + if (!vino_drvdata->dummy_desc_table.dma_cpu) { +@@ -4529,8 +4448,8 @@ + + dma_dummy_address = dma_map_single(NULL, + (void *)vino_drvdata->dummy_page, +- PAGE_SIZE, DMA_FROM_DEVICE); +- for (i = 0; i < VINO_DUMMY_DESC_COUNT; i++) { ++ PAGE_SIZE, DMA_FROM_DEVICE); ++ for (i = 0; i < vino_drvdata->dummy_desc_table.page_count; i++) { + vino_drvdata->dummy_desc_table.dma_cpu[i] = dma_dummy_address; + } +