summary refs log tree commit diff
path: root/drivers
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2005-09-07 17:29:07 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-07 17:29:07 -0700
commitdb400b3c4ee89d384d9163836a55577abdae772d (patch)
tree95d2d031089bcc7d26a7e4b3616c90e821a9c904 /drivers
parent0dd7f883a9e21c5f2ff5e8f1cbb0e78cdc044d8a (diff)
parent908f9c485042e516bb3749f4361129a94772fe26 (diff)
downloadlinux-db400b3c4ee89d384d9163836a55577abdae772d.tar.gz
Merge branch 'drm-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6
Diffstat (limited to 'drivers')
-rw-r--r--drivers/char/drm/drm_bufs.c66
-rw-r--r--drivers/char/drm/drm_context.c2
-rw-r--r--drivers/char/drm/drm_sysfs.c1
-rw-r--r--drivers/char/drm/mga_dma.c14
4 files changed, 46 insertions, 37 deletions
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c
index e0743ebbe4bd..f28e70ae6606 100644
--- a/drivers/char/drm/drm_bufs.c
+++ b/drivers/char/drm/drm_bufs.c
@@ -48,8 +48,8 @@ unsigned long drm_get_resource_len(drm_device_t *dev, unsigned int resource)
 }
 EXPORT_SYMBOL(drm_get_resource_len);
 
