final part of XFree86 4.2.99.2 merge
authorAlan Hourihane <alanh@fairlite.demon.co.uk>
Tue, 22 Oct 2002 23:38:53 +0000 (23:38 +0000)
committerAlan Hourihane <alanh@fairlite.demon.co.uk>
Tue, 22 Oct 2002 23:38:53 +0000 (23:38 +0000)
12 files changed:
bsd/Imakefile
libdrm/xf86drm.c
linux-core/drm_vm.c
linux-core/i810_dma.c
linux-core/i810_drv.h
linux-core/i830_dma.c
linux-core/i830_drv.h
linux/drm_vm.h
linux/i810_dma.c
linux/i810_drv.h
linux/i830_dma.c
linux/i830_drv.h

index 575e72b..13b2791 100644 (file)
@@ -1,5 +1,4 @@
-
-XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.8 2001/12/13 00:24:45 alanh Exp $
+XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/drm/kernel/Imakefile,v 1.9 2002/02/27 22:18:10 tsi Exp $
 
 XCOMM This is a kludge until we determine how best to build the
 XCOMM kernel-specific device driver.  This allows us to continue
index 8d3a20d..0532a1e 100644 (file)
  * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
  *         Kevin E. Martin <martin@valinux.com>
  *
- * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.25 2001/08/27 17:40:59 dawes Exp $
+ * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.28 2002/10/16 01:26:49 dawes Exp $
  *
  */
 
 #ifdef XFree86Server
 # include "xf86.h"
 # include "xf86_OSproc.h"
+# include "drm.h"
 # include "xf86_ansic.h"
 # define _DRM_MALLOC xalloc
 # define _DRM_FREE   xfree
@@ -66,6 +67,7 @@ extern int xf86RemoveSIGIOHandler(int fd);
 #  define _DRM_MALLOC Xmalloc
 #  define _DRM_FREE   Xfree
 # endif
+# include "drm.h"
 #endif
 
 /* No longer needed with CVS kernel modules on alpha 
@@ -81,7 +83,6 @@ extern unsigned long _bus_base(void);
 #endif
 
 #include "xf86drm.h"
-#include "drm.h"
 
 #ifndef DRM_MAJOR
 #define DRM_MAJOR 226          /* Linux */
@@ -197,7 +198,6 @@ static int drmOpenDevice(long dev, int minor)
     stat_t          st;
     char            buf[64];
     int             fd;
-    mode_t          dirmode = DRM_DEV_DIRMODE;
     mode_t          devmode = DRM_DEV_MODE;
     int             isroot  = !geteuid();
 #if defined(XFree86Server)
@@ -209,23 +209,16 @@ static int drmOpenDevice(long dev, int minor)
 
 #if defined(XFree86Server)
     devmode  = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
-    dirmode  = (devmode & S_IRUSR) ? S_IXUSR : 0;
-    dirmode |= (devmode & S_IRGRP) ? S_IXGRP : 0;
-    dirmode |= (devmode & S_IROTH) ? S_IXOTH : 0;
-    dirmode |= devmode;
     devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
     group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
 #endif
 
     if (stat(DRM_DIR_NAME, &st)) {
        if (!isroot) return DRM_ERR_NOT_ROOT;
-       remove(DRM_DIR_NAME);
-       mkdir(DRM_DIR_NAME, dirmode);
+       mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
+       chown(DRM_DIR_NAME, 0, 0); /* root:root */
+       chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
     }
-#if defined(XFree86Server)
-    chown(DRM_DIR_NAME, user, group);
-    chmod(DRM_DIR_NAME, dirmode);
-#endif
 
     sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
     drmMsg("drmOpenDevice: node name is %s\n", buf);
index 52dfd59..683c085 100644 (file)
@@ -71,7 +71,7 @@ struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
          * Find the right map
          */
 
