Merged the mga-lock-debug-0-2-0-branch with the trunk. This includes
authorJeff Hartmann <jhartmann@valinux.com>
Wed, 27 Sep 2000 21:32:19 +0000 (21:32 +0000)
committerJeff Hartmann <jhartmann@valinux.com>
Wed, 27 Sep 2000 21:32:19 +0000 (21:32 +0000)
    several fixes including: (Jeff) Really disable multitexture (Broken
    since Mesa 3.4 integration.)
(Jeff) Various changes in mga_state.c in the kernel module, which includes
    a fix to the bug where the first OGL application hangs the machine
    w/out rendering anything. This also includes defines for the warp
    registers so they are easily human readable.
(Rik and Jeff) Fixed all the schedule loops in the kernel to look like they
    are supposed too.
(Jeff) Configurable agp modes: Add the option "AGPMode2x" or "AGPMode4x" to
    your XF86Config file.
(Rik) Various cleanups to the mga kernel driver to make it easier to read
    and debug.
(Rik) Removed alot of DRM_DEBUG statements from the kernel driver.

23 files changed:
linux-core/drmP.h
linux-core/i810_dma.c
linux-core/i810_drv.c
linux-core/mga_drv.c
linux-core/r128_drv.c
linux-core/tdfx_drv.c
linux/dma.c
linux/drmP.h
linux/gamma_dma.c
linux/i810_dma.c
linux/i810_drv.c
linux/lists.c
linux/lock.c
linux/mga_bufs.c
linux/mga_context.c
linux/mga_dma.c
linux/mga_drv.c
linux/mga_drv.h
linux/mga_state.c
linux/r128_drv.c
linux/r128_drv.h
linux/tdfx_drv.c
linux/vm.c

index bfd124d..69cf63d 100644 (file)
@@ -436,6 +436,7 @@ typedef struct drm_file {
        struct drm_file   *next;
        struct drm_file   *prev;
        struct drm_device *dev;
+       int               remove_auth_on_close;
 } drm_file_t;
 
 
index 8a279be..11d9973 100644 (file)
@@ -253,16 +253,15 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        buf = i810_freelist_get(dev);
        if (!buf) {
                retcode = -ENOMEM;
-               DRM_DEBUG("%s retcode %d\n", __FUNCTION__, retcode);
-               goto out_get_buf;
+               DRM_DEBUG("retcode=%d\n", retcode);
+               return retcode;
        }
    
        retcode = i810_map_buffer(buf, filp);
        if(retcode) {
                i810_freelist_put(dev, buf);
-               DRM_DEBUG("mapbuf failed in %s retcode %d\n", 
-                         __FUNCTION__, retcode);
-               goto out_get_buf;
+               DRM_DEBUG("mapbuf failed, retcode %d\n", retcode);
+               return retcode;
        }
        buf->pid     = priv->pid;
        buf_priv = buf->dev_private;    
@@ -271,7 +270,6 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        d->request_size = buf->total;
        d->virtual = buf_priv->virtual;
 
-out_get_buf:
        return retcode;
 }
 
