merged drm-filp-0-1-branch
authorKeith Whitwell <keith@tungstengraphics.com>
Fri, 28 Mar 2003 14:27:37 +0000 (14:27 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Fri, 28 Mar 2003 14:27:37 +0000 (14:27 +0000)
48 files changed:
linux-core/drmP.h
linux-core/drm_bufs.c
linux-core/drm_dma.c
linux-core/drm_drv.c
linux-core/drm_lock.c
linux-core/drm_os_linux.h
linux-core/i810_dma.c
linux-core/i810_drv.h
linux-core/i830_dma.c
linux-core/i830_drv.h
linux/drmP.h
linux/drm_bufs.h
linux/drm_dma.h
linux/drm_drv.h
linux/drm_lists.h
linux/drm_lock.h
linux/drm_os_linux.h
linux/gamma_dma.c
linux/gamma_drv.h
linux/i810.h
linux/i810_dma.c
linux/i810_drv.h
linux/i830.h
linux/i830_dma.c
linux/i830_drv.h
shared-core/mga_dma.c
shared-core/mga_drv.h
shared-core/mga_state.c
shared-core/r128_cce.c
shared-core/r128_drv.h
shared-core/r128_state.c
shared-core/radeon_cp.c
shared-core/radeon_drv.h
shared-core/radeon_irq.c
shared-core/radeon_mem.c
shared-core/radeon_state.c
shared/mga_dma.c
shared/mga_drv.h
shared/mga_state.c
shared/r128_cce.c
shared/r128_drv.h
shared/r128_state.c
shared/radeon.h
shared/radeon_cp.c
shared/radeon_drv.h
shared/radeon_irq.c
shared/radeon_mem.c
shared/radeon_state.c

index 5c1474d..a6b3228 100644 (file)
@@ -276,6 +276,17 @@ do {                                                                       \
        (_map) = (_dev)->context_sareas[_ctx];          \
 } while(0)
 
+#define LOCK_TEST_WITH_RETURN( dev, filp )                             \
+do {                                                                   \
+       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
+            dev->lock.filp != filp ) {                         \
+               DRM_ERROR( "%s called without lock held\n",             \
+                          __FUNCTION__ );                              \
+               return -EINVAL;                                         \
+       }                                                               \
+} while (0)
+
+
 typedef int drm_ioctl_t( struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg );
 
@@ -324,7 +335,7 @@ typedef struct drm_buf {
        __volatile__ int  waiting;     /* On kernel DMA queue                */
        __volatile__ int  pending;     /* On hardware DMA queue              */
        wait_queue_head_t dma_wait;    /* Processes waiting                  */
-       pid_t             pid;         /* PID of holding process             */
+       struct file       *filp;       /* Pointer to holding file descr      */
        int               context;     /* Kernel queue for this buffer       */
        int               while_locked;/* Dispatch this buffer while locked  */
        enum {
@@ -442,7 +453,7 @@ typedef struct drm_queue {
 
 typedef struct drm_lock_data {
        drm_hw_lock_t     *hw_lock;     /* Hardware lock                   */
-       pid_t             pid;          /* PID of lock holder (0=kernel)   */
+       struct file       *filp;        /* File descr of lock holder (0=kernel)   */
        wait_queue_head_t lock_queue;   /* Queue of blocked processes      */
        unsigned long     lock_time;    /* Time of last lock in jiffies    */
 } drm_lock_data_t;
@@ -818,15 +829,15 @@ extern int             DRM(mapbufs)( struct inode *inode, struct file *filp,
 extern int          DRM(dma_setup)(drm_device_t *dev);
 extern void         DRM(dma_takedown)(drm_device_t *dev);
 extern void         DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf);
-extern void         DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid);
+extern void         DRM(reclaim_buffers)( struct file *filp );
 #if __HAVE_OLD_DMA
 /* GH: This is a dirty hack for now...
  */
 extern void         DRM(clear_next_buffer)(drm_device_t *dev);
 extern int          DRM(select_queue)(drm_device_t *dev,
                                       void (*wrapper)(unsigned long));
-extern int          DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *dma);
-extern int          DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma);
+extern int          DRM(dma_enqueue)(struct file *filp, drm_dma_t *dma);
+extern int          DRM(dma_get_buffers)(struct file *filp, drm_dma_t *dma);
 #endif
 #if __HAVE_DMA_IRQ
 extern int           DRM(control)( struct inode *inode, struct file *filp,
index 9ce7cff..b4e7369 100644 (file)
@@ -404,7 +404,7 @@ int DRM(addbufs_agp)( struct inode *inode, struct file *filp,
                buf->waiting = 0;
                buf->pending = 0;
                init_waitqueue_head( &buf->dma_wait );
-               buf->pid     = 0;
+               buf->filp    = 0;
 
                buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
                buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T),
@@ -617,7 +617,7 @@ int DRM(addbufs_pci)( struct inode *inode, struct file *filp,
                        buf->waiting = 0;
                        buf->pending = 0;
                        init_waitqueue_head( &buf->dma_wait );
-                       buf->pid     = 0;
+                       buf->filp    = 0;
 #if __HAVE_DMA_HISTOGRAM
                        buf->time_queued     = 0;
                        buf->time_dispatched = 0;
@@ -774,7 +774,7 @@ int DRM(addbufs_sg)( struct inode *inode, struct file *filp,
                buf->waiting = 0;
                buf->pending = 0;
                init_waitqueue_head( &buf->dma_wait );
-               buf->pid     = 0;
+               buf->filp    = 0;
 
                buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
                buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T),
@@ -1012,9 +1012,9 @@ int DRM(freebufs)( struct inode *inode, struct file *filp,
                        return -EINVAL;
                }
                buf = dma->buflist[idx];
-               if ( buf->pid != current->pid ) {
-                       DRM_ERROR( "Process %d freeing buffer owned by %d\n",
-                                  current->pid, buf->pid );
+               if ( buf->filp != filp ) {
+                       DRM_ERROR( "Process %d freeing buffer not owned\n",
+                                  current->pid );
                        return -EINVAL;
                }
                DRM(free_buffer)( dev, buf );
index 1b0b639..d21c8b9 100644 (file)
@@ -189,7 +189,7 @@ void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf)
 
        buf->waiting  = 0;
        buf->pending  = 0;
-       buf->pid      = 0;
+       buf->filp     = 0;
        buf->used     = 0;
 #if __HAVE_DMA_HISTOGRAM
        buf->time_completed = get_cycles();
@@ -211,14 +211,16 @@ void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf)
 }
 
 #if !__HAVE_DMA_RECLAIM
