add compat code from Paul Mackerras
authorDave Airlie <airlied@linux.ie>
Tue, 28 Jun 2005 13:02:20 +0000 (13:02 +0000)
committerDave Airlie <airlied@linux.ie>
Tue, 28 Jun 2005 13:02:20 +0000 (13:02 +0000)
linux-core/drmP.h
linux-core/drm_bufs.c
linux-core/radeon_drv.c
shared-core/radeon_drv.h

index ff2af8c..9c0e5b8 100644 (file)
@@ -274,6 +274,9 @@ do {                                                                        \
 typedef int drm_ioctl_t(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg);
 
+typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
+                              unsigned long arg);
+
 typedef struct drm_ioctl_desc {
        drm_ioctl_t *func;
        int auth_needed;
@@ -758,6 +761,9 @@ extern void __exit drm_exit(struct drm_driver *driver);
 extern void __exit drm_cleanup_pci(struct pci_dev *pdev);
 extern int drm_ioctl(struct inode *inode, struct file *filp,
                     unsigned int cmd, unsigned long arg);
+extern long drm_compat_ioctl(struct file *filp,
+                            unsigned int cmd, unsigned long arg);
+
 extern int drm_takedown(drm_device_t * dev);
 
                                /* Device support (drm_fops.h) */
index b54aaeb..d60d082 100644 (file)
@@ -109,6 +109,15 @@ int drm_initmap(drm_device_t * dev, unsigned int offset, unsigned int size,
 }
 EXPORT_SYMBOL(drm_initmap);
 
+#ifdef CONFIG_COMPAT
+/*
+ * Used to allocate 32-bit handles for _DRM_SHM regions
+ * The 0x10000000 value is chosen to be out of the way of
+ * FB/register and GART physical addresses.
+ */
+static unsigned int map32_handle = 0x10000000;
+#endif
+
 /**
  * Ioctl to specify a range of memory that is available for mapping by a non-root process.
  *
@@ -283,6 +292,13 @@ int drm_addmap(drm_device_t * dev, unsigned int offset,
 
        down(&dev->struct_sem);
        list_add(&list->head, &dev->maplist->head);
+#ifdef CONFIG_COMPAT
+       /* Assign a 32-bit handle for _DRM_SHM mappings */
+       /* We do it here so that dev->struct_sem protects the increment */
+       if (map->type == _DRM_SHM)
+               map->offset = map32_handle += PAGE_SIZE;
+#endif
+
        up(&dev->struct_sem);
       found_it:
        *map_ptr = map;
@@ -1568,3 +1584,4 @@ int drm_order( unsigned long size )
 }
 EXPORT_SYMBOL(drm_order);
 
+
index 21f29fc..7b1aa59 100644 (file)
@@ -102,6 +102,9 @@ static struct drm_driver driver = {
                .mmap = drm_mmap,
                .poll = drm_poll,
                .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+               .compat_ioctl = radeon_compat_ioctl,
+#endif
                },
        .pci_driver = {
                .name = DRIVER_NAME,
index 242f3cf..8b05aab 100644 (file)
@@ -311,6 +311,8 @@ extern int radeon_driver_open_helper(drm_device_t * dev,
                                     drm_file_t * filp_priv);
 extern void radeon_driver_free_filp_priv(drm_device_t * dev,
                                         drm_file_t * filp_priv);
+extern long radeon_compat_ioctl(struct file *filp, unsigned int cmd,
+                                        unsigned long arg);
 
 /* Flags for stats.boxes
  */