@@ -1070,11 +1068,11 @@ static void i810_dma_quiescent(drm_device_t *dev)
                return;
        }
        atomic_set(&dev_priv->flush_done, 0);
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&dev_priv->flush_queue, &entry);
        end = jiffies + (HZ*3);
    
        for (;;) {
+               current->state = TASK_INTERRUPTIBLE;
                i810_dma_quiescent_emit(dev);
                if (atomic_read(&dev_priv->flush_done) == 1) break;
                if((signed)(end - jiffies) <= 0) {
@@ -1105,10 +1103,10 @@ static int i810_flush_queue(drm_device_t *dev)
                return 0;
        }
        atomic_set(&dev_priv->flush_done, 0);
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&dev_priv->flush_queue, &entry);
        end = jiffies + (HZ*3);
        for (;;) {
+               current->state = TASK_INTERRUPTIBLE;
                i810_dma_emit_flush(dev);
                if (atomic_read(&dev_priv->flush_done) == 1) break;
                if((signed)(end - jiffies) <= 0) {
@@ -1202,6 +1200,7 @@ int i810_lock(struct inode *inode, struct file *filp, unsigned int cmd,
        if (!ret) {
                add_wait_queue(&dev->lock.lock_queue, &entry);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!dev->lock.hw_lock) {
                                /* Device has been unregistered */
                                ret = -EINTR;
@@ -1217,7 +1216,6 @@ int i810_lock(struct inode *inode, struct file *filp, unsigned int cmd,
                        
                                /* Contention */
                        atomic_inc(&dev->total_sleeps);
-                       current->state = TASK_INTERRUPTIBLE;
                        DRM_DEBUG("Calling lock schedule\n");
                        schedule();
                        if (signal_pending(current)) {
index a001b54..5d4a9c1 100644 (file)
@@ -509,6 +509,7 @@ int i810_release(struct inode *inode, struct file *filp)
                DECLARE_WAITQUEUE(entry, current);
                add_wait_queue(&dev->lock.lock_queue, &entry);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!dev->lock.hw_lock) {
                                /* Device has been unregistered */
                                retcode = -EINTR;
@@ -523,7 +524,6 @@ int i810_release(struct inode *inode, struct file *filp)
                        }
                                /* Contention */
                        atomic_inc(&dev->total_sleeps);
-                       current->state = TASK_INTERRUPTIBLE;
                        schedule();
                        if (signal_pending(current)) {
                                retcode = -ERESTARTSYS;
index 70d5d89..0ccf0a7 100644 (file)
@@ -217,6 +217,7 @@ static int mga_takedown(drm_device_t *dev)
 
        DRM_DEBUG("\n");
 
+       if (dev->dev_private) mga_dma_cleanup(dev);
        if (dev->irq) mga_irq_uninstall(dev);
 
        down(&dev->struct_sem);
@@ -352,7 +353,6 @@ static int mga_init(void)
 #ifdef MODULE
        drm_parse_options(mga);
 #endif
-       DRM_DEBUG("doing misc_register\n");
        if ((retcode = misc_register(&mga_misc))) {
                DRM_ERROR("Cannot register \"%s\"\n", MGA_NAME);
                return retcode;
@@ -360,11 +360,8 @@ static int mga_init(void)
        dev->device = MKDEV(MISC_MAJOR, mga_misc.minor);
        dev->name   = MGA_NAME;
 
-       DRM_DEBUG("doing mem init\n");
        drm_mem_init();
-       DRM_DEBUG("doing proc init\n");
        drm_proc_init(dev);
-       DRM_DEBUG("doing agp init\n");
        dev->agp    = drm_agp_init();
        if(dev->agp == NULL) {
                DRM_INFO("The mga drm module requires the agpgart module"
@@ -381,7 +378,6 @@ static int mga_init(void)
                                      MTRR_TYPE_WRCOMB,
                                      1);
 #endif
-       DRM_DEBUG("doing ctxbitmap init\n");
        if((retcode = drm_ctxbitmap_init(dev))) {
                DRM_ERROR("Cannot allocate memory for context bitmap.\n");
                drm_proc_cleanup();
@@ -416,7 +412,6 @@ static void mga_cleanup(void)
                DRM_INFO("Module unloaded\n");
        }
        drm_ctxbitmap_cleanup(dev);
-       mga_dma_cleanup(dev);
 #ifdef CONFIG_MTRR
        if(dev->agp && dev->agp->agp_mtrr) {
                int retval;
@@ -509,17 +504,21 @@ int mga_release(struct inode *inode, struct file *filp)
        if (dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)
            && dev->lock.pid == current->pid) {
                mga_reclaim_buffers(dev, priv->pid);
-               DRM_ERROR("Process %d dead, freeing lock for context %d\n",
-                         current->pid,
-                         _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
+               DRM_INFO("Process %d dead (ctx %d, d_s = 0x%02x)\n",
+                        current->pid,
+                        _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock),
+                        dev->dev_private ?
+                        ((drm_mga_private_t *)dev->dev_private)
+                        ->dispatch_status
+                        : 0);
+
+               if (dev->dev_private)
+                       ((drm_mga_private_t *)dev->dev_private)
+                               ->dispatch_status &= MGA_IN_DISPATCH;
+               
                drm_lock_free(dev,
                              &dev->lock.hw_lock->lock,
                              _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
-
-                               /* FIXME: may require heavy-handed reset of
-                                   hardware at this point, possibly
-                                   processed via a callback to the X
-                                   server. */
        } else if (dev->lock.hw_lock) {
                /* The lock is required to reclaim buffers */
                DECLARE_WAITQUEUE(entry, current);
@@ -546,10 +545,12 @@ int mga_release(struct inode *inode, struct file *filp)
                                break;
                        }
                }
-               current->state = TASK_RUNNING;
                remove_wait_queue(&dev->lock.lock_queue, &entry);
                if(!retcode) {
                        mga_reclaim_buffers(dev, priv->pid);
+                       if (dev->dev_private)
+                               ((drm_mga_private_t *)dev->dev_private)
+                                       ->dispatch_status &= MGA_IN_DISPATCH;
                        drm_lock_free(dev, &dev->lock.hw_lock->lock,
                                      DRM_KERNEL_CONTEXT);
                }
@@ -557,6 +558,13 @@ int mga_release(struct inode *inode, struct file *filp)
        drm_fasync(-1, filp, 0);
 
        down(&dev->struct_sem);
+       if (priv->remove_auth_on_close == 1) {
+               drm_file_t *temp = dev->file_first;
+               while(temp) {
+                       temp->authenticated = 0;
+                       temp = temp->next;
+               }
+       }
        if (priv->prev) priv->prev->next = priv->next;
        else            dev->file_first  = priv->next;
        if (priv->next) priv->next->prev = priv->prev;
@@ -604,9 +612,6 @@ int mga_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        atomic_inc(&dev->total_ioctl);
        ++priv->ioctl_count;
 
-       DRM_DEBUG("pid = %d, cmd = 0x%02x, nr = 0x%02x, dev 0x%x, auth = %d\n",
-                 current->pid, cmd, nr, dev->device, priv->authenticated);
-
        if (nr >= MGA_IOCTL_COUNT) {
                retcode = -EINVAL;
        } else {
@@ -614,7 +619,10 @@ int mga_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                func      = ioctl->func;
 
                if (!func) {
-                       DRM_DEBUG("no function\n");
+                       DRM_DEBUG("no function: pid = %d, cmd = 0x%02x,"
+                                 " nr = 0x%02x, dev 0x%x, auth = %d\n",
+                                 current->pid, cmd, nr, dev->device,
+                                 priv->authenticated);
                        retcode = -EINVAL;
                } else if ((ioctl->root_only && !capable(CAP_SYS_ADMIN))
                            || (ioctl->auth_needed && !priv->authenticated)) {
@@ -644,9 +652,6 @@ int mga_unlock(struct inode *inode, struct file *filp, unsigned int cmd,
                return -EINVAL;
        }
 
-       DRM_DEBUG("%d frees lock (%d holds)\n",
-                 lock.context,
-                 _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
        atomic_inc(&dev->total_unlocks);
        if (_DRM_LOCK_IS_CONT(dev->lock.hw_lock->lock))
                atomic_inc(&dev->total_contends);
@@ -654,9 +659,7 @@ int mga_unlock(struct inode *inode, struct file *filp, unsigned int cmd,
        mga_dma_schedule(dev, 1);
 
        if (drm_lock_free(dev, &dev->lock.hw_lock->lock,
-                         DRM_KERNEL_CONTEXT)) {
-          DRM_ERROR("\n");
-       }
+                         DRM_KERNEL_CONTEXT)) DRM_ERROR("\n");
 
        unblock_all_signals();
        return 0;
index 8d4a370..dcb766a 100644 (file)
@@ -603,6 +603,7 @@ int r128_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 #endif
                 add_wait_queue(&dev->lock.lock_queue, &entry);
                 for (;;) {
+                        current->state = TASK_INTERRUPTIBLE;
                         if (!dev->lock.hw_lock) {
                                 /* Device has been unregistered */
                                 ret = -EINTR;
@@ -618,7 +619,6 @@ int r128_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 
                                 /* Contention */
                         atomic_inc(&dev->total_sleeps);
-                        current->state = TASK_INTERRUPTIBLE;
 #if 1
                        current->policy |= SCHED_YIELD;
 #endif
index 689b360..d8f5bcc 100644 (file)
@@ -562,6 +562,7 @@ int tdfx_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 #endif
                 add_wait_queue(&dev->lock.lock_queue, &entry);
                 for (;;) {
+                        current->state = TASK_INTERRUPTIBLE;
                         if (!dev->lock.hw_lock) {
                                 /* Device has been unregistered */
                                 ret = -EINTR;
@@ -577,7 +578,6 @@ int tdfx_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 
                                 /* Contention */
                         atomic_inc(&dev->total_sleeps);
-                        current->state = TASK_INTERRUPTIBLE;
 #if 1
                        current->policy |= SCHED_YIELD;
 #endif
index 6234017..5cc3ec3 100644 (file)
@@ -397,10 +397,10 @@ int drm_dma_enqueue(drm_device_t *dev, drm_dma_t *d)
 
        atomic_inc(&q->use_count);
        if (atomic_read(&q->block_write)) {
-               current->state = TASK_INTERRUPTIBLE;
                add_wait_queue(&q->write_queue, &entry);
                atomic_inc(&q->block_count);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!atomic_read(&q->block_write)) break;
                        schedule();
                        if (signal_pending(current)) {
index bfd124d..69cf63d 100644 (file)
@@ -436,6 +436,7 @@ typedef struct drm_file {
        struct drm_file   *next;
        struct drm_file   *prev;
        struct drm_device *dev;
+       int               remove_auth_on_close;
 } drm_file_t;
 
 
index 7943338..77b0779 100644 (file)
@@ -778,6 +778,7 @@ int gamma_lock(struct inode *inode, struct file *filp, unsigned int cmd,
                }
                add_wait_queue(&dev->lock.lock_queue, &entry);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!dev->lock.hw_lock) {
                                /* Device has been unregistered */
                                ret = -EINTR;
@@ -794,7 +795,6 @@ int gamma_lock(struct inode *inode, struct file *filp, unsigned int cmd,
                        
                                /* Contention */
                        atomic_inc(&dev->total_sleeps);
-                       current->state = TASK_INTERRUPTIBLE;
                        schedule();
                        if (signal_pending(current)) {
                                ret = -ERESTARTSYS;
index 8a279be..11d9973 100644 (file)
@@ -253,16 +253,15 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        buf = i810_freelist_get(dev);
        if (!buf) {
                retcode = -ENOMEM;
-               DRM_DEBUG("%s retcode %d\n", __FUNCTION__, retcode);
-               goto out_get_buf;
+               DRM_DEBUG("retcode=%d\n", retcode);
+               return retcode;
        }
    
        retcode = i810_map_buffer(buf, filp);
        if(retcode) {
                i810_freelist_put(dev, buf);
-               DRM_DEBUG("mapbuf failed in %s retcode %d\n", 
-                         __FUNCTION__, retcode);
-               goto out_get_buf;
+               DRM_DEBUG("mapbuf failed, retcode %d\n", retcode);
+               return retcode;
        }
        buf->pid     = priv->pid;
        buf_priv = buf->dev_private;    
@@ -271,7 +270,6 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        d->request_size = buf->total;
        d->virtual = buf_priv->virtual;
 
-out_get_buf:
        return retcode;
 }
 
@@ -1070,11 +1068,11 @@ static void i810_dma_quiescent(drm_device_t *dev)
                return;
        }
        atomic_set(&dev_priv->flush_done, 0);
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&dev_priv->flush_queue, &entry);
        end = jiffies + (HZ*3);
    
        for (;;) {
+               current->state = TASK_INTERRUPTIBLE;
                i810_dma_quiescent_emit(dev);
                if (atomic_read(&dev_priv->flush_done) == 1) break;
                if((signed)(end - jiffies) <= 0) {
@@ -1105,10 +1103,10 @@ static int i810_flush_queue(drm_device_t *dev)
                return 0;
        }
        atomic_set(&dev_priv->flush_done, 0);
-       current->state = TASK_INTERRUPTIBLE;
        add_wait_queue(&dev_priv->flush_queue, &entry);
        end = jiffies + (HZ*3);
        for (;;) {
+               current->state = TASK_INTERRUPTIBLE;
                i810_dma_emit_flush(dev);
                if (atomic_read(&dev_priv->flush_done) == 1) break;
                if((signed)(end - jiffies) <= 0) {
@@ -1202,6 +1200,7 @@ int i810_lock(struct inode *inode, struct file *filp, unsigned int cmd,
        if (!ret) {
                add_wait_queue(&dev->lock.lock_queue, &entry);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!dev->lock.hw_lock) {
                                /* Device has been unregistered */
                                ret = -EINTR;
@@ -1217,7 +1216,6 @@ int i810_lock(struct inode *inode, struct file *filp, unsigned int cmd,
                        
                                /* Contention */
                        atomic_inc(&dev->total_sleeps);
-                       current->state = TASK_INTERRUPTIBLE;
                        DRM_DEBUG("Calling lock schedule\n");
                        schedule();
                        if (signal_pending(current)) {
index a001b54..5d4a9c1 100644 (file)
@@ -509,6 +509,7 @@ int i810_release(struct inode *inode, struct file *filp)
                DECLARE_WAITQUEUE(entry, current);
                add_wait_queue(&dev->lock.lock_queue, &entry);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!dev->lock.hw_lock) {
                                /* Device has been unregistered */
                                retcode = -EINTR;
@@ -523,7 +524,6 @@ int i810_release(struct inode *inode, struct file *filp)
                        }
                                /* Contention */
                        atomic_inc(&dev->total_sleeps);
-                       current->state = TASK_INTERRUPTIBLE;
                        schedule();
                        if (signal_pending(current)) {
                                retcode = -ERESTARTSYS;
index 0a21a91..60e66b8 100644 (file)
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *
  */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/lists.c,v 1.9 2000/08/28 02:43:15 tsi Exp $ */
 
 #define __NO_VERSION__
 #include "drmP.h"
 
 int drm_waitlist_create(drm_waitlist_t *bl, int count)
 {
-       DRM_DEBUG("%d\n", count);
        if (bl->count) return -EINVAL;
        
        bl->count      = count;
@@ -51,7 +49,6 @@ int drm_waitlist_create(drm_waitlist_t *bl, int count)
 
 int drm_waitlist_destroy(drm_waitlist_t *bl)
 {
-       DRM_DEBUG("\n");
        if (bl->rp != bl->wp) return -EINVAL;
        if (bl->bufs) drm_free(bl->bufs,
                               (bl->count + 2) * sizeof(*bl->bufs),
@@ -70,8 +67,6 @@ int drm_waitlist_put(drm_waitlist_t *bl, drm_buf_t *buf)
        unsigned long flags;
 
        left = DRM_LEFTCOUNT(bl);
-       DRM_DEBUG("put %d (%d left, rp = %p, wp = %p)\n",
-                 buf->idx, left, bl->rp, bl->wp);
        if (!left) {
                DRM_ERROR("Overflow while adding buffer %d from pid %d\n",
                          buf->idx, buf->pid);
@@ -104,13 +99,11 @@ drm_buf_t *drm_waitlist_get(drm_waitlist_t *bl)
        if (++bl->rp >= bl->end) bl->rp = bl->bufs;
        spin_unlock_irqrestore(&bl->read_lock, flags);
        
-       DRM_DEBUG("get %d\n", buf->idx);
        return buf;
 }
 
 int drm_freelist_create(drm_freelist_t *bl, int count)
 {
-       DRM_DEBUG("\n");
        atomic_set(&bl->count, 0);
        bl->next      = NULL;
        init_waitqueue_head(&bl->waiting);
@@ -124,7 +117,6 @@ int drm_freelist_create(drm_freelist_t *bl, int count)
 
 int drm_freelist_destroy(drm_freelist_t *bl)
 {
-       DRM_DEBUG("\n");
        atomic_set(&bl->count, 0);
        bl->next = NULL;
        return 0;
@@ -143,9 +135,6 @@ int drm_freelist_put(drm_device_t *dev, drm_freelist_t *bl, drm_buf_t *buf)
                DRM_ERROR("Freed buffer %d: w%d, p%d, l%d\n",
                          buf->idx, buf->waiting, buf->pending, buf->list);
        }
-       DRM_DEBUG("%d, count = %d, wfh = %d, w%d, p%d\n",
-                 buf->idx, atomic_read(&bl->count), atomic_read(&bl->wfh),
-                 buf->waiting, buf->pending);
        if (!bl) return 1;
 #if DRM_DMA_HISTOGRAM
        buf->time_freed = get_cycles();
@@ -191,9 +180,6 @@ static drm_buf_t *drm_freelist_try(drm_freelist_t *bl)
        atomic_dec(&bl->count);
        buf->next = NULL;
        buf->list = DRM_LIST_NONE;
-       DRM_DEBUG("%d, count = %d, wfh = %d, w%d, p%d\n",
-                 buf->idx, atomic_read(&bl->count), atomic_read(&bl->wfh),
-                 buf->waiting, buf->pending);
        if (buf->waiting || buf->pending) {
                DRM_ERROR("Free buffer %d: w%d, p%d, l%d\n",
                          buf->idx, buf->waiting, buf->pending, buf->list);
@@ -213,13 +199,10 @@ drm_buf_t *drm_freelist_get(drm_freelist_t *bl, int block)
        if (atomic_read(&bl->count) <= bl->low_mark) /* Became low */
                atomic_set(&bl->wfh, 1);
        if (atomic_read(&bl->wfh)) {
-               DRM_DEBUG("Block = %d, count = %d, wfh = %d\n",
-                         block, atomic_read(&bl->count),
-                         atomic_read(&bl->wfh));
                if (block) {
                        add_wait_queue(&bl->waiting, &entry);
-                       current->state = TASK_INTERRUPTIBLE;
                        for (;;) {
+                               current->state = TASK_INTERRUPTIBLE;
                                if (!atomic_read(&bl->wfh)
                                    && (buf = drm_freelist_try(bl))) break;
                                schedule();
@@ -231,7 +214,5 @@ drm_buf_t *drm_freelist_get(drm_freelist_t *bl, int block)
                return buf;
        }
                
-       DRM_DEBUG("Count = %d, wfh = %d\n",
-                 atomic_read(&bl->count), atomic_read(&bl->wfh));
        return drm_freelist_try(bl);
 }
index e5fd435..90d2f13 100644 (file)
@@ -50,7 +50,6 @@ int drm_lock_take(__volatile__ unsigned int *lock, unsigned int context)
 {
        unsigned int old, new, prev;
 
-       DRM_DEBUG("%d attempts\n", context);
        do {
                old = *lock;
                if (old & _DRM_LOCK_HELD) new = old | _DRM_LOCK_CONT;
@@ -68,11 +67,8 @@ int drm_lock_take(__volatile__ unsigned int *lock, unsigned int context)
        }
        if (new == (context | _DRM_LOCK_HELD)) {
                                /* Have lock */
-               DRM_DEBUG("%d\n", context);
                return 1;
        }
-       DRM_DEBUG("%d unable to get lock held by %d\n",
-                 context, _DRM_LOCKING_CONTEXT(old));
        return 0;
 }
 
@@ -89,7 +85,6 @@ int drm_lock_transfer(drm_device_t *dev,
                new  = context | _DRM_LOCK_HELD;
                prev = cmpxchg(lock, old, new);
        } while (prev != old);
-       DRM_DEBUG("%d => %d\n", _DRM_LOCKING_CONTEXT(old), context);
        return 1;
 }
 
@@ -99,7 +94,6 @@ int drm_lock_free(drm_device_t *dev,
        unsigned int old, new, prev;
        pid_t        pid = dev->lock.pid;
 
-       DRM_DEBUG("%d\n", context);
        dev->lock.pid = 0;
        do {
                old  = *lock;
@@ -128,10 +122,10 @@ static int drm_flush_queue(drm_device_t *dev, int context)
        atomic_inc(&q->use_count);
        if (atomic_read(&q->use_count) > 1) {
                atomic_inc(&q->block_write);
-               current->state = TASK_INTERRUPTIBLE;
                add_wait_queue(&q->flush_queue, &entry);
                atomic_inc(&q->block_count);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!DRM_BUFCOUNT(&q->waitlist)) break;
                        schedule();
                        if (signal_pending(current)) {
index 3ec28a7..05d941b 100644 (file)
@@ -66,7 +66,7 @@ int mga_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd,
        order = drm_order(request.size);
        size    = 1 << order;
        agp_offset = request.agp_start;
-       alignment  = (request.flags & _DRM_PAGE_ALIGN) ? PAGE_ALIGN(size) :size;
+       alignment  = (request.flags & _DRM_PAGE_ALIGN) ? PAGE_ALIGN(size):size;
        page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
        total = PAGE_SIZE << page_order;
        byte_count = 0;
@@ -119,8 +119,6 @@ int mga_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd,
                buf->order = order;
                buf->used = 0;
 
-               DRM_DEBUG("offset : %ld\n", offset);
-
                buf->offset = offset; /* Hrm */
                buf->bus_address = dev->agp->base + agp_offset + offset;
                buf->address = (void *)(agp_offset + offset + dev->agp->base);
@@ -130,7 +128,8 @@ int mga_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd,
                init_waitqueue_head(&buf->dma_wait);
                buf->pid = 0;
 
-               buf->dev_private = drm_alloc(sizeof(drm_mga_buf_priv_t), DRM_MEM_BUFS);
+               buf->dev_private = drm_alloc(sizeof(drm_mga_buf_priv_t),
+                                            DRM_MEM_BUFS);
                buf->dev_priv_size = sizeof(drm_mga_buf_priv_t);
 
 #if DRM_DMA_HISTOGRAM
@@ -142,9 +141,6 @@ int mga_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd,
                offset = offset + alignment;
                entry->buf_count++;
                byte_count += PAGE_SIZE << page_order;
-      
-               DRM_DEBUG("buffer %d @ %p\n",
-                         entry->buf_count, buf->address);
        }
    
        dma->buflist = drm_realloc(dma->buflist,
@@ -234,7 +230,7 @@ int mga_addbufs_pci(struct inode *inode, struct file *filp, unsigned int cmd,
        if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return -EINVAL;
        if (dev->queue_count) return -EBUSY; /* Not while in use */
 
-       alignment  = (request.flags & _DRM_PAGE_ALIGN) ? PAGE_ALIGN(size) :size;
+       alignment  = (request.flags & _DRM_PAGE_ALIGN) ? PAGE_ALIGN(size):size;
        page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
        total      = PAGE_SIZE << page_order;
 
@@ -402,8 +398,6 @@ int mga_infobufs(struct inode *inode, struct file *filp, unsigned int cmd,
                if (dma->bufs[i].buf_count) ++count;
        }
        
-       DRM_DEBUG("count = %d\n", count);
-       
        if (request.count >= count) {
                for (i = 0, count = 0; i < DRM_MAX_ORDER+1; i++) {
                        if (dma->bufs[i].buf_count) {
@@ -426,13 +420,6 @@ int mga_infobufs(struct inode *inode, struct file *filp, unsigned int cmd,
                                                 sizeof(dma->bufs[0]
                                                        .freelist.high_mark)))
                                        return -EFAULT;
-
-                               DRM_DEBUG("%d %d %d %d %d\n",
-                                         i,
-                                         dma->bufs[i].buf_count,
-                                         dma->bufs[i].buf_size,
-                                         dma->bufs[i].freelist.low_mark,
-                                         dma->bufs[i].freelist.high_mark);
                                ++count;
                        }
                }
@@ -459,13 +446,9 @@ int mga_markbufs(struct inode *inode, struct file *filp, unsigned int cmd,
 
        if (!dma) return -EINVAL;
 
-       if (copy_from_user(&request,
-                          (drm_buf_desc_t *)arg,
-                          sizeof(request)))
+       if (copy_from_user(&request, (drm_buf_desc_t *)arg, sizeof(request)))
                return -EFAULT;
 
-       DRM_DEBUG("%d, %d, %d\n",
-                 request.size, request.low_mark, request.high_mark);
        order = drm_order(request.size);
        if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return -EINVAL;
        entry = &dma->bufs[order];
@@ -499,7 +482,6 @@ int mga_freebufs(struct inode *inode, struct file *filp, unsigned int cmd,
                           sizeof(request)))
                return -EFAULT;
 
-       DRM_DEBUG("%d\n", request.count);
        for (i = 0; i < request.count; i++) {
                if (copy_from_user(&idx,
                                   &request.list[i],
@@ -537,12 +519,9 @@ int mga_mapbufs(struct inode *inode, struct file *filp, unsigned int cmd,
 
        if (!dma) return -EINVAL;
        
-       DRM_DEBUG("\n");
-
        spin_lock(&dev->count_lock);
        if (atomic_read(&dev->buf_alloc)) {
                spin_unlock(&dev->count_lock);
-               DRM_DEBUG("Busy\n");
                return -EBUSY;
        }
        ++dev->buf_use;         /* Can't allocate more after this call */
@@ -553,9 +532,6 @@ int mga_mapbufs(struct inode *inode, struct file *filp, unsigned int cmd,
                           sizeof(request)))
                return -EFAULT;
 
-       DRM_DEBUG("mga_mapbufs\n");
-       DRM_DEBUG("dma->flags : %x\n", dma->flags);
-   
        if (request.count >= dma->buf_count) {
                if(dma->flags & _DRM_DMA_USE_AGP) {
                        drm_mga_private_t *dev_priv = dev->dev_private;
@@ -563,7 +539,6 @@ int mga_mapbufs(struct inode *inode, struct file *filp, unsigned int cmd,
         
                        map = dev->maplist[dev_priv->buffer_map_idx];
                        if (!map) {
-                               DRM_DEBUG("map is null\n");
                                retcode = -EINVAL;
                                goto done;
                        }
index 36f2342..1494d5d 100644 (file)
@@ -36,9 +36,7 @@
 
 static int mga_alloc_queue(drm_device_t *dev)
 {
-       int temp = drm_ctxbitmap_next(dev);
-       DRM_DEBUG("mga_alloc_queue: %d\n", temp);
-       return temp;
+       return drm_ctxbitmap_next(dev);
 }
 
 int mga_context_switch(drm_device_t *dev, int old, int new)
@@ -103,7 +101,6 @@ int mga_resctx(struct inode *inode, struct file *filp, unsigned int cmd,
        drm_ctx_t       ctx;
        int             i;
 
-       DRM_DEBUG("%d\n", DRM_RESERVED_CONTEXTS);
        if (copy_from_user(&res, (drm_ctx_res_t *)arg, sizeof(res)))
                return -EFAULT;
        if (res.count >= DRM_RESERVED_CONTEXTS) {
@@ -136,8 +133,6 @@ int mga_addctx(struct inode *inode, struct file *filp, unsigned int cmd,
                ctx.handle = mga_alloc_queue(dev);
        }
         if (ctx.handle == -1) {
-               DRM_DEBUG("Not enough free contexts.\n");
-                               /* Should this return -EBUSY instead? */
                return -ENOMEM;
        }
        DRM_DEBUG("%d\n", ctx.handle);
@@ -205,6 +200,10 @@ int mga_rmctx(struct inode *inode, struct file *filp, unsigned int cmd,
        if (copy_from_user(&ctx, (drm_ctx_t *)arg, sizeof(ctx)))
                return -EFAULT;
        DRM_DEBUG("%d\n", ctx.handle);
+       if(ctx.handle == DRM_KERNEL_CONTEXT+1) {
+               priv->remove_auth_on_close = 1;
+       }
+
        if(ctx.handle != DRM_KERNEL_CONTEXT) {
                drm_ctxbitmap_free(dev, ctx.handle);
        }
index a718939..40d7716 100644 (file)
@@ -53,7 +53,6 @@ static unsigned long mga_alloc_page(drm_device_t *dev)
 {
        unsigned long address;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
        address = __get_free_page(GFP_KERNEL);
        if(address == 0UL) {
                return 0;
@@ -66,11 +65,7 @@ static unsigned long mga_alloc_page(drm_device_t *dev)
 
 static void mga_free_page(drm_device_t *dev, unsigned long page)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
-       if(page == 0UL) {
-               return;
-       }
+       if(!page) return;
        atomic_dec(&virt_to_page(page)->count);
        clear_bit(PG_locked, &virt_to_page(page)->flags);
        wake_up(&virt_to_page(page)->wait);
@@ -80,7 +75,7 @@ static void mga_free_page(drm_device_t *dev, unsigned long page)
 
 static void mga_delay(void)
 {
-       return;
+       return;
 }
 
 /* These are two age tags that will never be sent to
@@ -90,15 +85,13 @@ static void mga_delay(void)
 
 static int mga_freelist_init(drm_device_t *dev)
 {
-       drm_device_dma_t *dma = dev->dma;
+       drm_device_dma_t *dma = dev->dma;
        drm_buf_t *buf;
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
        drm_mga_freelist_t *item;
        int i;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        dev_priv->head = drm_alloc(sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER);
        if(dev_priv->head == NULL) return -ENOMEM;
        memset(dev_priv->head, 0, sizeof(drm_mga_freelist_t));
@@ -133,8 +126,6 @@ static void mga_freelist_cleanup(drm_device_t *dev)
        drm_mga_freelist_t *item;
        drm_mga_freelist_t *prev;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        item = dev_priv->head;
        while(item) {
                prev = item;
@@ -154,7 +145,7 @@ static inline void mga_dma_quiescent(drm_device_t *dev)
        unsigned long end;
        int i;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
+       DRM_DEBUG("dispatch_status = 0x%02x\n", dev_priv->dispatch_status);
        end = jiffies + (HZ*3);
        while(1) {
                if(!test_and_set_bit(MGA_IN_DISPATCH,
@@ -165,8 +156,10 @@ static inline void mga_dma_quiescent(drm_device_t *dev)
                        DRM_ERROR("irqs: %d wanted %d\n",
                                  atomic_read(&dev->total_irq),
                                  atomic_read(&dma->total_lost));
-                       DRM_ERROR("lockup\n");
-                       goto out_nolock;
+                       DRM_ERROR("lockup: dispatch_status = 0x%02x,"
+                                 " jiffies = %lu, end = %lu\n",
+                                 dev_priv->dispatch_status, jiffies, end);
+                       return;
                }
                for (i = 0 ; i < 2000 ; i++) mga_delay();
        }
@@ -178,15 +171,16 @@ static inline void mga_dma_quiescent(drm_device_t *dev)
                                  atomic_read(&dev->total_irq),
                                  atomic_read(&dma->total_lost));
                        DRM_ERROR("lockup\n");
-                       goto out_status;
+                       clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status);
+                       return;
                }
                for (i = 0 ; i < 2000 ; i++) mga_delay();
        }
        sarea_priv->dirty |= MGA_DMA_FLUSH;
 
-out_status:
        clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status);
-out_nolock:
+       DRM_DEBUG("exit, dispatch_status = 0x%02x\n",
+                 dev_priv->dispatch_status);
 }
 
 static void mga_reset_freelist(drm_device_t *dev)
@@ -217,29 +211,26 @@ drm_buf_t *mga_freelist_get(drm_device_t *dev)
        static int failed = 0;
        int return_null = 0;
 
-       DRM_DEBUG("%s : tail->age : %d last_prim_age : %d\n", __FUNCTION__,
-              dev_priv->tail->age, dev_priv->last_prim_age);
-
        if(failed >= 1000 && dev_priv->tail->age >= dev_priv->last_prim_age) {
-               DRM_DEBUG("I'm waiting on the freelist!!! %d\n",
-                      dev_priv->last_prim_age);
-               set_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status);
+               DRM_DEBUG("Waiting on freelist,"
+                         " tail->age = %d, last_prim_age= %d\n",
+                         dev_priv->tail->age,
+                         dev_priv->last_prim_age);
                add_wait_queue(&dev_priv->buf_queue, &entry);
+               set_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status);
                for (;;) {
-                       mga_dma_schedule(dev, 0);
                        current->state = TASK_INTERRUPTIBLE;
-                       if(!test_bit(MGA_IN_GETBUF,
-                                    &dev_priv->dispatch_status))
+                       mga_dma_schedule(dev, 0);
+                       if(dev_priv->tail->age < dev_priv->last_prim_age)
                                break;
                        atomic_inc(&dev->total_sleeps);
                        schedule();
                        if (signal_pending(current)) {
                                ++return_null;
-                               clear_bit(MGA_IN_GETBUF,
-                                         &dev_priv->dispatch_status);
                                break;
                        }
                }
+               clear_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status);
                current->state = TASK_RUNNING;
                remove_wait_queue(&dev_priv->buf_queue, &entry);
                if (return_null) return NULL;
@@ -255,6 +246,7 @@ drm_buf_t *mga_freelist_get(drm_device_t *dev)
                failed = 0;
                return next->buf;
        }
+
        failed++;
        return NULL;
 }
@@ -268,8 +260,6 @@ int mga_freelist_put(drm_device_t *dev, drm_buf_t *buf)
        drm_mga_freelist_t *head;
        drm_mga_freelist_t *next;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if(buf_priv->my_freelist->age == MGA_BUF_USED) {
                /* Discarded buffer, put it on the tail */
                next = buf_priv->my_freelist;
@@ -279,7 +269,6 @@ int mga_freelist_put(drm_device_t *dev, drm_buf_t *buf)
                next->prev = prev;
                next->next = NULL;
                dev_priv->tail = next;
-               DRM_DEBUG("Discarded\n");
        } else {
                /* Normally aged buffer, put it on the head + 1,
                 * as the real head is a sentinal element
@@ -303,7 +292,6 @@ static int mga_init_primary_bufs(drm_device_t *dev, drm_mga_init_t *init)
        int i, temp, size_of_buf;
        int offset = init->reserved_map_agpstart;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
        dev_priv->primary_size = ((init->primary_size + PAGE_SIZE - 1) /
                                  PAGE_SIZE) * PAGE_SIZE;
        size_of_buf = dev_priv->primary_size / MGA_NUM_PRIM_BUFS;
@@ -324,7 +312,7 @@ static int mga_init_primary_bufs(drm_device_t *dev, drm_mga_init_t *init)
        dev_priv->ioremap = drm_ioremap(dev->agp->base + offset,
                                        temp);
        if(dev_priv->ioremap == NULL) {
-               DRM_DEBUG("Ioremap failed\n");
+               DRM_ERROR("Ioremap failed\n");
                return -ENOMEM;
        }
        init_waitqueue_head(&dev_priv->wait_queue);
@@ -371,7 +359,6 @@ void mga_fire_primary(drm_device_t *dev, drm_mga_prim_buf_t *prim)
        int next_idx;
                PRIMLOCALS;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
        dev_priv->last_prim = prim;
 
        /* We never check for overflow, b/c there is always room */
@@ -388,14 +375,12 @@ void mga_fire_primary(drm_device_t *dev, drm_mga_prim_buf_t *prim)
 
        end = jiffies + (HZ*3);
        if(sarea_priv->dirty & MGA_DMA_FLUSH) {
-               DRM_DEBUG("Dma top flush\n");
                while((MGA_READ(MGAREG_STATUS) & 0x00030001) != 0x00020000) {
                        if((signed)(end - jiffies) <= 0) {
                                DRM_ERROR("irqs: %d wanted %d\n",
                                          atomic_read(&dev->total_irq),
                                          atomic_read(&dma->total_lost));
-                               DRM_ERROR("lockup in fire primary "
-                                         "(Dma Top Flush)\n");
+                               DRM_ERROR("lockup (flush)\n");
                                goto out_prim_wait;
                        }
 
@@ -403,14 +388,12 @@ void mga_fire_primary(drm_device_t *dev, drm_mga_prim_buf_t *prim)
                }
                sarea_priv->dirty &= ~(MGA_DMA_FLUSH);
        } else {
-               DRM_DEBUG("Status wait\n");
                while((MGA_READ(MGAREG_STATUS) & 0x00020001) != 0x00020000) {
                        if((signed)(end - jiffies) <= 0) {
                                DRM_ERROR("irqs: %d wanted %d\n",
                                          atomic_read(&dev->total_irq),
                                          atomic_read(&dma->total_lost));
-                               DRM_ERROR("lockup in fire primary "
-                                         "(Status Wait)\n");
+                               DRM_ERROR("lockup (wait)\n");
                                goto out_prim_wait;
                        }
 
@@ -453,7 +436,6 @@ int mga_advance_primary(drm_device_t *dev)
        /* This needs to reset the primary buffer if available,
         * we should collect stats on how many times it bites
         * it's tail */
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        next_prim_idx = dev_priv->current_prim_idx + 1;
        if(next_prim_idx >= MGA_NUM_PRIM_BUFS)
@@ -465,9 +447,8 @@ int mga_advance_primary(drm_device_t *dev)
 
        if(test_and_set_bit(MGA_BUF_IN_USE, &prim_buffer->buffer_status)) {
                add_wait_queue(&dev_priv->wait_queue, &entry);
-               current->state = TASK_INTERRUPTIBLE;
-
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        mga_dma_schedule(dev, 0);
                        if(!test_and_set_bit(MGA_BUF_IN_USE,
                                             &prim_buffer->buffer_status))
@@ -480,7 +461,7 @@ int mga_advance_primary(drm_device_t *dev)
                                break;
                        }
                }
-               current->state = TASK_RUNNING;
+               current->state = TASK_RUNNING;
                remove_wait_queue(&dev_priv->wait_queue, &entry);
                if(ret) return ret;
        }
@@ -492,10 +473,10 @@ int mga_advance_primary(drm_device_t *dev)
        prim_buffer->sec_used = 0;
        prim_buffer->prim_age = dev_priv->next_prim_age++;
        if(prim_buffer->prim_age == 0 || prim_buffer->prim_age == 0xffffffff) {
-          mga_flush_queue(dev);
-          mga_dma_quiescent(dev);
-          mga_reset_freelist(dev);
-          prim_buffer->prim_age = (dev_priv->next_prim_age += 2);
+               mga_flush_queue(dev);
+               mga_dma_quiescent(dev);
+               mga_reset_freelist(dev);
+               prim_buffer->prim_age = (dev_priv->next_prim_age += 2);
        }
 
        /* Reset all buffer status stuff */
@@ -512,67 +493,55 @@ int mga_advance_primary(drm_device_t *dev)
 static inline int mga_decide_to_fire(drm_device_t *dev)
 {
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
-       drm_device_dma_t  *dma      = dev->dma;
-
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if(test_bit(MGA_BUF_FORCE_FIRE, &dev_priv->next_prim->buffer_status)) {
-               atomic_inc(&dma->total_prio);
                return 1;
        }
 
        if (test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status) &&
            dev_priv->next_prim->num_dwords) {
-               atomic_inc(&dma->total_prio);
                return 1;
        }
 
        if (test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status) &&
            dev_priv->next_prim->num_dwords) {
-               atomic_inc(&dma->total_prio);
                return 1;
        }
 
        if(atomic_read(&dev_priv->pending_bufs) <= MGA_NUM_PRIM_BUFS - 1) {
                if(test_bit(MGA_BUF_SWAP_PENDING,
                            &dev_priv->next_prim->buffer_status)) {
-                       atomic_inc(&dma->total_dmas);
                        return 1;
                }
        }
 
        if(atomic_read(&dev_priv->pending_bufs) <= MGA_NUM_PRIM_BUFS / 2) {
                if(dev_priv->next_prim->sec_used >= MGA_DMA_BUF_NR / 8) {
-                       atomic_inc(&dma->total_hit);
                        return 1;
                }
        }
 
        if(atomic_read(&dev_priv->pending_bufs) >= MGA_NUM_PRIM_BUFS / 2) {
                if(dev_priv->next_prim->sec_used >= MGA_DMA_BUF_NR / 4) {
-                       atomic_inc(&dma->total_missed_free);
                        return 1;
                }
        }
 
-       atomic_inc(&dma->total_tried);
        return 0;
 }
 
 int mga_dma_schedule(drm_device_t *dev, int locked)
 {
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
-       drm_device_dma_t  *dma      = dev->dma;
-       int retval = 0;
+       int               retval    = 0;
 
-       if (test_and_set_bit(0, &dev->dma_flag)) {
-               atomic_inc(&dma->total_missed_dma);
+       if (!dev_priv) return -EBUSY;
+       
+       if (test_and_set_bit(0, &dev->dma_flag)) {
                retval = -EBUSY;
                goto sch_out_wakeup;
        }
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if(test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status) ||
           test_bit(MGA_IN_WAIT, &dev_priv->dispatch_status) ||
           test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status)) {
@@ -581,18 +550,14 @@ int mga_dma_schedule(drm_device_t *dev, int locked)
 
        if (!locked &&
            !drm_lock_take(&dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT)) {
-               atomic_inc(&dma->total_missed_lock);
                clear_bit(0, &dev->dma_flag);
-               DRM_DEBUG("Not locked\n");
                retval = -EBUSY;
                goto sch_out_wakeup;
        }
-       DRM_DEBUG("I'm locked\n");
 
        if(!test_and_set_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status)) {
                /* Fire dma buffer */
                if(mga_decide_to_fire(dev)) {
-                       DRM_DEBUG("idx :%d\n", dev_priv->next_prim->idx);
                        clear_bit(MGA_BUF_FORCE_FIRE,
                                  &dev_priv->next_prim->buffer_status);
                        if(dev_priv->current_prim == dev_priv->next_prim) {
@@ -604,8 +569,6 @@ int mga_dma_schedule(drm_device_t *dev, int locked)
                } else {
                        clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status);
                }
-       } else {
-               DRM_DEBUG("I can't get the dispatch lock\n");
        }
 
        if (!locked) {
@@ -615,6 +578,8 @@ int mga_dma_schedule(drm_device_t *dev, int locked)
                }
        }
 
+       clear_bit(0, &dev->dma_flag);
+
 sch_out_wakeup:
        if(test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status) &&
           atomic_read(&dev_priv->pending_bufs) == 0) {
@@ -623,18 +588,10 @@ sch_out_wakeup:
                wake_up_interruptible(&dev_priv->flush_queue);
        }
 
-       if(test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status) &&
-          dev_priv->tail->age < dev_priv->last_prim_age) {
-               clear_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status);
-               DRM_DEBUG("Waking up buf queue\n");
+       if(test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status)
+          && dev_priv->tail->age < dev_priv->last_prim_age)
                wake_up_interruptible(&dev_priv->buf_queue);
-       } else if (test_bit(MGA_IN_GETBUF, &dev_priv->dispatch_status)) {
-               DRM_DEBUG("Not waking buf_queue on %d %d\n",
-                         atomic_read(&dev->total_irq),
-                         dev_priv->last_prim_age);
-       }
 
-       clear_bit(0, &dev->dma_flag);
        return retval;
 }
 
@@ -644,7 +601,6 @@ static void mga_dma_service(int irq, void *device, struct pt_regs *regs)
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
        drm_mga_prim_buf_t *last_prim_buffer;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
        atomic_inc(&dev->total_irq);
        if((MGA_READ(MGAREG_STATUS) & 0x00000001) != 0x00000001) return;
        MGA_WRITE(MGAREG_ICLEAR, 0x00000001);
@@ -654,28 +610,28 @@ static void mga_dma_service(int irq, void *device, struct pt_regs *regs)
        dev_priv->sarea_priv->last_dispatch =
                dev_priv->last_prim_age = last_prim_buffer->prim_age;
        clear_bit(MGA_BUF_IN_USE, &last_prim_buffer->buffer_status);
-       wake_up_interruptible(&dev_priv->wait_queue);
        clear_bit(MGA_BUF_SWAP_PENDING, &last_prim_buffer->buffer_status);
        clear_bit(MGA_IN_DISPATCH, &dev_priv->dispatch_status);
        atomic_dec(&dev_priv->pending_bufs);
        queue_task(&dev->tq, &tq_immediate);
        mark_bh(IMMEDIATE_BH);
+       wake_up_interruptible(&dev_priv->wait_queue);
 }
 
 static void mga_dma_task_queue(void *device)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
        mga_dma_schedule((drm_device_t *)device, 0);
 }
 
 int mga_dma_cleanup(drm_device_t *dev)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if(dev->dev_private) {
                drm_mga_private_t *dev_priv =
                        (drm_mga_private_t *) dev->dev_private;
 
+               if (dev->irq) mga_flush_queue(dev);
+               mga_dma_quiescent(dev);
+
                if(dev_priv->ioremap) {
                        int temp = (dev_priv->warp_ucode_size +
                                    dev_priv->primary_size +
@@ -718,9 +674,6 @@ int mga_dma_cleanup(drm_device_t *dev)
 static int mga_dma_initialize(drm_device_t *dev, drm_mga_init_t *init) {
        drm_mga_private_t *dev_priv;
        drm_map_t *sarea_map = NULL;
-       int i;
-
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER);
        if(dev_priv == NULL) return -ENOMEM;
@@ -731,7 +684,6 @@ static int mga_dma_initialize(drm_device_t *dev, drm_mga_init_t *init) {
        if((init->reserved_map_idx >= dev->map_count) ||
           (init->buffer_map_idx >= dev->map_count)) {
                mga_dma_cleanup(dev);
-               DRM_DEBUG("reserved_map or buffer_map are invalid\n");
                return -EINVAL;
        }
 
@@ -759,7 +711,7 @@ static int mga_dma_initialize(drm_device_t *dev, drm_mga_init_t *init) {
        dev_priv->WarpPipe = 0xff000000;
        dev_priv->vertexsize = 0;
 
-       DRM_DEBUG("chipset: %d ucode_size: %d backOffset: %x depthOffset: %x\n",
+       DRM_DEBUG("chipset=%d ucode_size=%d backOffset=%x depthOffset=%x\n",
                  dev_priv->chipset, dev_priv->warp_ucode_size,
                  dev_priv->backOffset, dev_priv->depthOffset);
        DRM_DEBUG("cpp: %d sgram: %d stride: %d maccess: %x\n",
@@ -769,13 +721,6 @@ static int mga_dma_initialize(drm_device_t *dev, drm_mga_init_t *init) {
        memcpy(&dev_priv->WarpIndex, &init->WarpIndex,
               sizeof(drm_mga_warp_index_t) * MGA_MAX_WARP_PIPES);
 
-       for (i = 0 ; i < MGA_MAX_WARP_PIPES ; i++)
-               DRM_DEBUG("warp pipe %d: installed: %d phys: %lx size: %x\n",
-                         i,
-                         dev_priv->WarpIndex[i].installed,
-                         dev_priv->WarpIndex[i].phys_addr,
-                         dev_priv->WarpIndex[i].size);
-
        if(mga_init_primary_bufs(dev, init) != 0) {
                DRM_ERROR("Can not initialize primary buffers\n");
                mga_dma_cleanup(dev);
@@ -822,7 +767,8 @@ static int mga_dma_initialize(drm_device_t *dev, drm_mga_init_t *init) {
                MGA_WRITE(MGAREG_PRIMEND, ((phys_head + num_dwords * 4) |
                                           PDEA_pagpxfer_enable));
 
-               while(MGA_READ(MGAREG_DWGSYNC) != 0x0100) ;
+                               /* Do we need a looping check? */
+               while(MGA_READ(MGAREG_DWGSYNC) != 0x0100);
        }
 
        if(mga_freelist_init(dev) != 0) {
@@ -840,8 +786,6 @@ int mga_dma_init(struct inode *inode, struct file *filp,
        drm_device_t *dev = priv->dev;
        drm_mga_init_t init;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if (copy_from_user(&init, (drm_mga_init_t *)arg, sizeof(init)))
                return -EFAULT;
 
@@ -928,8 +872,6 @@ int mga_control(struct inode *inode, struct file *filp, unsigned int cmd,
        if (copy_from_user(&ctl, (drm_control_t *)arg, sizeof(ctl)))
                return -EFAULT;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        switch (ctl.func) {
        case DRM_INST_HANDLER:
                return mga_irq_install(dev, ctl.irq);
@@ -946,18 +888,16 @@ static int mga_flush_queue(drm_device_t *dev)
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
        int ret = 0;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
-       if(dev_priv == NULL) {
-               return 0;
-       }
+       if(!dev_priv) return 0;
 
        if(dev_priv->next_prim->num_dwords != 0) {
-               current->state = TASK_INTERRUPTIBLE;
                add_wait_queue(&dev_priv->flush_queue, &entry);
+               if (test_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status)) 
+                       DRM_ERROR("Incorrect mga_flush_queue logic\n");
                set_bit(MGA_IN_FLUSH, &dev_priv->dispatch_status);
                mga_dma_schedule(dev, 0);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!test_bit(MGA_IN_FLUSH,
                                      &dev_priv->dispatch_status))
                                break;
@@ -970,7 +910,7 @@ static int mga_flush_queue(drm_device_t *dev)
                                break;
                        }
                }
-               current->state = TASK_RUNNING;
+               current->state = TASK_RUNNING;
                remove_wait_queue(&dev_priv->flush_queue, &entry);
        }
        return ret;
@@ -986,7 +926,8 @@ void mga_reclaim_buffers(drm_device_t *dev, pid_t pid)
        if(dev->dev_private == NULL) return;
        if(dma->buflist == NULL) return;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
+       DRM_DEBUG("buf_count=%d\n", dma->buf_count);
+       
         mga_flush_queue(dev);
 
        for (i = 0; i < dma->buf_count; i++) {
@@ -1012,7 +953,6 @@ int mga_lock(struct inode *inode, struct file *filp, unsigned int cmd,
        int               ret   = 0;
        drm_lock_t        lock;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
        if (copy_from_user(&lock, (drm_lock_t *)arg, sizeof(lock)))
                return -EFAULT;
 
@@ -1022,13 +962,7 @@ int mga_lock(struct inode *inode, struct file *filp, unsigned int cmd,
                return -EINVAL;
        }
 
-       DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n",
-              lock.context, current->pid, dev->lock.hw_lock->lock,
-              lock.flags);
-
-       if (lock.context < 0) {
-               return -EINVAL;
-       }
+       if (lock.context < 0) return -EINVAL;
 
        /* Only one queue:
         */
@@ -1036,6 +970,7 @@ int mga_lock(struct inode *inode, struct file *filp, unsigned int cmd,
        if (!ret) {
                add_wait_queue(&dev->lock.lock_queue, &entry);
                for (;;) {
+                       current->state = TASK_INTERRUPTIBLE;
                        if (!dev->lock.hw_lock) {
                                /* Device has been unregistered */
                                ret = -EINTR;
@@ -1051,7 +986,6 @@ int mga_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 
                                /* Contention */
                        atomic_inc(&dev->total_sleeps);
-                       current->state = TASK_INTERRUPTIBLE;
                        schedule();
                        if (signal_pending(current)) {
                                ret = -ERESTARTSYS;
@@ -1079,7 +1013,8 @@ int mga_lock(struct inode *inode, struct file *filp, unsigned int cmd,
                }
        }
 
-       DRM_DEBUG("%d %s\n", lock.context, ret ? "interrupted" : "has lock");
+       if (ret) DRM_DEBUG("%d %s\n", lock.context,
+                          ret ? "interrupted" : "has lock");
        return ret;
 }
 
@@ -1091,12 +1026,11 @@ int mga_flush_ioctl(struct inode *inode, struct file *filp,
        drm_lock_t        lock;
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
        if (copy_from_user(&lock, (drm_lock_t *)arg, sizeof(lock)))
                return -EFAULT;
 
        if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
-               DRM_ERROR("mga_flush_ioctl called without lock held\n");
+               DRM_ERROR("lock not held\n");
                return -EINVAL;
        }
 
index 70d5d89..0ccf0a7 100644 (file)
@@ -217,6 +217,7 @@ static int mga_takedown(drm_device_t *dev)
 
        DRM_DEBUG("\n");
 
+       if (dev->dev_private) mga_dma_cleanup(dev);
        if (dev->irq) mga_irq_uninstall(dev);
 
        down(&dev->struct_sem);
@@ -352,7 +353,6 @@ static int mga_init(void)
 #ifdef MODULE
        drm_parse_options(mga);
 #endif
-       DRM_DEBUG("doing misc_register\n");
        if ((retcode = misc_register(&mga_misc))) {
                DRM_ERROR("Cannot register \"%s\"\n", MGA_NAME);
                return retcode;
@@ -360,11 +360,8 @@ static int mga_init(void)
        dev->device = MKDEV(MISC_MAJOR, mga_misc.minor);
        dev->name   = MGA_NAME;
 
-       DRM_DEBUG("doing mem init\n");
        drm_mem_init();
-       DRM_DEBUG("doing proc init\n");
        drm_proc_init(dev);
-       DRM_DEBUG("doing agp init\n");
        dev->agp    = drm_agp_init();
        if(dev->agp == NULL) {
                DRM_INFO("The mga drm module requires the agpgart module"
@@ -381,7 +378,6 @@ static int mga_init(void)
                                      MTRR_TYPE_WRCOMB,
                                      1);
 #endif
-       DRM_DEBUG("doing ctxbitmap init\n");
        if((retcode = drm_ctxbitmap_init(dev))) {
                DRM_ERROR("Cannot allocate memory for context bitmap.\n");
                drm_proc_cleanup();
@@ -416,7 +412,6 @@ static void mga_cleanup(void)
                DRM_INFO("Module unloaded\n");
        }
        drm_ctxbitmap_cleanup(dev);
-       mga_dma_cleanup(dev);
 #ifdef CONFIG_MTRR
        if(dev->agp && dev->agp->agp_mtrr) {
                int retval;
@@ -509,17 +504,21 @@ int mga_release(struct inode *inode, struct file *filp)
        if (dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)
            && dev->lock.pid == current->pid) {
                mga_reclaim_buffers(dev, priv->pid);
-               DRM_ERROR("Process %d dead, freeing lock for context %d\n",
-                         current->pid,
-                         _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
+               DRM_INFO("Process %d dead (ctx %d, d_s = 0x%02x)\n",
+                        current->pid,
+                        _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock),
+                        dev->dev_private ?
+                        ((drm_mga_private_t *)dev->dev_private)
+                        ->dispatch_status
+                        : 0);
+
+               if (dev->dev_private)
+                       ((drm_mga_private_t *)dev->dev_private)
+                               ->dispatch_status &= MGA_IN_DISPATCH;
+               
                drm_lock_free(dev,
                              &dev->lock.hw_lock->lock,
                              _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
-
-                               /* FIXME: may require heavy-handed reset of
-                                   hardware at this point, possibly
-                                   processed via a callback to the X
-                                   server. */
        } else if (dev->lock.hw_lock) {
                /* The lock is required to reclaim buffers */
                DECLARE_WAITQUEUE(entry, current);
@@ -546,10 +545,12 @@ int mga_release(struct inode *inode, struct file *filp)
                                break;
                        }
                }
-               current->state = TASK_RUNNING;
                remove_wait_queue(&dev->lock.lock_queue, &entry);
                if(!retcode) {
                        mga_reclaim_buffers(dev, priv->pid);
+                       if (dev->dev_private)
+                               ((drm_mga_private_t *)dev->dev_private)
+                                       ->dispatch_status &= MGA_IN_DISPATCH;
                        drm_lock_free(dev, &dev->lock.hw_lock->lock,
                                      DRM_KERNEL_CONTEXT);
                }
@@ -557,6 +558,13 @@ int mga_release(struct inode *inode, struct file *filp)
        drm_fasync(-1, filp, 0);
 
        down(&dev->struct_sem);
+       if (priv->remove_auth_on_close == 1) {
+               drm_file_t *temp = dev->file_first;
+               while(temp) {
+                       temp->authenticated = 0;
+                       temp = temp->next;
+               }
+       }
        if (priv->prev) priv->prev->next = priv->next;
        else            dev->file_first  = priv->next;
        if (priv->next) priv->next->prev = priv->prev;
@@ -604,9 +612,6 @@ int mga_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        atomic_inc(&dev->total_ioctl);
        ++priv->ioctl_count;
 
-       DRM_DEBUG("pid = %d, cmd = 0x%02x, nr = 0x%02x, dev 0x%x, auth = %d\n",
-                 current->pid, cmd, nr, dev->device, priv->authenticated);
-
        if (nr >= MGA_IOCTL_COUNT) {
                retcode = -EINVAL;
        } else {
@@ -614,7 +619,10 @@ int mga_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                func      = ioctl->func;
 
                if (!func) {
-                       DRM_DEBUG("no function\n");
+                       DRM_DEBUG("no function: pid = %d, cmd = 0x%02x,"
+                                 " nr = 0x%02x, dev 0x%x, auth = %d\n",
+                                 current->pid, cmd, nr, dev->device,
+                                 priv->authenticated);
                        retcode = -EINVAL;
                } else if ((ioctl->root_only && !capable(CAP_SYS_ADMIN))
                            || (ioctl->auth_needed && !priv->authenticated)) {
@@ -644,9 +652,6 @@ int mga_unlock(struct inode *inode, struct file *filp, unsigned int cmd,
                return -EINVAL;
        }
 
-       DRM_DEBUG("%d frees lock (%d holds)\n",
-                 lock.context,
-                 _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
        atomic_inc(&dev->total_unlocks);
        if (_DRM_LOCK_IS_CONT(dev->lock.hw_lock->lock))
                atomic_inc(&dev->total_contends);
@@ -654,9 +659,7 @@ int mga_unlock(struct inode *inode, struct file *filp, unsigned int cmd,
        mga_dma_schedule(dev, 1);
 
        if (drm_lock_free(dev, &dev->lock.hw_lock->lock,
-                         DRM_KERNEL_CONTEXT)) {
-          DRM_ERROR("\n");
-       }
+                         DRM_KERNEL_CONTEXT)) DRM_ERROR("\n");
 
        unblock_all_signals();
        return 0;
index f7f7053..61b7bfc 100644 (file)
@@ -51,7 +51,7 @@ typedef struct {
 } drm_mga_prim_buf_t;
 
 typedef struct _drm_mga_freelist {
-       unsigned int age;
+       __volatile__ unsigned int age;
        drm_buf_t *buf;
        struct _drm_mga_freelist *next;
        struct _drm_mga_freelist *prev;
@@ -378,6 +378,72 @@ drm_mga_prim_buf_t *tmp_buf =                                      \
 #define MGAREG_YTOP                            0x1c98
 #define MGAREG_ZORG                            0x1c0c
 
+/* Warp registers */
+#define MGAREG_WR0                              0x2d00
+#define MGAREG_WR1                              0x2d04
+#define MGAREG_WR2                              0x2d08
+#define MGAREG_WR3                              0x2d0c
+#define MGAREG_WR4                              0x2d10
+#define MGAREG_WR5                              0x2d14
+#define MGAREG_WR6                              0x2d18
+#define MGAREG_WR7                              0x2d1c
+#define MGAREG_WR8                              0x2d20
+#define MGAREG_WR9                              0x2d24
+#define MGAREG_WR10                             0x2d28
+#define MGAREG_WR11                             0x2d2c
+#define MGAREG_WR12                             0x2d30
+#define MGAREG_WR13                             0x2d34
+#define MGAREG_WR14                             0x2d38
+#define MGAREG_WR15                             0x2d3c
+#define MGAREG_WR16                             0x2d40
+#define MGAREG_WR17                             0x2d44
+#define MGAREG_WR18                             0x2d48
+#define MGAREG_WR19                             0x2d4c
+#define MGAREG_WR20                             0x2d50
+#define MGAREG_WR21                             0x2d54
+#define MGAREG_WR22                             0x2d58
+#define MGAREG_WR23                             0x2d5c
+#define MGAREG_WR24                             0x2d60
+#define MGAREG_WR25                             0x2d64
+#define MGAREG_WR26                             0x2d68
+#define MGAREG_WR27                             0x2d6c
+#define MGAREG_WR28                             0x2d70
+#define MGAREG_WR29                             0x2d74
+#define MGAREG_WR30                             0x2d78
+#define MGAREG_WR31                             0x2d7c
+#define MGAREG_WR32                             0x2d80
+#define MGAREG_WR33                             0x2d84
+#define MGAREG_WR34                             0x2d88
+#define MGAREG_WR35                             0x2d8c
+#define MGAREG_WR36                             0x2d90
+#define MGAREG_WR37                             0x2d94
+#define MGAREG_WR38                             0x2d98
+#define MGAREG_WR39                             0x2d9c
+#define MGAREG_WR40                             0x2da0
+#define MGAREG_WR41                             0x2da4
+#define MGAREG_WR42                             0x2da8
+#define MGAREG_WR43                             0x2dac
+#define MGAREG_WR44                             0x2db0
+#define MGAREG_WR45                             0x2db4
+#define MGAREG_WR46                             0x2db8
+#define MGAREG_WR47                             0x2dbc
+#define MGAREG_WR48                             0x2dc0
+#define MGAREG_WR49                             0x2dc4
+#define MGAREG_WR50                             0x2dc8
+#define MGAREG_WR51                             0x2dcc
+#define MGAREG_WR52                             0x2dd0
+#define MGAREG_WR53                             0x2dd4
+#define MGAREG_WR54                             0x2dd8
+#define MGAREG_WR55                             0x2ddc
+#define MGAREG_WR56                             0x2de0
+#define MGAREG_WR57                             0x2de4
+#define MGAREG_WR58                             0x2de8
+#define MGAREG_WR59                             0x2dec
+#define MGAREG_WR60                             0x2df0
+#define MGAREG_WR61                             0x2df4
+#define MGAREG_WR62                             0x2df8
+#define MGAREG_WR63                             0x2dfc
+
 #define PDEA_pagpxfer_enable                   0x2
 
 #define WIA_wmode_suspend                      0x0
@@ -431,6 +497,7 @@ drm_mga_prim_buf_t *tmp_buf =                                       \
 #define DC_clipdis_disable                     0x0
 #define DC_clipdis_enable                      0x80000000
 
+
 #define SETADD_mode_vertlist                           0x0
 
 
index 5bdc068..c5766dd 100644 (file)
@@ -44,7 +44,7 @@
 #define MGAG200EMITTEX_SIZE    20
 #define MGAG400EMITTEX0_SIZE   30
 #define MGAG400EMITTEX1_SIZE   25
-#define MGAG400EMITPIPE_SIZE   55
+#define MGAG400EMITPIPE_SIZE   50
 #define MGAG200EMITPIPE_SIZE   15
 
 #define MAX_STATE_SIZE ((MGAEMITCLIP_SIZE * MGA_NR_SAREA_CLIPRECTS) + \
@@ -57,24 +57,24 @@ static void mgaEmitClipRect(drm_mga_private_t * dev_priv,
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int *regs = sarea_priv->ContextState;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        /* This takes 10 dwords */
        PRIMGETPTR(dev_priv);
 
-       /* Force reset of dwgctl (eliminates clip disable) */
+       /* Force reset of dwgctl on G400 (eliminates clip disable bit) */
+       if (dev_priv->chipset == MGA_CARD_TYPE_G400) {
 #if 0
-       PRIMOUTREG(MGAREG_DMAPAD, 0);
-       PRIMOUTREG(MGAREG_DWGSYNC, 0);
-       PRIMOUTREG(MGAREG_DWGSYNC, 0);
-       PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]);
+               PRIMOUTREG(MGAREG_DMAPAD, 0);
+               PRIMOUTREG(MGAREG_DWGSYNC, 0);
+               PRIMOUTREG(MGAREG_DWGSYNC, 0);
+               PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]);
 #else
-       PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]);
-       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0x80000000);
-       PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]);
-       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0x80000000);
+               PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]);
+               PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0x80000000);
+               PRIMOUTREG(MGAREG_DWGCTL, regs[MGA_CTXREG_DWGCTL]);
+               PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0x80000000);
 #endif
-
+       }
        PRIMOUTREG(MGAREG_DMAPAD, 0);
        PRIMOUTREG(MGAREG_CXBNDRY, ((box->x2) << 16) | (box->x1));
        PRIMOUTREG(MGAREG_YTOP, box->y1 * dev_priv->stride / dev_priv->cpp);
@@ -88,7 +88,6 @@ static void mgaEmitContext(drm_mga_private_t * dev_priv)
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int *regs = sarea_priv->ContextState;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        /* This takes a max of 20 dwords */
        PRIMGETPTR(dev_priv);
@@ -128,7 +127,6 @@ static void mgaG200EmitTex(drm_mga_private_t * dev_priv)
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int *regs = sarea_priv->TexState[0];
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        PRIMGETPTR(dev_priv);
 
@@ -147,9 +145,9 @@ static void mgaG200EmitTex(drm_mga_private_t * dev_priv)
        PRIMOUTREG(MGAREG_TEXORG4, regs[MGA_TEXREG_ORG4]);
        PRIMOUTREG(MGAREG_TEXWIDTH, regs[MGA_TEXREG_WIDTH]);
        PRIMOUTREG(MGAREG_TEXHEIGHT, regs[MGA_TEXREG_HEIGHT]);
-       PRIMOUTREG(0x2d00 + 24 * 4, regs[MGA_TEXREG_WIDTH]);
+       PRIMOUTREG(MGAREG_WR24, regs[MGA_TEXREG_WIDTH]);
 
-       PRIMOUTREG(0x2d00 + 34 * 4, regs[MGA_TEXREG_HEIGHT]);
+       PRIMOUTREG(MGAREG_WR34, regs[MGA_TEXREG_HEIGHT]);
        PRIMOUTREG(MGAREG_TEXTRANS, 0xffff);
        PRIMOUTREG(MGAREG_TEXTRANSHIGH, 0xffff);
        PRIMOUTREG(MGAREG_DMAPAD, 0);
@@ -163,13 +161,11 @@ static void mgaG400EmitTex0(drm_mga_private_t * dev_priv)
 {
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int *regs = sarea_priv->TexState[0];
-       int multitex = regs[MGA_TEXREG_CTL2] & TMC_dualtex_enable;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        PRIMGETPTR(dev_priv);
 
-       /* This takes a max of 30 dwords */
+       /* This takes 30 dwords */
 
        PRIMOUTREG(MGAREG_TEXCTL2, regs[MGA_TEXREG_CTL2] | 0x00008000);
        PRIMOUTREG(MGAREG_TEXCTL, regs[MGA_TEXREG_CTL]);
@@ -184,22 +180,20 @@ static void mgaG400EmitTex0(drm_mga_private_t * dev_priv)
        PRIMOUTREG(MGAREG_TEXORG4, regs[MGA_TEXREG_ORG4]);
        PRIMOUTREG(MGAREG_TEXWIDTH, regs[MGA_TEXREG_WIDTH]);
        PRIMOUTREG(MGAREG_TEXHEIGHT, regs[MGA_TEXREG_HEIGHT]);
-       PRIMOUTREG(0x2d00 + 49 * 4, 0);
+       PRIMOUTREG(MGAREG_WR49, 0);
 
-       PRIMOUTREG(0x2d00 + 57 * 4, 0);
-       PRIMOUTREG(0x2d00 + 53 * 4, 0);
-       PRIMOUTREG(0x2d00 + 61 * 4, 0);
-       PRIMOUTREG(MGAREG_DMAPAD, 0);
+       PRIMOUTREG(MGAREG_WR57, 0);
+       PRIMOUTREG(MGAREG_WR53, 0);
+       PRIMOUTREG(MGAREG_WR61, 0);
+       PRIMOUTREG(MGAREG_WR52, 0x40);
 
-       if (!multitex || 1) {
-               PRIMOUTREG(0x2d00 + 52 * 4, 0x40);
-               PRIMOUTREG(0x2d00 + 60 * 4, 0x40);
-               PRIMOUTREG(MGAREG_DMAPAD, 0);
-               PRIMOUTREG(MGAREG_DMAPAD, 0);
-       }
+       PRIMOUTREG(MGAREG_WR60, 0x40);
+       PRIMOUTREG(MGAREG_WR54, regs[MGA_TEXREG_WIDTH] | 0x40);
+       PRIMOUTREG(MGAREG_WR62, regs[MGA_TEXREG_HEIGHT] | 0x40);
+       PRIMOUTREG(MGAREG_DMAPAD, 0);
 
-       PRIMOUTREG(0x2d00 + 54 * 4, regs[MGA_TEXREG_WIDTH] | 0x40);
-       PRIMOUTREG(0x2d00 + 62 * 4, regs[MGA_TEXREG_HEIGHT] | 0x40);
+       PRIMOUTREG(MGAREG_DMAPAD, 0);
+       PRIMOUTREG(MGAREG_DMAPAD, 0);
        PRIMOUTREG(MGAREG_TEXTRANS, 0xffff);
        PRIMOUTREG(MGAREG_TEXTRANSHIGH, 0xffff);
 
@@ -208,12 +202,11 @@ static void mgaG400EmitTex0(drm_mga_private_t * dev_priv)
 
 #define TMC_map1_enable                0x80000000
 
-static void mgaG400EmitTex1(drm_mga_private_t * dev_priv, int source )
+static void mgaG400EmitTex1(drm_mga_private_t * dev_priv)
 {
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int *regs = sarea_priv->TexState[source];
+       unsigned int *regs = sarea_priv->TexState[1];
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        PRIMGETPTR(dev_priv);
 
@@ -233,14 +226,14 @@ static void mgaG400EmitTex1(drm_mga_private_t * dev_priv, int source )
        PRIMOUTREG(MGAREG_TEXORG4, regs[MGA_TEXREG_ORG4]);
        PRIMOUTREG(MGAREG_TEXWIDTH, regs[MGA_TEXREG_WIDTH]);
        PRIMOUTREG(MGAREG_TEXHEIGHT, regs[MGA_TEXREG_HEIGHT]);
-       PRIMOUTREG(0x2d00 + 49 * 4, 0);
+       PRIMOUTREG(MGAREG_WR49, 0);
 
-       PRIMOUTREG(0x2d00 + 57 * 4, 0);
-       PRIMOUTREG(0x2d00 + 53 * 4, 0);
-       PRIMOUTREG(0x2d00 + 61 * 4, 0);
-       PRIMOUTREG(0x2d00 + 52 * 4, regs[MGA_TEXREG_WIDTH] | 0x40);
+       PRIMOUTREG(MGAREG_WR57, 0);
+       PRIMOUTREG(MGAREG_WR53, 0);
+       PRIMOUTREG(MGAREG_WR61, 0);
+       PRIMOUTREG(MGAREG_WR52, regs[MGA_TEXREG_WIDTH] | 0x40);
 
-       PRIMOUTREG(0x2d00 + 60 * 4, regs[MGA_TEXREG_HEIGHT] | 0x40);
+       PRIMOUTREG(MGAREG_WR60, regs[MGA_TEXREG_HEIGHT] | 0x40);
        PRIMOUTREG(MGAREG_TEXTRANS, 0xffff);
        PRIMOUTREG(MGAREG_TEXTRANSHIGH, 0xffff);
        PRIMOUTREG(MGAREG_TEXCTL2, regs[MGA_TEXREG_CTL2] | 0x00008000);
@@ -248,50 +241,29 @@ static void mgaG400EmitTex1(drm_mga_private_t * dev_priv, int source )
        PRIMADVANCE(dev_priv);
 }
 
+#define MAGIC_FPARAM_HEX_VALUE 0x46480000
+/* This is the hex value of 12800.0f which is a magic value we must
+ * set in wr56.
+ */
+
 static void mgaG400EmitPipe(drm_mga_private_t * dev_priv)
 {
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int pipe = sarea_priv->WarpPipe;
-       float fParam = 12800.0f;
-       int multitex = (sarea_priv->TexState[0][MGA_TEXREG_CTL2] &
-                       TMC_dualtex_enable);
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        PRIMGETPTR(dev_priv);
 
        /* This takes 50 dwords */
 
-       /* Establish vertex size.
+       /* Establish vertex size.  
         */
        PRIMOUTREG(MGAREG_WIADDR2, WIA_wmode_suspend);
        PRIMOUTREG(MGAREG_DMAPAD, 0);
        PRIMOUTREG(MGAREG_DMAPAD, 0);
        PRIMOUTREG(MGAREG_DMAPAD, 0);
 
-       if (sarea_priv->vertexsize == 10) {
-               PRIMOUTREG(MGAREG_YDST, 0);
-               PRIMOUTREG(MGAREG_FXLEFT, 0);
-               PRIMOUTREG(MGAREG_FXRIGHT, 1);
-               PRIMOUTREG(MGAREG_DWGCTL, MGA_FLUSH_CMD);
-
-               PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 1);
-               PRIMOUTREG(MGAREG_DMAPAD, 0);
-               PRIMOUTREG(MGAREG_DWGSYNC, 0x7000);
-               PRIMOUTREG(MGAREG_DMAPAD, 0);
-
-               if (multitex) {
-                       PRIMOUTREG(MGAREG_TEXCTL2, 0 | 0x00008000);
-                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
-                       PRIMOUTREG(MGAREG_TEXCTL2, 0x80 | 0x00008000);
-                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
-               } else {
-                       PRIMOUTREG(MGAREG_TEXCTL2, 0 | 0x00008000);
-                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
-                       PRIMOUTREG(MGAREG_TEXCTL2, 0 | 0x00008000);
-                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
-               }
-
+       if (pipe & MGA_T2) {
                PRIMOUTREG(MGAREG_WVRTXSZ, 0x00001e09);
                PRIMOUTREG(MGAREG_DMAPAD, 0);
                PRIMOUTREG(MGAREG_DMAPAD, 0);
@@ -302,21 +274,23 @@ static void mgaG400EmitPipe(drm_mga_private_t * dev_priv)
                PRIMOUTREG(MGAREG_WACCEPTSEQ, 0);
                PRIMOUTREG(MGAREG_WACCEPTSEQ, 0x1e000000);
        } else {
-               /* Flush the WARP pipe */
-               PRIMOUTREG(MGAREG_YDST, 0);
-               PRIMOUTREG(MGAREG_FXLEFT, 0);
-               PRIMOUTREG(MGAREG_FXRIGHT, 1);
-               PRIMOUTREG(MGAREG_DWGCTL, MGA_FLUSH_CMD);
-
-               PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 1);
-               PRIMOUTREG(MGAREG_DMAPAD, 0);
-               PRIMOUTREG(MGAREG_DWGSYNC, 0x7000);
-               PRIMOUTREG(MGAREG_DMAPAD, 0);
+               if (dev_priv->WarpPipe & MGA_T2) {
+                       /* Flush the WARP pipe */
+                       PRIMOUTREG(MGAREG_YDST, 0);
+                       PRIMOUTREG(MGAREG_FXLEFT, 0);
+                       PRIMOUTREG(MGAREG_FXRIGHT, 1);
+                       PRIMOUTREG(MGAREG_DWGCTL, MGA_FLUSH_CMD);
+
+                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 1);
+                       PRIMOUTREG(MGAREG_DWGSYNC, 0x7000);
+                       PRIMOUTREG(MGAREG_TEXCTL2, 0x00008000);
+                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
 
-               PRIMOUTREG(MGAREG_TEXCTL2, 0 | 0x00008000);
-               PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
-               PRIMOUTREG(MGAREG_TEXCTL2, 0 | 0x00008000);
-               PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
+                       PRIMOUTREG(MGAREG_TEXCTL2, 0x80 | 0x00008000);
+                       PRIMOUTREG(MGAREG_LEN + MGAREG_MGA_EXEC, 0);
+                       PRIMOUTREG(MGAREG_DMAPAD, 0);
+                       PRIMOUTREG(MGAREG_DMAPAD, 0);
+               }
 
                PRIMOUTREG(MGAREG_WVRTXSZ, 0x00001807);
                PRIMOUTREG(MGAREG_DMAPAD, 0);
@@ -331,29 +305,26 @@ static void mgaG400EmitPipe(drm_mga_private_t * dev_priv)
 
        PRIMOUTREG(MGAREG_WFLAG, 0);
        PRIMOUTREG(MGAREG_WFLAG1, 0);
-       PRIMOUTREG(0x2d00 + 56 * 4, *((u32 *) (&fParam)));
+       PRIMOUTREG(MGAREG_WR56, MAGIC_FPARAM_HEX_VALUE);
        PRIMOUTREG(MGAREG_DMAPAD, 0);
 
-       PRIMOUTREG(0x2d00 + 49 * 4, 0); /* Tex stage 0 */
-       PRIMOUTREG(0x2d00 + 57 * 4, 0); /* Tex stage 0 */
-       PRIMOUTREG(0x2d00 + 53 * 4, 0); /* Tex stage 1 */
-       PRIMOUTREG(0x2d00 + 61 * 4, 0); /* Tex stage 1 */
-
-       PRIMOUTREG(0x2d00 + 54 * 4, 0x40);      /* Tex stage 0 : w */
-       PRIMOUTREG(0x2d00 + 62 * 4, 0x40);      /* Tex stage 0 : h */
-       PRIMOUTREG(0x2d00 + 52 * 4, 0x40);      /* Tex stage 1 : w */
-       PRIMOUTREG(0x2d00 + 60 * 4, 0x40);      /* Tex stage 1 : h */
-
-       if (dev_priv->WarpPipe != pipe || 1) {
-               /* Dma pading required due to hw bug */
-               PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
-               PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
-               PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
-               PRIMOUTREG(MGAREG_WIADDR2,
-                          (u32) (dev_priv->WarpIndex[pipe].phys_addr |
-                                 WIA_wmode_start | WIA_wagp_agp));
-       }
+       PRIMOUTREG(MGAREG_WR49, 0);     /* Tex stage 0 */
+       PRIMOUTREG(MGAREG_WR57, 0);     /* Tex stage 0 */
+       PRIMOUTREG(MGAREG_WR53, 0);     /* Tex stage 1 */
+       PRIMOUTREG(MGAREG_WR61, 0);     /* Tex stage 1 */
+
+       PRIMOUTREG(MGAREG_WR54, 0x40);  /* Tex stage 0 : w */
+       PRIMOUTREG(MGAREG_WR62, 0x40);  /* Tex stage 0 : h */
+       PRIMOUTREG(MGAREG_WR52, 0x40);  /* Tex stage 1 : w */
+       PRIMOUTREG(MGAREG_WR60, 0x40);  /* Tex stage 1 : h */
 
+       /* Dma pading required due to hw bug */
+       PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
+       PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
+       PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
+       PRIMOUTREG(MGAREG_WIADDR2,
+                  (u32) (dev_priv->WarpIndex[pipe].
+                         phys_addr | WIA_wmode_start | WIA_wagp_agp));
        PRIMADVANCE(dev_priv);
 }
 
@@ -362,7 +333,6 @@ static void mgaG200EmitPipe(drm_mga_private_t * dev_priv)
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int pipe = sarea_priv->WarpPipe;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        PRIMGETPTR(dev_priv);
 
@@ -371,12 +341,12 @@ static void mgaG200EmitPipe(drm_mga_private_t * dev_priv)
        PRIMOUTREG(MGAREG_WIADDR, WIA_wmode_suspend);
        PRIMOUTREG(MGAREG_WVRTXSZ, 7);
        PRIMOUTREG(MGAREG_WFLAG, 0);
-       PRIMOUTREG(0x2d00 + 24 * 4, 0); /* tex w/h */
+       PRIMOUTREG(MGAREG_WR24, 0);     /* tex w/h */
 
-       PRIMOUTREG(0x2d00 + 25 * 4, 0x100);
-       PRIMOUTREG(0x2d00 + 34 * 4, 0); /* tex w/h */
-       PRIMOUTREG(0x2d00 + 42 * 4, 0xFFFF);
-       PRIMOUTREG(0x2d00 + 60 * 4, 0xFFFF);
+       PRIMOUTREG(MGAREG_WR25, 0x100);
+       PRIMOUTREG(MGAREG_WR34, 0);     /* tex w/h */
+       PRIMOUTREG(MGAREG_WR42, 0xFFFF);
+       PRIMOUTREG(MGAREG_WR60, 0xFFFF);
 
        /* Dma pading required due to hw bug */
        PRIMOUTREG(MGAREG_DMAPAD, 0xffffffff);
@@ -393,23 +363,13 @@ static void mgaEmitState(drm_mga_private_t * dev_priv)
 {
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int dirty = sarea_priv->dirty;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if (dev_priv->chipset == MGA_CARD_TYPE_G400) {
-               int multitex = (sarea_priv->TexState[0][MGA_TEXREG_CTL2] &
-                               TMC_dualtex_enable);
+               int multitex = sarea_priv->WarpPipe & MGA_T2;
 
-               dirty = ~0;
-
-               if (dirty & MGA_UPLOAD_PIPE
-/*                 && (sarea_priv->WarpPipe != dev_priv->WarpPipe || */
-/*                     sarea_priv->vertexsize != dev_priv->vertexsize) */
-                  )
-               {
+               if (sarea_priv->WarpPipe != dev_priv->WarpPipe) {
                        mgaG400EmitPipe(dev_priv);
                        dev_priv->WarpPipe = sarea_priv->WarpPipe;
-                       dev_priv->vertexsize = sarea_priv->vertexsize;
-                       sarea_priv->dirty &= ~MGA_UPLOAD_PIPE;
                }
 
                if (dirty & MGA_UPLOAD_CTX) {
@@ -422,11 +382,8 @@ static void mgaEmitState(drm_mga_private_t * dev_priv)
                        sarea_priv->dirty &= ~MGA_UPLOAD_TEX0;
                }
 
-               if (dirty & MGA_UPLOAD_TEX1) {
-                       if (multitex)
-                               mgaG400EmitTex1(dev_priv, 1);
-                       else
-                               mgaG400EmitTex1(dev_priv, 0);
+               if ((dirty & MGA_UPLOAD_TEX1) && multitex) {
+                       mgaG400EmitTex1(dev_priv);
                        sarea_priv->dirty &= ~MGA_UPLOAD_TEX1;
                }
        } else {
@@ -447,7 +404,6 @@ static void mgaEmitState(drm_mga_private_t * dev_priv)
        }
 }
 
-
 /* Disallow all write destinations except the front and backbuffer.
  */
 static int mgaVerifyContext(drm_mga_private_t * dev_priv)
@@ -455,8 +411,6 @@ static int mgaVerifyContext(drm_mga_private_t * dev_priv)
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        unsigned int *regs = sarea_priv->ContextState;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if (regs[MGA_CTXREG_DSTORG] != dev_priv->frontOffset &&
            regs[MGA_CTXREG_DSTORG] != dev_priv->backOffset) {
                DRM_DEBUG("BAD DSTORG: %x (front %x, back %x)\n\n",
@@ -475,8 +429,6 @@ static int mgaVerifyTex(drm_mga_private_t * dev_priv, int unit)
 {
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if ((sarea_priv->TexState[unit][MGA_TEXREG_ORG] & 0x3) == 0x1) {
                DRM_DEBUG("BAD TEXREG_ORG: %x, unit %d\n",
                          sarea_priv->TexState[unit][MGA_TEXREG_ORG],
@@ -494,8 +446,6 @@ static int mgaVerifyState(drm_mga_private_t * dev_priv)
        unsigned int dirty = sarea_priv->dirty;
        int rv = 0;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS)
                sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
 
@@ -523,8 +473,6 @@ static int mgaVerifyIload(drm_mga_private_t * dev_priv,
                          unsigned long bus_address,
                          unsigned int dstOrg, int length)
 {
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
        if (dstOrg < dev_priv->textureOffset ||
            dstOrg + length >
            (dev_priv->textureOffset + dev_priv->textureSize)) {
@@ -547,7 +495,6 @@ static void mga_dma_dispatch_tex_blit(drm_device_t * dev,
        int use_agp = PDEA_pagpxfer_enable | 0x00000001;
        u16 y2;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        y2 = length / 64;
 
@@ -555,7 +502,6 @@ static void mga_dma_dispatch_tex_blit(drm_device_t * dev,
 
        PRIMOUTREG(MGAREG_DSTORG, destOrg);
        PRIMOUTREG(MGAREG_MACCESS, 0x00000000);
-       DRM_DEBUG("srcorg : %lx\n", bus_address | use_agp);
        PRIMOUTREG(MGAREG_SRCORG, (u32) bus_address | use_agp);
        PRIMOUTREG(MGAREG_AR5, 64);
 
@@ -569,10 +515,10 @@ static void mga_dma_dispatch_tex_blit(drm_device_t * dev,
        PRIMOUTREG(MGAREG_FXBNDRY, (63 << 16));
        PRIMOUTREG(MGAREG_YDSTLEN + MGAREG_MGA_EXEC, y2);
 
+       PRIMOUTREG(MGAREG_DMAPAD, 0);
        PRIMOUTREG(MGAREG_SRCORG, 0);
        PRIMOUTREG(MGAREG_PITCH, dev_priv->stride / dev_priv->cpp);
-       PRIMOUTREG(MGAREG_DMAPAD, 0);
-       PRIMOUTREG(MGAREG_DMAPAD, 0);
+       PRIMOUTREG(MGAREG_DWGSYNC, 0x7000);
        PRIMADVANCE(dev_priv);
 }
 
@@ -586,14 +532,6 @@ static void mga_dma_dispatch_vertex(drm_device_t * dev, drm_buf_t * buf)
        int use_agp = PDEA_pagpxfer_enable;
        int i = 0;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
-       DRM_DEBUG("dispatch vertex %d addr 0x%lx, "
-                 "length 0x%x nbox %d dirty %x\n",
-                 buf->idx, address, length,
-                 sarea_priv->nbox, sarea_priv->dirty);
-
-       DRM_DEBUG("used : %d, total : %d\n", buf->used, buf->total);
 
        if (buf->used) {
                /* WARNING: if you change any of the state functions verify
@@ -604,19 +542,12 @@ static void mga_dma_dispatch_vertex(drm_device_t * dev, drm_buf_t * buf)
                              (MAX_STATE_SIZE + (5 * MGA_NR_SAREA_CLIPRECTS)));
                mgaEmitState(dev_priv);
 
-/*             length = dev_priv->vertexsize * 3 * 4; */
+#if 0
+               length = dev_priv->vertexsize * 3 * 4;
+#endif
 
                do {
                        if (i < sarea_priv->nbox) {
-                               DRM_DEBUG("idx %d Emit box %d/%d:"
-                                         "%d,%d - %d,%d\n",
-                                         buf->idx,
-                                         i, sarea_priv->nbox,
-                                         sarea_priv->boxes[i].x1,
-                                         sarea_priv->boxes[i].y1,
-                                         sarea_priv->boxes[i].x2,
-                                         sarea_priv->boxes[i].y2);
-
                                mgaEmitClipRect(dev_priv,
                                                &sarea_priv->boxes[i]);
                        }
@@ -653,12 +584,6 @@ static void mga_dma_dispatch_indices(drm_device_t * dev,
        int use_agp = PDEA_pagpxfer_enable;
        int i = 0;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
-
-       DRM_DEBUG("dispatch indices %d addr 0x%x, "
-                 "start 0x%x end 0x%x nbox %d dirty %x\n",
-                 buf->idx, address, start, end,
-                 sarea_priv->nbox, sarea_priv->dirty);
 
        if (start != end) {
                /* WARNING: if you change any of the state functions verify
@@ -671,15 +596,6 @@ static void mga_dma_dispatch_indices(drm_device_t * dev,
 
                do {
                        if (i < sarea_priv->nbox) {
-                               DRM_DEBUG("idx %d Emit box %d/%d:"
-                                         "%d,%d - %d,%d\n",
-                                         buf->idx,
-                                         i, sarea_priv->nbox,
-                                         sarea_priv->boxes[i].x1,
-                                         sarea_priv->boxes[i].y1,
-                                         sarea_priv->boxes[i].x2,
-                                         sarea_priv->boxes[i].y2);
-
                                mgaEmitClipRect(dev_priv,
                                                &sarea_priv->boxes[i]);
                        }
@@ -719,7 +635,6 @@ static void mga_dma_dispatch_clear(drm_device_t * dev, int flags,
        unsigned int cmd;
        int i;
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if (dev_priv->sgram)
                cmd = MGA_CLEAR_CMD | DC_atype_blk;
@@ -731,12 +646,7 @@ static void mga_dma_dispatch_clear(drm_device_t * dev, int flags,
        for (i = 0; i < nbox; i++) {
                unsigned int height = pbox[i].y2 - pbox[i].y1;
 
-               DRM_DEBUG("dispatch clear %d,%d-%d,%d flags %x!\n",
-                         pbox[i].x1, pbox[i].y1, pbox[i].x2,
-                         pbox[i].y2, flags);
-
                if (flags & MGA_FRONT) {
-                       DRM_DEBUG("clear front\n");
                        PRIMOUTREG(MGAREG_DMAPAD, 0);
                        PRIMOUTREG(MGAREG_PLNWT, clear_colormask);
                        PRIMOUTREG(MGAREG_YDSTLEN,
@@ -751,7 +661,6 @@ static void mga_dma_dispatch_clear(drm_device_t * dev, int flags,
                }
 
                if (flags & MGA_BACK) {
-                       DRM_DEBUG("clear back\n");
                        PRIMOUTREG(MGAREG_DMAPAD, 0);
                        PRIMOUTREG(MGAREG_PLNWT, clear_colormask);
                        PRIMOUTREG(MGAREG_YDSTLEN,
@@ -766,7 +675,6 @@ static void mga_dma_dispatch_clear(drm_device_t * dev, int flags,
                }
 
                if (flags & MGA_DEPTH) {
-                       DRM_DEBUG("clear depth\n");
                        PRIMOUTREG(MGAREG_DMAPAD, 0);
                        PRIMOUTREG(MGAREG_PLNWT, clear_depthmask);
                        PRIMOUTREG(MGAREG_YDSTLEN,
@@ -800,7 +708,6 @@ static void mga_dma_dispatch_swap(drm_device_t * dev)
        int pixel_stride = dev_priv->stride / dev_priv->cpp;
 
        PRIMLOCALS;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        PRIM_OVERFLOW(dev, dev_priv, (MGA_NR_SAREA_CLIPRECTS * 5) + 20);
 
@@ -823,9 +730,6 @@ static void mga_dma_dispatch_swap(drm_device_t * dev)
                unsigned int h = pbox[i].y2 - pbox[i].y1;
                unsigned int start = pbox[i].y1 * pixel_stride;
 
-               DRM_DEBUG("dispatch swap %d,%d-%d,%d!\n",
-                         pbox[i].x1, pbox[i].y1, pbox[i].x2, pbox[i].y2);
-
                PRIMOUTREG(MGAREG_AR0, start + pbox[i].x2 - 1);
                PRIMOUTREG(MGAREG_AR3, start + pbox[i].x1);
                PRIMOUTREG(MGAREG_FXBNDRY,
@@ -855,7 +759,6 @@ int mga_clear_bufs(struct inode *inode, struct file *filp,
 
        if (copy_from_user(&clear, (drm_mga_clear_t *) arg, sizeof(clear)))
                return -EFAULT;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
                DRM_ERROR("mga_clear_bufs called without lock held\n");
@@ -887,7 +790,6 @@ int mga_swap_bufs(struct inode *inode, struct file *filp,
        drm_mga_private_t *dev_priv =
            (drm_mga_private_t *) dev->dev_private;
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
                DRM_ERROR("mga_swap_bufs called without lock held\n");
@@ -922,9 +824,7 @@ int mga_iload(struct inode *inode, struct file *filp,
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_iload_t iload;
        unsigned long bus_address;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
-       DRM_DEBUG("Starting Iload\n");
        if (copy_from_user(&iload, (drm_mga_iload_t *) arg, sizeof(iload)))
                return -EFAULT;
 
@@ -936,8 +836,6 @@ int mga_iload(struct inode *inode, struct file *filp,
        buf = dma->buflist[iload.idx];
        buf_priv = buf->dev_private;
        bus_address = buf->bus_address;
-       DRM_DEBUG("bus_address %lx, length %d, destorg : %x\n",
-                 bus_address, iload.length, iload.destOrg);
 
        if (mgaVerifyIload(dev_priv,
                           bus_address, iload.destOrg, iload.length)) {
@@ -968,7 +866,6 @@ int mga_vertex(struct inode *inode, struct file *filp,
        drm_buf_t *buf;
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_vertex_t vertex;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if (copy_from_user(&vertex, (drm_mga_vertex_t *) arg, sizeof(vertex)))
                return -EFAULT;
@@ -978,8 +875,6 @@ int mga_vertex(struct inode *inode, struct file *filp,
                return -EINVAL;
        }
 
-       DRM_DEBUG("mga_vertex\n");
-
        buf = dma->buflist[vertex.idx];
        buf_priv = buf->dev_private;
 
@@ -993,7 +888,6 @@ int mga_vertex(struct inode *inode, struct file *filp,
                        buf_priv->dispatched = 0;
                        mga_freelist_put(dev, buf);
                }
-               DRM_DEBUG("bad state\n");
                return -EINVAL;
        }
 
@@ -1017,9 +911,9 @@ int mga_indices(struct inode *inode, struct file *filp,
        drm_buf_t *buf;
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_indices_t indices;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
-       if (copy_from_user(&indices, (drm_mga_indices_t *) arg, sizeof(indices)))
+       if (copy_from_user(&indices,
+                          (drm_mga_indices_t *)arg, sizeof(indices)))
                return -EFAULT;
 
        if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
@@ -1027,8 +921,6 @@ int mga_indices(struct inode *inode, struct file *filp,
                return -EINVAL;
        }
 
-       DRM_DEBUG("mga_indices\n");
-
        buf = dma->buflist[indices.idx];
        buf_priv = buf->dev_private;
 
@@ -1058,7 +950,6 @@ static int mga_dma_get_buffers(drm_device_t * dev, drm_dma_t * d)
 {
        int i;
        drm_buf_t *buf;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        for (i = d->granted_count; i < d->request_count; i++) {
                buf = mga_freelist_get(dev);
@@ -1084,12 +975,9 @@ int mga_dma(struct inode *inode, struct file *filp, unsigned int cmd,
        drm_device_dma_t *dma = dev->dma;
        int retcode = 0;
        drm_dma_t d;
-       DRM_DEBUG("%s\n", __FUNCTION__);
 
        if (copy_from_user(&d, (drm_dma_t *) arg, sizeof(d)))
                return -EFAULT;
-       DRM_DEBUG("%d %d: %d send, %d req\n",
-                 current->pid, d.context, d.send_count, d.request_count);
 
        if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
                DRM_ERROR("mga_dma called without lock held\n");
@@ -1120,8 +1008,6 @@ int mga_dma(struct inode *inode, struct file *filp, unsigned int cmd,
                retcode = mga_dma_get_buffers(dev, &d);
        }
 
-       DRM_DEBUG("%d returning, granted = %d\n",
-                 current->pid, d.granted_count);
        if (copy_to_user((drm_dma_t *) arg, &d, sizeof(d)))
                return -EFAULT;
        return retcode;
index 8d4a370..dcb766a 100644 (file)
@@ -603,6 +603,7 @@ int r128_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 #endif
                 add_wait_queue(&dev->lock.lock_queue, &entry);
                 for (;;) {
+                        current->state = TASK_INTERRUPTIBLE;
                         if (!dev->lock.hw_lock) {
                                 /* Device has been unregistered */
                                 ret = -EINTR;
@@ -618,7 +619,6 @@ int r128_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 
                                 /* Contention */
                         atomic_inc(&dev->total_sleeps);
-                        current->state = TASK_INTERRUPTIBLE;
 #if 1
                        current->policy |= SCHED_YIELD;
 #endif
index dbb9ddc..860dbf9 100644 (file)
@@ -198,7 +198,7 @@ extern int  r128_context_switch_complete(drm_device_t *dev, int new);
 #define R128_MAX_USEC_TIMEOUT  100000  /* 100 ms */
 
 
-#define R128_BASE(reg)         ((unsigned long)(dev_priv->mmio->handle))
+#define R128_BASE(reg)         ((u32)(dev_priv->mmio->handle))
 #define R128_ADDR(reg)         (R128_BASE(reg) + reg)
 
 #define R128_DEREF(reg)                *(__volatile__ int *)R128_ADDR(reg)
index 689b360..d8f5bcc 100644 (file)
@@ -562,6 +562,7 @@ int tdfx_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 #endif
                 add_wait_queue(&dev->lock.lock_queue, &entry);
                 for (;;) {
+                        current->state = TASK_INTERRUPTIBLE;
                         if (!dev->lock.hw_lock) {
                                 /* Device has been unregistered */
                                 ret = -EINTR;
@@ -577,7 +578,6 @@ int tdfx_lock(struct inode *inode, struct file *filp, unsigned int cmd,
 
                                 /* Contention */
                         atomic_inc(&dev->total_sleeps);
-                        current->state = TASK_INTERRUPTIBLE;
 #if 1
                        current->policy |= SCHED_YIELD;
 #endif
index 074e75d..4c78be8 100644 (file)
@@ -68,8 +68,6 @@ struct page *drm_vm_nopage(struct vm_area_struct *vma,
                           int write_access)
 #endif
 {
-       DRM_DEBUG("0x%08lx, %d\n", address, write_access);
-
        return NOPAGE_SIGBUS;           /* Disallow mremap */
 }