-       if(!dev->agp->cant_use_aperture) goto vm_nopage_error;
+       if(!dev->agp || !dev->agp->cant_use_aperture) goto vm_nopage_error;
 
        list_for_each(list, &dev->maplist->head) {
                r_list = (drm_map_list_t *)list;
@@ -408,7 +408,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
 
        if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
                vma->vm_flags &= VM_MAYWRITE;
-#if defined(__i386__)
+#if defined(__i386__) || defined(__x86_64__)
                pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
 #else
                                /* Ye gads this is ugly.  With more thought
@@ -435,7 +435,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
        case _DRM_FRAME_BUFFER:
        case _DRM_REGISTERS:
                if (VM_OFFSET(vma) >= __pa(high_memory)) {
-#if defined(__i386__)
+#if defined(__i386__) || defined(__x86_64__)
                        if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
                                pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
                                pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
index f4eef3a..e95554a 100644 (file)
 #include <linux/interrupt.h>   /* For task queue support */
 #include <linux/delay.h>
 
+#ifdef DO_MUNMAP_4_ARGS
+#define DO_MUNMAP(m, a, l)     do_munmap(m, a, l, 1)
+#else
+#define DO_MUNMAP(m, a, l)     do_munmap(m, a, l)
+#endif
+
 #define I810_BUF_FREE          2
 #define I810_BUF_CLIENT                1
 #define I810_BUF_HARDWARE              0
@@ -218,7 +224,7 @@ static int i810_unmap_buffer(drm_buf_t *buf)
 #else
        down_write( &current->mm->mmap_sem );
 #endif
-       retcode = do_munmap(current->mm,
+       retcode = DO_MUNMAP(current->mm,
                            (unsigned long)buf_priv->virtual,
                            (size_t) buf->total);
 #if LINUX_VERSION_CODE <= 0x020402
@@ -263,44 +269,6 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        return retcode;
 }
 
-static unsigned long i810_alloc_page(drm_device_t *dev)
-{
-       unsigned long address;
-
-       address = __get_free_page(GFP_KERNEL);
-       if(address == 0UL)
-               return 0;
-
-#if LINUX_VERSION_CODE < 0x020409
-       atomic_inc(&virt_to_page(address)->count);
-       set_bit(PG_locked, &virt_to_page(address)->flags);
-#else
-       get_page(virt_to_page(address));
-#if LINUX_VERSION_CODE < 0x020500
-       LockPage(virt_to_page(address));
-#else
-       SetPageLocked(virt_to_page(address));
-#endif
-#endif
-       return address;
-}
-
-static void i810_free_page(drm_device_t *dev, unsigned long page)
-{
-       if (page) {
-#if LINUX_VERSION_CODE < 0x020409
-               atomic_dec(&virt_to_page(page)->count);
-               clear_bit(PG_locked, &virt_to_page(page)->flags);
-               wake_up(&virt_to_page(page)->wait);
-#else
-               struct page *p = virt_to_page(page);
-               put_page(p);
-               unlock_page(p);
-#endif
-               free_page(page);
-       }
-}
-
 static int i810_dma_cleanup(drm_device_t *dev)
 {
        drm_device_dma_t *dma = dev->dma;
@@ -315,7 +283,9 @@ static int i810_dma_cleanup(drm_device_t *dev)
                                         dev_priv->ring.Size);
                }
                if(dev_priv->hw_status_page != 0UL) {
-                       i810_free_page(dev, dev_priv->hw_status_page);
+                       pci_free_consistent(dev->pdev, PAGE_SIZE,
+                                           (void *)dev_priv->hw_status_page,
+                                           dev_priv->dma_status_page);
                        /* Need to rewrite hardware status page */
                        I810_WRITE(0x02080, 0x1ffff000);
                }