-void DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid)
+void DRM(reclaim_buffers)( struct file *filp )
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
        if (!dma) return;
        for (i = 0; i < dma->buf_count; i++) {
-               if (dma->buflist[i]->pid == pid) {
+               if (dma->buflist[i]->filp == filp) {
                        switch (dma->buflist[i]->list) {
                        case DRM_LIST_NONE:
                                DRM(free_buffer)(dev, dma->buflist[i]);
@@ -319,8 +321,10 @@ int DRM(select_queue)(drm_device_t *dev, void (*wrapper)(unsigned long))
 }
 
 
-int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
+int DRM(dma_enqueue)(struct file *filp, drm_dma_t *d)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        int               i;
        drm_queue_t       *q;
        drm_buf_t         *buf;
@@ -382,10 +386,10 @@ int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
                        return -EINVAL;
                }
                buf = dma->buflist[ idx ];
-               if (buf->pid != current->pid) {
+               if (buf->filp != filp) {
                        atomic_dec(&q->use_count);
-                       DRM_ERROR("Process %d using buffer owned by %d\n",
-                                 current->pid, buf->pid);
+                       DRM_ERROR("Process %d using buffer not owned\n",
+                                 current->pid);
                        return -EINVAL;
                }
                if (buf->list != DRM_LIST_NONE) {
@@ -427,9 +431,11 @@ int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
        return 0;
 }
 
-static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
+static int DRM(dma_get_buffers_of_order)(struct file *filp, drm_dma_t *d,
                                         int order)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        int               i;
        drm_buf_t         *buf;
        drm_device_dma_t  *dma = dev->dma;
@@ -439,13 +445,13 @@ static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
                                        d->flags & _DRM_DMA_WAIT);
                if (!buf) break;
                if (buf->pending || buf->waiting) {
-                       DRM_ERROR("Free buffer %d in use by %d (w%d, p%d)\n",
+                       DRM_ERROR("Free buffer %d in use by %x (w%d, p%d)\n",
                                  buf->idx,
-                                 buf->pid,
+                                 buf->filp,
                                  buf->waiting,
                                  buf->pending);
                }
-               buf->pid     = current->pid;
+               buf->filp     = filp;
                if (copy_to_user(&d->request_indices[i],
                                 &buf->idx,
                                 sizeof(buf->idx)))
@@ -462,7 +468,7 @@ static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
 }
 
 
-int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
+int DRM(dma_get_buffers)(struct file *filp, drm_dma_t *dma)
 {
        int               order;
        int               retcode = 0;
@@ -471,7 +477,7 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
        order = DRM(order)(dma->request_size);
 
        dma->granted_count = 0;
-       retcode            = DRM(dma_get_buffers_of_order)(dev, dma, order);
+       retcode            = DRM(dma_get_buffers_of_order)(filp, dma, order);
 
        if (dma->granted_count < dma->request_count
            && (dma->flags & _DRM_DMA_SMALLER_OK)) {
@@ -481,7 +487,7 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
                             && tmp_order >= DRM_MIN_ORDER;
                     --tmp_order) {
 
-                       retcode = DRM(dma_get_buffers_of_order)(dev, dma,
+                       retcode = DRM(dma_get_buffers_of_order)(filp, dma,
                                                                tmp_order);
                }
        }
@@ -494,7 +500,7 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
                             && tmp_order <= DRM_MAX_ORDER;
                     ++tmp_order) {
 
-                       retcode = DRM(dma_get_buffers_of_order)(dev, dma,
+                       retcode = DRM(dma_get_buffers_of_order)(filp, dma,
                                                                tmp_order);
                }
        }
index 41349e8..0a4f3ae 100644 (file)
@@ -496,7 +496,7 @@ static int DRM(takedown)( drm_device_t *dev )
 #endif
        if ( dev->lock.hw_lock ) {
                dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
-               dev->lock.pid = 0;
+               dev->lock.filp = 0;
                wake_up_interruptible( &dev->lock.lock_queue );
        }
        up( &dev->struct_sem );
@@ -732,8 +732,6 @@ int DRM(open)( struct inode *inode, struct file *filp )
                return -ENODEV;
        }
 
-       DRM_DEBUG( "open_count = %d\n", dev->open_count );
-
        retcode = DRM(open_helper)( inode, filp, dev );
        if ( !retcode ) {
                atomic_inc( &dev->counts[_DRM_STAT_OPENS] );
@@ -770,10 +768,10 @@ int DRM(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 ) {
-               DRM_DEBUG( "Process %d dead, freeing lock for context %d\n",
-                          current->pid,
-                          _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
+            dev->lock.filp == filp ) {
+               DRM_DEBUG( "File %p released, freeing lock for context %d\n",
+                       filp,
+                       _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
 #if __HAVE_RELEASE
                DRIVER_RELEASE();
 #endif
@@ -789,6 +787,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
        else if ( dev->lock.hw_lock ) {
                /* The lock is required to reclaim buffers */
                DECLARE_WAITQUEUE( entry, current );
+
                add_wait_queue( &dev->lock.lock_queue, &entry );
                for (;;) {
                        current->state = TASK_INTERRUPTIBLE;
@@ -799,7 +798,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
                        }
                        if ( DRM(lock_take)( &dev->lock.hw_lock->lock,
                                             DRM_KERNEL_CONTEXT ) ) {
-                               dev->lock.pid       = priv->pid;
+                               dev->lock.filp      = filp;
                                dev->lock.lock_time = jiffies;
                                 atomic_inc( &dev->counts[_DRM_STAT_LOCKS] );
                                break;  /* Got lock */
@@ -823,7 +822,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
                }
        }
 #elif __HAVE_DMA
-       DRM(reclaim_buffers)( dev, priv->pid );
+       DRM(reclaim_buffers)( filp );
 #endif
 
        DRM(fasync)( -1, filp, 0 );
@@ -847,7 +846,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
                dev->file_last   = priv->prev;
        }
        up( &dev->struct_sem );
-
+       
        DRM(free)( priv, sizeof(*priv), DRM_MEM_FILES );
 
        /* ========================================================
@@ -872,6 +871,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
        spin_unlock( &dev->count_lock );
 
        unlock_kernel();
+
        return retcode;
 }
 
@@ -969,7 +969,7 @@ int DRM(lock)( struct inode *inode, struct file *filp,
                         }
                         if ( DRM(lock_take)( &dev->lock.hw_lock->lock,
                                             lock.context ) ) {
-                                dev->lock.pid       = current->pid;
+                                dev->lock.filp      = filp;
                                 dev->lock.lock_time = jiffies;
                                 atomic_inc( &dev->counts[_DRM_STAT_LOCKS] );
                                 break;  /* Got lock */
@@ -1051,7 +1051,7 @@ int DRM(unlock)( struct inode *inode, struct file *filp,
         * agent to request it then we should just be able to
         * take it immediately and not eat the ioctl.
         */
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        {
                __volatile__ unsigned int *plock = &dev->lock.hw_lock->lock;
                unsigned int old, new, prev, ctx;
index c887d1f..e9b17cc 100644 (file)
@@ -79,7 +79,7 @@ int DRM(lock_transfer)(drm_device_t *dev,
 {
        unsigned int old, new, prev;
 
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        do {
                old  = *lock;
                new  = context | _DRM_LOCK_HELD;
@@ -92,19 +92,17 @@ int DRM(lock_free)(drm_device_t *dev,
                   __volatile__ unsigned int *lock, unsigned int context)
 {
        unsigned int old, new, prev;
-       pid_t        pid = dev->lock.pid;
 
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        do {
                old  = *lock;
                new  = 0;
                prev = cmpxchg(lock, old, new);
        } while (prev != old);
        if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) {
-               DRM_ERROR("%d freed heavyweight lock held by %d (pid %d)\n",
+               DRM_ERROR("%d freed heavyweight lock held by %d\n",
                          context,
-                         _DRM_LOCKING_CONTEXT(old),
-                         pid);
+                         _DRM_LOCKING_CONTEXT(old));
                return 1;
        }
        wake_up_interruptible(&dev->lock.lock_queue);
index e9b2435..b57efd3 100644 (file)
@@ -3,16 +3,17 @@
 #include <linux/interrupt.h>   /* For task queue support */
 #include <linux/delay.h>
 
+#define DRMFILE                         struct file *
 #define DRM_IOCTL_ARGS                 struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data
 #define DRM_ERR(d)                     -(d)
 #define DRM_CURRENTPID                 current->pid
 #define DRM_UDELAY(d)                  udelay(d)
-#define DRM_READ8(addr)                        readb(addr)
-#define DRM_READ32(addr)               readl(addr)
-#define DRM_WRITE8(addr, val)          writeb(val, addr)
-#define DRM_WRITE32(addr, val)         writel(val, addr)
-#define DRM_READMEMORYBARRIER()                mb()
-#define DRM_WRITEMEMORYBARRIER()       wmb()
+#define DRM_READ8(map, offset)         readb(((unsigned long)(map)->handle) + (offset))
+#define DRM_READ32(map, offset)                readl(((unsigned long)(map)->handle) + (offset))
+#define DRM_WRITE8(map, offset, val)   writeb(val, ((unsigned long)(map)->handle) + (offset))
+#define DRM_WRITE32(map, offset, val)  writel(val, ((unsigned long)(map)->handle) + (offset))
+#define DRM_READMEMORYBARRIER(map)     mb()
+#define DRM_WRITEMEMORYBARRIER(map)    wmb()
 #define DRM_DEVICE     drm_file_t      *priv   = filp->private_data; \
                        drm_device_t    *dev    = priv->dev
 
@@ -42,7 +43,7 @@
 
 /* malloc/free without the overhead of DRM(alloc) */
 #define DRM_MALLOC(x) kmalloc(x, GFP_KERNEL)
-#define DRM_FREE(x) kfree(x)
+#define DRM_FREE(x,size) kfree(x)
 
 #define DRM_GETSAREA()                                                  \
 do {                                                                    \
index 91c204c..de9345e 100644 (file)
@@ -209,7 +209,6 @@ static int i810_unmap_buffer(drm_buf_t *buf)
 static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
                               struct file *filp)
 {
-       drm_file_t        *priv   = filp->private_data;
        drm_buf_t         *buf;
        drm_i810_buf_priv_t *buf_priv;
        int retcode = 0;
@@ -227,7 +226,7 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
                DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
                return retcode;
        }
-       buf->pid     = priv->pid;
+       buf->filp = filp;
        buf_priv = buf->dev_private;
        d->granted = 1;
        d->request_idx = buf->idx;
@@ -856,8 +855,10 @@ static int i810_flush_queue(drm_device_t *dev)
 }
 
 /* Must be called with the lock held */
-void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
+void i810_reclaim_buffers(struct file *filp)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
@@ -871,7 +872,7 @@ void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
                drm_buf_t *buf = dma->buflist[ i ];
                drm_i810_buf_priv_t *buf_priv = buf->dev_private;
 
-               if (buf->pid == pid && buf_priv) {
+               if (buf->filp == filp && buf_priv) {
                        int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
                                           I810_BUF_FREE);
 
index 24bcc55..bbb570b 100644 (file)
@@ -88,7 +88,7 @@ extern int  i810_dma_init(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
 extern int  i810_flush_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
-extern void i810_reclaim_buffers(drm_device_t *dev, pid_t pid);
+extern void i810_reclaim_buffers(struct file *filp);
 extern int  i810_getage(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg);
 extern int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma);
index 419cea1..d2555c9 100644 (file)
@@ -217,7 +217,6 @@ static int i830_unmap_buffer(drm_buf_t *buf)
 static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d, 
                               struct file *filp)
 {
-       drm_file_t        *priv   = filp->private_data;
        drm_buf_t         *buf;
        drm_i830_buf_priv_t *buf_priv;
        int retcode = 0;
@@ -235,7 +234,7 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d,
                DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
                return retcode;
        }
-       buf->pid     = priv->pid;
+       buf->filp = filp;
        buf_priv = buf->dev_private;    
        d->granted = 1;
        d->request_idx = buf->idx;
@@ -1301,8 +1300,10 @@ static int i830_flush_queue(drm_device_t *dev)
 }
 
 /* Must be called with the lock held */
-void i830_reclaim_buffers(drm_device_t *dev, pid_t pid)
+void i830_reclaim_buffers( struct file *filp )
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
@@ -1316,7 +1317,7 @@ void i830_reclaim_buffers(drm_device_t *dev, pid_t pid)
                drm_buf_t *buf = dma->buflist[ i ];
                drm_i830_buf_priv_t *buf_priv = buf->dev_private;
           
-               if (buf->pid == pid && buf_priv) {
+               if (buf->filp == filp && buf_priv) {
                        int used = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT, 
                                           I830_BUF_FREE);
 
index daad476..37313af 100644 (file)
@@ -101,7 +101,7 @@ extern int  i830_dma_init(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
 extern int  i830_flush_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
-extern void i830_reclaim_buffers(drm_device_t *dev, pid_t pid);
+extern void i830_reclaim_buffers(struct file *filp);
 extern int  i830_getage(struct inode *inode, struct file *filp, unsigned int cmd,
                        unsigned long arg);
 extern int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma);
index 5c1474d..a6b3228 100644 (file)
@@ -276,6 +276,17 @@ do {                                                                       \
        (_map) = (_dev)->context_sareas[_ctx];          \
 } while(0)
 
+#define LOCK_TEST_WITH_RETURN( dev, filp )                             \
+do {                                                                   \
+       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
+            dev->lock.filp != filp ) {                         \
+               DRM_ERROR( "%s called without lock held\n",             \
+                          __FUNCTION__ );                              \
+               return -EINVAL;                                         \
+       }                                                               \
+} while (0)
+
+
 typedef int drm_ioctl_t( struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg );
 
@@ -324,7 +335,7 @@ typedef struct drm_buf {
        __volatile__ int  waiting;     /* On kernel DMA queue                */
        __volatile__ int  pending;     /* On hardware DMA queue              */
        wait_queue_head_t dma_wait;    /* Processes waiting                  */
-       pid_t             pid;         /* PID of holding process             */
+       struct file       *filp;       /* Pointer to holding file descr      */
        int               context;     /* Kernel queue for this buffer       */
        int               while_locked;/* Dispatch this buffer while locked  */
        enum {
@@ -442,7 +453,7 @@ typedef struct drm_queue {
 
 typedef struct drm_lock_data {
        drm_hw_lock_t     *hw_lock;     /* Hardware lock                   */
-       pid_t             pid;          /* PID of lock holder (0=kernel)   */
+       struct file       *filp;        /* File descr of lock holder (0=kernel)   */
        wait_queue_head_t lock_queue;   /* Queue of blocked processes      */
        unsigned long     lock_time;    /* Time of last lock in jiffies    */
 } drm_lock_data_t;
@@ -818,15 +829,15 @@ extern int             DRM(mapbufs)( struct inode *inode, struct file *filp,
 extern int          DRM(dma_setup)(drm_device_t *dev);
 extern void         DRM(dma_takedown)(drm_device_t *dev);
 extern void         DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf);
-extern void         DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid);
+extern void         DRM(reclaim_buffers)( struct file *filp );
 #if __HAVE_OLD_DMA
 /* GH: This is a dirty hack for now...
  */
 extern void         DRM(clear_next_buffer)(drm_device_t *dev);
 extern int          DRM(select_queue)(drm_device_t *dev,
                                       void (*wrapper)(unsigned long));
-extern int          DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *dma);
-extern int          DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma);
+extern int          DRM(dma_enqueue)(struct file *filp, drm_dma_t *dma);
+extern int          DRM(dma_get_buffers)(struct file *filp, drm_dma_t *dma);
 #endif
 #if __HAVE_DMA_IRQ
 extern int           DRM(control)( struct inode *inode, struct file *filp,
index 9ce7cff..b4e7369 100644 (file)
@@ -404,7 +404,7 @@ int DRM(addbufs_agp)( struct inode *inode, struct file *filp,
                buf->waiting = 0;
                buf->pending = 0;
                init_waitqueue_head( &buf->dma_wait );
-               buf->pid     = 0;
+               buf->filp    = 0;
 
                buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
                buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T),
@@ -617,7 +617,7 @@ int DRM(addbufs_pci)( struct inode *inode, struct file *filp,
                        buf->waiting = 0;
                        buf->pending = 0;
                        init_waitqueue_head( &buf->dma_wait );
-                       buf->pid     = 0;
+                       buf->filp    = 0;
 #if __HAVE_DMA_HISTOGRAM
                        buf->time_queued     = 0;
                        buf->time_dispatched = 0;
@@ -774,7 +774,7 @@ int DRM(addbufs_sg)( struct inode *inode, struct file *filp,
                buf->waiting = 0;
                buf->pending = 0;
                init_waitqueue_head( &buf->dma_wait );
-               buf->pid     = 0;
+               buf->filp    = 0;
 
                buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
                buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T),
@@ -1012,9 +1012,9 @@ int DRM(freebufs)( struct inode *inode, struct file *filp,
                        return -EINVAL;
                }
                buf = dma->buflist[idx];
-               if ( buf->pid != current->pid ) {
-                       DRM_ERROR( "Process %d freeing buffer owned by %d\n",
-                                  current->pid, buf->pid );
+               if ( buf->filp != filp ) {
+                       DRM_ERROR( "Process %d freeing buffer not owned\n",
+                                  current->pid );
                        return -EINVAL;
                }
                DRM(free_buffer)( dev, buf );
index 1b0b639..d21c8b9 100644 (file)
@@ -189,7 +189,7 @@ void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf)
 
        buf->waiting  = 0;
        buf->pending  = 0;
-       buf->pid      = 0;
+       buf->filp     = 0;
        buf->used     = 0;
 #if __HAVE_DMA_HISTOGRAM
        buf->time_completed = get_cycles();
@@ -211,14 +211,16 @@ void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf)
 }
 
 #if !__HAVE_DMA_RECLAIM
-void DRM(reclaim_buffers)(drm_device_t *dev, pid_t pid)
+void DRM(reclaim_buffers)( struct file *filp )
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
        if (!dma) return;
        for (i = 0; i < dma->buf_count; i++) {
-               if (dma->buflist[i]->pid == pid) {
+               if (dma->buflist[i]->filp == filp) {
                        switch (dma->buflist[i]->list) {
                        case DRM_LIST_NONE:
                                DRM(free_buffer)(dev, dma->buflist[i]);
@@ -319,8 +321,10 @@ int DRM(select_queue)(drm_device_t *dev, void (*wrapper)(unsigned long))
 }
 
 
-int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
+int DRM(dma_enqueue)(struct file *filp, drm_dma_t *d)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        int               i;
        drm_queue_t       *q;
        drm_buf_t         *buf;
@@ -382,10 +386,10 @@ int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
                        return -EINVAL;
                }
                buf = dma->buflist[ idx ];
-               if (buf->pid != current->pid) {
+               if (buf->filp != filp) {
                        atomic_dec(&q->use_count);
-                       DRM_ERROR("Process %d using buffer owned by %d\n",
-                                 current->pid, buf->pid);
+                       DRM_ERROR("Process %d using buffer not owned\n",
+                                 current->pid);
                        return -EINVAL;
                }
                if (buf->list != DRM_LIST_NONE) {
@@ -427,9 +431,11 @@ int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *d)
        return 0;
 }
 
-static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
+static int DRM(dma_get_buffers_of_order)(struct file *filp, drm_dma_t *d,
                                         int order)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        int               i;
        drm_buf_t         *buf;
        drm_device_dma_t  *dma = dev->dma;
@@ -439,13 +445,13 @@ static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
                                        d->flags & _DRM_DMA_WAIT);
                if (!buf) break;
                if (buf->pending || buf->waiting) {
-                       DRM_ERROR("Free buffer %d in use by %d (w%d, p%d)\n",
+                       DRM_ERROR("Free buffer %d in use by %x (w%d, p%d)\n",
                                  buf->idx,
-                                 buf->pid,
+                                 buf->filp,
                                  buf->waiting,
                                  buf->pending);
                }
-               buf->pid     = current->pid;
+               buf->filp     = filp;
                if (copy_to_user(&d->request_indices[i],
                                 &buf->idx,
                                 sizeof(buf->idx)))
@@ -462,7 +468,7 @@ static int DRM(dma_get_buffers_of_order)(drm_device_t *dev, drm_dma_t *d,
 }
 
 
-int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
+int DRM(dma_get_buffers)(struct file *filp, drm_dma_t *dma)
 {
        int               order;
        int               retcode = 0;
@@ -471,7 +477,7 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
        order = DRM(order)(dma->request_size);
 
        dma->granted_count = 0;
-       retcode            = DRM(dma_get_buffers_of_order)(dev, dma, order);
+       retcode            = DRM(dma_get_buffers_of_order)(filp, dma, order);
 
        if (dma->granted_count < dma->request_count
            && (dma->flags & _DRM_DMA_SMALLER_OK)) {
@@ -481,7 +487,7 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
                             && tmp_order >= DRM_MIN_ORDER;
                     --tmp_order) {
 
-                       retcode = DRM(dma_get_buffers_of_order)(dev, dma,
+                       retcode = DRM(dma_get_buffers_of_order)(filp, dma,
                                                                tmp_order);
                }
        }
@@ -494,7 +500,7 @@ int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma)
                             && tmp_order <= DRM_MAX_ORDER;
                     ++tmp_order) {
 
-                       retcode = DRM(dma_get_buffers_of_order)(dev, dma,
+                       retcode = DRM(dma_get_buffers_of_order)(filp, dma,
                                                                tmp_order);
                }
        }
index 41349e8..0a4f3ae 100644 (file)
@@ -496,7 +496,7 @@ static int DRM(takedown)( drm_device_t *dev )
 #endif
        if ( dev->lock.hw_lock ) {
                dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
-               dev->lock.pid = 0;
+               dev->lock.filp = 0;
                wake_up_interruptible( &dev->lock.lock_queue );
        }
        up( &dev->struct_sem );
@@ -732,8 +732,6 @@ int DRM(open)( struct inode *inode, struct file *filp )
                return -ENODEV;
        }
 
-       DRM_DEBUG( "open_count = %d\n", dev->open_count );
-
        retcode = DRM(open_helper)( inode, filp, dev );
        if ( !retcode ) {
                atomic_inc( &dev->counts[_DRM_STAT_OPENS] );
@@ -770,10 +768,10 @@ int DRM(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 ) {
-               DRM_DEBUG( "Process %d dead, freeing lock for context %d\n",
-                          current->pid,
-                          _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
+            dev->lock.filp == filp ) {
+               DRM_DEBUG( "File %p released, freeing lock for context %d\n",
+                       filp,
+                       _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
 #if __HAVE_RELEASE
                DRIVER_RELEASE();
 #endif
@@ -789,6 +787,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
        else if ( dev->lock.hw_lock ) {
                /* The lock is required to reclaim buffers */
                DECLARE_WAITQUEUE( entry, current );
+
                add_wait_queue( &dev->lock.lock_queue, &entry );
                for (;;) {
                        current->state = TASK_INTERRUPTIBLE;
@@ -799,7 +798,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
                        }
                        if ( DRM(lock_take)( &dev->lock.hw_lock->lock,
                                             DRM_KERNEL_CONTEXT ) ) {
-                               dev->lock.pid       = priv->pid;
+                               dev->lock.filp      = filp;
                                dev->lock.lock_time = jiffies;
                                 atomic_inc( &dev->counts[_DRM_STAT_LOCKS] );
                                break;  /* Got lock */
@@ -823,7 +822,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
                }
        }
 #elif __HAVE_DMA
-       DRM(reclaim_buffers)( dev, priv->pid );
+       DRM(reclaim_buffers)( filp );
 #endif
 
        DRM(fasync)( -1, filp, 0 );
@@ -847,7 +846,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
                dev->file_last   = priv->prev;
        }
        up( &dev->struct_sem );
-
+       
        DRM(free)( priv, sizeof(*priv), DRM_MEM_FILES );
 
        /* ========================================================
@@ -872,6 +871,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
        spin_unlock( &dev->count_lock );
 
        unlock_kernel();
+
        return retcode;
 }
 
@@ -969,7 +969,7 @@ int DRM(lock)( struct inode *inode, struct file *filp,
                         }
                         if ( DRM(lock_take)( &dev->lock.hw_lock->lock,
                                             lock.context ) ) {
-                                dev->lock.pid       = current->pid;
+                                dev->lock.filp      = filp;
                                 dev->lock.lock_time = jiffies;
                                 atomic_inc( &dev->counts[_DRM_STAT_LOCKS] );
                                 break;  /* Got lock */
@@ -1051,7 +1051,7 @@ int DRM(unlock)( struct inode *inode, struct file *filp,
         * agent to request it then we should just be able to
         * take it immediately and not eat the ioctl.
         */
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        {
                __volatile__ unsigned int *plock = &dev->lock.hw_lock->lock;
                unsigned int old, new, prev, ctx;
index 5cd8cd4..4a64df7 100644 (file)
@@ -73,8 +73,8 @@ int DRM(waitlist_put)(drm_waitlist_t *bl, drm_buf_t *buf)
 
        left = DRM_LEFTCOUNT(bl);
        if (!left) {
-               DRM_ERROR("Overflow while adding buffer %d from pid %d\n",
-                         buf->idx, buf->pid);
+               DRM_ERROR("Overflow while adding buffer %d from filp %p\n",
+                         buf->idx, buf->filp);
                return -EINVAL;
        }
 #if __HAVE_DMA_HISTOGRAM
index c887d1f..e9b17cc 100644 (file)
@@ -79,7 +79,7 @@ int DRM(lock_transfer)(drm_device_t *dev,
 {
        unsigned int old, new, prev;
 
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        do {
                old  = *lock;
                new  = context | _DRM_LOCK_HELD;
@@ -92,19 +92,17 @@ int DRM(lock_free)(drm_device_t *dev,
                   __volatile__ unsigned int *lock, unsigned int context)
 {
        unsigned int old, new, prev;
-       pid_t        pid = dev->lock.pid;
 
-       dev->lock.pid = 0;
+       dev->lock.filp = 0;
        do {
                old  = *lock;
                new  = 0;
                prev = cmpxchg(lock, old, new);
        } while (prev != old);
        if (_DRM_LOCK_IS_HELD(old) && _DRM_LOCKING_CONTEXT(old) != context) {
-               DRM_ERROR("%d freed heavyweight lock held by %d (pid %d)\n",
+               DRM_ERROR("%d freed heavyweight lock held by %d\n",
                          context,
-                         _DRM_LOCKING_CONTEXT(old),
-                         pid);
+                         _DRM_LOCKING_CONTEXT(old));
                return 1;
        }
        wake_up_interruptible(&dev->lock.lock_queue);
index e9b2435..b57efd3 100644 (file)
@@ -3,16 +3,17 @@
 #include <linux/interrupt.h>   /* For task queue support */
 #include <linux/delay.h>
 
+#define DRMFILE                         struct file *
 #define DRM_IOCTL_ARGS                 struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data
 #define DRM_ERR(d)                     -(d)
 #define DRM_CURRENTPID                 current->pid
 #define DRM_UDELAY(d)                  udelay(d)
-#define DRM_READ8(addr)                        readb(addr)
-#define DRM_READ32(addr)               readl(addr)
-#define DRM_WRITE8(addr, val)          writeb(val, addr)
-#define DRM_WRITE32(addr, val)         writel(val, addr)
-#define DRM_READMEMORYBARRIER()                mb()
-#define DRM_WRITEMEMORYBARRIER()       wmb()
+#define DRM_READ8(map, offset)         readb(((unsigned long)(map)->handle) + (offset))
+#define DRM_READ32(map, offset)                readl(((unsigned long)(map)->handle) + (offset))
+#define DRM_WRITE8(map, offset, val)   writeb(val, ((unsigned long)(map)->handle) + (offset))
+#define DRM_WRITE32(map, offset, val)  writel(val, ((unsigned long)(map)->handle) + (offset))
+#define DRM_READMEMORYBARRIER(map)     mb()
+#define DRM_WRITEMEMORYBARRIER(map)    wmb()
 #define DRM_DEVICE     drm_file_t      *priv   = filp->private_data; \
                        drm_device_t    *dev    = priv->dev
 
@@ -42,7 +43,7 @@
 
 /* malloc/free without the overhead of DRM(alloc) */
 #define DRM_MALLOC(x) kmalloc(x, GFP_KERNEL)
-#define DRM_FREE(x) kfree(x)
+#define DRM_FREE(x,size) kfree(x)
 
 #define DRM_GETSAREA()                                                  \
 do {                                                                    \
index 0cf1f8e..a3c21d1 100644 (file)
@@ -190,7 +190,7 @@ static int gamma_do_dma(drm_device_t *dev, int locked)
                if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
                        DRM_ERROR("Dispatching buffer %d from pid %d"
                                  " \"while locked\", but no lock held\n",
-                                 buf->idx, buf->pid);
+                                 buf->idx, current->pid);
                }
        } else {
                if (!locked && !gamma_lock_take(&dev->lock.hw_lock->lock,
@@ -342,7 +342,8 @@ again:
        return retcode;
 }
 
-static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d)
+static int gamma_dma_priority(struct file *filp, 
+                             drm_device_t *dev, drm_dma_t *d)
 {
        unsigned long     address;
        unsigned long     length;
@@ -380,15 +381,15 @@ static int gamma_dma_priority(drm_device_t *dev, drm_dma_t *d)
                        continue;
                }
                buf = dma->buflist[ idx ];
-               if (buf->pid != current->pid) {
-                       DRM_ERROR("Process %d using buffer owned by %d\n",
-                                 current->pid, buf->pid);
+               if (buf->filp != filp) {
+                       DRM_ERROR("Process %d using buffer not owned\n",
+                                 current->pid);
                        retcode = -EINVAL;
                        goto cleanup;
                }
                if (buf->list != DRM_LIST_NONE) {
-                       DRM_ERROR("Process %d using %d's buffer on list %d\n",
-                                 current->pid, buf->pid, buf->list);
+                       DRM_ERROR("Process %d using buffer on list %d\n",
+                                 current->pid, buf->list);
                        retcode = -EINVAL;
                        goto cleanup;
                }
@@ -480,7 +481,8 @@ cleanup:
        return retcode;
 }
 
-static int gamma_dma_send_buffers(drm_device_t *dev, drm_dma_t *d)
+static int gamma_dma_send_buffers(struct file *filp,
+                                 drm_device_t *dev, drm_dma_t *d)
 {
        DECLARE_WAITQUEUE(entry, current);
        drm_buf_t         *last_buf = NULL;
@@ -492,7 +494,7 @@ static int gamma_dma_send_buffers(drm_device_t *dev, drm_dma_t *d)
                add_wait_queue(&last_buf->dma_wait, &entry);
        }
 
-       if ((retcode = gamma_dma_enqueue(dev, d))) {
+       if ((retcode = gamma_dma_enqueue(filp, d))) {
                if (d->flags & _DRM_DMA_BLOCK)
                        remove_wait_queue(&last_buf->dma_wait, &entry);
                return retcode;
@@ -522,14 +524,13 @@ static int gamma_dma_send_buffers(drm_device_t *dev, drm_dma_t *d)
                        }
                }
                if (retcode) {
-                       DRM_ERROR("ctx%d w%d p%d c%ld i%d l%d %d/%d\n",
+                       DRM_ERROR("ctx%d w%d p%d c%ld i%d l%d pid:%d\n",
                                  d->context,
                                  last_buf->waiting,
                                  last_buf->pending,
                                  (long)DRM_WAITCOUNT(dev, d->context),
                                  last_buf->idx,
                                  last_buf->list,
-                                 last_buf->pid,
                                  current->pid);
                }
        }
@@ -562,15 +563,15 @@ int gamma_dma(struct inode *inode, struct file *filp, unsigned int cmd,
 
        if (d.send_count) {
                if (d.flags & _DRM_DMA_PRIORITY)
-                       retcode = gamma_dma_priority(dev, &d);
+                       retcode = gamma_dma_priority(filp, dev, &d);
                else
-                       retcode = gamma_dma_send_buffers(dev, &d);
+                       retcode = gamma_dma_send_buffers(filp, dev, &d);
        }
 
        d.granted_count = 0;
 
        if (!retcode && d.request_count) {
-               retcode = gamma_dma_get_buffers(dev, &d);
+               retcode = gamma_dma_get_buffers(filp, &d);
        }
 
        DRM_DEBUG("%d returning, granted = %d\n",
index e7d0c89..2f7d358 100644 (file)
@@ -42,16 +42,6 @@ typedef struct drm_gamma_private {
        drm_map_t *mmio3;
 } drm_gamma_private_t;
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != current->pid ) {                          \
-               DRM_ERROR( "%s called without lock held\n",             \
-                          __FUNCTION__ );                              \
-               return -EINVAL;                                         \
-       }                                                               \
-} while (0)
-
                                /* gamma_dma.c */
 extern int gamma_dma_init( struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg );
index ea1e7fe..f37cb2e 100644 (file)
@@ -86,7 +86,7 @@
  */
 #define __HAVE_RELEASE         1
 #define DRIVER_RELEASE() do {                                          \
-       i810_reclaim_buffers( dev, priv->pid );                         \
+       i810_reclaim_buffers( filp );                           \
 } while (0)
 
 /* DMA customization:
index 91c204c..de9345e 100644 (file)
@@ -209,7 +209,6 @@ static int i810_unmap_buffer(drm_buf_t *buf)
 static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
                               struct file *filp)
 {
-       drm_file_t        *priv   = filp->private_data;
        drm_buf_t         *buf;
        drm_i810_buf_priv_t *buf_priv;
        int retcode = 0;
@@ -227,7 +226,7 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
                DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
                return retcode;
        }
-       buf->pid     = priv->pid;
+       buf->filp = filp;
        buf_priv = buf->dev_private;
        d->granted = 1;
        d->request_idx = buf->idx;
@@ -856,8 +855,10 @@ static int i810_flush_queue(drm_device_t *dev)
 }
 
 /* Must be called with the lock held */
-void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
+void i810_reclaim_buffers(struct file *filp)
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
@@ -871,7 +872,7 @@ void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
                drm_buf_t *buf = dma->buflist[ i ];
                drm_i810_buf_priv_t *buf_priv = buf->dev_private;
 
-               if (buf->pid == pid && buf_priv) {
+               if (buf->filp == filp && buf_priv) {
                        int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
                                           I810_BUF_FREE);
 
index 24bcc55..bbb570b 100644 (file)
@@ -88,7 +88,7 @@ extern int  i810_dma_init(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
 extern int  i810_flush_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
-extern void i810_reclaim_buffers(drm_device_t *dev, pid_t pid);
+extern void i810_reclaim_buffers(struct file *filp);
 extern int  i810_getage(struct inode *inode, struct file *filp,
                        unsigned int cmd, unsigned long arg);
 extern int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma);
index c8ba1fd..a351a4c 100644 (file)
@@ -87,7 +87,7 @@
  */
 #define __HAVE_RELEASE         1
 #define DRIVER_RELEASE() do {                                          \
-       i830_reclaim_buffers( dev, priv->pid );                         \
+       i830_reclaim_buffers( filp );                           \
 } while (0)
 
 /* DMA customization:
index 419cea1..d2555c9 100644 (file)
@@ -217,7 +217,6 @@ static int i830_unmap_buffer(drm_buf_t *buf)
 static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d, 
                               struct file *filp)
 {
-       drm_file_t        *priv   = filp->private_data;
        drm_buf_t         *buf;
        drm_i830_buf_priv_t *buf_priv;
        int retcode = 0;
@@ -235,7 +234,7 @@ static int i830_dma_get_buffer(drm_device_t *dev, drm_i830_dma_t *d,
                DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
                return retcode;
        }
-       buf->pid     = priv->pid;
+       buf->filp = filp;
        buf_priv = buf->dev_private;    
        d->granted = 1;
        d->request_idx = buf->idx;
@@ -1301,8 +1300,10 @@ static int i830_flush_queue(drm_device_t *dev)
 }
 
 /* Must be called with the lock held */
-void i830_reclaim_buffers(drm_device_t *dev, pid_t pid)
+void i830_reclaim_buffers( struct file *filp )
 {
+       drm_file_t    *priv   = filp->private_data;
+       drm_device_t  *dev    = priv->dev;
        drm_device_dma_t *dma = dev->dma;
        int              i;
 
@@ -1316,7 +1317,7 @@ void i830_reclaim_buffers(drm_device_t *dev, pid_t pid)
                drm_buf_t *buf = dma->buflist[ i ];
                drm_i830_buf_priv_t *buf_priv = buf->dev_private;
           
-               if (buf->pid == pid && buf_priv) {
+               if (buf->filp == filp && buf_priv) {
                        int used = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT, 
                                           I830_BUF_FREE);
 
index daad476..37313af 100644 (file)
@@ -101,7 +101,7 @@ extern int  i830_dma_init(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
 extern int  i830_flush_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
-extern void i830_reclaim_buffers(drm_device_t *dev, pid_t pid);
+extern void i830_reclaim_buffers(struct file *filp);
 extern int  i830_getage(struct inode *inode, struct file *filp, unsigned int cmd,
                        unsigned long arg);
 extern int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma);
index 22bd61f..5e95c9f 100644 (file)
@@ -686,7 +686,7 @@ int mga_dma_flush( DRM_IOCTL_ARGS )
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
        drm_lock_t lock;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( lock, (drm_lock_t *)data, sizeof(lock) );
 
@@ -720,7 +720,7 @@ int mga_dma_reset( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return mga_do_dma_reset( dev_priv );
 }
@@ -730,7 +730,8 @@ int mga_dma_reset( DRM_IOCTL_ARGS )
  * DMA buffer management
  */
 
-static int mga_dma_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int mga_dma_get_buffers( DRMFILE filp,
+                               drm_device_t *dev, drm_dma_t *d )
 {
        drm_buf_t *buf;
        int i;
@@ -739,7 +740,7 @@ static int mga_dma_get_buffers( drm_device_t *dev, drm_dma_t *d )
                buf = mga_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EAGAIN);
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i],
                                   &buf->idx, sizeof(buf->idx) ) )
@@ -761,7 +762,7 @@ int mga_dma_buffers( DRM_IOCTL_ARGS )
        drm_dma_t d;
        int ret = 0;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *)data, sizeof(d) );
 
@@ -786,7 +787,7 @@ int mga_dma_buffers( DRM_IOCTL_ARGS )
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = mga_dma_get_buffers( dev, &d );
+               ret = mga_dma_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL( (drm_dma_t *)data, d, sizeof(d) );
index a5085b0..7efc89b 100644 (file)
@@ -90,14 +90,14 @@ typedef struct drm_mga_private {
        unsigned int texture_offset;
        unsigned int texture_size;
 
-       drm_map_t *sarea;
-       drm_map_t *fb;
-       drm_map_t *mmio;
-       drm_map_t *status;
-       drm_map_t *warp;
-       drm_map_t *primary;
-       drm_map_t *buffers;
-       drm_map_t *agp_textures;
+       drm_local_map_t *sarea;
+       drm_local_map_t *fb;
+       drm_local_map_t *mmio;
+       drm_local_map_t *status;
+       drm_local_map_t *warp;
+       drm_local_map_t *primary;
+       drm_local_map_t *buffers;
+       drm_local_map_t *agp_textures;
 } drm_mga_private_t;
 
                                /* mga_dma.c */
@@ -131,32 +131,30 @@ extern int  mga_getparam( DRM_IOCTL_ARGS );
 extern int mga_warp_install_microcode( drm_mga_private_t *dev_priv );
 extern int mga_warp_init( drm_mga_private_t *dev_priv );
 
-#define mga_flush_write_combine()      DRM_WRITEMEMORYBARRIER()
-
+#define mga_flush_write_combine()      DRM_WRITEMEMORYBARRIER(dev_priv->primary)
 
+#if defined(__linux__) && defined(__alpha__)
 #define MGA_BASE( reg )                ((unsigned long)(dev_priv->mmio->handle))
 #define MGA_ADDR( reg )                (MGA_BASE(reg) + reg)
 
 #define MGA_DEREF( reg )       *(volatile u32 *)MGA_ADDR( reg )
 #define MGA_DEREF8( reg )      *(volatile u8 *)MGA_ADDR( reg )
 
-#ifdef __alpha__
 #define MGA_READ( reg )                (_MGA_READ((u32 *)MGA_ADDR(reg)))
 #define MGA_READ8( reg )       (_MGA_READ((u8 *)MGA_ADDR(reg)))
-#define MGA_WRITE( reg, val )  do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF( reg ) = val; } while (0)
-#define MGA_WRITE8( reg, val )  do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF8( reg ) = val; } while (0)
+#define MGA_WRITE( reg, val )  do { DRM_WRITEMEMORYBARRIER(dev_priv->mmio); MGA_DEREF( reg ) = val; } while (0)
+#define MGA_WRITE8( reg, val )  do { DRM_WRITEMEMORYBARRIER(dev_priv->mmio); MGA_DEREF8( reg ) = val; } while (0)
 
 static inline u32 _MGA_READ(u32 *addr)
 {
-       DRM_READMEMORYBARRIER();
+       DRM_READMEMORYBARRIER(dev_priv->mmio);
        return *(volatile u32 *)addr;
 }
-
 #else
-#define MGA_READ( reg )                MGA_DEREF( reg )
-#define MGA_READ8( reg )       MGA_DEREF8( reg )
-#define MGA_WRITE( reg, val )  do { MGA_DEREF( reg ) = val; } while (0)
-#define MGA_WRITE8( reg, val )  do { MGA_DEREF8( reg ) = val; } while (0)
+#define MGA_READ8( reg )       DRM_READ8(dev_priv->mmio, (reg))
+#define MGA_READ( reg )                DRM_READ32(dev_priv->mmio, (reg))
+#define MGA_WRITE8( reg, val )  DRM_WRITE8(dev_priv->mmio, (reg), (val))
+#define MGA_WRITE( reg, val )  DRM_WRITE32(dev_priv->mmio, (reg), (val))
 #endif
 
 #define DWGREG0        0x1c00
@@ -186,16 +184,6 @@ do {                                                                       \
        }                                                               \
 } while (0)
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                                \
-               DRM_ERROR( "%s called without lock held\n",             \
-                          __FUNCTION__ );                                      \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 #define WRAP_TEST_WITH_RETURN( dev_priv )                              \
 do {                                                                   \
        if ( test_bit( 0, &dev_priv->prim.wrapped ) ) {                 \
index 6107722..256dd47 100644 (file)
@@ -887,7 +887,7 @@ int mga_dma_clear( DRM_IOCTL_ARGS )
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        drm_mga_clear_t clear;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_mga_clear_t *)data, sizeof(clear) );
 
@@ -911,7 +911,7 @@ int mga_dma_swap( DRM_IOCTL_ARGS )
        drm_mga_private_t *dev_priv = dev->dev_private;
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
                sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
@@ -936,7 +936,7 @@ int mga_dma_vertex( DRM_IOCTL_ARGS )
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_vertex_t vertex;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( vertex,
                             (drm_mga_vertex_t *)data,
@@ -975,7 +975,7 @@ int mga_dma_indices( DRM_IOCTL_ARGS )
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_indices_t indices;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( indices,
                             (drm_mga_indices_t *)data,
@@ -1015,7 +1015,7 @@ int mga_dma_iload( DRM_IOCTL_ARGS )
        drm_mga_iload_t iload;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( iload, (drm_mga_iload_t *)data, sizeof(iload) );
 
@@ -1055,7 +1055,7 @@ int mga_dma_blit( DRM_IOCTL_ARGS )
        drm_mga_blit_t blit;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( blit, (drm_mga_blit_t *)data, sizeof(blit) );
 
index 5175885..7f0f432 100644 (file)
@@ -579,6 +579,7 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init )
                (dev_priv->ring.size / sizeof(u32)) - 1;
 
        dev_priv->ring.high_mark = 128;
+       dev_priv->ring.ring_rptr = dev_priv->ring_rptr;
 
        dev_priv->sarea_priv->last_frame = 0;
        R128_WRITE( R128_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame );
@@ -663,7 +664,7 @@ int r128_cce_start( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 ) {
                DRM_DEBUG( "%s while CCE running\n", __FUNCTION__ );
@@ -686,7 +687,7 @@ int r128_cce_stop( DRM_IOCTL_ARGS )
        int ret;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL(stop, (drm_r128_cce_stop_t *)data, sizeof(stop) );
 
@@ -725,7 +726,7 @@ int r128_cce_reset( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
@@ -746,7 +747,7 @@ int r128_cce_idle( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cce_running ) {
                r128_do_cce_flush( dev_priv );
@@ -760,7 +761,7 @@ int r128_engine_reset( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return r128_do_engine_reset( dev );
 }
@@ -807,7 +808,7 @@ int r128_fullscreen( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        drm_r128_fullscreen_t fs;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( fs, (drm_r128_fullscreen_t *)data, sizeof(fs) );
 
@@ -889,7 +890,7 @@ drm_buf_t *r128_freelist_get( drm_device_t *dev )
        for ( i = 0 ; i < dma->buf_count ; i++ ) {
                buf = dma->buflist[i];
                buf_priv = buf->dev_private;
-               if ( buf->pid == 0 )
+               if ( buf->filp == 0 )
                        return buf;
        }
 
@@ -948,7 +949,7 @@ int r128_wait_ring( drm_r128_private_t *dev_priv, int n )
        return DRM_ERR(EBUSY);
 }
 
-static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int r128_cce_get_buffers( DRMFILE filp, drm_device_t *dev, drm_dma_t *d )
 {
        int i;
        drm_buf_t *buf;
@@ -957,7 +958,7 @@ static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
                buf = r128_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EAGAIN);
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx,
                                   sizeof(buf->idx) ) )
@@ -978,7 +979,7 @@ int r128_cce_buffers( DRM_IOCTL_ARGS )
        int ret = 0;
        drm_dma_t d;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *) data, sizeof(d) );
 
@@ -1001,7 +1002,7 @@ int r128_cce_buffers( DRM_IOCTL_ARGS )
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = r128_cce_get_buffers( dev, &d );
+               ret = r128_cce_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL((drm_dma_t *) data, d, sizeof(d) );
index 763fcb3..bd91387 100644 (file)
@@ -34,8 +34,8 @@
 #ifndef __R128_DRV_H__
 #define __R128_DRV_H__
 
-#define GET_RING_HEAD(ring)            DRM_READ32(  (volatile u32 *) (ring)->head )
-#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (volatile u32 *) (ring)->head, (val) )
+#define GET_RING_HEAD(ring)            DRM_READ32(  (ring)->ring_rptr, 0 ) /* (ring)->head */
+#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (ring)->ring_rptr, 0, (val) ) /* (ring)->head */
 
 typedef struct drm_r128_freelist {
        unsigned int age;
@@ -56,6 +56,7 @@ typedef struct drm_r128_ring_buffer {
        int space;
 
        int high_mark;
+       drm_local_map_t *ring_rptr;
 } drm_r128_ring_buffer_t;
 
 typedef struct drm_r128_private {
@@ -98,13 +99,13 @@ typedef struct drm_r128_private {
        u32 depth_pitch_offset_c;
        u32 span_pitch_offset_c;
 
-       drm_map_t *sarea;
-       drm_map_t *fb;
-       drm_map_t *mmio;
-       drm_map_t *cce_ring;
-       drm_map_t *ring_rptr;
-       drm_map_t *buffers;
-       drm_map_t *agp_textures;
+       drm_local_map_t *sarea;
+       drm_local_map_t *fb;
+       drm_local_map_t *mmio;
+       drm_local_map_t *cce_ring;
+       drm_local_map_t *ring_rptr;
+       drm_local_map_t *buffers;
+       drm_local_map_t *agp_textures;
 } drm_r128_private_t;
 
 typedef struct drm_r128_buf_priv {
@@ -370,15 +371,10 @@ extern int r128_cce_indirect( DRM_IOCTL_ARGS );
 
 #define R128_PERFORMANCE_BOXES         0
 
-
-#define R128_BASE(reg)         ((unsigned long)(dev_priv->mmio->handle))
-#define R128_ADDR(reg)         (R128_BASE( reg ) + reg)
-
-#define R128_READ(reg)         DRM_READ32(  (volatile u32 *) R128_ADDR(reg) )
-#define R128_WRITE(reg,val)    DRM_WRITE32( (volatile u32 *) R128_ADDR(reg), (val) )
-
-#define R128_READ8(reg)                DRM_READ8(  (volatile u8 *) R128_ADDR(reg) )
-#define R128_WRITE8(reg,val)   DRM_WRITE8( (volatile u8 *) R128_ADDR(reg), (val) )
+#define R128_READ(reg)         DRM_READ32(  dev_priv->mmio, (reg) )
+#define R128_WRITE(reg,val)    DRM_WRITE32( dev_priv->mmio, (reg), (val) )
+#define R128_READ8(reg)                DRM_READ8(   dev_priv->mmio, (reg) )
+#define R128_WRITE8(reg,val)   DRM_WRITE8(  dev_priv->mmio, (reg), (val) )
 
 #define R128_WRITE_PLL(addr,val)                                       \
 do {                                                                   \
@@ -403,15 +399,6 @@ extern int R128_READ_PLL(drm_device_t *dev, int addr);
  * Misc helper macros
  */
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                        \
-               DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );     \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 #define RING_SPACE_TEST_WITH_RETURN( dev_priv )                                \
 do {                                                                   \
        drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i;          \
@@ -453,7 +440,7 @@ do {                                                                        \
 #if defined(__powerpc__)
 #define r128_flush_write_combine()     (void) GET_RING_HEAD( &dev_priv->ring )
 #else
-#define r128_flush_write_combine()     DRM_WRITEMEMORYBARRIER()
+#define r128_flush_write_combine()     DRM_WRITEMEMORYBARRIER(dev_priv->ring_rptr)
 #endif
 
 
index 68f7306..12c4a0e 100644 (file)
@@ -778,7 +778,8 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
        sarea_priv->nbox = 0;
 }
 
-static int r128_cce_dispatch_blit( drm_device_t *dev,
+static int r128_cce_dispatch_blit( DRMFILE filp,
+                                  drm_device_t *dev,
                                   drm_r128_blit_t *blit )
 {
        drm_r128_private_t *dev_priv = dev->dev_private;
@@ -829,9 +830,9 @@ static int r128_cce_dispatch_blit( drm_device_t *dev,
        buf = dma->buflist[blit->idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -896,7 +897,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
        int count, x, y;
        u32 *buffer;
        u8 *mask;
-       int i;
+       int i, buffer_size, mask_size;
        RING_LOCALS;
        DRM_DEBUG( "\n" );
 
@@ -908,25 +909,25 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
                return DRM_ERR(EFAULT);
        }
 
-       buffer = DRM_MALLOC( depth->n * sizeof(u32) );
+       buffer_size = depth->n * sizeof(u32);
+       buffer = DRM_MALLOC( buffer_size );
        if ( buffer == NULL )
                return DRM_ERR(ENOMEM);
-       if ( DRM_COPY_FROM_USER( buffer, depth->buffer,
-                            depth->n * sizeof(u32) ) ) {
-               DRM_FREE( buffer );
+       if ( DRM_COPY_FROM_USER( buffer, depth->buffer, buffer_size ) ) {
+               DRM_FREE( buffer, buffer_size);
                return DRM_ERR(EFAULT);
        }
 
+       mask_size = depth->n * sizeof(u8);
        if ( depth->mask ) {
-               mask = DRM_MALLOC( depth->n * sizeof(u8) );
+               mask = DRM_MALLOC( mask_size );
                if ( mask == NULL ) {
-                       DRM_FREE( buffer );
+                       DRM_FREE( buffer, buffer_size );
                        return DRM_ERR(ENOMEM);
                }
-               if ( DRM_COPY_FROM_USER( mask, depth->mask,
-                                    depth->n * sizeof(u8) ) ) {
-                       DRM_FREE( buffer );
-                       DRM_FREE( mask );
+               if ( DRM_COPY_FROM_USER( mask, depth->mask, mask_size ) ) {
+                       DRM_FREE( buffer, buffer_size );
+                       DRM_FREE( mask, mask_size );
                        return DRM_ERR(EFAULT);
                }
 
@@ -953,7 +954,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
                        }
                }
 
-               DRM_FREE( mask );
+               DRM_FREE( mask, mask_size );
        } else {
                for ( i = 0 ; i < count ; i++, x++ ) {
                        BEGIN_RING( 6 );
@@ -977,7 +978,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
                }
        }
 
-       DRM_FREE( buffer );
+       DRM_FREE( buffer, buffer_size );
 
        return 0;
 }
@@ -989,60 +990,62 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
        int count, *x, *y;
        u32 *buffer;
        u8 *mask;
-       int i;
+       int i, xbuf_size, ybuf_size, buffer_size, mask_size;
        RING_LOCALS;
        DRM_DEBUG( "\n" );
 
        count = depth->n;
 
-       x = DRM_MALLOC( count * sizeof(*x) );
+       xbuf_size = count * sizeof(*x);
+       ybuf_size = count * sizeof(*y);
+       x = DRM_MALLOC( xbuf_size );
        if ( x == NULL ) {
                return DRM_ERR(ENOMEM);
        }
-       y = DRM_MALLOC( count * sizeof(*y) );
+       y = DRM_MALLOC( ybuf_size );
        if ( y == NULL ) {
-               DRM_FREE( x );
+               DRM_FREE( x, xbuf_size );
                return DRM_ERR(ENOMEM);
        }
-       if ( DRM_COPY_FROM_USER( x, depth->x, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( x, depth->x, xbuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
-       if ( DRM_COPY_FROM_USER( y, depth->y, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( y, depth->y, xbuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
 
-       buffer = DRM_MALLOC( depth->n * sizeof(u32) );
+       buffer_size = depth->n * sizeof(u32);
+       buffer = DRM_MALLOC( buffer_size );
        if ( buffer == NULL ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(ENOMEM);
        }
-       if ( DRM_COPY_FROM_USER( buffer, depth->buffer,
-                            depth->n * sizeof(u32) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
-               DRM_FREE( buffer );
+       if ( DRM_COPY_FROM_USER( buffer, depth->buffer, buffer_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
+               DRM_FREE( buffer, buffer_size );
                return DRM_ERR(EFAULT);
        }
 
        if ( depth->mask ) {
-               mask = DRM_MALLOC( depth->n * sizeof(u8) );
+               mask_size = depth->n * sizeof(u8);
+               mask = DRM_MALLOC( mask_size );
                if ( mask == NULL ) {
-                       DRM_FREE( x );
-                       DRM_FREE( y );
-                       DRM_FREE( buffer );
+                       DRM_FREE( x, xbuf_size );
+                       DRM_FREE( y, ybuf_size );
+                       DRM_FREE( buffer, buffer_size );
                        return DRM_ERR(ENOMEM);
                }
-               if ( DRM_COPY_FROM_USER( mask, depth->mask,
-                                    depth->n * sizeof(u8) ) ) {
-                       DRM_FREE( x );
-                       DRM_FREE( y );
-                       DRM_FREE( buffer );
-                       DRM_FREE( mask );
+               if ( DRM_COPY_FROM_USER( mask, depth->mask, mask_size ) ) {
+                       DRM_FREE( x, xbuf_size );
+                       DRM_FREE( y, ybuf_size );
+                       DRM_FREE( buffer, buffer_size );
+                       DRM_FREE( mask, mask_size );
                        return DRM_ERR(EFAULT);
                }
 
@@ -1069,7 +1072,7 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
                        }
                }
 
-               DRM_FREE( mask );
+               DRM_FREE( mask, mask_size );
        } else {
                for ( i = 0 ; i < count ; i++ ) {
                        BEGIN_RING( 6 );
@@ -1093,9 +1096,9 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
                }
        }
 
-       DRM_FREE( x );
-       DRM_FREE( y );
-       DRM_FREE( buffer );
+       DRM_FREE( x, xbuf_size );
+       DRM_FREE( y, ybuf_size );
+       DRM_FREE( buffer, buffer_size );
 
        return 0;
 }
@@ -1146,7 +1149,7 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
 {
        drm_r128_private_t *dev_priv = dev->dev_private;
        int count, *x, *y;
-       int i;
+       int i, xbuf_size, ybuf_size;
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
@@ -1155,23 +1158,25 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
                count = dev_priv->depth_pitch;
        }
 
-       x = DRM_MALLOC( count * sizeof(*x) );
+       xbuf_size = count * sizeof(*x);
+       ybuf_size = count * sizeof(*y);
+       x = DRM_MALLOC( xbuf_size );
        if ( x == NULL ) {
                return DRM_ERR(ENOMEM);
        }
-       y = DRM_MALLOC( count * sizeof(*y) );
+       y = DRM_MALLOC( ybuf_size );
        if ( y == NULL ) {
-               DRM_FREE( x );
+               DRM_FREE( x, xbuf_size );
                return DRM_ERR(ENOMEM);
        }
-       if ( DRM_COPY_FROM_USER( x, depth->x, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( x, depth->x, xbuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
-       if ( DRM_COPY_FROM_USER( y, depth->y, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( y, depth->y, ybuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
 
@@ -1199,8 +1204,8 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
                ADVANCE_RING();
        }
 
-       DRM_FREE( x );
-       DRM_FREE( y );
+       DRM_FREE( x, xbuf_size );
+       DRM_FREE( y, ybuf_size );
 
        return 0;
 }
@@ -1240,7 +1245,7 @@ int r128_cce_clear( DRM_IOCTL_ARGS )
        drm_r128_clear_t clear;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_r128_clear_t *) data,
                             sizeof(clear) );
@@ -1266,7 +1271,7 @@ int r128_cce_swap( DRM_IOCTL_ARGS )
        drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1293,7 +1298,7 @@ int r128_cce_vertex( DRM_IOCTL_ARGS )
        drm_r128_buf_priv_t *buf_priv;
        drm_r128_vertex_t vertex;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1324,9 +1329,9 @@ int r128_cce_vertex( DRM_IOCTL_ARGS )
        buf = dma->buflist[vertex.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1353,7 +1358,7 @@ int r128_cce_indices( DRM_IOCTL_ARGS )
        drm_r128_indices_t elts;
        int count;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1383,9 +1388,9 @@ int r128_cce_indices( DRM_IOCTL_ARGS )
        buf = dma->buflist[elts.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1421,7 +1426,7 @@ int r128_cce_blit( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_blit_t blit;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( blit, (drm_r128_blit_t *) data,
                             sizeof(blit) );
@@ -1437,7 +1442,7 @@ int r128_cce_blit( DRM_IOCTL_ARGS )
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       return r128_cce_dispatch_blit( dev, &blit );
+       return r128_cce_dispatch_blit( filp, dev, &blit );
 }
 
 int r128_cce_depth( DRM_IOCTL_ARGS )
@@ -1446,7 +1451,7 @@ int r128_cce_depth( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_depth_t depth;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( depth, (drm_r128_depth_t *) data,
                             sizeof(depth) );
@@ -1474,7 +1479,7 @@ int r128_cce_stipple( DRM_IOCTL_ARGS )
        drm_r128_stipple_t stipple;
        u32 mask[32];
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stipple, (drm_r128_stipple_t *) data,
                             sizeof(stipple) );
@@ -1502,7 +1507,7 @@ int r128_cce_indirect( DRM_IOCTL_ARGS )
        RING_LOCALS;
 #endif
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1525,9 +1530,9 @@ int r128_cce_indirect( DRM_IOCTL_ARGS )
        buf = dma->buflist[indirect.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
index b4d0e4b..3ec8dfd 100644 (file)
 
 #define RADEON_FIFO_DEBUG      0
 
+#if defined(__alpha__) || defined(__powerpc__)
+# define PCIGART_ENABLED
+#else
+# undef PCIGART_ENABLED
+#endif
 
 
 /* CP microcode (from ATI) */
@@ -880,7 +885,6 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
 
        /* Set the write pointer delay */
        RADEON_WRITE( RADEON_CP_RB_WPTR_DELAY, 0 );
-       RADEON_READ( RADEON_CP_RB_WPTR_DELAY ); /* read back to propagate */
 
        /* Initialize the ring buffer's read and write pointers */
        cur_read_ptr = RADEON_READ( RADEON_CP_RB_RPTR );
@@ -922,11 +926,11 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
        RADEON_WRITE( RADEON_SCRATCH_UMSK, 0x7 );
 
        /* Writeback doesn't seem to work everywhere, test it first */
-       DRM_WRITE32( &dev_priv->scratch[1], 0 );
+       DRM_WRITE32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0 );
        RADEON_WRITE( RADEON_SCRATCH_REG1, 0xdeadbeef );
 
        for ( tmp = 0 ; tmp < dev_priv->usec_timeout ; tmp++ ) {
-               if ( DRM_READ32( &dev_priv->scratch[1] ) == 0xdeadbeef )
+               if ( DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(1) ) == 0xdeadbeef )
                        break;
                DRM_UDELAY( 1 );
        }
@@ -986,6 +990,17 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
 
        dev_priv->is_pci = init->is_pci;
 
+#if !defined(PCIGART_ENABLED)
+       /* PCI support is not 100% working, so we disable it here.
+        */
+       if ( dev_priv->is_pci ) {
+               DRM_ERROR( "PCI GART not yet supported for Radeon!\n" );
+               dev->dev_private = (void *)dev_priv;
+               radeon_do_cleanup_cp(dev);
+               return DRM_ERR(EINVAL);
+       }
+#endif
+
        if ( dev_priv->is_pci && !dev->sg ) {
                DRM_ERROR( "PCI GART memory not allocated!\n" );
                dev->dev_private = (void *)dev_priv;
@@ -1202,6 +1217,7 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
                (dev_priv->ring.size / sizeof(u32)) - 1;
 
        dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
+       dev_priv->ring.ring_rptr = dev_priv->ring_rptr;
 
 #if __REALLY_HAVE_SG
        if ( dev_priv->is_pci ) {
@@ -1307,7 +1323,7 @@ int radeon_cp_start( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cp_running ) {
                DRM_DEBUG( "%s while CP running\n", __FUNCTION__ );
@@ -1335,10 +1351,13 @@ int radeon_cp_stop( DRM_IOCTL_ARGS )
        int ret;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stop, (drm_radeon_cp_stop_t *)data, sizeof(stop) );
 
+       if (!dev_priv->cp_running)
+               return 0;
+
        /* Flush any pending CP commands.  This ensures any outstanding
         * commands are exectuted by the engine before we turn it off.
         */
@@ -1366,6 +1385,39 @@ int radeon_cp_stop( DRM_IOCTL_ARGS )
        return 0;
 }
 
+
+void radeon_do_release( drm_device_t *dev )
+{
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       int ret;
+
+       if (dev_priv) {
+               if (dev_priv->cp_running) {
+                       /* Stop the cp */
+                       while ((ret = radeon_do_cp_idle( dev_priv )) != 0) {
+                               DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
+#ifdef __linux__
+                               schedule();
+#else
+                               tsleep(&ret, PZERO, "rdnrel", 1);
+#endif
+                       }
+                       radeon_do_cp_stop( dev_priv );
+                       radeon_do_engine_reset( dev );
+               }
+
+               /* Disable *all* interrupts */
+               RADEON_WRITE( RADEON_GEN_INT_CNTL, 0 );
+
+               /* Free memory heap structures */
+               radeon_mem_takedown( &(dev_priv->agp_heap) );
+               radeon_mem_takedown( &(dev_priv->fb_heap) );
+
+               /* deallocate kernel resources */
+               radeon_do_cleanup_cp( dev );
+       }
+}
+
 /* Just reset the CP ring.  Called as part of an X Server engine reset.
  */
 int radeon_cp_reset( DRM_IOCTL_ARGS )
@@ -1374,7 +1426,7 @@ int radeon_cp_reset( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
@@ -1395,10 +1447,7 @@ int radeon_cp_idle( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
-
-/*     if (dev->irq)  */
-/*             radeon_emit_and_wait_irq( dev ); */
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return radeon_do_cp_idle( dev_priv );
 }
@@ -1408,7 +1457,7 @@ int radeon_engine_reset( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return radeon_do_engine_reset( dev );
 }
@@ -1467,7 +1516,7 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
                for ( i = start ; i < dma->buf_count ; i++ ) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
-                       if ( buf->pid == 0 || (buf->pending && 
+                       if ( buf->filp == 0 || (buf->pending && 
                                               buf_priv->age <= done_age) ) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
@@ -1494,7 +1543,7 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
        drm_buf_t *buf;
        int i, t;
        int start;
-       u32 done_age = DRM_READ32(&dev_priv->scratch[1]);
+       u32 done_age = DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1));
 
        if ( ++dev_priv->last_buf >= dma->buf_count )
                dev_priv->last_buf = 0;
@@ -1506,7 +1555,7 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
                for ( i = start ; i < dma->buf_count ; i++ ) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
-                       if ( buf->pid == 0 || (buf->pending && 
+                       if ( buf->filp == 0 || (buf->pending && 
                                               buf_priv->age <= done_age) ) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
@@ -1571,7 +1620,7 @@ int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n )
        return DRM_ERR(EBUSY);
 }
 
-static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int radeon_cp_get_buffers( DRMFILE filp, drm_device_t *dev, drm_dma_t *d )
 {
        int i;
        drm_buf_t *buf;
@@ -1580,7 +1629,7 @@ static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
                buf = radeon_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EBUSY); /* NOTE: broken client */
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx,
                                   sizeof(buf->idx) ) )
@@ -1601,7 +1650,7 @@ int radeon_cp_buffers( DRM_IOCTL_ARGS )
        int ret = 0;
        drm_dma_t d;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *)data, sizeof(d) );
 
@@ -1624,7 +1673,7 @@ int radeon_cp_buffers( DRM_IOCTL_ARGS )
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = radeon_cp_get_buffers( dev, &d );
+               ret = radeon_cp_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL( (drm_dma_t *)data, d, sizeof(d) );
index 635ad14..7faffa7 100644 (file)
@@ -31,8 +31,8 @@
 #ifndef __RADEON_DRV_H__
 #define __RADEON_DRV_H__
 
-#define GET_RING_HEAD(ring)            DRM_READ32(  (volatile u32 *) (ring)->head )
-#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (volatile u32 *) (ring)->head , (val))
+#define GET_RING_HEAD(ring)            DRM_READ32(  (ring)->ring_rptr, 0 ) /* (ring)->head */
+#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (ring)->ring_rptr, 0, (val) ) /* (ring)->head */
 
 typedef struct drm_radeon_freelist {
        unsigned int age;
@@ -53,6 +53,7 @@ typedef struct drm_radeon_ring_buffer {
        int space;
 
        int high_mark;
+       drm_local_map_t *ring_rptr;
 } drm_radeon_ring_buffer_t;
 
 typedef struct drm_radeon_depth_clear_t {
@@ -67,7 +68,7 @@ struct mem_block {
        struct mem_block *prev;
        int start;
        int size;
-       int pid;                /* 0: free, -1: heap, other: real pids */
+       DRMFILE filp;           /* 0: free, -1: heap, other: real files */
 };
 
 typedef struct drm_radeon_private {
@@ -126,13 +127,13 @@ typedef struct drm_radeon_private {
 
        drm_radeon_depth_clear_t depth_clear;
 
-       drm_map_t *sarea;
-       drm_map_t *fb;
-       drm_map_t *mmio;
-       drm_map_t *cp_ring;
-       drm_map_t *ring_rptr;
-       drm_map_t *buffers;
-       drm_map_t *agp_textures;
+       drm_local_map_t *sarea;
+       drm_local_map_t *fb;
+       drm_local_map_t *mmio;
+       drm_local_map_t *cp_ring;
+       drm_local_map_t *ring_rptr;
+       drm_local_map_t *buffers;
+       drm_local_map_t *agp_textures;
 
        struct mem_block *agp_heap;
        struct mem_block *fb_heap;
@@ -183,7 +184,7 @@ extern int radeon_mem_alloc( DRM_IOCTL_ARGS );
 extern int radeon_mem_free( DRM_IOCTL_ARGS );
 extern int radeon_mem_init_heap( DRM_IOCTL_ARGS );
 extern void radeon_mem_takedown( struct mem_block **heap );
-extern void radeon_mem_release( struct mem_block *heap );
+extern void radeon_mem_release( DRMFILE filp, struct mem_block *heap );
 
                                /* radeon_irq.c */
 extern int radeon_irq_emit( DRM_IOCTL_ARGS );
@@ -193,6 +194,7 @@ extern int radeon_emit_and_wait_irq(drm_device_t *dev);
 extern int radeon_wait_irq(drm_device_t *dev, int swi_nr);
 extern int radeon_emit_irq(drm_device_t *dev);
 
+extern void radeon_do_release(drm_device_t *dev);
 
 /* Flags for stats.boxes
  */
@@ -266,8 +268,10 @@ extern int radeon_emit_irq(drm_device_t *dev);
 #define RADEON_SCRATCH_UMSK            0x0770
 #define RADEON_SCRATCH_ADDR            0x0774
 
+#define RADEON_SCRATCHOFF( x )         (RADEON_SCRATCH_REG_OFFSET + 4*(x))
+
 #define GET_SCRATCH( x )       (dev_priv->writeback_works                      \
-                               ? DRM_READ32( &dev_priv->scratch[(x)] )         \
+                               ? DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(x) ) \
                                : RADEON_READ( RADEON_SCRATCH_REG0 + 4*(x) ) )
 
 
@@ -686,15 +690,10 @@ extern int radeon_emit_irq(drm_device_t *dev);
 
 #define RADEON_RING_HIGH_MARK          128
 
-
-#define RADEON_BASE(reg)       ((unsigned long)(dev_priv->mmio->handle))
-#define RADEON_ADDR(reg)       (RADEON_BASE( reg ) + reg)
-
-#define RADEON_READ(reg)       DRM_READ32(  (volatile u32 *) RADEON_ADDR(reg) )
-#define RADEON_WRITE(reg,val)  DRM_WRITE32( (volatile u32 *) RADEON_ADDR(reg), (val) )
-
-#define RADEON_READ8(reg)      DRM_READ8(  (volatile u8 *) RADEON_ADDR(reg) )
-#define RADEON_WRITE8(reg,val) DRM_WRITE8( (volatile u8 *) RADEON_ADDR(reg), (val) )
+#define RADEON_READ(reg)       DRM_READ32(  dev_priv->mmio, (reg) )
+#define RADEON_WRITE(reg,val)  DRM_WRITE32( dev_priv->mmio, (reg), (val) )
+#define RADEON_READ8(reg)      DRM_READ8(  dev_priv->mmio, (reg) )
+#define RADEON_WRITE8(reg,val) DRM_WRITE8( dev_priv->mmio, (reg), (val) )
 
 #define RADEON_WRITE_PLL( addr, val )                                  \
 do {                                                                   \
@@ -771,16 +770,6 @@ extern int RADEON_READ_PLL( drm_device_t *dev, int addr );
  * Misc helper macros
  */
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                        \
-               DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );     \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
-
 /* Perfbox functionality only.  
  */
 #define RING_SPACE_TEST_WITH_RETURN( dev_priv )                                \
@@ -827,43 +816,10 @@ do {                                                                      \
 
 #define RING_LOCALS    int write, _nr; unsigned int mask; u32 *ring;
 
-#if defined(__alpha__)
-#  define RADEON_PAD_RING 16 /* pad ring requests to 16 lw boundaries */
-#else
-#  define RADEON_PAD_RING 0
-#endif
-
-#if RADEON_PAD_RING
-# define radeon_pad_size(n)    \
-       (((RADEON_PAD_RING) - ((n) % (RADEON_PAD_RING))) % (RADEON_PAD_RING))
-# define radeon_pad_ring() do {                                                \
-       if (RADEON_VERBOSE) {                                           \
-               DRM_INFO("Padding ring from %d (%x) with %d words\n",   \
-                        write, write, radeon_pad_size(write));         \
-       }                                                               \
-       switch (radeon_pad_size(write)) {                               \
-       case 0:  /* aligned */                                          \
-               break;                                                  \
-       case 1:  /* 1 word */                                           \
-               OUT_RING(CP_PACKET2());                                 \
-               break;                                                  \
-       default: /* >= 2 words */                                       \
-               OUT_RING(CP_PACKET3(0x1000, radeon_pad_size(write) - 1));\
-               write = (write + radeon_pad_size(write)) & mask;        \
-               write &= mask;                                          \
-               break;                                                  \
-       }                                                               \
-} while(0)
-#else
-# define radeon_pad_size(n) 0
-# define radeon_pad_ring()
-#endif
-
-#define BEGIN_RING( req_n ) do {                                       \
-       int n = req_n + radeon_pad_size(req_n);                         \
+#define BEGIN_RING( n ) do {                                           \
        if ( RADEON_VERBOSE ) {                                         \
-               DRM_INFO( "BEGIN_RING( %d (%d) ) in %s\n",              \
-                          n, req_n, __FUNCTION__ );                    \
+               DRM_INFO( "BEGIN_RING( %d ) in %s\n",                   \
+                          n, __FUNCTION__ );                           \
        }                                                               \
        if ( dev_priv->ring.space <= (n) * sizeof(u32) ) {              \
                 COMMIT_RING();                                         \
@@ -880,7 +836,6 @@ do {                                                                        \
                DRM_INFO( "ADVANCE_RING() wr=0x%06x tail=0x%06x\n",     \
                          write, dev_priv->ring.tail );                 \
        }                                                               \
-       radeon_pad_ring();                                              \
        if (((dev_priv->ring.tail + _nr) & mask) != write) {            \
                DRM_ERROR(                                              \
                        "ADVANCE_RING(): mismatch: nr: %x write: %x line: %d\n",        \
@@ -892,7 +847,7 @@ do {                                                                        \
 
 #define COMMIT_RING() do {                                             \
        /* Flush writes to ring */                                      \
-       DRM_READMEMORYBARRIER();                                        \
+       DRM_READMEMORYBARRIER(dev_priv->mmio);                                  \
        GET_RING_HEAD( &dev_priv->ring );                               \
        RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail );         \
        /* read from PCI bus to ensure correct posting */               \
index 596706b..9199fbb 100644 (file)
@@ -179,7 +179,7 @@ int radeon_irq_emit( DRM_IOCTL_ARGS )
        drm_radeon_irq_emit_t emit;
        int result;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
index 5c07c1a..c3cbd3a 100644 (file)
@@ -40,7 +40,7 @@
  */
 
 static struct mem_block *split_block(struct mem_block *p, int start, int size,
-                                    int pid )
+                                    DRMFILE filp )
 {
        /* Maybe cut off the start of an existing block */
        if (start > p->start) {
@@ -49,7 +49,7 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size,
                        goto out;
                newblock->start = start;
                newblock->size = p->size - (start - p->start);
-               newblock->pid = 0;
+               newblock->filp = 0;
                newblock->next = p->next;
                newblock->prev = p;
                p->next->prev = newblock;
@@ -65,7 +65,7 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size,
                        goto out;
                newblock->start = start + size;
                newblock->size = p->size - size;
-               newblock->pid = 0;
+               newblock->filp = 0;
                newblock->next = p->next;
                newblock->prev = p;
                p->next->prev = newblock;
@@ -75,20 +75,20 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size,
 
  out:
        /* Our block is in the middle */
-       p->pid = pid;
+       p->filp = filp;
        return p;
 }
 
 static struct mem_block *alloc_block( struct mem_block *heap, int size, 
-                                     int align2, int pid )
+                                     int align2, DRMFILE filp )
 {
        struct mem_block *p;
        int mask = (1 << align2)-1;
 
        for (p = heap->next ; p != heap ; p = p->next) {
                int start = (p->start + mask) & ~mask;
-               if (p->pid == 0 && start + size <= p->start + p->size)
-                       return split_block( p, start, size, pid );
+               if (p->filp == 0 && start + size <= p->start + p->size)
+                       return split_block( p, start, size, filp );
        }
 
        return NULL;
@@ -108,38 +108,28 @@ static struct mem_block *find_block( struct mem_block *heap, int start )
 
 static void free_block( struct mem_block *p )
 {
-       p->pid = 0;
+       p->filp = 0;
 
-       /* Assumes a single contiguous range.  Needs a special pid in
+       /* Assumes a single contiguous range.  Needs a special filp in
         * 'heap' to stop it being subsumed.
         */
-       if (p->next->pid == 0) {
+       if (p->next->filp == 0) {
                struct mem_block *q = p->next;
                p->size += q->size;
                p->next = q->next;
                p->next->prev = p;
-               DRM_FREE(q);
+               DRM_FREE(q, sizeof(*q));
        }
 
-       if (p->prev->pid == 0) {
+       if (p->prev->filp == 0) {
                struct mem_block *q = p->prev;
                q->size += p->size;
                q->next = p->next;
                q->next->prev = q;
-               DRM_FREE(p);
+               DRM_FREE(p, sizeof(*q));
        }
 }
 
-static void print_heap( struct mem_block *heap )
-{
-       struct mem_block *p;
-
-       for (p = heap->next ; p != heap ; p = p->next) 
-               DRM_DEBUG("0x%x..0x%x (0x%x) -- owner %d\n",
-                         p->start, p->start + p->size,
-                         p->size, p->pid);
-}
-
 /* Initialize.  How to check for an uninitialized heap?
  */
 static int init_heap(struct mem_block **heap, int start, int size)
@@ -151,47 +141,46 @@ static int init_heap(struct mem_block **heap, int start, int size)
        
        *heap = DRM_MALLOC(sizeof(**heap));
        if (!*heap) {
-               DRM_FREE( blocks );
+               DRM_FREE( blocks, sizeof(*blocks) );
                return -ENOMEM;
        }
 
        blocks->start = start;
        blocks->size = size;
-       blocks->pid = 0;
+       blocks->filp = 0;
        blocks->next = blocks->prev = *heap;
 
        memset( *heap, 0, sizeof(**heap) );
-       (*heap)->pid = -1;
+       (*heap)->filp = (DRMFILE) -1;
        (*heap)->next = (*heap)->prev = blocks;
        return 0;
 }
 
 
-/* Free all blocks associated with the releasing pid.
+/* Free all blocks associated with the releasing file.
  */
-void radeon_mem_release( struct mem_block *heap )
+void radeon_mem_release( DRMFILE filp, struct mem_block *heap )
 {
-       int pid = DRM_CURRENTPID;
        struct mem_block *p;
 
        if (!heap || !heap->next)
                return;
 
        for (p = heap->next ; p != heap ; p = p->next) {
-               if (p->pid == pid
-                       p->pid = 0;
+               if (p->filp == filp
+                       p->filp = 0;
        }
 
-       /* Assumes a single contiguous range.  Needs a special pid in
+       /* Assumes a single contiguous range.  Needs a special filp in
         * 'heap' to stop it being subsumed.
         */
        for (p = heap->next ; p != heap ; p = p->next) {
-               while (p->pid == 0 && p->next->pid == 0) {
+               while (p->filp == 0 && p->next->filp == 0) {
                        struct mem_block *q = p->next;
                        p->size += q->size;
                        p->next = q->next;
                        p->next->prev = p;
-                       DRM_FREE(q);
+                       DRM_FREE(q, sizeof(*q));
                }
        }
 }
@@ -208,10 +197,10 @@ void radeon_mem_takedown( struct mem_block **heap )
        for (p = (*heap)->next ; p != *heap ; ) {
                struct mem_block *q = p;
                p = p->next;
-               DRM_FREE(q);
+               DRM_FREE(q, sizeof(*q));
        }
 
-       DRM_FREE( *heap );
+       DRM_FREE( *heap, sizeof(**heap) );
        *heap = 0;
 }
 
@@ -258,7 +247,7 @@ int radeon_mem_alloc( DRM_IOCTL_ARGS )
                alloc.alignment = 12;
 
        block = alloc_block( *heap, alloc.size, alloc.alignment,
-                            DRM_CURRENTPID );
+                            filp );
 
        if (!block) 
                return DRM_ERR(ENOMEM);
@@ -297,7 +286,7 @@ int radeon_mem_free( DRM_IOCTL_ARGS )
        if (!block)
                return DRM_ERR(EFAULT);
 
-       if (block->pid != DRM_CURRENTPID)
+       if (block->filp != filp)
                return DRM_ERR(EPERM);
 
        free_block( block );    
index d9bc948..86cbead 100644 (file)
@@ -1063,7 +1063,8 @@ static void radeon_cp_dispatch_indices( drm_device_t *dev,
 
 #define RADEON_MAX_TEXTURE_SIZE (RADEON_BUFFER_SIZE - 8 * sizeof(u32))
 
-static int radeon_cp_dispatch_texture( drm_device_t *dev,
+static int radeon_cp_dispatch_texture( DRMFILE filp,
+                                      drm_device_t *dev,
                                       drm_radeon_texture_t *tex,
                                       drm_radeon_tex_image_t *image )
 {
@@ -1216,7 +1217,7 @@ static int radeon_cp_dispatch_texture( drm_device_t *dev,
                        }
                }
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
                buf->used = (dwords + 8) * sizeof(u32);
                radeon_cp_dispatch_indirect( dev, buf, 0, buf->used );
                radeon_cp_discard_buffer( dev, buf );
@@ -1273,7 +1274,7 @@ int radeon_cp_clear( DRM_IOCTL_ARGS )
        drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_radeon_clear_t *)data,
                             sizeof(clear) );
@@ -1342,7 +1343,7 @@ int radeon_cp_flip( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1362,7 +1363,7 @@ int radeon_cp_swap( DRM_IOCTL_ARGS )
        drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1386,7 +1387,7 @@ int radeon_cp_vertex( DRM_IOCTL_ARGS )
        drm_radeon_vertex_t vertex;
        drm_radeon_tcl_prim_t prim;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1416,9 +1417,9 @@ int radeon_cp_vertex( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[vertex.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1473,7 +1474,7 @@ int radeon_cp_indices( DRM_IOCTL_ARGS )
        drm_radeon_tcl_prim_t prim;
        int count;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1503,9 +1504,9 @@ int radeon_cp_indices( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[elts.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1568,7 +1569,7 @@ int radeon_cp_texture( DRM_IOCTL_ARGS )
        drm_radeon_tex_image_t image;
        int ret;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( tex, (drm_radeon_texture_t *)data, sizeof(tex) );
 
@@ -1585,7 +1586,7 @@ int radeon_cp_texture( DRM_IOCTL_ARGS )
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       ret = radeon_cp_dispatch_texture( dev, &tex, &image );
+       ret = radeon_cp_dispatch_texture( filp, dev, &tex, &image );
 
        COMMIT_RING();
        return ret;
@@ -1598,7 +1599,7 @@ int radeon_cp_stipple( DRM_IOCTL_ARGS )
        drm_radeon_stipple_t stipple;
        u32 mask[32];
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stipple, (drm_radeon_stipple_t *)data,
                             sizeof(stipple) );
@@ -1623,7 +1624,7 @@ int radeon_cp_indirect( DRM_IOCTL_ARGS )
        drm_radeon_indirect_t indirect;
        RING_LOCALS;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1645,9 +1646,9 @@ int radeon_cp_indirect( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[indirect.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1700,7 +1701,7 @@ int radeon_cp_vertex2( DRM_IOCTL_ARGS )
        int i;
        unsigned char laststate;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1725,9 +1726,9 @@ int radeon_cp_vertex2( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[vertex.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
 
@@ -2027,7 +2028,7 @@ int radeon_cp_cmdbuf( DRM_IOCTL_ARGS )
        drm_radeon_cmd_header_t header;
        int orig_nbox;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -2096,8 +2097,9 @@ int radeon_cp_cmdbuf( DRM_IOCTL_ARGS )
                        }
 
                        buf = dma->buflist[idx];
-                       if ( buf->pid != DRM_CURRENTPID || buf->pending ) {
-                               DRM_ERROR( "bad buffer\n" );
+                       if ( buf->filp != filp || buf->pending ) {
+                               DRM_ERROR( "bad buffer %p %p %d\n",
+                                          buf->filp, filp, buf->pending);
                                return DRM_ERR(EINVAL);
                        }
 
index 22bd61f..5e95c9f 100644 (file)
@@ -686,7 +686,7 @@ int mga_dma_flush( DRM_IOCTL_ARGS )
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
        drm_lock_t lock;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( lock, (drm_lock_t *)data, sizeof(lock) );
 
@@ -720,7 +720,7 @@ int mga_dma_reset( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        drm_mga_private_t *dev_priv = (drm_mga_private_t *)dev->dev_private;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return mga_do_dma_reset( dev_priv );
 }
@@ -730,7 +730,8 @@ int mga_dma_reset( DRM_IOCTL_ARGS )
  * DMA buffer management
  */
 
-static int mga_dma_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int mga_dma_get_buffers( DRMFILE filp,
+                               drm_device_t *dev, drm_dma_t *d )
 {
        drm_buf_t *buf;
        int i;
@@ -739,7 +740,7 @@ static int mga_dma_get_buffers( drm_device_t *dev, drm_dma_t *d )
                buf = mga_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EAGAIN);
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i],
                                   &buf->idx, sizeof(buf->idx) ) )
@@ -761,7 +762,7 @@ int mga_dma_buffers( DRM_IOCTL_ARGS )
        drm_dma_t d;
        int ret = 0;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *)data, sizeof(d) );
 
@@ -786,7 +787,7 @@ int mga_dma_buffers( DRM_IOCTL_ARGS )
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = mga_dma_get_buffers( dev, &d );
+               ret = mga_dma_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL( (drm_dma_t *)data, d, sizeof(d) );
index a5085b0..7efc89b 100644 (file)
@@ -90,14 +90,14 @@ typedef struct drm_mga_private {
        unsigned int texture_offset;
        unsigned int texture_size;
 
-       drm_map_t *sarea;
-       drm_map_t *fb;
-       drm_map_t *mmio;
-       drm_map_t *status;
-       drm_map_t *warp;
-       drm_map_t *primary;
-       drm_map_t *buffers;
-       drm_map_t *agp_textures;
+       drm_local_map_t *sarea;
+       drm_local_map_t *fb;
+       drm_local_map_t *mmio;
+       drm_local_map_t *status;
+       drm_local_map_t *warp;
+       drm_local_map_t *primary;
+       drm_local_map_t *buffers;
+       drm_local_map_t *agp_textures;
 } drm_mga_private_t;
 
                                /* mga_dma.c */
@@ -131,32 +131,30 @@ extern int  mga_getparam( DRM_IOCTL_ARGS );
 extern int mga_warp_install_microcode( drm_mga_private_t *dev_priv );
 extern int mga_warp_init( drm_mga_private_t *dev_priv );
 
-#define mga_flush_write_combine()      DRM_WRITEMEMORYBARRIER()
-
+#define mga_flush_write_combine()      DRM_WRITEMEMORYBARRIER(dev_priv->primary)
 
+#if defined(__linux__) && defined(__alpha__)
 #define MGA_BASE( reg )                ((unsigned long)(dev_priv->mmio->handle))
 #define MGA_ADDR( reg )                (MGA_BASE(reg) + reg)
 
 #define MGA_DEREF( reg )       *(volatile u32 *)MGA_ADDR( reg )
 #define MGA_DEREF8( reg )      *(volatile u8 *)MGA_ADDR( reg )
 
-#ifdef __alpha__
 #define MGA_READ( reg )                (_MGA_READ((u32 *)MGA_ADDR(reg)))
 #define MGA_READ8( reg )       (_MGA_READ((u8 *)MGA_ADDR(reg)))
-#define MGA_WRITE( reg, val )  do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF( reg ) = val; } while (0)
-#define MGA_WRITE8( reg, val )  do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF8( reg ) = val; } while (0)
+#define MGA_WRITE( reg, val )  do { DRM_WRITEMEMORYBARRIER(dev_priv->mmio); MGA_DEREF( reg ) = val; } while (0)
+#define MGA_WRITE8( reg, val )  do { DRM_WRITEMEMORYBARRIER(dev_priv->mmio); MGA_DEREF8( reg ) = val; } while (0)
 
 static inline u32 _MGA_READ(u32 *addr)
 {
-       DRM_READMEMORYBARRIER();
+       DRM_READMEMORYBARRIER(dev_priv->mmio);
        return *(volatile u32 *)addr;
 }
-
 #else
-#define MGA_READ( reg )                MGA_DEREF( reg )
-#define MGA_READ8( reg )       MGA_DEREF8( reg )
-#define MGA_WRITE( reg, val )  do { MGA_DEREF( reg ) = val; } while (0)
-#define MGA_WRITE8( reg, val )  do { MGA_DEREF8( reg ) = val; } while (0)
+#define MGA_READ8( reg )       DRM_READ8(dev_priv->mmio, (reg))
+#define MGA_READ( reg )                DRM_READ32(dev_priv->mmio, (reg))
+#define MGA_WRITE8( reg, val )  DRM_WRITE8(dev_priv->mmio, (reg), (val))
+#define MGA_WRITE( reg, val )  DRM_WRITE32(dev_priv->mmio, (reg), (val))
 #endif
 
 #define DWGREG0        0x1c00
@@ -186,16 +184,6 @@ do {                                                                       \
        }                                                               \
 } while (0)
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                                \
-               DRM_ERROR( "%s called without lock held\n",             \
-                          __FUNCTION__ );                                      \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 #define WRAP_TEST_WITH_RETURN( dev_priv )                              \
 do {                                                                   \
        if ( test_bit( 0, &dev_priv->prim.wrapped ) ) {                 \
index 6107722..256dd47 100644 (file)
@@ -887,7 +887,7 @@ int mga_dma_clear( DRM_IOCTL_ARGS )
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
        drm_mga_clear_t clear;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_mga_clear_t *)data, sizeof(clear) );
 
@@ -911,7 +911,7 @@ int mga_dma_swap( DRM_IOCTL_ARGS )
        drm_mga_private_t *dev_priv = dev->dev_private;
        drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS )
                sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
@@ -936,7 +936,7 @@ int mga_dma_vertex( DRM_IOCTL_ARGS )
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_vertex_t vertex;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( vertex,
                             (drm_mga_vertex_t *)data,
@@ -975,7 +975,7 @@ int mga_dma_indices( DRM_IOCTL_ARGS )
        drm_mga_buf_priv_t *buf_priv;
        drm_mga_indices_t indices;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( indices,
                             (drm_mga_indices_t *)data,
@@ -1015,7 +1015,7 @@ int mga_dma_iload( DRM_IOCTL_ARGS )
        drm_mga_iload_t iload;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( iload, (drm_mga_iload_t *)data, sizeof(iload) );
 
@@ -1055,7 +1055,7 @@ int mga_dma_blit( DRM_IOCTL_ARGS )
        drm_mga_blit_t blit;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( blit, (drm_mga_blit_t *)data, sizeof(blit) );
 
index 5175885..7f0f432 100644 (file)
@@ -579,6 +579,7 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init )
                (dev_priv->ring.size / sizeof(u32)) - 1;
 
        dev_priv->ring.high_mark = 128;
+       dev_priv->ring.ring_rptr = dev_priv->ring_rptr;
 
        dev_priv->sarea_priv->last_frame = 0;
        R128_WRITE( R128_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame );
@@ -663,7 +664,7 @@ int r128_cce_start( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4 ) {
                DRM_DEBUG( "%s while CCE running\n", __FUNCTION__ );
@@ -686,7 +687,7 @@ int r128_cce_stop( DRM_IOCTL_ARGS )
        int ret;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL(stop, (drm_r128_cce_stop_t *)data, sizeof(stop) );
 
@@ -725,7 +726,7 @@ int r128_cce_reset( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
@@ -746,7 +747,7 @@ int r128_cce_idle( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cce_running ) {
                r128_do_cce_flush( dev_priv );
@@ -760,7 +761,7 @@ int r128_engine_reset( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return r128_do_engine_reset( dev );
 }
@@ -807,7 +808,7 @@ int r128_fullscreen( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        drm_r128_fullscreen_t fs;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( fs, (drm_r128_fullscreen_t *)data, sizeof(fs) );
 
@@ -889,7 +890,7 @@ drm_buf_t *r128_freelist_get( drm_device_t *dev )
        for ( i = 0 ; i < dma->buf_count ; i++ ) {
                buf = dma->buflist[i];
                buf_priv = buf->dev_private;
-               if ( buf->pid == 0 )
+               if ( buf->filp == 0 )
                        return buf;
        }
 
@@ -948,7 +949,7 @@ int r128_wait_ring( drm_r128_private_t *dev_priv, int n )
        return DRM_ERR(EBUSY);
 }
 
-static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int r128_cce_get_buffers( DRMFILE filp, drm_device_t *dev, drm_dma_t *d )
 {
        int i;
        drm_buf_t *buf;
@@ -957,7 +958,7 @@ static int r128_cce_get_buffers( drm_device_t *dev, drm_dma_t *d )
                buf = r128_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EAGAIN);
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx,
                                   sizeof(buf->idx) ) )
@@ -978,7 +979,7 @@ int r128_cce_buffers( DRM_IOCTL_ARGS )
        int ret = 0;
        drm_dma_t d;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *) data, sizeof(d) );
 
@@ -1001,7 +1002,7 @@ int r128_cce_buffers( DRM_IOCTL_ARGS )
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = r128_cce_get_buffers( dev, &d );
+               ret = r128_cce_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL((drm_dma_t *) data, d, sizeof(d) );
index 763fcb3..bd91387 100644 (file)
@@ -34,8 +34,8 @@
 #ifndef __R128_DRV_H__
 #define __R128_DRV_H__
 
-#define GET_RING_HEAD(ring)            DRM_READ32(  (volatile u32 *) (ring)->head )
-#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (volatile u32 *) (ring)->head, (val) )
+#define GET_RING_HEAD(ring)            DRM_READ32(  (ring)->ring_rptr, 0 ) /* (ring)->head */
+#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (ring)->ring_rptr, 0, (val) ) /* (ring)->head */
 
 typedef struct drm_r128_freelist {
        unsigned int age;
@@ -56,6 +56,7 @@ typedef struct drm_r128_ring_buffer {
        int space;
 
        int high_mark;
+       drm_local_map_t *ring_rptr;
 } drm_r128_ring_buffer_t;
 
 typedef struct drm_r128_private {
@@ -98,13 +99,13 @@ typedef struct drm_r128_private {
        u32 depth_pitch_offset_c;
        u32 span_pitch_offset_c;
 
-       drm_map_t *sarea;
-       drm_map_t *fb;
-       drm_map_t *mmio;
-       drm_map_t *cce_ring;
-       drm_map_t *ring_rptr;
-       drm_map_t *buffers;
-       drm_map_t *agp_textures;
+       drm_local_map_t *sarea;
+       drm_local_map_t *fb;
+       drm_local_map_t *mmio;
+       drm_local_map_t *cce_ring;
+       drm_local_map_t *ring_rptr;
+       drm_local_map_t *buffers;
+       drm_local_map_t *agp_textures;
 } drm_r128_private_t;
 
 typedef struct drm_r128_buf_priv {
@@ -370,15 +371,10 @@ extern int r128_cce_indirect( DRM_IOCTL_ARGS );
 
 #define R128_PERFORMANCE_BOXES         0
 
-
-#define R128_BASE(reg)         ((unsigned long)(dev_priv->mmio->handle))
-#define R128_ADDR(reg)         (R128_BASE( reg ) + reg)
-
-#define R128_READ(reg)         DRM_READ32(  (volatile u32 *) R128_ADDR(reg) )
-#define R128_WRITE(reg,val)    DRM_WRITE32( (volatile u32 *) R128_ADDR(reg), (val) )
-
-#define R128_READ8(reg)                DRM_READ8(  (volatile u8 *) R128_ADDR(reg) )
-#define R128_WRITE8(reg,val)   DRM_WRITE8( (volatile u8 *) R128_ADDR(reg), (val) )
+#define R128_READ(reg)         DRM_READ32(  dev_priv->mmio, (reg) )
+#define R128_WRITE(reg,val)    DRM_WRITE32( dev_priv->mmio, (reg), (val) )
+#define R128_READ8(reg)                DRM_READ8(   dev_priv->mmio, (reg) )
+#define R128_WRITE8(reg,val)   DRM_WRITE8(  dev_priv->mmio, (reg), (val) )
 
 #define R128_WRITE_PLL(addr,val)                                       \
 do {                                                                   \
@@ -403,15 +399,6 @@ extern int R128_READ_PLL(drm_device_t *dev, int addr);
  * Misc helper macros
  */
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                        \
-               DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );     \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
 #define RING_SPACE_TEST_WITH_RETURN( dev_priv )                                \
 do {                                                                   \
        drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i;          \
@@ -453,7 +440,7 @@ do {                                                                        \
 #if defined(__powerpc__)
 #define r128_flush_write_combine()     (void) GET_RING_HEAD( &dev_priv->ring )
 #else
-#define r128_flush_write_combine()     DRM_WRITEMEMORYBARRIER()
+#define r128_flush_write_combine()     DRM_WRITEMEMORYBARRIER(dev_priv->ring_rptr)
 #endif
 
 
index 68f7306..12c4a0e 100644 (file)
@@ -778,7 +778,8 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
        sarea_priv->nbox = 0;
 }
 
-static int r128_cce_dispatch_blit( drm_device_t *dev,
+static int r128_cce_dispatch_blit( DRMFILE filp,
+                                  drm_device_t *dev,
                                   drm_r128_blit_t *blit )
 {
        drm_r128_private_t *dev_priv = dev->dev_private;
@@ -829,9 +830,9 @@ static int r128_cce_dispatch_blit( drm_device_t *dev,
        buf = dma->buflist[blit->idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -896,7 +897,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
        int count, x, y;
        u32 *buffer;
        u8 *mask;
-       int i;
+       int i, buffer_size, mask_size;
        RING_LOCALS;
        DRM_DEBUG( "\n" );
 
@@ -908,25 +909,25 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
                return DRM_ERR(EFAULT);
        }
 
-       buffer = DRM_MALLOC( depth->n * sizeof(u32) );
+       buffer_size = depth->n * sizeof(u32);
+       buffer = DRM_MALLOC( buffer_size );
        if ( buffer == NULL )
                return DRM_ERR(ENOMEM);
-       if ( DRM_COPY_FROM_USER( buffer, depth->buffer,
-                            depth->n * sizeof(u32) ) ) {
-               DRM_FREE( buffer );
+       if ( DRM_COPY_FROM_USER( buffer, depth->buffer, buffer_size ) ) {
+               DRM_FREE( buffer, buffer_size);
                return DRM_ERR(EFAULT);
        }
 
+       mask_size = depth->n * sizeof(u8);
        if ( depth->mask ) {
-               mask = DRM_MALLOC( depth->n * sizeof(u8) );
+               mask = DRM_MALLOC( mask_size );
                if ( mask == NULL ) {
-                       DRM_FREE( buffer );
+                       DRM_FREE( buffer, buffer_size );
                        return DRM_ERR(ENOMEM);
                }
-               if ( DRM_COPY_FROM_USER( mask, depth->mask,
-                                    depth->n * sizeof(u8) ) ) {
-                       DRM_FREE( buffer );
-                       DRM_FREE( mask );
+               if ( DRM_COPY_FROM_USER( mask, depth->mask, mask_size ) ) {
+                       DRM_FREE( buffer, buffer_size );
+                       DRM_FREE( mask, mask_size );
                        return DRM_ERR(EFAULT);
                }
 
@@ -953,7 +954,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
                        }
                }
 
-               DRM_FREE( mask );
+               DRM_FREE( mask, mask_size );
        } else {
                for ( i = 0 ; i < count ; i++, x++ ) {
                        BEGIN_RING( 6 );
@@ -977,7 +978,7 @@ static int r128_cce_dispatch_write_span( drm_device_t *dev,
                }
        }
 
-       DRM_FREE( buffer );
+       DRM_FREE( buffer, buffer_size );
 
        return 0;
 }
@@ -989,60 +990,62 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
        int count, *x, *y;
        u32 *buffer;
        u8 *mask;
-       int i;
+       int i, xbuf_size, ybuf_size, buffer_size, mask_size;
        RING_LOCALS;
        DRM_DEBUG( "\n" );
 
        count = depth->n;
 
-       x = DRM_MALLOC( count * sizeof(*x) );
+       xbuf_size = count * sizeof(*x);
+       ybuf_size = count * sizeof(*y);
+       x = DRM_MALLOC( xbuf_size );
        if ( x == NULL ) {
                return DRM_ERR(ENOMEM);
        }
-       y = DRM_MALLOC( count * sizeof(*y) );
+       y = DRM_MALLOC( ybuf_size );
        if ( y == NULL ) {
-               DRM_FREE( x );
+               DRM_FREE( x, xbuf_size );
                return DRM_ERR(ENOMEM);
        }
-       if ( DRM_COPY_FROM_USER( x, depth->x, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( x, depth->x, xbuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
-       if ( DRM_COPY_FROM_USER( y, depth->y, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( y, depth->y, xbuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
 
-       buffer = DRM_MALLOC( depth->n * sizeof(u32) );
+       buffer_size = depth->n * sizeof(u32);
+       buffer = DRM_MALLOC( buffer_size );
        if ( buffer == NULL ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(ENOMEM);
        }
-       if ( DRM_COPY_FROM_USER( buffer, depth->buffer,
-                            depth->n * sizeof(u32) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
-               DRM_FREE( buffer );
+       if ( DRM_COPY_FROM_USER( buffer, depth->buffer, buffer_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
+               DRM_FREE( buffer, buffer_size );
                return DRM_ERR(EFAULT);
        }
 
        if ( depth->mask ) {
-               mask = DRM_MALLOC( depth->n * sizeof(u8) );
+               mask_size = depth->n * sizeof(u8);
+               mask = DRM_MALLOC( mask_size );
                if ( mask == NULL ) {
-                       DRM_FREE( x );
-                       DRM_FREE( y );
-                       DRM_FREE( buffer );
+                       DRM_FREE( x, xbuf_size );
+                       DRM_FREE( y, ybuf_size );
+                       DRM_FREE( buffer, buffer_size );
                        return DRM_ERR(ENOMEM);
                }
-               if ( DRM_COPY_FROM_USER( mask, depth->mask,
-                                    depth->n * sizeof(u8) ) ) {
-                       DRM_FREE( x );
-                       DRM_FREE( y );
-                       DRM_FREE( buffer );
-                       DRM_FREE( mask );
+               if ( DRM_COPY_FROM_USER( mask, depth->mask, mask_size ) ) {
+                       DRM_FREE( x, xbuf_size );
+                       DRM_FREE( y, ybuf_size );
+                       DRM_FREE( buffer, buffer_size );
+                       DRM_FREE( mask, mask_size );
                        return DRM_ERR(EFAULT);
                }
 
@@ -1069,7 +1072,7 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
                        }
                }
 
-               DRM_FREE( mask );
+               DRM_FREE( mask, mask_size );
        } else {
                for ( i = 0 ; i < count ; i++ ) {
                        BEGIN_RING( 6 );
@@ -1093,9 +1096,9 @@ static int r128_cce_dispatch_write_pixels( drm_device_t *dev,
                }
        }
 
-       DRM_FREE( x );
-       DRM_FREE( y );
-       DRM_FREE( buffer );
+       DRM_FREE( x, xbuf_size );
+       DRM_FREE( y, ybuf_size );
+       DRM_FREE( buffer, buffer_size );
 
        return 0;
 }
@@ -1146,7 +1149,7 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
 {
        drm_r128_private_t *dev_priv = dev->dev_private;
        int count, *x, *y;
-       int i;
+       int i, xbuf_size, ybuf_size;
        RING_LOCALS;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
@@ -1155,23 +1158,25 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
                count = dev_priv->depth_pitch;
        }
 
-       x = DRM_MALLOC( count * sizeof(*x) );
+       xbuf_size = count * sizeof(*x);
+       ybuf_size = count * sizeof(*y);
+       x = DRM_MALLOC( xbuf_size );
        if ( x == NULL ) {
                return DRM_ERR(ENOMEM);
        }
-       y = DRM_MALLOC( count * sizeof(*y) );
+       y = DRM_MALLOC( ybuf_size );
        if ( y == NULL ) {
-               DRM_FREE( x );
+               DRM_FREE( x, xbuf_size );
                return DRM_ERR(ENOMEM);
        }
-       if ( DRM_COPY_FROM_USER( x, depth->x, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( x, depth->x, xbuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
-       if ( DRM_COPY_FROM_USER( y, depth->y, count * sizeof(int) ) ) {
-               DRM_FREE( x );
-               DRM_FREE( y );
+       if ( DRM_COPY_FROM_USER( y, depth->y, ybuf_size ) ) {
+               DRM_FREE( x, xbuf_size );
+               DRM_FREE( y, ybuf_size );
                return DRM_ERR(EFAULT);
        }
 
@@ -1199,8 +1204,8 @@ static int r128_cce_dispatch_read_pixels( drm_device_t *dev,
                ADVANCE_RING();
        }
 
-       DRM_FREE( x );
-       DRM_FREE( y );
+       DRM_FREE( x, xbuf_size );
+       DRM_FREE( y, ybuf_size );
 
        return 0;
 }
@@ -1240,7 +1245,7 @@ int r128_cce_clear( DRM_IOCTL_ARGS )
        drm_r128_clear_t clear;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_r128_clear_t *) data,
                             sizeof(clear) );
@@ -1266,7 +1271,7 @@ int r128_cce_swap( DRM_IOCTL_ARGS )
        drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1293,7 +1298,7 @@ int r128_cce_vertex( DRM_IOCTL_ARGS )
        drm_r128_buf_priv_t *buf_priv;
        drm_r128_vertex_t vertex;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1324,9 +1329,9 @@ int r128_cce_vertex( DRM_IOCTL_ARGS )
        buf = dma->buflist[vertex.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1353,7 +1358,7 @@ int r128_cce_indices( DRM_IOCTL_ARGS )
        drm_r128_indices_t elts;
        int count;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1383,9 +1388,9 @@ int r128_cce_indices( DRM_IOCTL_ARGS )
        buf = dma->buflist[elts.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1421,7 +1426,7 @@ int r128_cce_blit( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_blit_t blit;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( blit, (drm_r128_blit_t *) data,
                             sizeof(blit) );
@@ -1437,7 +1442,7 @@ int r128_cce_blit( DRM_IOCTL_ARGS )
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       return r128_cce_dispatch_blit( dev, &blit );
+       return r128_cce_dispatch_blit( filp, dev, &blit );
 }
 
 int r128_cce_depth( DRM_IOCTL_ARGS )
@@ -1446,7 +1451,7 @@ int r128_cce_depth( DRM_IOCTL_ARGS )
        drm_r128_private_t *dev_priv = dev->dev_private;
        drm_r128_depth_t depth;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( depth, (drm_r128_depth_t *) data,
                             sizeof(depth) );
@@ -1474,7 +1479,7 @@ int r128_cce_stipple( DRM_IOCTL_ARGS )
        drm_r128_stipple_t stipple;
        u32 mask[32];
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stipple, (drm_r128_stipple_t *) data,
                             sizeof(stipple) );
@@ -1502,7 +1507,7 @@ int r128_cce_indirect( DRM_IOCTL_ARGS )
        RING_LOCALS;
 #endif
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1525,9 +1530,9 @@ int r128_cce_indirect( DRM_IOCTL_ARGS )
        buf = dma->buflist[indirect.idx];
        buf_priv = buf->dev_private;
 
-       if ( buf->pid != DRM_CURRENTPID ) {
+       if ( buf->filp != filp ) {
                DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
index fe71687..d465773 100644 (file)
@@ -51,7 +51,7 @@
 #define DRIVER_DATE            "20020828"
 
 #define DRIVER_MAJOR           1
-#define DRIVER_MINOR           7
+#define DRIVER_MINOR           8
 #define DRIVER_PATCHLEVEL      0
 
 /* Interface history:
@@ -77,6 +77,7 @@
  *       and R200_PP_CUBIC_OFFSET_F1_[0..5].
  *       Added packets R200_EMIT_PP_CUBIC_FACES_[0..5] and
  *       R200_EMIT_PP_CUBIC_OFFSETS_[0..5].  (brian)
+ * 1.8 - Remove need to call cleanup ioctls on last client exit (keith)
  */
 #define DRIVER_IOCTLS                                                       \
  [DRM_IOCTL_NR(DRM_IOCTL_DMA)]               = { radeon_cp_buffers,  1, 0 }, \
  [DRM_IOCTL_NR(DRM_IOCTL_RADEON_IRQ_WAIT)]   = { radeon_irq_wait, 1, 0 },
 
 
-#define USE_IRQS 1
-#if USE_IRQS
-#define __HAVE_DMA_IRQ         1
-#define __HAVE_VBL_IRQ         1
-#define __HAVE_SHARED_IRQ       1
 
 /* When a client dies:
  *    - Check for and clean up flipped page state
  *
  * DRM infrastructure takes care of reclaiming dma buffers.
  */
-#define DRIVER_PRERELEASE() do {                                       \
+#define DRIVER_PRERELEASE()                                            \
+do {                                                                   \
        if ( dev->dev_private ) {                                       \
                drm_radeon_private_t *dev_priv = dev->dev_private;      \
                if ( dev_priv->page_flipping ) {                        \
                        radeon_do_cleanup_pageflip( dev );              \
                }                                                       \
-                radeon_mem_release( dev_priv->agp_heap );              \
+                radeon_mem_release( filp, dev_priv->agp_heap );                \
+                radeon_mem_release( filp, dev_priv->fb_heap );         \
        }                                                               \
 } while (0)
 
-/* On unloading the module:
- *    - Free memory heap structure
- *    - Remove mappings made at startup and free dev_private.
+/* When the last client dies, shut down the CP and free dev->dev_priv.
  */
-#define DRIVER_PRETAKEDOWN() do {                                      \
-       if ( dev->dev_private ) {                                       \
-               drm_radeon_private_t *dev_priv = dev->dev_private;      \
-               radeon_mem_takedown( &(dev_priv->agp_heap) );           \
-               radeon_do_cleanup_cp( dev );                            \
-       }                                                               \
+/* #define __HAVE_RELEASE 1 */
+#define DRIVER_PRETAKEDOWN()                   \
+do {                                           \
+    radeon_do_release( dev );                  \
 } while (0)
 
-#else
-#define __HAVE_DMA_IRQ 0
-#endif
+
 
 /* DMA customization:
  */
 #define __HAVE_DMA             1
+#define __HAVE_DMA_IRQ         1
+#define __HAVE_VBL_IRQ         1
+#define __HAVE_SHARED_IRQ       1
 
 
 /* Buffer customization:
index b4d0e4b..3ec8dfd 100644 (file)
 
 #define RADEON_FIFO_DEBUG      0
 
+#if defined(__alpha__) || defined(__powerpc__)
+# define PCIGART_ENABLED
+#else
+# undef PCIGART_ENABLED
+#endif
 
 
 /* CP microcode (from ATI) */
@@ -880,7 +885,6 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
 
        /* Set the write pointer delay */
        RADEON_WRITE( RADEON_CP_RB_WPTR_DELAY, 0 );
-       RADEON_READ( RADEON_CP_RB_WPTR_DELAY ); /* read back to propagate */
 
        /* Initialize the ring buffer's read and write pointers */
        cur_read_ptr = RADEON_READ( RADEON_CP_RB_RPTR );
@@ -922,11 +926,11 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
        RADEON_WRITE( RADEON_SCRATCH_UMSK, 0x7 );
 
        /* Writeback doesn't seem to work everywhere, test it first */
-       DRM_WRITE32( &dev_priv->scratch[1], 0 );
+       DRM_WRITE32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0 );
        RADEON_WRITE( RADEON_SCRATCH_REG1, 0xdeadbeef );
 
        for ( tmp = 0 ; tmp < dev_priv->usec_timeout ; tmp++ ) {
-               if ( DRM_READ32( &dev_priv->scratch[1] ) == 0xdeadbeef )
+               if ( DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(1) ) == 0xdeadbeef )
                        break;
                DRM_UDELAY( 1 );
        }
@@ -986,6 +990,17 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
 
        dev_priv->is_pci = init->is_pci;
 
+#if !defined(PCIGART_ENABLED)
+       /* PCI support is not 100% working, so we disable it here.
+        */
+       if ( dev_priv->is_pci ) {
+               DRM_ERROR( "PCI GART not yet supported for Radeon!\n" );
+               dev->dev_private = (void *)dev_priv;
+               radeon_do_cleanup_cp(dev);
+               return DRM_ERR(EINVAL);
+       }
+#endif
+
        if ( dev_priv->is_pci && !dev->sg ) {
                DRM_ERROR( "PCI GART memory not allocated!\n" );
                dev->dev_private = (void *)dev_priv;
@@ -1202,6 +1217,7 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
                (dev_priv->ring.size / sizeof(u32)) - 1;
 
        dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
+       dev_priv->ring.ring_rptr = dev_priv->ring_rptr;
 
 #if __REALLY_HAVE_SG
        if ( dev_priv->is_pci ) {
@@ -1307,7 +1323,7 @@ int radeon_cp_start( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( dev_priv->cp_running ) {
                DRM_DEBUG( "%s while CP running\n", __FUNCTION__ );
@@ -1335,10 +1351,13 @@ int radeon_cp_stop( DRM_IOCTL_ARGS )
        int ret;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stop, (drm_radeon_cp_stop_t *)data, sizeof(stop) );
 
+       if (!dev_priv->cp_running)
+               return 0;
+
        /* Flush any pending CP commands.  This ensures any outstanding
         * commands are exectuted by the engine before we turn it off.
         */
@@ -1366,6 +1385,39 @@ int radeon_cp_stop( DRM_IOCTL_ARGS )
        return 0;
 }
 
+
+void radeon_do_release( drm_device_t *dev )
+{
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       int ret;
+
+       if (dev_priv) {
+               if (dev_priv->cp_running) {
+                       /* Stop the cp */
+                       while ((ret = radeon_do_cp_idle( dev_priv )) != 0) {
+                               DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
+#ifdef __linux__
+                               schedule();
+#else
+                               tsleep(&ret, PZERO, "rdnrel", 1);
+#endif
+                       }
+                       radeon_do_cp_stop( dev_priv );
+                       radeon_do_engine_reset( dev );
+               }
+
+               /* Disable *all* interrupts */
+               RADEON_WRITE( RADEON_GEN_INT_CNTL, 0 );
+
+               /* Free memory heap structures */
+               radeon_mem_takedown( &(dev_priv->agp_heap) );
+               radeon_mem_takedown( &(dev_priv->fb_heap) );
+
+               /* deallocate kernel resources */
+               radeon_do_cleanup_cp( dev );
+       }
+}
+
 /* Just reset the CP ring.  Called as part of an X Server engine reset.
  */
 int radeon_cp_reset( DRM_IOCTL_ARGS )
@@ -1374,7 +1426,7 @@ int radeon_cp_reset( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_DEBUG( "%s called before init done\n", __FUNCTION__ );
@@ -1395,10 +1447,7 @@ int radeon_cp_idle( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
-
-/*     if (dev->irq)  */
-/*             radeon_emit_and_wait_irq( dev ); */
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return radeon_do_cp_idle( dev_priv );
 }
@@ -1408,7 +1457,7 @@ int radeon_engine_reset( DRM_IOCTL_ARGS )
        DRM_DEVICE;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        return radeon_do_engine_reset( dev );
 }
@@ -1467,7 +1516,7 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
                for ( i = start ; i < dma->buf_count ; i++ ) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
-                       if ( buf->pid == 0 || (buf->pending && 
+                       if ( buf->filp == 0 || (buf->pending && 
                                               buf_priv->age <= done_age) ) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
@@ -1494,7 +1543,7 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
        drm_buf_t *buf;
        int i, t;
        int start;
-       u32 done_age = DRM_READ32(&dev_priv->scratch[1]);
+       u32 done_age = DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1));
 
        if ( ++dev_priv->last_buf >= dma->buf_count )
                dev_priv->last_buf = 0;
@@ -1506,7 +1555,7 @@ drm_buf_t *radeon_freelist_get( drm_device_t *dev )
                for ( i = start ; i < dma->buf_count ; i++ ) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
-                       if ( buf->pid == 0 || (buf->pending && 
+                       if ( buf->filp == 0 || (buf->pending && 
                                               buf_priv->age <= done_age) ) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
@@ -1571,7 +1620,7 @@ int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n )
        return DRM_ERR(EBUSY);
 }
 
-static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
+static int radeon_cp_get_buffers( DRMFILE filp, drm_device_t *dev, drm_dma_t *d )
 {
        int i;
        drm_buf_t *buf;
@@ -1580,7 +1629,7 @@ static int radeon_cp_get_buffers( drm_device_t *dev, drm_dma_t *d )
                buf = radeon_freelist_get( dev );
                if ( !buf ) return DRM_ERR(EBUSY); /* NOTE: broken client */
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
 
                if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx,
                                   sizeof(buf->idx) ) )
@@ -1601,7 +1650,7 @@ int radeon_cp_buffers( DRM_IOCTL_ARGS )
        int ret = 0;
        drm_dma_t d;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( d, (drm_dma_t *)data, sizeof(d) );
 
@@ -1624,7 +1673,7 @@ int radeon_cp_buffers( DRM_IOCTL_ARGS )
        d.granted_count = 0;
 
        if ( d.request_count ) {
-               ret = radeon_cp_get_buffers( dev, &d );
+               ret = radeon_cp_get_buffers( filp, dev, &d );
        }
 
        DRM_COPY_TO_USER_IOCTL( (drm_dma_t *)data, d, sizeof(d) );
index 635ad14..7faffa7 100644 (file)
@@ -31,8 +31,8 @@
 #ifndef __RADEON_DRV_H__
 #define __RADEON_DRV_H__
 
-#define GET_RING_HEAD(ring)            DRM_READ32(  (volatile u32 *) (ring)->head )
-#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (volatile u32 *) (ring)->head , (val))
+#define GET_RING_HEAD(ring)            DRM_READ32(  (ring)->ring_rptr, 0 ) /* (ring)->head */
+#define SET_RING_HEAD(ring,val)                DRM_WRITE32( (ring)->ring_rptr, 0, (val) ) /* (ring)->head */
 
 typedef struct drm_radeon_freelist {
        unsigned int age;
@@ -53,6 +53,7 @@ typedef struct drm_radeon_ring_buffer {
        int space;
 
        int high_mark;
+       drm_local_map_t *ring_rptr;
 } drm_radeon_ring_buffer_t;
 
 typedef struct drm_radeon_depth_clear_t {
@@ -67,7 +68,7 @@ struct mem_block {
        struct mem_block *prev;
        int start;
        int size;
-       int pid;                /* 0: free, -1: heap, other: real pids */
+       DRMFILE filp;           /* 0: free, -1: heap, other: real files */
 };
 
 typedef struct drm_radeon_private {
@@ -126,13 +127,13 @@ typedef struct drm_radeon_private {
 
        drm_radeon_depth_clear_t depth_clear;
 
-       drm_map_t *sarea;
-       drm_map_t *fb;
-       drm_map_t *mmio;
-       drm_map_t *cp_ring;
-       drm_map_t *ring_rptr;
-       drm_map_t *buffers;
-       drm_map_t *agp_textures;
+       drm_local_map_t *sarea;
+       drm_local_map_t *fb;
+       drm_local_map_t *mmio;
+       drm_local_map_t *cp_ring;
+       drm_local_map_t *ring_rptr;
+       drm_local_map_t *buffers;
+       drm_local_map_t *agp_textures;
 
        struct mem_block *agp_heap;
        struct mem_block *fb_heap;
@@ -183,7 +184,7 @@ extern int radeon_mem_alloc( DRM_IOCTL_ARGS );
 extern int radeon_mem_free( DRM_IOCTL_ARGS );
 extern int radeon_mem_init_heap( DRM_IOCTL_ARGS );
 extern void radeon_mem_takedown( struct mem_block **heap );
-extern void radeon_mem_release( struct mem_block *heap );
+extern void radeon_mem_release( DRMFILE filp, struct mem_block *heap );
 
                                /* radeon_irq.c */
 extern int radeon_irq_emit( DRM_IOCTL_ARGS );
@@ -193,6 +194,7 @@ extern int radeon_emit_and_wait_irq(drm_device_t *dev);
 extern int radeon_wait_irq(drm_device_t *dev, int swi_nr);
 extern int radeon_emit_irq(drm_device_t *dev);
 
+extern void radeon_do_release(drm_device_t *dev);
 
 /* Flags for stats.boxes
  */
@@ -266,8 +268,10 @@ extern int radeon_emit_irq(drm_device_t *dev);
 #define RADEON_SCRATCH_UMSK            0x0770
 #define RADEON_SCRATCH_ADDR            0x0774
 
+#define RADEON_SCRATCHOFF( x )         (RADEON_SCRATCH_REG_OFFSET + 4*(x))
+
 #define GET_SCRATCH( x )       (dev_priv->writeback_works                      \
-                               ? DRM_READ32( &dev_priv->scratch[(x)] )         \
+                               ? DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(x) ) \
                                : RADEON_READ( RADEON_SCRATCH_REG0 + 4*(x) ) )
 
 
@@ -686,15 +690,10 @@ extern int radeon_emit_irq(drm_device_t *dev);
 
 #define RADEON_RING_HIGH_MARK          128
 
-
-#define RADEON_BASE(reg)       ((unsigned long)(dev_priv->mmio->handle))
-#define RADEON_ADDR(reg)       (RADEON_BASE( reg ) + reg)
-
-#define RADEON_READ(reg)       DRM_READ32(  (volatile u32 *) RADEON_ADDR(reg) )
-#define RADEON_WRITE(reg,val)  DRM_WRITE32( (volatile u32 *) RADEON_ADDR(reg), (val) )
-
-#define RADEON_READ8(reg)      DRM_READ8(  (volatile u8 *) RADEON_ADDR(reg) )
-#define RADEON_WRITE8(reg,val) DRM_WRITE8( (volatile u8 *) RADEON_ADDR(reg), (val) )
+#define RADEON_READ(reg)       DRM_READ32(  dev_priv->mmio, (reg) )
+#define RADEON_WRITE(reg,val)  DRM_WRITE32( dev_priv->mmio, (reg), (val) )
+#define RADEON_READ8(reg)      DRM_READ8(  dev_priv->mmio, (reg) )
+#define RADEON_WRITE8(reg,val) DRM_WRITE8( dev_priv->mmio, (reg), (val) )
 
 #define RADEON_WRITE_PLL( addr, val )                                  \
 do {                                                                   \
@@ -771,16 +770,6 @@ extern int RADEON_READ_PLL( drm_device_t *dev, int addr );
  * Misc helper macros
  */
 
-#define LOCK_TEST_WITH_RETURN( dev )                                   \
-do {                                                                   \
-       if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
-            dev->lock.pid != DRM_CURRENTPID ) {                        \
-               DRM_ERROR( "%s called without lock held\n", __FUNCTION__ );     \
-               return DRM_ERR(EINVAL);                         \
-       }                                                               \
-} while (0)
-
-
 /* Perfbox functionality only.  
  */
 #define RING_SPACE_TEST_WITH_RETURN( dev_priv )                                \
@@ -827,43 +816,10 @@ do {                                                                      \
 
 #define RING_LOCALS    int write, _nr; unsigned int mask; u32 *ring;
 
-#if defined(__alpha__)
-#  define RADEON_PAD_RING 16 /* pad ring requests to 16 lw boundaries */
-#else
-#  define RADEON_PAD_RING 0
-#endif
-
-#if RADEON_PAD_RING
-# define radeon_pad_size(n)    \
-       (((RADEON_PAD_RING) - ((n) % (RADEON_PAD_RING))) % (RADEON_PAD_RING))
-# define radeon_pad_ring() do {                                                \
-       if (RADEON_VERBOSE) {                                           \
-               DRM_INFO("Padding ring from %d (%x) with %d words\n",   \
-                        write, write, radeon_pad_size(write));         \
-       }                                                               \
-       switch (radeon_pad_size(write)) {                               \
-       case 0:  /* aligned */                                          \
-               break;                                                  \
-       case 1:  /* 1 word */                                           \
-               OUT_RING(CP_PACKET2());                                 \
-               break;                                                  \
-       default: /* >= 2 words */                                       \
-               OUT_RING(CP_PACKET3(0x1000, radeon_pad_size(write) - 1));\
-               write = (write + radeon_pad_size(write)) & mask;        \
-               write &= mask;                                          \
-               break;                                                  \
-       }                                                               \
-} while(0)
-#else
-# define radeon_pad_size(n) 0
-# define radeon_pad_ring()
-#endif
-
-#define BEGIN_RING( req_n ) do {                                       \
-       int n = req_n + radeon_pad_size(req_n);                         \
+#define BEGIN_RING( n ) do {                                           \
        if ( RADEON_VERBOSE ) {                                         \
-               DRM_INFO( "BEGIN_RING( %d (%d) ) in %s\n",              \
-                          n, req_n, __FUNCTION__ );                    \
+               DRM_INFO( "BEGIN_RING( %d ) in %s\n",                   \
+                          n, __FUNCTION__ );                           \
        }                                                               \
        if ( dev_priv->ring.space <= (n) * sizeof(u32) ) {              \
                 COMMIT_RING();                                         \
@@ -880,7 +836,6 @@ do {                                                                        \
                DRM_INFO( "ADVANCE_RING() wr=0x%06x tail=0x%06x\n",     \
                          write, dev_priv->ring.tail );                 \
        }                                                               \
-       radeon_pad_ring();                                              \
        if (((dev_priv->ring.tail + _nr) & mask) != write) {            \
                DRM_ERROR(                                              \
                        "ADVANCE_RING(): mismatch: nr: %x write: %x line: %d\n",        \
@@ -892,7 +847,7 @@ do {                                                                        \
 
 #define COMMIT_RING() do {                                             \
        /* Flush writes to ring */                                      \
-       DRM_READMEMORYBARRIER();                                        \
+       DRM_READMEMORYBARRIER(dev_priv->mmio);                                  \
        GET_RING_HEAD( &dev_priv->ring );                               \
        RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail );         \
        /* read from PCI bus to ensure correct posting */               \
index 596706b..9199fbb 100644 (file)
@@ -179,7 +179,7 @@ int radeon_irq_emit( DRM_IOCTL_ARGS )
        drm_radeon_irq_emit_t emit;
        int result;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
index 5c07c1a..c3cbd3a 100644 (file)
@@ -40,7 +40,7 @@
  */
 
 static struct mem_block *split_block(struct mem_block *p, int start, int size,
-                                    int pid )
+                                    DRMFILE filp )
 {
        /* Maybe cut off the start of an existing block */
        if (start > p->start) {
@@ -49,7 +49,7 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size,
                        goto out;
                newblock->start = start;
                newblock->size = p->size - (start - p->start);
-               newblock->pid = 0;
+               newblock->filp = 0;
                newblock->next = p->next;
                newblock->prev = p;
                p->next->prev = newblock;
@@ -65,7 +65,7 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size,
                        goto out;
                newblock->start = start + size;
                newblock->size = p->size - size;
-               newblock->pid = 0;
+               newblock->filp = 0;
                newblock->next = p->next;
                newblock->prev = p;
                p->next->prev = newblock;
@@ -75,20 +75,20 @@ static struct mem_block *split_block(struct mem_block *p, int start, int size,
 
  out:
        /* Our block is in the middle */
-       p->pid = pid;
+       p->filp = filp;
        return p;
 }
 
 static struct mem_block *alloc_block( struct mem_block *heap, int size, 
-                                     int align2, int pid )
+                                     int align2, DRMFILE filp )
 {
        struct mem_block *p;
        int mask = (1 << align2)-1;
 
        for (p = heap->next ; p != heap ; p = p->next) {
                int start = (p->start + mask) & ~mask;
-               if (p->pid == 0 && start + size <= p->start + p->size)
-                       return split_block( p, start, size, pid );
+               if (p->filp == 0 && start + size <= p->start + p->size)
+                       return split_block( p, start, size, filp );
        }
 
        return NULL;
@@ -108,38 +108,28 @@ static struct mem_block *find_block( struct mem_block *heap, int start )
 
 static void free_block( struct mem_block *p )
 {
-       p->pid = 0;
+       p->filp = 0;
 
-       /* Assumes a single contiguous range.  Needs a special pid in
+       /* Assumes a single contiguous range.  Needs a special filp in
         * 'heap' to stop it being subsumed.
         */
-       if (p->next->pid == 0) {
+       if (p->next->filp == 0) {
                struct mem_block *q = p->next;
                p->size += q->size;
                p->next = q->next;
                p->next->prev = p;
-               DRM_FREE(q);
+               DRM_FREE(q, sizeof(*q));
        }
 
-       if (p->prev->pid == 0) {
+       if (p->prev->filp == 0) {
                struct mem_block *q = p->prev;
                q->size += p->size;
                q->next = p->next;
                q->next->prev = q;
-               DRM_FREE(p);
+               DRM_FREE(p, sizeof(*q));
        }
 }
 
-static void print_heap( struct mem_block *heap )
-{
-       struct mem_block *p;
-
-       for (p = heap->next ; p != heap ; p = p->next) 
-               DRM_DEBUG("0x%x..0x%x (0x%x) -- owner %d\n",
-                         p->start, p->start + p->size,
-                         p->size, p->pid);
-}
-
 /* Initialize.  How to check for an uninitialized heap?
  */
 static int init_heap(struct mem_block **heap, int start, int size)
@@ -151,47 +141,46 @@ static int init_heap(struct mem_block **heap, int start, int size)
        
        *heap = DRM_MALLOC(sizeof(**heap));
        if (!*heap) {
-               DRM_FREE( blocks );
+               DRM_FREE( blocks, sizeof(*blocks) );
                return -ENOMEM;
        }
 
        blocks->start = start;
        blocks->size = size;
-       blocks->pid = 0;
+       blocks->filp = 0;
        blocks->next = blocks->prev = *heap;
 
        memset( *heap, 0, sizeof(**heap) );
-       (*heap)->pid = -1;
+       (*heap)->filp = (DRMFILE) -1;
        (*heap)->next = (*heap)->prev = blocks;
        return 0;
 }
 
 
-/* Free all blocks associated with the releasing pid.
+/* Free all blocks associated with the releasing file.
  */
-void radeon_mem_release( struct mem_block *heap )
+void radeon_mem_release( DRMFILE filp, struct mem_block *heap )
 {
-       int pid = DRM_CURRENTPID;
        struct mem_block *p;
 
        if (!heap || !heap->next)
                return;
 
        for (p = heap->next ; p != heap ; p = p->next) {
-               if (p->pid == pid
-                       p->pid = 0;
+               if (p->filp == filp
+                       p->filp = 0;
        }
 
-       /* Assumes a single contiguous range.  Needs a special pid in
+       /* Assumes a single contiguous range.  Needs a special filp in
         * 'heap' to stop it being subsumed.
         */
        for (p = heap->next ; p != heap ; p = p->next) {
-               while (p->pid == 0 && p->next->pid == 0) {
+               while (p->filp == 0 && p->next->filp == 0) {
                        struct mem_block *q = p->next;
                        p->size += q->size;
                        p->next = q->next;
                        p->next->prev = p;
-                       DRM_FREE(q);
+                       DRM_FREE(q, sizeof(*q));
                }
        }
 }
@@ -208,10 +197,10 @@ void radeon_mem_takedown( struct mem_block **heap )
        for (p = (*heap)->next ; p != *heap ; ) {
                struct mem_block *q = p;
                p = p->next;
-               DRM_FREE(q);
+               DRM_FREE(q, sizeof(*q));
        }
 
-       DRM_FREE( *heap );
+       DRM_FREE( *heap, sizeof(**heap) );
        *heap = 0;
 }
 
@@ -258,7 +247,7 @@ int radeon_mem_alloc( DRM_IOCTL_ARGS )
                alloc.alignment = 12;
 
        block = alloc_block( *heap, alloc.size, alloc.alignment,
-                            DRM_CURRENTPID );
+                            filp );
 
        if (!block) 
                return DRM_ERR(ENOMEM);
@@ -297,7 +286,7 @@ int radeon_mem_free( DRM_IOCTL_ARGS )
        if (!block)
                return DRM_ERR(EFAULT);
 
-       if (block->pid != DRM_CURRENTPID)
+       if (block->filp != filp)
                return DRM_ERR(EPERM);
 
        free_block( block );    
index d9bc948..86cbead 100644 (file)
@@ -1063,7 +1063,8 @@ static void radeon_cp_dispatch_indices( drm_device_t *dev,
 
 #define RADEON_MAX_TEXTURE_SIZE (RADEON_BUFFER_SIZE - 8 * sizeof(u32))
 
-static int radeon_cp_dispatch_texture( drm_device_t *dev,
+static int radeon_cp_dispatch_texture( DRMFILE filp,
+                                      drm_device_t *dev,
                                       drm_radeon_texture_t *tex,
                                       drm_radeon_tex_image_t *image )
 {
@@ -1216,7 +1217,7 @@ static int radeon_cp_dispatch_texture( drm_device_t *dev,
                        }
                }
 
-               buf->pid = DRM_CURRENTPID;
+               buf->filp = filp;
                buf->used = (dwords + 8) * sizeof(u32);
                radeon_cp_dispatch_indirect( dev, buf, 0, buf->used );
                radeon_cp_discard_buffer( dev, buf );
@@ -1273,7 +1274,7 @@ int radeon_cp_clear( DRM_IOCTL_ARGS )
        drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( clear, (drm_radeon_clear_t *)data,
                             sizeof(clear) );
@@ -1342,7 +1343,7 @@ int radeon_cp_flip( DRM_IOCTL_ARGS )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1362,7 +1363,7 @@ int radeon_cp_swap( DRM_IOCTL_ARGS )
        drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
        DRM_DEBUG( "\n" );
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
 
@@ -1386,7 +1387,7 @@ int radeon_cp_vertex( DRM_IOCTL_ARGS )
        drm_radeon_vertex_t vertex;
        drm_radeon_tcl_prim_t prim;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1416,9 +1417,9 @@ int radeon_cp_vertex( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[vertex.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1473,7 +1474,7 @@ int radeon_cp_indices( DRM_IOCTL_ARGS )
        drm_radeon_tcl_prim_t prim;
        int count;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1503,9 +1504,9 @@ int radeon_cp_indices( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[elts.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1568,7 +1569,7 @@ int radeon_cp_texture( DRM_IOCTL_ARGS )
        drm_radeon_tex_image_t image;
        int ret;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( tex, (drm_radeon_texture_t *)data, sizeof(tex) );
 
@@ -1585,7 +1586,7 @@ int radeon_cp_texture( DRM_IOCTL_ARGS )
        RING_SPACE_TEST_WITH_RETURN( dev_priv );
        VB_AGE_TEST_WITH_RETURN( dev_priv );
 
-       ret = radeon_cp_dispatch_texture( dev, &tex, &image );
+       ret = radeon_cp_dispatch_texture( filp, dev, &tex, &image );
 
        COMMIT_RING();
        return ret;
@@ -1598,7 +1599,7 @@ int radeon_cp_stipple( DRM_IOCTL_ARGS )
        drm_radeon_stipple_t stipple;
        u32 mask[32];
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        DRM_COPY_FROM_USER_IOCTL( stipple, (drm_radeon_stipple_t *)data,
                             sizeof(stipple) );
@@ -1623,7 +1624,7 @@ int radeon_cp_indirect( DRM_IOCTL_ARGS )
        drm_radeon_indirect_t indirect;
        RING_LOCALS;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1645,9 +1646,9 @@ int radeon_cp_indirect( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[indirect.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
        if ( buf->pending ) {
@@ -1700,7 +1701,7 @@ int radeon_cp_vertex2( DRM_IOCTL_ARGS )
        int i;
        unsigned char laststate;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -1725,9 +1726,9 @@ int radeon_cp_vertex2( DRM_IOCTL_ARGS )
 
        buf = dma->buflist[vertex.idx];
 
-       if ( buf->pid != DRM_CURRENTPID ) {
-               DRM_ERROR( "process %d using buffer owned by %d\n",
-                          DRM_CURRENTPID, buf->pid );
+       if ( buf->filp != filp ) {
+               DRM_ERROR( "process %d using buffer owned by %p\n",
+                          DRM_CURRENTPID, buf->filp );
                return DRM_ERR(EINVAL);
        }
 
@@ -2027,7 +2028,7 @@ int radeon_cp_cmdbuf( DRM_IOCTL_ARGS )
        drm_radeon_cmd_header_t header;
        int orig_nbox;
 
-       LOCK_TEST_WITH_RETURN( dev );
+       LOCK_TEST_WITH_RETURN( dev, filp );
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -2096,8 +2097,9 @@ int radeon_cp_cmdbuf( DRM_IOCTL_ARGS )
                        }
 
                        buf = dma->buflist[idx];
-                       if ( buf->pid != DRM_CURRENTPID || buf->pending ) {
-                               DRM_ERROR( "bad buffer\n" );
+                       if ( buf->filp != filp || buf->pending ) {
+                               DRM_ERROR( "bad buffer %p %p %d\n",
+                                          buf->filp, filp, buf->pending);
                                return DRM_ERR(EINVAL);
                        }