-static drm_local_map_t *drm_find_matching_map(drm_device_t *dev,
-					      drm_local_map_t *map)
+static drm_map_list_t *drm_find_matching_map(drm_device_t *dev,
+					     drm_local_map_t *map)
 {
 	struct list_head *list;
 
@@ -57,7 +57,7 @@ static drm_local_map_t *drm_find_matching_map(drm_device_t *dev,
 		drm_map_list_t *entry = list_entry(list, drm_map_list_t, head);
 		if (entry->map && map->type == entry->map->type &&
 		    entry->map->offset == map->offset) {
-			return entry->map;
+			return entry;
 		}
 	}
 
@@ -114,14 +114,13 @@ static __inline__ unsigned int HandleID(unsigned long lhandle, drm_device_t *dev
  * type.  Adds the map to the map list drm_device::maplist. Adds MTRR's where
  * applicable and if supported by the kernel.
  */
-int drm_addmap(drm_device_t * dev, unsigned int offset,
-	       unsigned int size, drm_map_type_t type,
-	       drm_map_flags_t flags, drm_local_map_t ** map_ptr)
+int drm_addmap_core(drm_device_t * dev, unsigned int offset,
+		    unsigned int size, drm_map_type_t type,
+		    drm_map_flags_t flags, drm_map_list_t **maplist)
 {
 	drm_map_t *map;
 	drm_map_list_t *list;
 	drm_dma_handle_t *dmah;
-	drm_local_map_t *found_map;
 
 	map = drm_alloc( sizeof(*map), DRM_MEM_MAPS );
 	if ( !map )
@@ -166,17 +165,17 @@ int drm_addmap(drm_device_t * dev, unsigned int offset,
 		 * needing to be aware of it.  Therefore, we just return success
 		 * when the server tries to create a duplicate map.
 		 */
-		found_map = drm_find_matching_map(dev, map);
-		if (found_map != NULL) {
-			if (found_map->size != map->size) {
+		list = drm_find_matching_map(dev, map);
+		if (list != NULL) {
+			if (list->map->size != map->size) {
 				DRM_DEBUG("Matching maps of type %d with "
 				   "mismatched sizes, (%ld vs %ld)\n",
-				    map->type, map->size, found_map->size);
-				found_map->size = map->size;
+				    map->type, map->size, list->map->size);
+				list->map->size = map->size;
 			}
 
 			drm_free(map, sizeof(*map), DRM_MEM_MAPS);
-			*map_ptr = found_map;
+			*maplist = list;
 			return 0;
 		}
 
@@ -264,9 +263,22 @@ int drm_addmap(drm_device_t * dev, unsigned int offset,
 				    : map->offset, dev);
  	up(&dev->struct_sem);
 
-	*map_ptr = map;
+	*maplist = list;
 	return 0;
 }
+
+int drm_addmap(drm_device_t *dev, unsigned int offset,
+	       unsigned int size, drm_map_type_t type,
+	       drm_map_flags_t flags, drm_local_map_t **map_ptr)
+{
+	drm_map_list_t *list;
+	int rc;
+
+	rc = drm_addmap_core(dev, offset, size, type, flags, &list);
+	if (!rc)
+		*map_ptr = list->map;
+	return rc;
+}
 EXPORT_SYMBOL(drm_addmap);
 
 int drm_addmap_ioctl(struct inode *inode, struct file *filp,
@@ -275,10 +287,9 @@ int drm_addmap_ioctl(struct inode *inode, struct file *filp,
 	drm_file_t *priv = filp->private_data;
 	drm_device_t *dev = priv->head->dev;
 	drm_map_t map;
-	drm_map_t *map_ptr;
+	drm_map_list_t *maplist;
 	drm_map_t __user *argp = (void __user *)arg;
 	int err;
-	unsigned long handle = 0;
 
 	if (!(filp->f_mode & 3))
 		return -EACCES;	/* Require read/write */
@@ -287,26 +298,15 @@ int drm_addmap_ioctl(struct inode *inode, struct file *filp,
 		return -EFAULT;
 	}
 
-	err = drm_addmap(dev, map.offset, map.size, map.type, map.flags,
-			 &map_ptr);
+	err = drm_addmap_core(dev, map.offset, map.size, map.type, map.flags,
+			      &maplist);
 
-	if (err) {
+	if (err) 
 		return err;
-	}
-
-	{
-		drm_map_list_t *_entry;
-		list_for_each_entry(_entry, &dev->maplist->head, head) {
-			if (_entry->map == map_ptr)
-				handle = _entry->user_token;
-		}
-		if (!handle)
-			return -EFAULT;
-	}
 
-	if (copy_to_user(argp, map_ptr, sizeof(*map_ptr)))
+	if (copy_to_user(argp, maplist->map, sizeof(drm_map_t)))
 		return -EFAULT;
-	if (put_user(handle, &argp->handle))
+	if (put_user(maplist->user_token, &argp->handle))
 		return -EFAULT;
 	return 0;
 }
@@ -1041,7 +1041,7 @@ static int drm_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request)
 	return 0;
 }
 
-int drm_addbufs_fb(drm_device_t *dev, drm_buf_desc_t *request)
+static int drm_addbufs_fb(drm_device_t *dev, drm_buf_desc_t *request)
 {
 	drm_device_dma_t *dma = dev->dma;
 	drm_buf_entry_t *entry;
diff --git a/drivers/char/drm/drm_context.c b/drivers/char/drm/drm_context.c
index f515567e5b6f..502892794c16 100644
--- a/drivers/char/drm/drm_context.c
+++ b/drivers/char/drm/drm_context.c
@@ -308,7 +308,7 @@ found:
  *
  * Attempt to set drm_device::context_flag.
  */
-int drm_context_switch( drm_device_t *dev, int old, int new )
+static int drm_context_switch( drm_device_t *dev, int old, int new )
 {
         if ( test_and_set_bit( 0, &dev->context_flag ) ) {
                 DRM_ERROR( "Reentering -- FIXME\n" );
diff --git a/drivers/char/drm/drm_sysfs.c b/drivers/char/drm/drm_sysfs.c
index 2fc10c4bbcdf..475cc5e555e1 100644
--- a/drivers/char/drm/drm_sysfs.c
+++ b/drivers/char/drm/drm_sysfs.c
@@ -17,6 +17,7 @@
 #include <linux/err.h>
 
 #include "drm_core.h"
+#include "drmP.h"
 
 struct drm_sysfs_class {
 	struct class_device_attribute attr;
diff --git a/drivers/char/drm/mga_dma.c b/drivers/char/drm/mga_dma.c
index 567b425b784f..fc7d4a594bca 100644
--- a/drivers/char/drm/mga_dma.c
+++ b/drivers/char/drm/mga_dma.c
@@ -417,6 +417,7 @@ int mga_driver_preinit(drm_device_t *dev, unsigned long flags)
 	return 0;
 }
 
+#if __OS_HAS_AGP
 /**
  * Bootstrap the driver for AGP DMA.
  * 
@@ -560,6 +561,13 @@ static int mga_do_agp_dma_bootstrap(drm_device_t * dev,
 	DRM_INFO("Initialized card for AGP DMA.\n");
 	return 0;
 }
+#else
+static int mga_do_agp_dma_bootstrap(drm_device_t * dev,
+				    drm_mga_dma_bootstrap_t * dma_bs)
+{
+	return -EINVAL;
+}
+#endif
 
 /**
  * Bootstrap the driver for PCI DMA.
@@ -697,7 +705,6 @@ static int mga_do_dma_bootstrap(drm_device_t * dev,
 	 * carve off portions of it for internal uses.  The remaining memory
 	 * is returned to user-mode to be used for AGP textures.
 	 */
-
 	if (is_agp) {
 		err = mga_do_agp_dma_bootstrap(dev, dma_bs);
 	}
@@ -932,6 +939,7 @@ static int mga_do_cleanup_dma( drm_device_t *dev )
 			drm_core_ioremapfree(dev->agp_buffer_map, dev);
 
 		if (dev_priv->used_new_dma_init) {
+#if __OS_HAS_AGP
 			if (dev_priv->agp_mem != NULL) {
 				dev_priv->agp_textures = NULL;
 				drm_unbind_agp(dev_priv->agp_mem);
@@ -944,7 +952,7 @@ static int mga_do_cleanup_dma( drm_device_t *dev )
 			if ((dev->agp != NULL) && dev->agp->acquired) {
 				err = drm_agp_release(dev);
 			}
-
+#endif
 			dev_priv->used_new_dma_init = 0;
 		}
 
@@ -965,7 +973,7 @@ static int mga_do_cleanup_dma( drm_device_t *dev )
 		}
 	}
 
-	return 0;
+	return err;
 }
 
 int mga_dma_init( DRM_IOCTL_ARGS )