@@ -475,7 +445,9 @@ static int i810_dma_initialize(drm_device_t *dev,
        dev_priv->zi1 = init->depth_offset | init->pitch_bits;
 
        /* Program Hardware Status Page */
-       dev_priv->hw_status_page = i810_alloc_page(dev);
+       dev_priv->hw_status_page =
+               (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE,
+                                               &dev_priv->dma_status_page);
        if(dev_priv->hw_status_page == 0UL) {
                dev->dev_private = (void *)dev_priv;
                i810_dma_cleanup(dev);
@@ -485,7 +457,7 @@ static int i810_dma_initialize(drm_device_t *dev,
        memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
        DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
 
-       I810_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
+       I810_WRITE(0x02080, dev_priv->dma_status_page);
        DRM_DEBUG("Enabled hardware status page\n");
 
        /* Now we need to init our freelist */
index 99165cf..106abf5 100644 (file)
@@ -64,6 +64,8 @@ typedef struct drm_i810_private {
        unsigned long hw_status_page;
        unsigned long counter;
 
+       dma_addr_t dma_status_page;
+
        drm_buf_t *mmap_buffer;
 
 
index 7088437..d29e21c 100644 (file)
@@ -272,29 +272,6 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d,
        return retcode;
 }
 
-static unsigned long i830_alloc_page(drm_device_t *dev)
-{
-       unsigned long address;
-   
-       address = __get_free_page(GFP_KERNEL);
-       if(address == 0UL) 
-               return 0;
-       
-       get_page(virt_to_page(address));
-       LockPage(virt_to_page(address));
-       return address;
-}
-
-static void i830_free_page(drm_device_t *dev, unsigned long page)
-{
-       if (page) {
-               struct page *p = virt_to_page(page);
-               put_page(p);
-               UnlockPage(p);
-               free_page(page);
-       }
-}
-
 static int i830_dma_cleanup(drm_device_t *dev)
 {
        drm_device_dma_t *dma = dev->dma;
@@ -309,7 +286,9 @@ static int i830_dma_cleanup(drm_device_t *dev)
                                         dev_priv->ring.Size);
                }
                if(dev_priv->hw_status_page != 0UL) {
-                       i830_free_page(dev, dev_priv->hw_status_page);
+                       pci_free_consistent(dev->pdev, PAGE_SIZE,
+                                           (void *)dev_priv->hw_status_page,
+                                           dev_priv->dma_status_page);
                        /* Need to rewrite hardware status page */
                        I830_WRITE(0x02080, 0x1ffff000);
                }
@@ -483,7 +462,9 @@ static int i830_dma_initialize(drm_device_t *dev,
        dev_priv->depth_pitch = init->depth_pitch;
 
        /* Program Hardware Status Page */
-       dev_priv->hw_status_page = i830_alloc_page(dev);
+       dev_priv->hw_status_page =
+               (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE,
+                                               &dev_priv->dma_status_page);
        if(dev_priv->hw_status_page == 0UL) {
                dev->dev_private = (void *)dev_priv;
                i830_dma_cleanup(dev);
@@ -493,7 +474,7 @@ static int i830_dma_initialize(drm_device_t *dev,
        memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
        DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
    
-       I830_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
+       I830_WRITE(0x02080, dev_priv->dma_status_page);
        DRM_DEBUG("Enabled hardware status page\n");
    
        /* Now we need to init our freelist */
index 527d0ce..eec640c 100644 (file)
@@ -64,6 +64,8 @@ typedef struct drm_i830_private {
        unsigned long hw_status_page;
        unsigned long counter;
 
+       dma_addr_t dma_status_page;
+
        drm_buf_t *mmap_buffer;
        
        u32 front_di1, back_di1, zi1;
index 52dfd59..683c085 100644 (file)
@@ -71,7 +71,7 @@ struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
          * Find the right map
          */
 
-       if(!dev->agp->cant_use_aperture) goto vm_nopage_error;
+       if(!dev->agp || !dev->agp->cant_use_aperture) goto vm_nopage_error;
 
        list_for_each(list, &dev->maplist->head) {
                r_list = (drm_map_list_t *)list;
@@ -408,7 +408,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
 
        if (!capable(CAP_SYS_ADMIN) && (map->flags & _DRM_READ_ONLY)) {
                vma->vm_flags &= VM_MAYWRITE;
-#if defined(__i386__)
+#if defined(__i386__) || defined(__x86_64__)
                pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
 #else
                                /* Ye gads this is ugly.  With more thought
@@ -435,7 +435,7 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
        case _DRM_FRAME_BUFFER:
        case _DRM_REGISTERS:
                if (VM_OFFSET(vma) >= __pa(high_memory)) {
-#if defined(__i386__)
+#if defined(__i386__) || defined(__x86_64__)
                        if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
                                pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
                                pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
index f4eef3a..e95554a 100644 (file)
 #include <linux/interrupt.h>   /* For task queue support */
 #include <linux/delay.h>
 
+#ifdef DO_MUNMAP_4_ARGS
+#define DO_MUNMAP(m, a, l)     do_munmap(m, a, l, 1)
+#else
+#define DO_MUNMAP(m, a, l)     do_munmap(m, a, l)
+#endif
+
 #define I810_BUF_FREE          2
 #define I810_BUF_CLIENT                1
 #define I810_BUF_HARDWARE              0
@@ -218,7 +224,7 @@ static int i810_unmap_buffer(drm_buf_t *buf)
 #else
        down_write( &current->mm->mmap_sem );
 #endif
-       retcode = do_munmap(current->mm,
+       retcode = DO_MUNMAP(current->mm,
                            (unsigned long)buf_priv->virtual,
                            (size_t) buf->total);
 #if LINUX_VERSION_CODE <= 0x020402
@@ -263,44 +269,6 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        return retcode;
 }
 
-static unsigned long i810_alloc_page(drm_device_t *dev)
-{
-       unsigned long address;
-
-       address = __get_free_page(GFP_KERNEL);
-       if(address == 0UL)
-               return 0;
-
-#if LINUX_VERSION_CODE < 0x020409
-       atomic_inc(&virt_to_page(address)->count);
-       set_bit(PG_locked, &virt_to_page(address)->flags);
-#else
-       get_page(virt_to_page(address));
-#if LINUX_VERSION_CODE < 0x020500
-       LockPage(virt_to_page(address));
-#else
-       SetPageLocked(virt_to_page(address));
-#endif
-#endif
-       return address;
-}
-
-static void i810_free_page(drm_device_t *dev, unsigned long page)
-{
-       if (page) {
-#if LINUX_VERSION_CODE < 0x020409
-               atomic_dec(&virt_to_page(page)->count);
-               clear_bit(PG_locked, &virt_to_page(page)->flags);
-               wake_up(&virt_to_page(page)->wait);
-#else
-               struct page *p = virt_to_page(page);
-               put_page(p);
-               unlock_page(p);
-#endif
-               free_page(page);
-       }
-}
-
 static int i810_dma_cleanup(drm_device_t *dev)
 {
        drm_device_dma_t *dma = dev->dma;
@@ -315,7 +283,9 @@ static int i810_dma_cleanup(drm_device_t *dev)
                                         dev_priv->ring.Size);
                }
                if(dev_priv->hw_status_page != 0UL) {
-                       i810_free_page(dev, dev_priv->hw_status_page);
+                       pci_free_consistent(dev->pdev, PAGE_SIZE,
+                                           (void *)dev_priv->hw_status_page,
+                                           dev_priv->dma_status_page);
                        /* Need to rewrite hardware status page */
                        I810_WRITE(0x02080, 0x1ffff000);
                }
@@ -475,7 +445,9 @@ static int i810_dma_initialize(drm_device_t *dev,
        dev_priv->zi1 = init->depth_offset | init->pitch_bits;
 
        /* Program Hardware Status Page */
-       dev_priv->hw_status_page = i810_alloc_page(dev);
+       dev_priv->hw_status_page =
+               (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE,
+                                               &dev_priv->dma_status_page);
        if(dev_priv->hw_status_page == 0UL) {
                dev->dev_private = (void *)dev_priv;
                i810_dma_cleanup(dev);
@@ -485,7 +457,7 @@ static int i810_dma_initialize(drm_device_t *dev,
        memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
        DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
 
-       I810_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
+       I810_WRITE(0x02080, dev_priv->dma_status_page);
        DRM_DEBUG("Enabled hardware status page\n");
 
        /* Now we need to init our freelist */
index 99165cf..106abf5 100644 (file)
@@ -64,6 +64,8 @@ typedef struct drm_i810_private {
        unsigned long hw_status_page;
        unsigned long counter;
 
+       dma_addr_t dma_status_page;
+
        drm_buf_t *mmap_buffer;
 
 
index 7088437..d29e21c 100644 (file)
@@ -272,29 +272,6 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d,
        return retcode;
 }
 
-static unsigned long i830_alloc_page(drm_device_t *dev)
-{
-       unsigned long address;
-   
-       address = __get_free_page(GFP_KERNEL);
-       if(address == 0UL) 
-               return 0;
-       
-       get_page(virt_to_page(address));
-       LockPage(virt_to_page(address));
-       return address;
-}
-
-static void i830_free_page(drm_device_t *dev, unsigned long page)
-{
-       if (page) {
-               struct page *p = virt_to_page(page);
-               put_page(p);
-               UnlockPage(p);
-               free_page(page);
-       }
-}
-
 static int i830_dma_cleanup(drm_device_t *dev)
 {
        drm_device_dma_t *dma = dev->dma;
@@ -309,7 +286,9 @@ static int i830_dma_cleanup(drm_device_t *dev)
                                         dev_priv->ring.Size);
                }
                if(dev_priv->hw_status_page != 0UL) {
-                       i830_free_page(dev, dev_priv->hw_status_page);
+                       pci_free_consistent(dev->pdev, PAGE_SIZE,
+                                           (void *)dev_priv->hw_status_page,
+                                           dev_priv->dma_status_page);
                        /* Need to rewrite hardware status page */
                        I830_WRITE(0x02080, 0x1ffff000);
                }
@@ -483,7 +462,9 @@ static int i830_dma_initialize(drm_device_t *dev,
        dev_priv->depth_pitch = init->depth_pitch;
 
        /* Program Hardware Status Page */
-       dev_priv->hw_status_page = i830_alloc_page(dev);
+       dev_priv->hw_status_page =
+               (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE,
+                                               &dev_priv->dma_status_page);
        if(dev_priv->hw_status_page == 0UL) {
                dev->dev_private = (void *)dev_priv;
                i830_dma_cleanup(dev);
@@ -493,7 +474,7 @@ static int i830_dma_initialize(drm_device_t *dev,
        memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE);
        DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page);
    
-       I830_WRITE(0x02080, virt_to_bus((void *)dev_priv->hw_status_page));
+       I830_WRITE(0x02080, dev_priv->dma_status_page);
        DRM_DEBUG("Enabled hardware status page\n");
    
        /* Now we need to init our freelist */
index 527d0ce..eec640c 100644 (file)
@@ -64,6 +64,8 @@ typedef struct drm_i830_private {
        unsigned long hw_status_page;
        unsigned long counter;
 
+       dma_addr_t dma_status_page;
+
        drm_buf_t *mmap_buffer;
        
        u32 front_di1, back_di1, zi1;