Merge branch 'radeon-ttm' of git://people.freedesktop.org/~airlied/drm into modesetti...
authorJerome Glisse <glisse@freedesktop.org>
Sat, 27 Oct 2007 22:55:27 +0000 (00:55 +0200)
committerJerome Glisse <glisse@freedesktop.org>
Sat, 27 Oct 2007 22:55:27 +0000 (00:55 +0200)
Conflicts:

linux-core/Makefile.kernel
linux-core/drmP.h
shared-core/radeon_cp.c
shared-core/radeon_drv.h
shared-core/radeon_irq.c

modified:   linux-core/Makefile.kernel
modified:   linux-core/ati_pcigart.c
modified:   linux-core/drmP.h
new file:   linux-core/radeon_buffer.c
modified:   linux-core/radeon_drv.c
new file:   linux-core/radeon_fence.c
modified:   shared-core/radeon_cp.c
modified:   shared-core/radeon_drm.h
modified:   shared-core/radeon_drv.h
modified:   shared-core/radeon_irq.c
modified:   tests/ttmtest/src/ttmtest.c

1  2 
linux-core/Makefile.kernel
linux-core/ati_pcigart.c
linux-core/drmP.h
linux-core/radeon_buffer.c
linux-core/radeon_drv.c
linux-core/radeon_fence.c
shared-core/radeon_cp.c
shared-core/radeon_drm.h
shared-core/radeon_drv.h
shared-core/radeon_irq.c

@@@ -13,26 -13,21 +13,26 @@@ drm-objs    := drm_auth.o drm_bufs.o dr
                drm_sysfs.o drm_pci.o drm_agpsupport.o drm_scatter.o \
                drm_memory_debug.o ati_pcigart.o drm_sman.o \
                drm_hashtab.o drm_mm.o drm_object.o drm_compat.o \
 -              drm_fence.o drm_ttm.o drm_bo.o drm_bo_move.o
 +              drm_fence.o drm_ttm.o drm_bo.o drm_bo_move.o drm_crtc.o \
 +              drm_edid.o drm_modes.o drm_bo_lock.o
  tdfx-objs   := tdfx_drv.o
  r128-objs   := r128_drv.o r128_cce.o r128_state.o r128_irq.o
  mga-objs    := mga_drv.o mga_dma.o mga_state.o mga_warp.o mga_irq.o
  i810-objs   := i810_drv.o i810_dma.o
  i915-objs   := i915_drv.o i915_dma.o i915_irq.o i915_mem.o i915_fence.o \
 -              i915_buffer.o
 +              i915_buffer.o intel_display.o intel_crt.o intel_lvds.o \
 +              intel_sdvo.o intel_modes.o intel_i2c.o i915_init.o intel_fb.o
  nouveau-objs := nouveau_drv.o nouveau_state.o nouveau_fifo.o nouveau_mem.o \
 -              nouveau_object.o nouveau_irq.o \
 +              nouveau_object.o nouveau_irq.o nouveau_notifier.o nouveau_swmthd.o \
 +              nouveau_sgdma.o nouveau_dma.o \
                nv04_timer.o \
 -              nv04_mc.o nv40_mc.o \
 +              nv04_mc.o nv40_mc.o nv50_mc.o \
                nv04_fb.o nv10_fb.o nv40_fb.o \
 -              nv04_graph.o nv10_graph.o nv20_graph.o nv30_graph.o \
 -              nv40_graph.o
 +              nv04_fifo.o nv10_fifo.o nv40_fifo.o nv50_fifo.o \
 +              nv04_graph.o nv10_graph.o nv20_graph.o \
 +              nv40_graph.o nv50_graph.o \
 +              nv04_instmem.o nv50_instmem.o
- radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o
+ radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o radeon_fence.o radeon_buffer.o
  sis-objs    := sis_drv.o sis_mm.o
  ffb-objs    := ffb_drv.o ffb_context.o
  savage-objs := savage_drv.o savage_bci.o savage_state.o
@@@ -40,8 -35,6 +40,8 @@@ via-objs    := via_irq.o via_drv.o via_
                via_video.o via_dmablit.o via_fence.o via_buffer.o
  mach64-objs := mach64_drv.o mach64_dma.o mach64_irq.o mach64_state.o
  nv-objs := nv_drv.o
 +xgi-objs    := xgi_cmdlist.o xgi_drv.o xgi_fb.o xgi_misc.o xgi_pcie.o \
 +              xgi_fence.o
  
  ifeq ($(CONFIG_COMPAT),y)
  drm-objs    += drm_ioc32.o
@@@ -50,7 -43,6 +50,7 @@@ mga-objs    += mga_ioc32.
  r128-objs   += r128_ioc32.o
  i915-objs   += i915_ioc32.o
  nouveau-objs += nouveau_ioc32.o
 +xgi-objs    += xgi_ioc32.o
  endif
  
  obj-m                 += drm.o
@@@ -67,4 -59,3 +67,4 @@@ obj-$(CONFIG_DRM_VIA)   += via.
  obj-$(CONFIG_DRM_MACH64)+= mach64.o
  obj-$(CONFIG_DRM_NV)    += nv.o
  obj-$(CONFIG_DRM_NOUVEAU) += nouveau.o
 +obj-$(CONFIG_DRM_XGI)   += xgi.o
diff --combined linux-core/ati_pcigart.c
  
  # define ATI_PCIGART_PAGE_SIZE                4096    /**< PCI GART page size */
  
+ static __inline__ void insert_page_into_table(struct ati_pcigart_info *info, u32 page_base, u32 *pci_gart)
+ {
+       switch(info->gart_reg_if) {
+       case DRM_ATI_GART_IGP:
+               *pci_gart = cpu_to_le32((page_base) | 0xc);
+               break;
+       case DRM_ATI_GART_PCIE:
+               *pci_gart = cpu_to_le32((page_base >> 8) | 0xc);
+               break;
+       default:
+       case DRM_ATI_GART_PCI:
+               *pci_gart = cpu_to_le32(page_base);
+               break;
+       }
+ }
+ static __inline__ u32 get_page_base_from_table(struct ati_pcigart_info *info, u32 *pci_gart)
+ {
+       u32 retval;
+       switch(info->gart_reg_if) {
+       case DRM_ATI_GART_IGP:
+               retval = *pci_gart;
+               retval &= ~0xc;
+               break;
+       case DRM_ATI_GART_PCIE:
+               retval = *pci_gart;
+               retval &= ~0xc;
+               retval <<= 8;
+               break;
+       default:
+       case DRM_ATI_GART_PCI:
+               retval = *pci_gart;
+               break;
+       }
+       return retval;
+ }
  static void *drm_ati_alloc_pcigart_table(int order)
  {
        unsigned long address;
@@@ -81,9 -120,9 +120,9 @@@ static void drm_ati_free_pcigart_table(
        free_pages((unsigned long)address, order);
  }
  
 -int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
 +int drm_ati_pcigart_cleanup(struct drm_device *dev, struct ati_pcigart_info *gart_info)
  {
 -      drm_sg_mem_t *entry = dev->sg;
 +      struct drm_sg_mem *entry = dev->sg;
        unsigned long pages;
        int i;
        int order;
  }
  EXPORT_SYMBOL(drm_ati_pcigart_cleanup);
  
 -int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
 +int drm_ati_pcigart_init(struct drm_device *dev, struct ati_pcigart_info *gart_info)
  {
 -      drm_sg_mem_t *entry = dev->sg;
 +      struct drm_sg_mem *entry = dev->sg;
        void *address = NULL;
        unsigned long pages;
        u32 *pci_gart, page_base, bus_address = 0;
                page_base = (u32) entry->busaddr[i];
  
                for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
-                       switch(gart_info->gart_reg_if) {
-                       case DRM_ATI_GART_IGP:
-                               *pci_gart = cpu_to_le32((page_base) | 0xc);
-                               break;
-                       case DRM_ATI_GART_PCIE:
-                               *pci_gart = cpu_to_le32((page_base >> 8) | 0xc);
-                               break;
-                       default:
-                       case DRM_ATI_GART_PCI:
-                               *pci_gart = cpu_to_le32(page_base);
-                               break;
-                       }
+                       insert_page_into_table(gart_info, page_base, pci_gart);
                        pci_gart++;
                        page_base += ATI_PCIGART_PAGE_SIZE;
                }
        return ret;
  }
  EXPORT_SYMBOL(drm_ati_pcigart_init);
 -static int ati_pcigart_bind_ttm(drm_ttm_backend_t *backend,
 -                              unsigned long offset,
 -                              int cached)
+ static int ati_pcigart_needs_unbind_cache_adjust(drm_ttm_backend_t *backend)
+ {
+       return ((backend->flags & DRM_BE_FLAG_BOUND_CACHED) ? 0 : 1);
+ }
+ static int ati_pcigart_populate(drm_ttm_backend_t *backend,
+                               unsigned long num_pages,
+                               struct page **pages)
+ {
+       ati_pcigart_ttm_backend_t *atipci_be =
+               container_of(backend, ati_pcigart_ttm_backend_t, backend);
+       DRM_ERROR("%ld\n", num_pages);
+       atipci_be->pages = pages;
+       atipci_be->num_pages = num_pages;
+       atipci_be->populated = 1;
+       return 0;
+ }
 -      DRM_ERROR("Offset is %08lX\n", offset);
++static int ati_pcigart_bind_ttm(struct drm_ttm_backend *backend,
++                              struct drm_bo_mem_reg *bo_mem)
+ {
+       ati_pcigart_ttm_backend_t *atipci_be =
+               container_of(backend, ati_pcigart_ttm_backend_t, backend);
+         off_t j;
+       int i;
+       struct ati_pcigart_info *info = atipci_be->gart_info;
+       u32 *pci_gart;
+       u32 page_base;
++      unsigned long offset = bo_mem->mm_node->start;
+       pci_gart = info->addr;
 -static drm_ttm_backend_func_t ati_pcigart_ttm_backend = 
++      DRM_ERROR("Offset is %08lX\n", bo_mem->mm_node->start);
+         j = offset;
+         while (j < (offset + atipci_be->num_pages)) {
+               if (get_page_base_from_table(info, pci_gart+j))
+                       return -EBUSY;
+                 j++;
+         }
+         for (i = 0, j = offset; i < atipci_be->num_pages; i++, j++) {
+               struct page *cur_page = atipci_be->pages[i];
+                 /* write value */
+               page_base = page_to_phys(cur_page);
+               insert_page_into_table(info, page_base, pci_gart + j);
+         }
+ #if defined(__i386__) || defined(__x86_64__)
+       wbinvd();
+ #else
+       mb();
+ #endif
+       atipci_be->gart_flush_fn(atipci_be->dev);
+       atipci_be->bound = 1;
+       atipci_be->offset = offset;
+         /* need to traverse table and add entries */
+       DRM_DEBUG("\n");
+       return 0;
+ }
+ static int ati_pcigart_unbind_ttm(drm_ttm_backend_t *backend)
+ {
+       ati_pcigart_ttm_backend_t *atipci_be =
+               container_of(backend, ati_pcigart_ttm_backend_t, backend);
+       struct ati_pcigart_info *info = atipci_be->gart_info;   
+       unsigned long offset = atipci_be->offset;
+       int i;
+       off_t j;
+       u32 *pci_gart = info->addr;
+       DRM_DEBUG("\n");
+       if (atipci_be->bound != 1)
+               return -EINVAL;
+       for (i = 0, j = offset; i < atipci_be->num_pages; i++, j++) {
+               *(pci_gart + j) = 0;
+       }
+       atipci_be->gart_flush_fn(atipci_be->dev);
+       atipci_be->bound = 0;
+       atipci_be->offset = 0;
+       return 0;
+ }
+ static void ati_pcigart_clear_ttm(drm_ttm_backend_t *backend)
+ {
+       ati_pcigart_ttm_backend_t *atipci_be =
+               container_of(backend, ati_pcigart_ttm_backend_t, backend);
+       DRM_DEBUG("\n");        
+       if (atipci_be->pages) {
+               backend->func->unbind(backend);
+               atipci_be->pages = NULL;
+       }
+       atipci_be->num_pages = 0;
+ }
+ static void ati_pcigart_destroy_ttm(drm_ttm_backend_t *backend)
+ {
+       ati_pcigart_ttm_backend_t *atipci_be;
+       if (backend) {
+               DRM_DEBUG("\n");
+               atipci_be = container_of(backend, ati_pcigart_ttm_backend_t, backend);
+               if (atipci_be) {
+                       if (atipci_be->pages) {
+                               backend->func->clear(backend);
+                       }
+                       drm_ctl_free(atipci_be, sizeof(*atipci_be), DRM_MEM_TTM);
+               }
+       }
+ }
 -drm_ttm_backend_t *ati_pcigart_init_ttm(struct drm_device *dev, struct ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev))
++static struct drm_ttm_backend_func ati_pcigart_ttm_backend = 
+ {
+       .needs_ub_cache_adjust = ati_pcigart_needs_unbind_cache_adjust,
+       .populate = ati_pcigart_populate,
+       .clear = ati_pcigart_clear_ttm,
+       .bind = ati_pcigart_bind_ttm,
+       .unbind = ati_pcigart_unbind_ttm,
+       .destroy =  ati_pcigart_destroy_ttm,
+ };
 -      atipci_be->backend.mem_type = DRM_BO_MEM_TT;
++struct drm_ttm_backend *ati_pcigart_init_ttm(struct drm_device *dev, struct ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev))
+ {
+       ati_pcigart_ttm_backend_t *atipci_be;
+       atipci_be = drm_ctl_calloc(1, sizeof (*atipci_be), DRM_MEM_TTM);
+       if (!atipci_be)
+               return NULL;
+       
+       atipci_be->populated = 0;
+       atipci_be->backend.func = &ati_pcigart_ttm_backend;
+       atipci_be->gart_info = info;
+       atipci_be->gart_flush_fn = gart_flush_fn;
+       atipci_be->dev = dev;
+       return &atipci_be->backend;
+ }
+ EXPORT_SYMBOL(ati_pcigart_init_ttm);
diff --combined linux-core/drmP.h
@@@ -84,8 -84,6 +84,8 @@@
  #include "drm_os_linux.h"
  #include "drm_hashtab.h"
  
 +struct drm_file;
 +
  /* If you want the memory alloc debug functionality, change define below */
  /* #define DEBUG_MEMORY */
  
  
  #include "drm_compat.h"
  
 +#include "drm_crtc.h"
 +
  /***********************************************************************/
  /** \name Macros to make printk easier */
  /*@{*/
   * Test that the hardware lock is held by the caller, returning otherwise.
   *
   * \param dev DRM device.
 - * \param filp file pointer of the caller.
 + * \param file_priv DRM file private pointer of the caller.
   */
 -#define LOCK_TEST_WITH_RETURN( dev, filp )                            \
 +#define LOCK_TEST_WITH_RETURN( dev, file_priv )                               \
  do {                                                                  \
        if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) ||           \
 -           dev->lock.filp != filp )   {                               \
 +           dev->lock.file_priv != file_priv ) {                       \
                DRM_ERROR( "%s called without lock held, held  %d owner %p %p\n",\
                           __FUNCTION__, _DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ),\
 -                         dev->lock.filp, filp );                      \
 +                         dev->lock.file_priv, file_priv );            \
                return -EINVAL;                                         \
        }                                                               \
  } while (0)
                        return -EFAULT;                                 \
        }
  
 +struct drm_device;
 +struct drm_file;
 +
  /**
   * Ioctl function type.
   *
 - * \param inode device inode.
 - * \param filp file pointer.
 - * \param cmd command.
 - * \param arg argument.
 + * \param dev DRM device structure
 + * \param data pointer to kernel-space stored data, copied in and out according
 + *           to ioctl description.
 + * \param file_priv DRM file private pointer.
   */
 -typedef int drm_ioctl_t(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 +typedef int drm_ioctl_t(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
  
  typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
                               unsigned long arg);
  #define DRM_MASTER      0x2
  #define DRM_ROOT_ONLY   0x4
  
 -typedef struct drm_ioctl_desc {
 +struct drm_ioctl_desc {
 +      unsigned int cmd;
        drm_ioctl_t *func;
        int flags;
 -} drm_ioctl_desc_t;
 -
 -typedef struct drm_devstate {
 -      pid_t owner;                    /**< X server pid holding x_lock */
 -} drm_devstate_t;
 +};
 +/**
 + * Creates a driver or general drm_ioctl_desc array entry for the given
 + * ioctl, for use by drm_ioctl().
 + */
 +#define DRM_IOCTL_DEF(ioctl, func, flags) \
 +      [DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags}
  
 -typedef struct drm_magic_entry {
 +struct drm_magic_entry {
        struct list_head head;
 -      drm_hash_item_t hash_item;
 +      struct drm_hash_item hash_item;
        struct drm_file *priv;
 -} drm_magic_entry_t;
 +};
  
 -typedef struct drm_vma_entry {
 +struct drm_vma_entry {
        struct list_head head;
        struct vm_area_struct *vma;
        pid_t pid;
 -} drm_vma_entry_t;
 +};
  
  /**
   * DMA buffer.
   */
 -typedef struct drm_buf {
 +struct drm_buf {
        int idx;                       /**< Index into master buflist */
        int total;                     /**< Buffer size */
        int order;                     /**< log-base-2(total) */
        __volatile__ int waiting;      /**< On kernel DMA queue */
        __volatile__ int pending;      /**< On hardware DMA queue */
        wait_queue_head_t dma_wait;    /**< Processes waiting */
 -      struct file *filp;             /**< Pointer to holding file descr */
 +      struct drm_file *file_priv;    /**< Private of holding file descr */
        int context;                   /**< Kernel queue for this buffer */
        int while_locked;              /**< Dispatch this buffer while locked */
        enum {
  
        int dev_priv_size;              /**< Size of buffer private storage */
        void *dev_private;              /**< Per-buffer private storage */
 -} drm_buf_t;
 +};
  
  /** bufs is one longer than it has to be */
 -typedef struct drm_waitlist {
 +struct drm_waitlist {
        int count;                      /**< Number of possible buffers */
 -      drm_buf_t **bufs;               /**< List of pointers to buffers */
 -      drm_buf_t **rp;                 /**< Read pointer */
 -      drm_buf_t **wp;                 /**< Write pointer */
 -      drm_buf_t **end;                /**< End pointer */
 +      struct drm_buf **bufs;          /**< List of pointers to buffers */
 +      struct drm_buf **rp;                    /**< Read pointer */
 +      struct drm_buf **wp;                    /**< Write pointer */
 +      struct drm_buf **end;           /**< End pointer */
        spinlock_t read_lock;
        spinlock_t write_lock;
 -} drm_waitlist_t;
 +};
  
 -typedef struct drm_freelist {
 +struct drm_freelist {
        int initialized;               /**< Freelist in use */
        atomic_t count;                /**< Number of free buffers */
 -      drm_buf_t *next;               /**< End pointer */
 +      struct drm_buf *next;          /**< End pointer */
  
        wait_queue_head_t waiting;     /**< Processes waiting on free bufs */
        int low_mark;                  /**< Low water mark */
        int high_mark;                 /**< High water mark */
        atomic_t wfh;                  /**< If waiting for high mark */
        spinlock_t lock;
 -} drm_freelist_t;
 +};
  
  typedef struct drm_dma_handle {
        dma_addr_t busaddr;
  /**
   * Buffer entry.  There is one of this for each buffer size order.
   */
 -typedef struct drm_buf_entry {
 +struct drm_buf_entry {
        int buf_size;                   /**< size */
        int buf_count;                  /**< number of buffers */
 -      drm_buf_t *buflist;             /**< buffer list */
 +      struct drm_buf *buflist;                /**< buffer list */
        int seg_count;
        int page_order;
 -      drm_dma_handle_t **seglist;
 -      drm_freelist_t freelist;
 -} drm_buf_entry_t;
 +      struct drm_dma_handle **seglist;
 +      struct drm_freelist freelist;
 +};
  
  /*
   * This should be small enough to allow the use of kmalloc for hash tables
   */
  
  #define DRM_FILE_HASH_ORDER 8
 -typedef enum{
 +enum drm_ref_type {
        _DRM_REF_USE=0,
        _DRM_REF_TYPE1,
        _DRM_NO_REF_TYPES
 -} drm_ref_t;
 +};
  
  
  /** File private data */
 -typedef struct drm_file {
 +struct drm_file {
        int authenticated;
        int master;
        int minor;
         */
  
        struct list_head refd_objects;
 -      struct list_head user_objects;
  
 -      drm_open_hash_t refd_object_hash[_DRM_NO_REF_TYPES];
 +      struct drm_open_hash refd_object_hash[_DRM_NO_REF_TYPES];
 +      struct file *filp;
        void *driver_priv;
 -} drm_file_t;
 +
 +      struct list_head fbs;
 +};
  
  /** Wait queue */
 -typedef struct drm_queue {
 +struct drm_queue {
        atomic_t use_count;             /**< Outstanding uses (+1) */
        atomic_t finalization;          /**< Finalization in progress */
        atomic_t block_count;           /**< Count of processes waiting */
        atomic_t total_flushed;         /**< Total flushes statistic */
        atomic_t total_locks;           /**< Total locks statistics */
  #endif
 -      drm_ctx_flags_t flags;          /**< Context preserving and 2D-only */
 -      drm_waitlist_t waitlist;        /**< Pending buffers */
 +      enum drm_ctx_flags flags;       /**< Context preserving and 2D-only */
 +      struct drm_waitlist waitlist;   /**< Pending buffers */
        wait_queue_head_t flush_queue;  /**< Processes waiting until flush */
 -} drm_queue_t;
 +};
  
  /**
   * Lock data.
   */
 -typedef struct drm_lock_data {
 -      drm_hw_lock_t *hw_lock;         /**< Hardware lock */
 -      struct file *filp;              /**< File descr of lock holder (0=kernel) */
 +struct drm_lock_data {
 +      struct drm_hw_lock *hw_lock;            /**< Hardware lock */
 +      /** Private of lock holder's file (NULL=kernel) */
 +      struct drm_file *file_priv;
        wait_queue_head_t lock_queue;   /**< Queue of blocked processes */
        unsigned long lock_time;        /**< Time of last lock in jiffies */
        spinlock_t spinlock;
        uint32_t kernel_waiters;
        uint32_t user_waiters;
        int idle_has_lock;
 -} drm_lock_data_t;
 +};
  
  /**
   * DMA data.
   */
 -typedef struct drm_device_dma {
 +struct drm_device_dma {
  
 -      drm_buf_entry_t bufs[DRM_MAX_ORDER + 1]; /**< buffers, grouped by their size order */
 +      struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];   /**< buffers, grouped by their size order */
        int buf_count;                  /**< total number of buffers */
 -      drm_buf_t **buflist;            /**< Vector of pointers into drm_device_dma::bufs */
 +      struct drm_buf **buflist;               /**< Vector of pointers into drm_device_dma::bufs */
        int seg_count;
        int page_count;                 /**< number of pages */
        unsigned long *pagelist;        /**< page list */
                _DRM_DMA_USE_PCI_RO = 0x08
        } flags;
  
 -} drm_device_dma_t;
 +};
  
  /**
   * AGP memory entry.  Stored as a doubly linked list.
   */
 -typedef struct drm_agp_mem {
 +struct drm_agp_mem {
        unsigned long handle;           /**< handle */
        DRM_AGP_MEM *memory;
        unsigned long bound;            /**< address */
        int pages;
        struct list_head head;
 -} drm_agp_mem_t;
 +};
  
  /**
   * AGP data.
   *
   * \sa drm_agp_init)() and drm_device::agp.
   */
 -typedef struct drm_agp_head {
 +struct drm_agp_head {
        DRM_AGP_KERN agp_info;          /**< AGP device information */
        struct list_head memory;
        unsigned long mode;             /**< AGP mode */
        int agp_mtrr;
        int cant_use_aperture;
        unsigned long page_mask;
 -} drm_agp_head_t;
 +};
  
  /**
   * Scatter-gather memory.
   */
 -typedef struct drm_sg_mem {
 +struct drm_sg_mem {
        unsigned long handle;
        void *virtual;
        int pages;
        struct page **pagelist;
        dma_addr_t *busaddr;
 -} drm_sg_mem_t;
 +};
  
 -typedef struct drm_sigdata {
 +struct drm_sigdata {
        int context;
 -      drm_hw_lock_t *lock;
 -} drm_sigdata_t;
 +      struct drm_hw_lock *lock;
 +};
  
  
  /*
   * Generic memory manager structs
   */
  
 -typedef struct drm_mm_node {
 +struct drm_mm_node {
        struct list_head fl_entry;
        struct list_head ml_entry;
        int free;
        unsigned long size;
        struct drm_mm *mm;
        void *private;
 -} drm_mm_node_t;
 +};
  
 -typedef struct drm_mm {
 +struct drm_mm {
        struct list_head fl_entry;
        struct list_head ml_entry;
 -} drm_mm_t;
 +};
  
  
  /**
   * Mappings list
   */
 -typedef struct drm_map_list {
 +struct drm_map_list {
        struct list_head head;          /**< list head */
 -      drm_hash_item_t hash;
 -      drm_map_t *map;                 /**< mapping */
 -      drm_u64_t user_token;
 -      drm_mm_node_t *file_offset_node;
 -} drm_map_list_t;
 +      struct drm_hash_item hash;
 +      struct drm_map *map;                    /**< mapping */
 +      uint64_t user_token;
 +      struct drm_mm_node *file_offset_node;
 +};
  
 -typedef drm_map_t drm_local_map_t;
 +typedef struct drm_map drm_local_map_t;
  
  /**
   * Context handle list
   */
 -typedef struct drm_ctx_list {
 +struct drm_ctx_list {
        struct list_head head;          /**< list head */
        drm_context_t handle;           /**< context handle */
 -      drm_file_t *tag;                /**< associated fd private data */
 -} drm_ctx_list_t;
 -
 -struct drm_ctx_sarea_list {
 -      struct list_head head;
 -      int ctx_id;
 -      drm_map_t *map;
 +      struct drm_file *tag;           /**< associated fd private data */
  };
  
 -typedef struct drm_vbl_sig {
 +struct drm_vbl_sig {
        struct list_head head;
        unsigned int sequence;
        struct siginfo info;
        struct task_struct *task;
 -} drm_vbl_sig_t;
 +};
  
  /* location of GART table */
  #define DRM_ATI_GART_MAIN 1
  #define DRM_ATI_GART_PCIE 2
  #define DRM_ATI_GART_IGP 3
  
 -typedef struct ati_pcigart_info {
 +struct ati_pcigart_info {
        int gart_table_location;
        int gart_reg_if;
        void *addr;
        dma_addr_t bus_addr;
        drm_local_map_t mapping;
        int table_size;
 -} drm_ati_pcigart_info;
 -
 -struct drm_drawable_list {
 -      struct list_head head;
 -      int id;
 -      drm_drawable_info_t info;
  };
  
  #include "drm_objects.h"
   * in this family
   */
  
 -struct drm_device;
  struct drm_driver {
        int (*load) (struct drm_device *, unsigned long flags);
        int (*firstopen) (struct drm_device *);
 -      int (*open) (struct drm_device *, drm_file_t *);
 -      void (*preclose) (struct drm_device *, struct file * filp);
 -      void (*postclose) (struct drm_device *, drm_file_t *);
 +      int (*open) (struct drm_device *, struct drm_file *);
 +      void (*preclose) (struct drm_device *, struct drm_file *file_priv);
 +      void (*postclose) (struct drm_device *, struct drm_file *);
        void (*lastclose) (struct drm_device *);
        int (*unload) (struct drm_device *);
 -      int (*dma_ioctl) (DRM_IOCTL_ARGS);
 +      int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
        void (*dma_ready) (struct drm_device *);
        int (*dma_quiescent) (struct drm_device *);
        int (*context_ctor) (struct drm_device * dev, int context);
        void (*irq_preinstall) (struct drm_device * dev);
        void (*irq_postinstall) (struct drm_device * dev);
        void (*irq_uninstall) (struct drm_device * dev);
 -      void (*reclaim_buffers) (struct drm_device *dev, struct file * filp);
 +      void (*reclaim_buffers) (struct drm_device *dev,
 +                               struct drm_file *file_priv);
        void (*reclaim_buffers_locked) (struct drm_device *dev,
 -                                      struct file * filp);
 +                                      struct drm_file *file_priv);
        void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
 -                                      struct file * filp);
 -      unsigned long (*get_map_ofs) (drm_map_t * map);
 +                                          struct drm_file *file_priv);
 +      unsigned long (*get_map_ofs) (struct drm_map * map);
        unsigned long (*get_reg_ofs) (struct drm_device * dev);
 -      void (*set_version) (struct drm_device * dev, drm_set_version_t * sv);
 +      void (*set_version) (struct drm_device * dev, struct drm_set_version * sv);
 +
 +      /* FB routines, if present */
 +      int (*fb_probe)(struct drm_device *dev, struct drm_crtc *crtc);
 +      int (*fb_remove)(struct drm_device *dev, struct drm_crtc *crtc);
  
        struct drm_fence_driver *fence_driver;
        struct drm_bo_driver *bo_driver;
  /* variables */
        u32 driver_features;
        int dev_priv_size;
 -      drm_ioctl_desc_t *ioctls;
 +      struct drm_ioctl_desc *ioctls;
        int num_ioctls;
        struct file_operations fops;
        struct pci_driver pci_driver;
   * that may contain multiple heads. Embed one per head of these in the
   * private drm_device structure.
   */
 -typedef struct drm_head {
 +struct drm_head {
        int minor;                      /**< Minor device number */
        struct drm_device *dev;
        struct proc_dir_entry *dev_root;  /**< proc directory entry */
        dev_t device;                   /**< Device number for mknod */
        struct class_device *dev_class;
 -} drm_head_t;
 +};
  
  
  /**
   * DRM device structure. This structure represent a complete card that
   * may contain multiple heads.
   */
 -typedef struct drm_device {
 +struct drm_device {
        char *unique;                   /**< Unique identifier: e.g., busid */
        int unique_len;                 /**< Length of unique field */
        char *devname;                  /**< For /proc/interrupts */
        /** \name Performance counters */
        /*@{ */
        unsigned long counters;
 -      drm_stat_type_t types[15];
 +      enum drm_stat_type types[15];
        atomic_t counts[15];
        /*@} */
  
        /** \name Authentication */
        /*@{ */
        struct list_head filelist;
 -      drm_open_hash_t magiclist;
 +      struct drm_open_hash magiclist;
        struct list_head magicfree;
        /*@} */
  
        /*@{ */
        struct list_head maplist;       /**< Linked list of regions */
        int map_count;                  /**< Number of mappable regions */
 -      drm_open_hash_t map_hash;       /**< User token hash table for maps */
 -      drm_mm_t offset_manager;        /**< User token manager */
 -      drm_open_hash_t object_hash;    /**< User token hash table for objects */
 +      struct drm_open_hash map_hash;       /**< User token hash table for maps */
 +      struct drm_mm offset_manager;        /**< User token manager */
 +      struct drm_open_hash object_hash;    /**< User token hash table for objects */
        struct address_space *dev_mapping;  /**< For unmap_mapping_range() */
        struct page *ttm_dummy_page;
  
        struct mutex ctxlist_mutex;     /**< For ctxlist */
  
        struct idr ctx_idr;
 -      struct list_head context_sarealist;
  
        struct list_head vmalist;       /**< List of vmas (for debugging) */
 -      drm_lock_data_t lock;           /**< Information on hardware lock */
 +      struct drm_lock_data lock;              /**< Information on hardware lock */
        /*@} */
  
        /** \name DMA queues (contexts) */
        int queue_count;                /**< Number of active DMA queues */
        int queue_reserved;             /**< Number of reserved DMA queues */
        int queue_slots;                /**< Actual length of queuelist */
 -      drm_queue_t **queuelist;        /**< Vector of pointers to DMA queues */
 -      drm_device_dma_t *dma;          /**< Optional pointer for DMA support */
 +      struct drm_queue **queuelist;   /**< Vector of pointers to DMA queues */
 +      struct drm_device_dma *dma;             /**< Optional pointer for DMA support */
        /*@} */
  
        /** \name Context support */
        wait_queue_head_t buf_readers;  /**< Processes waiting to read */
        wait_queue_head_t buf_writers;  /**< Processes waiting to ctx switch */
  
 -      drm_agp_head_t *agp;            /**< AGP data */
 +      struct drm_agp_head *agp;               /**< AGP data */
  
        struct pci_dev *pdev;           /**< PCI device structure */
        int pci_vendor;                 /**< PCI vendor id */
  #ifdef __alpha__
        struct pci_controller *hose;
  #endif
 -      drm_sg_mem_t *sg;               /**< Scatter gather memory */
 +      struct drm_sg_mem *sg;          /**< Scatter gather memory */
        void *dev_private;              /**< device private data */
 -      drm_sigdata_t sigdata;          /**< For block_all_signals */
 +      struct drm_sigdata sigdata;             /**< For block_all_signals */
        sigset_t sigmask;
  
        struct drm_driver *driver;
        drm_local_map_t *agp_buffer_map;
        unsigned int agp_buffer_token;
 -      drm_head_t primary;             /**< primary screen head */
 +      struct drm_head primary;                /**< primary screen head */
  
 -      drm_fence_manager_t fm;
 -      drm_buffer_manager_t bm;
 +      struct drm_fence_manager fm;
 +      struct drm_buffer_manager bm;
  
        /** \name Drawable information */
        /*@{ */
        spinlock_t drw_lock;
        struct idr drw_idr;
 -      struct list_head drwlist;
        /*@} */
 -} drm_device_t;
 +
 +      /* DRM mode setting */
 +      struct drm_mode_config mode_config;
 +};
  
  #if __OS_HAS_AGP
 -typedef struct drm_agp_ttm_backend {
 -        drm_ttm_backend_t backend;
 +struct drm_agp_ttm_backend {
 +      struct drm_ttm_backend backend;
        DRM_AGP_MEM *mem;
        struct agp_bridge_data *bridge;
        int populated;
 -} drm_agp_ttm_backend_t;
 +};
  #endif
  
 -      drm_ttm_backend_t backend;
+ typedef struct ati_pcigart_ttm_backend {
 -      drm_device_t *dev;
++      struct drm_ttm_backend backend;
+       int populated;
+       void (*gart_flush_fn)(struct drm_device *dev);
+       struct ati_pcigart_info *gart_info;
+       unsigned long offset;
+       struct page **pages;
+       int num_pages;
+       int bound;
++      struct drm_device *dev;
+ } ati_pcigart_ttm_backend_t;
  
  static __inline__ int drm_core_check_feature(struct drm_device *dev,
                                             int feature)
@@@ -921,12 -926,10 +932,12 @@@ extern void drm_exit(struct drm_driver 
  extern void drm_cleanup_pci(struct pci_dev *pdev);
  extern int drm_ioctl(struct inode *inode, struct file *filp,
                     unsigned int cmd, unsigned long arg);
 +extern long drm_unlocked_ioctl(struct file *filp,
 +                             unsigned int cmd, unsigned long arg);
  extern long drm_compat_ioctl(struct file *filp,
                             unsigned int cmd, unsigned long arg);
  
 -extern int drm_lastclose(drm_device_t * dev);
 +extern int drm_lastclose(struct drm_device *dev);
  
                                /* Device support (drm_fops.h) */
  extern int drm_open(struct inode *inode, struct file *filp);
@@@ -937,7 -940,7 +948,7 @@@ unsigned int drm_poll(struct file *filp
  
                                /* Mapping support (drm_vm.h) */
  extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
 -extern unsigned long drm_core_get_map_ofs(drm_map_t * map);
 +extern unsigned long drm_core_get_map_ofs(struct drm_map * map);
  extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev);
  extern pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma);
  
@@@ -950,179 -953,173 +961,179 @@@ extern void *drm_calloc(size_t nmemb, s
  extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area);
  extern unsigned long drm_alloc_pages(int order, int area);
  extern void drm_free_pages(unsigned long address, int order, int area);
 -extern DRM_AGP_MEM *drm_alloc_agp(drm_device_t *dev, int pages, u32 type);
 +extern DRM_AGP_MEM *drm_alloc_agp(struct drm_device *dev, int pages, u32 type);
  extern int drm_free_agp(DRM_AGP_MEM * handle, int pages);
  extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start);
  extern int drm_unbind_agp(DRM_AGP_MEM * handle);
  
  extern void drm_free_memctl(size_t size);
  extern int drm_alloc_memctl(size_t size);
 -extern void drm_query_memctl(drm_u64_t *cur_used,
 -                           drm_u64_t *low_threshold,
 -                           drm_u64_t *high_threshold);
 +extern void drm_query_memctl(uint64_t *cur_used,
 +                           uint64_t *low_threshold,
 +                           uint64_t *high_threshold);
  extern void drm_init_memctl(size_t low_threshold,
                            size_t high_threshold,
                            size_t unit_size);
  
                                /* Misc. IOCTL support (drm_ioctl.h) */
 -extern int drm_irq_by_busid(struct inode *inode, struct file *filp,
 -                          unsigned int cmd, unsigned long arg);
 -extern int drm_getunique(struct inode *inode, struct file *filp,
 -                       unsigned int cmd, unsigned long arg);
 -extern int drm_setunique(struct inode *inode, struct file *filp,
 -                       unsigned int cmd, unsigned long arg);
 -extern int drm_getmap(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_getclient(struct inode *inode, struct file *filp,
 -                       unsigned int cmd, unsigned long arg);
 -extern int drm_getstats(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_setversion(struct inode *inode, struct file *filp,
 -                        unsigned int cmd, unsigned long arg);
 -extern int drm_noop(struct inode *inode, struct file *filp,
 -                  unsigned int cmd, unsigned long arg);
 +extern int drm_irq_by_busid(struct drm_device *dev, void *data,
 +                          struct drm_file *file_priv);
 +extern int drm_getunique(struct drm_device *dev, void *data,
 +                       struct drm_file *file_priv);
 +extern int drm_setunique(struct drm_device *dev, void *data,
 +                       struct drm_file *file_priv);
 +extern int drm_getmap(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_getclient(struct drm_device *dev, void *data,
 +                       struct drm_file *file_priv);
 +extern int drm_getstats(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_setversion(struct drm_device *dev, void *data,
 +                        struct drm_file *file_priv);
 +extern int drm_noop(struct drm_device *dev, void *data,
 +                  struct drm_file *file_priv);
  
                                /* Context IOCTL support (drm_context.h) */
 -extern int drm_resctx(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_addctx(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_modctx(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_getctx(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_switchctx(struct inode *inode, struct file *filp,
 -                       unsigned int cmd, unsigned long arg);
 -extern int drm_newctx(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_rmctx(struct inode *inode, struct file *filp,
 -                   unsigned int cmd, unsigned long arg);
 -
 -extern int drm_ctxbitmap_init(drm_device_t * dev);
 -extern void drm_ctxbitmap_cleanup(drm_device_t * dev);
 -extern void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle);
 -
 -extern int drm_setsareactx(struct inode *inode, struct file *filp,
 -                         unsigned int cmd, unsigned long arg);
 -extern int drm_getsareactx(struct inode *inode, struct file *filp,
 -                         unsigned int cmd, unsigned long arg);
 +extern int drm_resctx(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_addctx(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_modctx(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_getctx(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_switchctx(struct drm_device *dev, void *data,
 +                       struct drm_file *file_priv);
 +extern int drm_newctx(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_rmctx(struct drm_device *dev, void *data,
 +                   struct drm_file *file_priv);
 +
 +extern int drm_ctxbitmap_init(struct drm_device *dev);
 +extern void drm_ctxbitmap_cleanup(struct drm_device *dev);
 +extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
 +
 +extern int drm_setsareactx(struct drm_device *dev, void *data,
 +                         struct drm_file *file_priv);
 +extern int drm_getsareactx(struct drm_device *dev, void *data,
 +                         struct drm_file *file_priv);
  
                                /* Drawable IOCTL support (drm_drawable.h) */
 -extern int drm_adddraw(struct inode *inode, struct file *filp,
 -                     unsigned int cmd, unsigned long arg);
 -extern int drm_rmdraw(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_update_drawable_info(struct inode *inode, struct file *filp,
 -                     unsigned int cmd, unsigned long arg);
 -extern drm_drawable_info_t *drm_get_drawable_info(drm_device_t *dev,
 -                                                drm_drawable_t id);
 +extern int drm_adddraw(struct drm_device *dev, void *data,
 +                     struct drm_file *file_priv);
 +extern int drm_rmdraw(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_update_drawable_info(struct drm_device *dev, void *data,
 +                                  struct drm_file *file_priv);
 +extern struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev,
 +                                                     drm_drawable_t id);
 +extern void drm_drawable_free_all(struct drm_device *dev);
  
                                /* Authentication IOCTL support (drm_auth.h) */
 -extern int drm_getmagic(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_authmagic(struct inode *inode, struct file *filp,
 -                       unsigned int cmd, unsigned long arg);
 +extern int drm_getmagic(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_authmagic(struct drm_device *dev, void *data,
 +                       struct drm_file *file_priv);
  
                                /* Locking IOCTL support (drm_lock.h) */
 -extern int drm_lock(struct inode *inode, struct file *filp,
 -                  unsigned int cmd, unsigned long arg);
 -extern int drm_unlock(struct inode *inode, struct file *filp,
 -                    unsigned int cmd, unsigned long arg);
 -extern int drm_lock_take(drm_lock_data_t *lock_data, unsigned int context);
 -extern int drm_lock_free(drm_lock_data_t *lock_data, unsigned int context);
 -extern void drm_idlelock_take(drm_lock_data_t *lock_data);
 -extern void drm_idlelock_release(drm_lock_data_t *lock_data);
 +extern int drm_lock(struct drm_device *dev, void *data,
 +                  struct drm_file *file_priv);
 +extern int drm_unlock(struct drm_device *dev, void *data,
 +                    struct drm_file *file_priv);
 +extern int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context);
 +extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context);
 +extern void drm_idlelock_take(struct drm_lock_data *lock_data);
 +extern void drm_idlelock_release(struct drm_lock_data *lock_data);
  
  /*
   * These are exported to drivers so that they can implement fencing using
   * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
   */
  
 -extern int drm_i_have_hw_lock(struct file *filp);
 -extern int drm_kernel_take_hw_lock(struct file *filp);
 +extern int drm_i_have_hw_lock(struct drm_device *dev,
 +                            struct drm_file *file_priv);
  
                                /* Buffer management support (drm_bufs.h) */
 -extern int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request);
 -extern int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request);
 -extern int drm_addbufs_fb (drm_device_t * dev, drm_buf_desc_t * request);
 -extern int drm_addmap(drm_device_t * dev, unsigned int offset,
 -                    unsigned int size, drm_map_type_t type,
 -                    drm_map_flags_t flags, drm_local_map_t ** map_ptr);
 -extern int drm_addmap_ioctl(struct inode *inode, struct file *filp,
 -                          unsigned int cmd, unsigned long arg);
 -extern int drm_rmmap(drm_device_t *dev, drm_local_map_t *map);
 -extern int drm_rmmap_locked(drm_device_t *dev, drm_local_map_t *map);
 -extern int drm_rmmap_ioctl(struct inode *inode, struct file *filp,
 -                         unsigned int cmd, unsigned long arg);
 -extern int drm_addbufs(struct inode *inode, struct file *filp,
 -                     unsigned int cmd, unsigned long arg);
 -extern int drm_infobufs(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_markbufs(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_freebufs(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_mapbufs(struct inode *inode, struct file *filp,
 -                     unsigned int cmd, unsigned long arg);
 +extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request);
 +extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request);
 +extern int drm_addbufs_fb (struct drm_device *dev, struct drm_buf_desc * request);
 +extern int drm_addmap(struct drm_device *dev, unsigned int offset,
 +                    unsigned int size, enum drm_map_type type,
 +                    enum drm_map_flags flags, drm_local_map_t ** map_ptr);
 +extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
 +                          struct drm_file *file_priv);
 +extern int drm_rmmap(struct drm_device *dev, drm_local_map_t *map);
 +extern int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map);
 +extern int drm_rmmap_ioctl(struct drm_device *dev, void *data,
 +                         struct drm_file *file_priv);
 +extern int drm_addbufs(struct drm_device *dev, void *data,
 +                     struct drm_file *file_priv);
 +extern int drm_infobufs(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_markbufs(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_freebufs(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_mapbufs(struct drm_device *dev, void *data,
 +                     struct drm_file *file_priv);
  extern int drm_order(unsigned long size);
 -extern unsigned long drm_get_resource_start(drm_device_t *dev,
 +extern unsigned long drm_get_resource_start(struct drm_device *dev,
                                            unsigned int resource);
 -extern unsigned long drm_get_resource_len(drm_device_t *dev,
 +extern unsigned long drm_get_resource_len(struct drm_device *dev,
                                          unsigned int resource);
 +extern struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
 +                                                drm_local_map_t *map);
 +
  
                                /* DMA support (drm_dma.h) */
 -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_core_reclaim_buffers(drm_device_t *dev, struct file *filp);
 +extern int drm_dma_setup(struct drm_device *dev);
 +extern void drm_dma_takedown(struct drm_device *dev);
 +extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);
 +extern void drm_core_reclaim_buffers(struct drm_device *dev,
 +                                   struct drm_file *filp);
  
                                /* IRQ support (drm_irq.h) */
 -extern int drm_control(struct inode *inode, struct file *filp,
 -                     unsigned int cmd, unsigned long arg);
 +extern int drm_control(struct drm_device *dev, void *data,
 +                     struct drm_file *file_priv);
  extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS);
 -extern int drm_irq_uninstall(drm_device_t *dev);
 -extern void drm_driver_irq_preinstall(drm_device_t * dev);
 -extern void drm_driver_irq_postinstall(drm_device_t * dev);
 -extern void drm_driver_irq_uninstall(drm_device_t * dev);
 -
 -extern int drm_wait_vblank(struct inode *inode, struct file *filp,
 -                         unsigned int cmd, unsigned long arg);
 -extern int drm_vblank_wait(drm_device_t * dev, unsigned int *vbl_seq);
 -extern void drm_vbl_send_signals(drm_device_t * dev);
 -extern void drm_locked_tasklet(drm_device_t *dev, void(*func)(drm_device_t*));
 +extern int drm_irq_install(struct drm_device *dev);
 +extern int drm_irq_uninstall(struct drm_device *dev);
 +extern void drm_driver_irq_preinstall(struct drm_device *dev);
 +extern void drm_driver_irq_postinstall(struct drm_device *dev);
 +extern void drm_driver_irq_uninstall(struct drm_device *dev);
 +
 +extern int drm_wait_vblank(struct drm_device *dev, void *data,
 +                         struct drm_file *file_priv);
 +extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
 +extern void drm_vbl_send_signals(struct drm_device *dev);
 +extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*));
  
                                /* AGP/GART support (drm_agpsupport.h) */
 -extern drm_agp_head_t *drm_agp_init(drm_device_t *dev);
 -extern int drm_agp_acquire(drm_device_t * dev);
 -extern int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp,
 -                         unsigned int cmd, unsigned long arg);
 -extern int drm_agp_release(drm_device_t *dev);
 -extern int drm_agp_release_ioctl(struct inode *inode, struct file *filp,
 -                         unsigned int cmd, unsigned long arg);
 -extern int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode);
 -extern int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,
 -                        unsigned int cmd, unsigned long arg);
 -extern int drm_agp_info(drm_device_t * dev, drm_agp_info_t *info);
 -extern int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_agp_alloc(drm_device_t *dev, drm_agp_buffer_t *request);
 -extern int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp,
 -                       unsigned int cmd, unsigned long arg);
 -extern int drm_agp_free(drm_device_t *dev, drm_agp_buffer_t *request);
 -extern int drm_agp_free_ioctl(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_agp_unbind(drm_device_t *dev, drm_agp_binding_t *request);
 -extern int drm_agp_unbind_ioctl(struct inode *inode, struct file *filp,
 -                        unsigned int cmd, unsigned long arg);
 -extern int drm_agp_bind(drm_device_t *dev, drm_agp_binding_t *request);
 -extern int drm_agp_bind_ioctl(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 +extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
 +extern int drm_agp_acquire(struct drm_device *dev);
 +extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
 +                               struct drm_file *file_priv);
 +extern int drm_agp_release(struct drm_device *dev);
 +extern int drm_agp_release_ioctl(struct drm_device *dev, void *data,
 +                               struct drm_file *file_priv);
 +extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
 +extern int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
 +                              struct drm_file *file_priv);
 +extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
 +extern int drm_agp_info_ioctl(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
 +extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
 +                       struct drm_file *file_priv);
 +extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
 +extern int drm_agp_free_ioctl(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
 +extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
 +                        struct drm_file *file_priv);
 +extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
 +extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
  #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)
  extern DRM_AGP_MEM *drm_agp_allocate_memory(size_t pages, u32 type);
  #else
@@@ -1131,22 -1128,22 +1142,22 @@@ extern DRM_AGP_MEM *drm_agp_allocate_me
  extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
  extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
  extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
 -extern drm_ttm_backend_t *drm_agp_init_ttm(struct drm_device *dev);
 +extern struct drm_ttm_backend *drm_agp_init_ttm(struct drm_device *dev);
                                /* Stub support (drm_stub.h) */
  extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
                     struct drm_driver *driver);
 -extern int drm_put_dev(drm_device_t * dev);
 -extern int drm_put_head(drm_head_t * head);
 +extern int drm_put_dev(struct drm_device *dev);
 +extern int drm_put_head(struct drm_head * head);
  extern unsigned int drm_debug; /* 1 to enable debug output */
  extern unsigned int drm_cards_limit;
 -extern drm_head_t **drm_heads;
 -extern struct drm_sysfs_class *drm_class;
 +extern struct drm_head **drm_heads;
 +extern struct class *drm_class;
  extern struct proc_dir_entry *drm_proc_root;
  
  extern drm_local_map_t *drm_getsarea(struct drm_device *dev);
  
                                /* Proc support (drm_proc.h) */
 -extern int drm_proc_init(drm_device_t * dev,
 +extern int drm_proc_init(struct drm_device *dev,
                         int minor,
                         struct proc_dir_entry *root,
                         struct proc_dir_entry **dev_root);
@@@ -1155,47 -1152,48 +1166,48 @@@ extern int drm_proc_cleanup(int minor
                            struct proc_dir_entry *dev_root);
  
                                /* Scatter Gather Support (drm_scatter.h) */
 -extern void drm_sg_cleanup(drm_sg_mem_t * entry);
 -extern int drm_sg_alloc(struct inode *inode, struct file *filp,
 -                      unsigned int cmd, unsigned long arg);
 -extern int drm_sg_free(struct inode *inode, struct file *filp,
 -                     unsigned int cmd, unsigned long arg);
 +extern void drm_sg_cleanup(struct drm_sg_mem * entry);
 +extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
 +                      struct drm_file *file_priv);
 +extern int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request);
 +extern int drm_sg_free(struct drm_device *dev, void *data,
 +                     struct drm_file *file_priv);
  
                               /* ATI PCIGART support (ati_pcigart.h) */
 -extern int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info *gart_info);
 -extern int drm_ati_pcigart_cleanup(drm_device_t * dev, drm_ati_pcigart_info *gart_info);
 -extern drm_ttm_backend_t *ati_pcigart_init_ttm(struct drm_device *dev, struct ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev));
 +extern int drm_ati_pcigart_init(struct drm_device *dev, struct ati_pcigart_info *gart_info);
 +extern int drm_ati_pcigart_cleanup(struct drm_device *dev, struct ati_pcigart_info *gart_info);
++extern struct drm_ttm_backend *ati_pcigart_init_ttm(struct drm_device *dev, struct ati_pcigart_info *info, void (*gart_flush_fn)(struct drm_device *dev));
  
 -extern drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size,
 +extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
                           size_t align, dma_addr_t maxaddr);
 -extern void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t *dmah);
 -extern void drm_pci_free(drm_device_t * dev, drm_dma_handle_t *dmah);
 +extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah);
 +extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah);
  
                               /* sysfs support (drm_sysfs.c) */
  struct drm_sysfs_class;
 -extern struct drm_sysfs_class *drm_sysfs_create(struct module *owner,
 -                                              char *name);
 -extern void drm_sysfs_destroy(struct drm_sysfs_class *cs);
 -extern struct class_device *drm_sysfs_device_add(struct drm_sysfs_class *cs,
 -                                               drm_head_t * head);
 +extern struct class *drm_sysfs_create(struct module *owner, char *name);
 +extern void drm_sysfs_destroy(struct class *cs);
 +extern struct class_device *drm_sysfs_device_add(struct class *cs,
 +                                               struct drm_head * head);
  extern void drm_sysfs_device_remove(struct class_device *class_dev);
  
  /*
   * Basic memory manager support (drm_mm.c)
   */
  
 -extern drm_mm_node_t * drm_mm_get_block(drm_mm_node_t * parent, unsigned long size,
 +extern struct drm_mm_node * drm_mm_get_block(struct drm_mm_node * parent, unsigned long size,
                                               unsigned alignment);
 -extern void drm_mm_put_block(drm_mm_node_t *cur);
 -extern drm_mm_node_t *drm_mm_search_free(const drm_mm_t *mm, unsigned long size,
 +extern void drm_mm_put_block(struct drm_mm_node *cur);
 +extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, unsigned long size,
                                                unsigned alignment, int best_match);
 -extern int drm_mm_init(drm_mm_t *mm, unsigned long start, unsigned long size);
 -extern void drm_mm_takedown(drm_mm_t *mm);
 -extern int drm_mm_clean(drm_mm_t *mm);
 -extern unsigned long drm_mm_tail_space(drm_mm_t *mm);
 -extern int drm_mm_remove_space_from_tail(drm_mm_t *mm, unsigned long size);
 -extern int drm_mm_add_space_to_tail(drm_mm_t *mm, unsigned long size);
 -
 -static inline drm_mm_t *drm_get_mm(drm_mm_node_t *block)
 +extern int drm_mm_init(struct drm_mm *mm, unsigned long start, unsigned long size);
 +extern void drm_mm_takedown(struct drm_mm *mm);
 +extern int drm_mm_clean(struct drm_mm *mm);
 +extern unsigned long drm_mm_tail_space(struct drm_mm *mm);
 +extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, unsigned long size);
 +extern int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size);
 +
 +static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block)
  {
        return block->mm;
  }
@@@ -1206,14 -1204,14 +1218,14 @@@ extern void drm_core_ioremapfree(struc
  static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev,
                                                   unsigned int token)
  {
 -      drm_map_list_t *_entry;
 +      struct drm_map_list *_entry;
        list_for_each_entry(_entry, &dev->maplist, head)
                if (_entry->user_token == token)
                        return _entry->map;
        return NULL;
  }
  
 -static __inline__ int drm_device_is_agp(drm_device_t *dev)
 +static __inline__ int drm_device_is_agp(struct drm_device *dev)
  {
        if ( dev->driver->device_is_agp != NULL ) {
                int err = (*dev->driver->device_is_agp)( dev );
        return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
  }
  
 -static __inline__ int drm_device_is_pcie(drm_device_t *dev)
 +static __inline__ int drm_device_is_pcie(struct drm_device *dev)
  {
        return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
  }
@@@ -1287,19 -1285,5 +1299,19 @@@ static inline void drm_ctl_free(void *p
  
  /*@}*/
  
 +/** Type for the OS's non-sleepable mutex lock */
 +#define DRM_SPINTYPE          spinlock_t
 +/**
 + * Initialize the lock for use.  name is an optional string describing the
 + * lock
 + */
 +#define DRM_SPININIT(l,name)  spin_lock_init(l)
 +#define DRM_SPINUNINIT(l)
 +#define DRM_SPINLOCK(l)               spin_lock(l)
 +#define DRM_SPINUNLOCK(l)     spin_unlock(l)
 +#define DRM_SPINLOCK_IRQSAVE(l, _flags)       spin_lock_irqsave(l, _flags);
 +#define DRM_SPINUNLOCK_IRQRESTORE(l, _flags) spin_unlock_irqrestore(l, _flags);
 +#define DRM_SPINLOCK_ASSERT(l)                do {} while (0) 
 +
  #endif                                /* __KERNEL__ */
  #endif
index 0000000,3afc17e..8e2b20b
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,263 +1,263 @@@
 -drm_ttm_backend_t *radeon_create_ttm_backend_entry(drm_device_t * dev)
+ /**************************************************************************
+  * 
+  * Copyright 2007 Dave Airlie
+  * All Rights Reserved.
+  * 
+  * Permission is hereby granted, free of charge, to any person obtaining a
+  * copy of this software and associated documentation files (the
+  * "Software"), to deal in the Software without restriction, including
+  * without limitation the rights to use, copy, modify, merge, publish,
+  * distribute, sub license, and/or sell copies of the Software, and to
+  * permit persons to whom the Software is furnished to do so, subject to
+  * the following conditions:
+  * 
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
+  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
+  * USE OR OTHER DEALINGS IN THE SOFTWARE.
+  *
+  * The above copyright notice and this permission notice (including the
+  * next paragraph) shall be included in all copies or substantial portions
+  * of the Software.
+  * 
+  * 
+  **************************************************************************/
+ /*
+  * Authors: Dave Airlie <airlied@linux.ie>
+  */
+ #include "drmP.h"
+ #include "radeon_drm.h"
+ #include "radeon_drv.h"
 -int radeon_fence_types(drm_buffer_object_t *bo, uint32_t * class, uint32_t * type)
++struct drm_ttm_backend *radeon_create_ttm_backend_entry(struct drm_device * dev)
+ {
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       if(dev_priv->flags & RADEON_IS_AGP)
+               return drm_agp_init_ttm(dev);
+       else
+               return ati_pcigart_init_ttm(dev, &dev_priv->gart_info, radeon_gart_flush);
+ }
 -int radeon_invalidate_caches(drm_device_t * dev, uint32_t flags)
++int radeon_fence_types(struct drm_buffer_object *bo, uint32_t * class, uint32_t * type)
+ {
+       *class = 0;
+       if (bo->mem.flags & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE))
+               *type = 3;
+       else
+               *type = 1;
+       return 0;
+ }
 -uint32_t radeon_evict_mask(drm_buffer_object_t *bo)
++int radeon_invalidate_caches(struct drm_device * dev, uint64_t flags)
+ {
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       RING_LOCALS;
+       BEGIN_RING(4);
+       RADEON_FLUSH_CACHE();
+       RADEON_FLUSH_ZCACHE();
+       ADVANCE_RING();
+       return 0;
+ }
 -int radeon_init_mem_type(drm_device_t * dev, uint32_t type,
 -                       drm_mem_type_manager_t * man)
++uint32_t radeon_evict_mask(struct drm_buffer_object *bo)
+ {
+       switch (bo->mem.mem_type) {
+       case DRM_BO_MEM_LOCAL:
+       case DRM_BO_MEM_TT:
+               return DRM_BO_FLAG_MEM_LOCAL;
+       case DRM_BO_MEM_VRAM:
+               if (bo->mem.num_pages > 128)
+                       return DRM_BO_MEM_TT;
+               else
+                       return DRM_BO_MEM_LOCAL;
+       default:
+               return DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_CACHED;
+       }
+ }
 -static void radeon_emit_copy_blit(drm_device_t * dev,
++int radeon_init_mem_type(struct drm_device * dev, uint32_t type,
++                       struct drm_mem_type_manager * man)
+ {
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       switch (type) {
+       case DRM_BO_MEM_LOCAL:
+               man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
+                   _DRM_FLAG_MEMTYPE_CACHED;
+               man->drm_bus_maptype = 0;
+               break;
+       case DRM_BO_MEM_VRAM:
+               man->flags =  _DRM_FLAG_MEMTYPE_FIXED | _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_NEEDS_IOREMAP;
+               man->io_addr = NULL;
+               man->drm_bus_maptype = _DRM_FRAME_BUFFER;
+               man->io_offset = drm_get_resource_start(dev, 0);
+               man->io_size = drm_get_resource_len(dev, 0);
+               break;
+       case DRM_BO_MEM_TT:
+               if (dev_priv->flags & RADEON_IS_AGP) {
+                       if (!(drm_core_has_AGP(dev) && dev->agp)) {
+                               DRM_ERROR("AGP is not enabled for memory type %u\n",
+                                         (unsigned)type);
+                               return -EINVAL;
+                       }
+                       man->io_offset = dev->agp->agp_info.aper_base;
+                       man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024;
+                       man->io_addr = NULL;
+                       man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
+                               _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_NEEDS_IOREMAP;
+                       man->drm_bus_maptype = _DRM_AGP;
+               } else {
+                       man->io_offset = dev_priv->gart_vm_start;
+                       man->io_size = dev_priv->gart_size;
+                       man->io_addr = NULL;
+                       man->flags = _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_CMA;
+                       man->drm_bus_maptype = _DRM_SCATTER_GATHER;
+               }
+               break;
+       default:
+               DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
+               return -EINVAL;
+       }
+       return 0;
+ }
 -static int radeon_move_blit(drm_buffer_object_t * bo,
 -                          int evict, int no_wait, drm_bo_mem_reg_t *new_mem)
++static void radeon_emit_copy_blit(struct drm_device * dev,
+                                 uint32_t src_offset,
+                                 uint32_t dst_offset,
+                                 uint32_t pages, int direction)
+ {
+       uint32_t cur_pages;
+       uint32_t stride = PAGE_SIZE;
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       uint32_t format, height;
+       RING_LOCALS;
+       if (!dev_priv)
+               return;
+       /* 32-bit copy format */
+       format = RADEON_COLOR_FORMAT_ARGB8888;
+       /* radeon limited to 16k stride */
+       stride &= 0x3fff;
+       while(pages > 0) {
+               cur_pages = pages;
+               if (cur_pages > 2048)
+                       cur_pages = 2048;
+               pages -= cur_pages;
+               /* needs verification */
+               BEGIN_RING(7);          
+               OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT_MULTI, 5));
+               OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
+                        RADEON_GMC_DST_PITCH_OFFSET_CNTL |
+                        RADEON_GMC_BRUSH_NONE |
+                        (format << 8) |
+                        RADEON_GMC_SRC_DATATYPE_COLOR |
+                        RADEON_ROP3_S |
+                        RADEON_DP_SRC_SOURCE_MEMORY |
+                        RADEON_GMC_CLR_CMP_CNTL_DIS | RADEON_GMC_WR_MSK_DIS);
+               if (direction) {
+                       OUT_RING((stride << 22) | (src_offset >> 10));
+                       OUT_RING((stride << 22) | (dst_offset >> 10));
+               } else {
+                       OUT_RING((stride << 22) | (dst_offset >> 10));
+                       OUT_RING((stride << 22) | (src_offset >> 10));
+               }
+               OUT_RING(0);
+               OUT_RING(pages); /* x - y */
+               OUT_RING((stride << 16) | cur_pages);
+               ADVANCE_RING();
+       }
+       BEGIN_RING(2);
+       RADEON_WAIT_UNTIL_2D_IDLE();
+       ADVANCE_RING();
+       return;
+ }
 -      drm_bo_mem_reg_t *old_mem = &bo->mem;
++static int radeon_move_blit(struct drm_buffer_object * bo,
++                          int evict, int no_wait, struct drm_bo_mem_reg *new_mem)
+ {
 -static int radeon_move_flip(drm_buffer_object_t * bo,
 -                          int evict, int no_wait, drm_bo_mem_reg_t * new_mem)
++      struct drm_bo_mem_reg *old_mem = &bo->mem;
+       int dir = 0;
+       if ((old_mem->mem_type == new_mem->mem_type) &&
+           (new_mem->mm_node->start <
+            old_mem->mm_node->start + old_mem->mm_node->size)) {
+               dir = 1;
+       }
+       radeon_emit_copy_blit(bo->dev,
+                             old_mem->mm_node->start << PAGE_SHIFT,
+                             new_mem->mm_node->start << PAGE_SHIFT,
+                             new_mem->num_pages, dir);
+       
+       return drm_bo_move_accel_cleanup(bo, evict, no_wait, 0,
+                                        DRM_FENCE_TYPE_EXE |
+                                        DRM_RADEON_FENCE_TYPE_RW,
+                                        DRM_RADEON_FENCE_FLAG_FLUSHED, new_mem);
+ }
 -      drm_device_t *dev = bo->dev;
 -      drm_bo_mem_reg_t tmp_mem;
++static int radeon_move_flip(struct drm_buffer_object * bo,
++                          int evict, int no_wait, struct drm_bo_mem_reg * new_mem)
+ {
 -      ret = drm_bind_ttm(bo->ttm, 1, tmp_mem.mm_node->start);
++      struct drm_device *dev = bo->dev;
++      struct drm_bo_mem_reg tmp_mem;
+       int ret;
+       tmp_mem = *new_mem;
+       tmp_mem.mm_node = NULL;
+       tmp_mem.mask = DRM_BO_FLAG_MEM_TT |
+           DRM_BO_FLAG_CACHED | DRM_BO_FLAG_FORCE_CACHING;
+       ret = drm_bo_mem_space(bo, &tmp_mem, no_wait);
+       if (ret)
+               return ret;
 -int radeon_move(drm_buffer_object_t * bo,
 -              int evict, int no_wait, drm_bo_mem_reg_t * new_mem)
++      ret = drm_bind_ttm(bo->ttm, &tmp_mem);
+       if (ret)
+               goto out_cleanup;
+       ret = radeon_move_blit(bo, 1, no_wait, &tmp_mem);
+       if (ret)
+               goto out_cleanup;
+       ret = drm_bo_move_ttm(bo, evict, no_wait, new_mem);
+ out_cleanup:
+       if (tmp_mem.mm_node) {
+               mutex_lock(&dev->struct_mutex);
+               if (tmp_mem.mm_node != bo->pinned_node)
+                       drm_mm_put_block(tmp_mem.mm_node);
+               tmp_mem.mm_node = NULL;
+               mutex_unlock(&dev->struct_mutex);
+       }
+       return ret;
+ }
 -      drm_bo_mem_reg_t *old_mem = &bo->mem;
++int radeon_move(struct drm_buffer_object * bo,
++              int evict, int no_wait, struct drm_bo_mem_reg * new_mem)
+ {
++      struct drm_bo_mem_reg *old_mem = &bo->mem;
+       DRM_DEBUG("\n");
+       if (old_mem->mem_type == DRM_BO_MEM_LOCAL) {
+               return drm_bo_move_memcpy(bo, evict, no_wait, new_mem);
+       } else if (new_mem->mem_type == DRM_BO_MEM_LOCAL) {
+               if (radeon_move_flip(bo, evict, no_wait, new_mem))
+                       return drm_bo_move_memcpy(bo, evict, no_wait, new_mem);
+       } else {
+               if (radeon_move_blit(bo, evict, no_wait, new_mem))
+                       return drm_bo_move_memcpy(bo, evict, no_wait, new_mem);
+       }
+       return 0;
+ }
diff --combined linux-core/radeon_drv.c
@@@ -56,6 -56,38 +56,38 @@@ static struct pci_device_id pciidlist[
        radeon_PCI_IDS
  };
  
 -static drm_fence_driver_t radeon_fence_driver = {
+ #ifdef RADEON_HAVE_FENCE
 -static drm_bo_driver_t radeon_bo_driver = {
++static struct drm_fence_driver radeon_fence_driver = {
+       .num_classes = 1,
+       .wrap_diff = (1 << 30),
+       .flush_diff = (1 << 29),
+       .sequence_mask = 0xffffffffU,
+       .lazy_capable = 1,
+       .emit = radeon_fence_emit_sequence,
+       .poke_flush = radeon_poke_flush,
+       .has_irq = radeon_fence_has_irq,
+ };
+ #endif
+ #ifdef RADEON_HAVE_BUFFER
+ static uint32_t radeon_mem_prios[] = {DRM_BO_MEM_VRAM, DRM_BO_MEM_TT, DRM_BO_MEM_LOCAL};
+ static uint32_t radeon_busy_prios[] = {DRM_BO_MEM_TT, DRM_BO_MEM_VRAM, DRM_BO_MEM_LOCAL};
++static struct drm_bo_driver radeon_bo_driver = {
+       .mem_type_prio = radeon_mem_prios,
+       .mem_busy_prio = radeon_busy_prios,
+       .num_mem_type_prio = sizeof(radeon_mem_prios)/sizeof(uint32_t),
+       .num_mem_busy_prio = sizeof(radeon_busy_prios)/sizeof(uint32_t),
+       .create_ttm_backend_entry = radeon_create_ttm_backend_entry,
+       .fence_type = radeon_fence_types,
+       .invalidate_caches = radeon_invalidate_caches,
+       .init_mem_type = radeon_init_mem_type,
+       .evict_mask = radeon_evict_mask,
+       .move = radeon_move,
+ };
+ #endif
  static int probe(struct pci_dev *pdev, const struct pci_device_id *ent);
  static struct drm_driver driver = {
        .driver_features =
                .remove = __devexit_p(drm_cleanup_pci),
        },
  
+ #ifdef RADEON_HAVE_FENCE
+       .fence_driver = &radeon_fence_driver,
+ #endif
+ #ifdef RADEON_HAVE_BUFFER
+       .bo_driver = &radeon_bo_driver,
+ #endif
        .name = DRIVER_NAME,
        .desc = DRIVER_DESC,
        .date = DRIVER_DATE,
index 0000000,7de3650..682f0be
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,125 +1,125 @@@
 -static void radeon_perform_flush(drm_device_t * dev)
+ /**************************************************************************
+  * 
+  * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
+  * All Rights Reserved.
+  * 
+  * Permission is hereby granted, free of charge, to any person obtaining a
+  * copy of this software and associated documentation files (the
+  * "Software"), to deal in the Software without restriction, including
+  * without limitation the rights to use, copy, modify, merge, publish,
+  * distribute, sub license, and/or sell copies of the Software, and to
+  * permit persons to whom the Software is furnished to do so, subject to
+  * the following conditions:
+  * 
+  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
+  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
+  * USE OR OTHER DEALINGS IN THE SOFTWARE.
+  *
+  * The above copyright notice and this permission notice (including the
+  * next paragraph) shall be included in all copies or substantial portions
+  * of the Software.
+  * 
+  * 
+  **************************************************************************/
+ /*
+  * Authors: Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+  */
+ #include "drmP.h"
+ #include "drm.h"
+ #include "radeon_drm.h"
+ #include "radeon_drv.h"
+ /*
+  * Implements an intel sync flush operation.
+  */
 -      drm_fence_manager_t *fm = &dev->fm;
 -      drm_fence_class_manager_t *fc = &dev->fm.class[0];
 -      drm_fence_driver_t *driver = dev->driver->fence_driver;
++static void radeon_perform_flush(struct drm_device * dev)
+ {
+       drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
 -              drm_fence_handler(dev, 0, sequence, pending_flush_types);
++      struct drm_fence_manager *fm = &dev->fm;
++      struct drm_fence_class_manager *fc = &dev->fm.fence_class[0];
++      struct drm_fence_driver *driver = dev->driver->fence_driver;
+       uint32_t pending_flush_types = 0;
+       uint32_t sequence;
+       if (!dev_priv)
+               return;
+       pending_flush_types = fc->pending_flush |
+               ((fc->pending_exe_flush) ? DRM_FENCE_TYPE_EXE : 0);
+       if (pending_flush_types) {
+               sequence = READ_BREADCRUMB(dev_priv);
+                                            
 -void radeon_poke_flush(drm_device_t * dev, uint32_t class)
++              drm_fence_handler(dev, 0, sequence, pending_flush_types, 0);
+       }
+       return;
+ }
 -      drm_fence_manager_t *fm = &dev->fm;
++void radeon_poke_flush(struct drm_device * dev, uint32_t class)
+ {
 -int radeon_fence_emit_sequence(drm_device_t *dev, uint32_t class,
++      struct drm_fence_manager *fm = &dev->fm;
+       unsigned long flags;
+       if (class != 0)
+               return;
+       write_lock_irqsave(&fm->lock, flags);
+       radeon_perform_flush(dev);
+       write_unlock_irqrestore(&fm->lock, flags);
+ }
 -void radeon_fence_handler(drm_device_t * dev)
++int radeon_fence_emit_sequence(struct drm_device *dev, uint32_t class,
+                              uint32_t flags, uint32_t *sequence,
+                              uint32_t *native_type)
+ {
+       drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
+       RING_LOCALS;
+       if (!dev_priv)
+               return -EINVAL;
+       *native_type = DRM_FENCE_TYPE_EXE;
+       if (flags & DRM_RADEON_FENCE_FLAG_FLUSHED) {
+               *native_type |= DRM_RADEON_FENCE_TYPE_RW;
+               
+               BEGIN_RING(4);
+               
+               RADEON_FLUSH_CACHE();
+               RADEON_FLUSH_ZCACHE();
+               ADVANCE_RING();
+       }
+       radeon_emit_irq(dev);
+       *sequence = (uint32_t) dev_priv->counter;
+       return 0;
+ }
 -      drm_fence_manager_t *fm = &dev->fm;
++void radeon_fence_handler(struct drm_device * dev)
+ {
 -int radeon_fence_has_irq(drm_device_t *dev, uint32_t class, uint32_t flags)
++      struct drm_fence_manager *fm = &dev->fm;
+       write_lock(&fm->lock);
+       radeon_perform_flush(dev);
+       write_unlock(&fm->lock);
+ }
++int radeon_fence_has_irq(struct drm_device *dev, uint32_t class, uint32_t flags)
+ {
+       /*
+        * We have an irq that tells us when we have a new breadcrumb.
+        */
+       if (class == 0 && flags == DRM_FENCE_TYPE_EXE)
+               return 1;
+       return 0;
+ }
diff --combined shared-core/radeon_cp.c
@@@ -36,7 -36,7 +36,7 @@@
  
  #define RADEON_FIFO_DEBUG     0
  
 -static int radeon_do_cleanup_cp(drm_device_t * dev);
 +static int radeon_do_cleanup_cp(struct drm_device * dev);
  
  /* CP microcode (from ATI) */
  static const u32 R200_cp_microcode[][2] = {
@@@ -816,7 -816,7 +816,7 @@@ static const u32 R300_cp_microcode[][2
        { 0000000000, 0000000000 },
  };
  
 -static int RADEON_READ_PLL(drm_device_t * dev, int addr)
 +static int RADEON_READ_PLL(struct drm_device * dev, int addr)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
  
@@@ -889,7 -889,7 +889,7 @@@ static int radeon_do_pixcache_flush(drm
        DRM_ERROR("failed!\n");
        radeon_status(dev_priv);
  #endif
 -      return DRM_ERR(EBUSY);
 +      return -EBUSY;
  }
  
  static int radeon_do_wait_for_fifo(drm_radeon_private_t * dev_priv, int entries)
        DRM_ERROR("failed!\n");
        radeon_status(dev_priv);
  #endif
 -      return DRM_ERR(EBUSY);
 +      return -EBUSY;
  }
  
  static int radeon_do_wait_for_idle(drm_radeon_private_t * dev_priv)
        DRM_ERROR("failed!\n");
        radeon_status(dev_priv);
  #endif
 -      return DRM_ERR(EBUSY);
 +      return -EBUSY;
  }
  
  /* ================================================================
@@@ -1066,7 -1066,7 +1066,7 @@@ static void radeon_do_cp_stop(drm_radeo
  
  /* Reset the engine.  This will stop the CP if it is running.
   */
 -static int radeon_do_engine_reset(drm_device_t * dev)
 +static int radeon_do_engine_reset(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
        u32 clock_cntl_index, mclk_cntl, rbbm_soft_reset;
        return 0;
  }
  
 -static void radeon_cp_init_ring_buffer(drm_device_t * dev,
 +static void radeon_cp_init_ring_buffer(struct drm_device * dev,
                                       drm_radeon_private_t * dev_priv)
  {
        u32 ring_start, cur_read_ptr;
        } else
  #endif
        {
 -              drm_sg_mem_t *entry = dev->sg;
 +              struct drm_sg_mem *entry = dev->sg;
                unsigned long tmp_ofs, page_ofs;
  
                tmp_ofs = dev_priv->ring_rptr->offset -
        /* Set ring buffer size */
  #ifdef __BIG_ENDIAN
        RADEON_WRITE(RADEON_CP_RB_CNTL,
 -                   dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT);
 +                   RADEON_BUF_SWAP_32BIT |
 +                   (dev_priv->ring.fetch_size_l2ow << 18) |
 +                   (dev_priv->ring.rptr_update_l2qw << 8) |
 +                   dev_priv->ring.size_l2qw);
  #else
 -      RADEON_WRITE(RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw);
 +      RADEON_WRITE(RADEON_CP_RB_CNTL,
 +                   (dev_priv->ring.fetch_size_l2ow << 18) |
 +                   (dev_priv->ring.rptr_update_l2qw << 8) |
 +                   dev_priv->ring.size_l2qw);
  #endif
  
        /* Start with assuming that writeback doesn't work */
@@@ -1390,7 -1384,30 +1390,29 @@@ static void radeon_set_pcigart(drm_rade
        }
  }
  
 -
+ void radeon_gart_flush(struct drm_device *dev)
+ {
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       
+       if (dev_priv->flags & RADEON_IS_IGPGART) {
+               RADEON_READ_IGPGART(dev_priv, RADEON_IGPGART_FLUSH);
+               RADEON_WRITE_IGPGART(RADEON_IGPGART_FLUSH, 0x1);
+               RADEON_READ_IGPGART(dev_priv, RADEON_IGPGART_FLUSH);
+               RADEON_WRITE_IGPGART(RADEON_IGPGART_FLUSH, 0x0);
+       } else if (dev_priv->flags & RADEON_IS_PCIE) {
+               u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL);
+               tmp |= RADEON_PCIE_TX_GART_INVALIDATE_TLB;
+               RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
+               tmp &= ~RADEON_PCIE_TX_GART_INVALIDATE_TLB;
+               RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
+       } else {
+       }
+ }
 -static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
 +static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
  
        if ((dev_priv->flags & RADEON_NEW_MEMMAP) && !dev_priv->new_memmap) {
                DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX for 3D\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        if (init->is_pci && (dev_priv->flags & RADEON_IS_AGP))
        if ((!(dev_priv->flags & RADEON_IS_AGP)) && !dev->sg) {
                DRM_ERROR("PCI GART memory not allocated!\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        dev_priv->usec_timeout = init->usec_timeout;
            dev_priv->usec_timeout > RADEON_MAX_USEC_TIMEOUT) {
                DRM_DEBUG("TIMEOUT problem!\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        /* Enable vblank on CRTC1 for older X servers
            (init->cp_mode != RADEON_CSQ_PRIBM_INDBM)) {
                DRM_DEBUG("BAD cp_mode (%x)!\n", init->cp_mode);
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        switch (init->fb_bpp) {
        if (!dev_priv->sarea) {
                DRM_ERROR("could not find sarea!\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        dev_priv->cp_ring = drm_core_findmap(dev, init->ring_offset);
        if (!dev_priv->cp_ring) {
                DRM_ERROR("could not find cp ring region!\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
        dev_priv->ring_rptr = drm_core_findmap(dev, init->ring_rptr_offset);
        if (!dev_priv->ring_rptr) {
                DRM_ERROR("could not find ring read pointer!\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
        dev->agp_buffer_token = init->buffers_offset;
        dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
        if (!dev->agp_buffer_map) {
                DRM_ERROR("could not find dma buffer region!\n");
                radeon_do_cleanup_cp(dev);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        if (init->gart_textures_offset) {
                if (!dev_priv->gart_textures) {
                        DRM_ERROR("could not find GART texture region!\n");
                        radeon_do_cleanup_cp(dev);
 -                      return DRM_ERR(EINVAL);
 +                      return -EINVAL;
                }
        }
  
                    !dev->agp_buffer_map->handle) {
                        DRM_ERROR("could not find ioremap agp regions!\n");
                        radeon_do_cleanup_cp(dev);
 -                      return DRM_ERR(EINVAL);
 +                      return -EINVAL;
                }
        } else
  #endif
        dev_priv->ring.size = init->ring_size;
        dev_priv->ring.size_l2qw = drm_order(init->ring_size / 8);
  
 +      dev_priv->ring.rptr_update = /* init->rptr_update */ 4096;
 +      dev_priv->ring.rptr_update_l2qw = drm_order( /* init->rptr_update */ 4096 / 8);
 +
 +      dev_priv->ring.fetch_size = /* init->fetch_size */ 32;
 +      dev_priv->ring.fetch_size_l2ow = drm_order( /* init->fetch_size */ 32 / 16);
 +
        dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
  
        dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;
                                DRM_ERROR
                                    ("Cannot use PCI Express without GART in FB memory\n");
                                radeon_do_cleanup_cp(dev);
 -                              return DRM_ERR(EINVAL);
 +                              return -EINVAL;
                        }
                }
  
                if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
                        DRM_ERROR("failed to init PCI GART!\n");
                        radeon_do_cleanup_cp(dev);
 -                      return DRM_ERR(ENOMEM);
 +                      return -ENOMEM;
                }
  
                /* Turn on PCI GART */
        return 0;
  }
  
 -static int radeon_do_cleanup_cp(drm_device_t * dev)
 +static int radeon_do_cleanup_cp(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG("\n");
   *
   * Charl P. Botha <http://cpbotha.net>
   */
 -static int radeon_do_resume_cp(drm_device_t * dev)
 +static int radeon_do_resume_cp(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
  
        if (!dev_priv) {
                DRM_ERROR("Called with no initialization\n");
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        DRM_DEBUG("Starting radeon_do_resume_cp()\n");
        return 0;
  }
  
 -int radeon_cp_init(DRM_IOCTL_ARGS)
 +int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
 -      drm_radeon_init_t init;
 +      drm_radeon_init_t *init = data;
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
 -      DRM_COPY_FROM_USER_IOCTL(init, (drm_radeon_init_t __user *) data,
 -                               sizeof(init));
 -
 -      if (init.func == RADEON_INIT_R300_CP)
 +      if (init->func == RADEON_INIT_R300_CP)
                r300_init_reg_flags();
  
 -      switch (init.func) {
 +      switch (init->func) {
        case RADEON_INIT_CP:
        case RADEON_INIT_R200_CP:
        case RADEON_INIT_R300_CP:
 -              return radeon_do_init_cp(dev, &init);
 +              return radeon_do_init_cp(dev, init);
        case RADEON_CLEANUP_CP:
                return radeon_do_cleanup_cp(dev);
        }
  
 -      return DRM_ERR(EINVAL);
 +      return -EINVAL;
  }
  
 -int radeon_cp_start(DRM_IOCTL_ARGS)
 +int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG("\n");
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        if (dev_priv->cp_running) {
                DRM_DEBUG("%s while CP running\n", __FUNCTION__);
  /* Stop the CP.  The engine must have been idled before calling this
   * routine.
   */
 -int radeon_cp_stop(DRM_IOCTL_ARGS)
 +int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        drm_radeon_private_t *dev_priv = dev->dev_private;
 -      drm_radeon_cp_stop_t stop;
 +      drm_radeon_cp_stop_t *stop = data;
        int ret;
        DRM_DEBUG("\n");
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 -
 -      DRM_COPY_FROM_USER_IOCTL(stop, (drm_radeon_cp_stop_t __user *) data,
 -                               sizeof(stop));
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        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.
         */
 -      if (stop.flush) {
 +      if (stop->flush) {
                radeon_do_cp_flush(dev_priv);
        }
  
        /* If we fail to make the engine go idle, we return an error
         * code so that the DRM ioctl wrapper can try again.
         */
 -      if (stop.idle) {
 +      if (stop->idle) {
                ret = radeon_do_cp_idle(dev_priv);
                if (ret)
                        return ret;
        return 0;
  }
  
 -void radeon_do_release(drm_device_t * dev)
 +void radeon_do_release(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
        int i, ret;
  
  /* Just reset the CP ring.  Called as part of an X Server engine reset.
   */
 -int radeon_cp_reset(DRM_IOCTL_ARGS)
 +int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG("\n");
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        if (!dev_priv) {
                DRM_DEBUG("%s called before init done\n", __FUNCTION__);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        radeon_do_cp_reset(dev_priv);
        return 0;
  }
  
 -int radeon_cp_idle(DRM_IOCTL_ARGS)
 +int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG("\n");
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        return radeon_do_cp_idle(dev_priv);
  }
  
  /* Added by Charl P. Botha to call radeon_do_resume_cp().
   */
 -int radeon_cp_resume(DRM_IOCTL_ARGS)
 +int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
  
        return radeon_do_resume_cp(dev);
  }
  
 -int radeon_engine_reset(DRM_IOCTL_ARGS)
 +int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        DRM_DEBUG("\n");
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        return radeon_do_engine_reset(dev);
  }
  
  /* KW: Deprecated to say the least:
   */
 -int radeon_fullscreen(DRM_IOCTL_ARGS)
 +int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
        return 0;
  }
   * they can't get the lock.
   */
  
 -drm_buf_t *radeon_freelist_get(drm_device_t * dev)
 +struct drm_buf *radeon_freelist_get(struct drm_device * dev)
  {
 -      drm_device_dma_t *dma = dev->dma;
 +      struct drm_device_dma *dma = dev->dma;
        drm_radeon_private_t *dev_priv = dev->dev_private;
        drm_radeon_buf_priv_t *buf_priv;
 -      drm_buf_t *buf;
 +      struct drm_buf *buf;
        int i, t;
        int start;
  
                for (i = start; i < dma->buf_count; i++) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
 -                      if (buf->filp == 0 || (buf->pending &&
 -                                             buf_priv->age <= done_age)) {
 +                      if (buf->file_priv == NULL || (buf->pending &&
 +                                                     buf_priv->age <=
 +                                                     done_age)) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
                                return buf;
  }
  
  #if 0
 -drm_buf_t *radeon_freelist_get(drm_device_t * dev)
 +struct drm_buf *radeon_freelist_get(struct drm_device * dev)
  {
 -      drm_device_dma_t *dma = dev->dma;
 +      struct drm_device_dma *dma = dev->dma;
        drm_radeon_private_t *dev_priv = dev->dev_private;
        drm_radeon_buf_priv_t *buf_priv;
 -      drm_buf_t *buf;
 +      struct drm_buf *buf;
        int i, t;
        int start;
        u32 done_age = DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1));
                for (i = start; i < dma->buf_count; i++) {
                        buf = dma->buflist[i];
                        buf_priv = buf->dev_private;
 -                      if (buf->filp == 0 || (buf->pending &&
 -                                             buf_priv->age <= done_age)) {
 +                      if (buf->file_priv == 0 || (buf->pending &&
 +                                                  buf_priv->age <=
 +                                                  done_age)) {
                                dev_priv->stats.requested_bufs++;
                                buf->pending = 0;
                                return buf;
  }
  #endif
  
 -void radeon_freelist_reset(drm_device_t * dev)
 +void radeon_freelist_reset(struct drm_device * dev)
  {
 -      drm_device_dma_t *dma = dev->dma;
 +      struct drm_device_dma *dma = dev->dma;
        drm_radeon_private_t *dev_priv = dev->dev_private;
        int i;
  
        dev_priv->last_buf = 0;
        for (i = 0; i < dma->buf_count; i++) {
 -              drm_buf_t *buf = dma->buflist[i];
 +              struct drm_buf *buf = dma->buflist[i];
                drm_radeon_buf_priv_t *buf_priv = buf->dev_private;
                buf_priv->age = 0;
        }
@@@ -2176,65 -2198,70 +2198,65 @@@ int radeon_wait_ring(drm_radeon_private
        radeon_status(dev_priv);
        DRM_ERROR("failed!\n");
  #endif
 -      return DRM_ERR(EBUSY);
 +      return -EBUSY;
  }
  
 -static int radeon_cp_get_buffers(DRMFILE filp, drm_device_t * dev,
 -                               drm_dma_t * d)
 +static int radeon_cp_get_buffers(struct drm_device *dev,
 +                               struct drm_file *file_priv,
 +                               struct drm_dma * d)
  {
        int i;
 -      drm_buf_t *buf;
 +      struct drm_buf *buf;
  
        for (i = d->granted_count; i < d->request_count; i++) {
                buf = radeon_freelist_get(dev);
                if (!buf)
 -                      return DRM_ERR(EBUSY);  /* NOTE: broken client */
 +                      return -EBUSY;  /* NOTE: broken client */
  
 -              buf->filp = filp;
 +              buf->file_priv = file_priv;
  
                if (DRM_COPY_TO_USER(&d->request_indices[i], &buf->idx,
                                     sizeof(buf->idx)))
 -                      return DRM_ERR(EFAULT);
 +                      return -EFAULT;
                if (DRM_COPY_TO_USER(&d->request_sizes[i], &buf->total,
                                     sizeof(buf->total)))
 -                      return DRM_ERR(EFAULT);
 +                      return -EFAULT;
  
                d->granted_count++;
        }
        return 0;
  }
  
 -int radeon_cp_buffers(DRM_IOCTL_ARGS)
 +int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
 -      drm_device_dma_t *dma = dev->dma;
 +      struct drm_device_dma *dma = dev->dma;
        int ret = 0;
 -      drm_dma_t __user *argp = (void __user *)data;
 -      drm_dma_t d;
 +      struct drm_dma *d = data;
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 -
 -      DRM_COPY_FROM_USER_IOCTL(d, argp, sizeof(d));
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        /* Please don't send us buffers.
         */
 -      if (d.send_count != 0) {
 +      if (d->send_count != 0) {
                DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
 -                        DRM_CURRENTPID, d.send_count);
 -              return DRM_ERR(EINVAL);
 +                        DRM_CURRENTPID, d->send_count);
 +              return -EINVAL;
        }
  
        /* We'll send you buffers.
         */
 -      if (d.request_count < 0 || d.request_count > dma->buf_count) {
 +      if (d->request_count < 0 || d->request_count > dma->buf_count) {
                DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
 -                        DRM_CURRENTPID, d.request_count, dma->buf_count);
 -              return DRM_ERR(EINVAL);
 +                        DRM_CURRENTPID, d->request_count, dma->buf_count);
 +              return -EINVAL;
        }
  
 -      d.granted_count = 0;
 +      d->granted_count = 0;
  
 -      if (d.request_count) {
 -              ret = radeon_cp_get_buffers(filp, dev, &d);
 +      if (d->request_count) {
 +              ret = radeon_cp_get_buffers(dev, file_priv, d);
        }
  
 -      DRM_COPY_TO_USER_IOCTL(argp, d, sizeof(d));
 -
        return ret;
  }
  
@@@ -2245,7 -2272,7 +2267,7 @@@ int radeon_driver_load(struct drm_devic
  
        dev_priv = drm_alloc(sizeof(drm_radeon_private_t), DRM_MEM_DRIVER);
        if (dev_priv == NULL)
 -              return DRM_ERR(ENOMEM);
 +              return -ENOMEM;
  
        memset(dev_priv, 0, sizeof(drm_radeon_private_t));
        dev->dev_private = (void *)dev_priv;
@@@ -2301,6 -2328,9 +2323,9 @@@ int radeon_driver_firstopen(struct drm_
        if (ret != 0)
                return ret;
  
+ #ifdef RADEON_HAVE_BUFFER
+       drm_bo_driver_init(dev);
+ #endif
        return 0;
  }
  
diff --combined shared-core/radeon_drm.h
@@@ -417,7 -417,7 +417,7 @@@ typedef struct 
  
        /* The current cliprects, or a subset thereof.
         */
 -      drm_clip_rect_t boxes[RADEON_NR_SAREA_CLIPRECTS];
 +      struct drm_clip_rect boxes[RADEON_NR_SAREA_CLIPRECTS];
        unsigned int nbox;
  
        /* Counters for client-side throttling of rendering clients.
        unsigned int last_dispatch;
        unsigned int last_clear;
  
 -      drm_tex_region_t tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS +
 +      struct drm_tex_region tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS +
                                                       1];
        unsigned int tex_age[RADEON_NR_TEX_HEAPS];
        int ctx_owner;
        int pfCurrentPage;      /* which buffer is being displayed? */
        int crtc2_base;         /* CRTC2 frame offset */
        int tiling_enabled;     /* set by drm, read by 2d + 3d clients */
+       unsigned int last_fence;
  } drm_radeon_sarea_t;
  
+ /* The only fence class we support */
+ #define DRM_RADEON_FENCE_CLASS_ACCEL 0
+ /* Fence type that guarantees read-write flush */
+ #define DRM_RADEON_FENCE_TYPE_RW 2
+ /* cache flushes programmed just before the fence */
+ #define DRM_RADEON_FENCE_FLAG_FLUSHED 0x01000000
  /* WARNING: If you change any of these defines, make sure to change the
   * defines in the Xserver file (xf86drmRadeon.h)
   *
@@@ -604,7 -613,7 +613,7 @@@ typedef struct drm_radeon_cmd_buffer 
        int bufsz;
        char __user *buf;
        int nbox;
 -      drm_clip_rect_t __user *boxes;
 +      struct drm_clip_rect __user *boxes;
  } drm_radeon_cmd_buffer_t;
  
  typedef struct drm_radeon_tex_image {
diff --combined shared-core/radeon_drv.h
  #define DRIVER_MINOR          28
  #define DRIVER_PATCHLEVEL     0
  
+ #if defined(__linux__)
+ #define RADEON_HAVE_FENCE
+ #define RADEON_HAVE_BUFFER
+ #endif
  /*
   * Radeon chip families
   */
@@@ -156,7 -161,7 +161,7 @@@ enum radeon_chip_flags 
  
  typedef struct drm_radeon_freelist {
        unsigned int age;
 -      drm_buf_t *buf;
 +      struct drm_buf *buf;
        struct drm_radeon_freelist *next;
        struct drm_radeon_freelist *prev;
  } drm_radeon_freelist_t;
  typedef struct drm_radeon_ring_buffer {
        u32 *start;
        u32 *end;
 -      int size;
 -      int size_l2qw;
 +      int size; /* Double Words */
 +      int size_l2qw; /* log2 Quad Words */
 +
 +      int rptr_update; /* Double Words */
 +      int rptr_update_l2qw; /* log2 Quad Words */
 +
 +      int fetch_size; /* Double Words */
 +      int fetch_size_l2ow; /* log2 Oct Words */
  
        u32 tail;
        u32 tail_mask;
@@@ -195,7 -194,7 +200,7 @@@ struct mem_block 
        struct mem_block *prev;
        int start;
        int size;
 -      DRMFILE filp;           /* 0: free, -1: heap, other: real files */
 +      struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */
  };
  
  struct radeon_surface {
@@@ -210,7 -209,7 +215,7 @@@ struct radeon_virt_surface 
        u32 lower;
        u32 upper;
        u32 flags;
 -      DRMFILE filp;
 +      struct drm_file *file_priv;
  };
  
  typedef struct drm_radeon_private {
        struct mem_block *fb_heap;
  
        /* SW interrupt */
-       wait_queue_head_t swi_queue;
-       atomic_t swi_emitted;
+       wait_queue_head_t irq_queue;
+       int counter;
        int vblank_crtc;
        uint32_t irq_enable_reg;
        int irq_enabled;
  
        unsigned long pcigart_offset;
        unsigned int pcigart_offset_set;
 -      drm_ati_pcigart_info gart_info;
 +      struct ati_pcigart_info gart_info;
  
        u32 scratch_ages[5];
  
@@@ -312,11 -312,11 +318,11 @@@ typedef struct drm_radeon_kcmd_buffer 
        int bufsz;
        char *buf;
        int nbox;
 -      drm_clip_rect_t __user *boxes;
 +      struct drm_clip_rect __user *boxes;
  } drm_radeon_kcmd_buffer_t;
  
  extern int radeon_no_wb;
 -extern drm_ioctl_desc_t radeon_ioctls[];
 +extern struct drm_ioctl_desc radeon_ioctls[];
  extern int radeon_max_ioctl;
  
  /* Check whether the given hardware address is inside the framebuffer or the
@@@ -335,66 -335,88 +341,92 @@@ static __inline__ int radeon_check_offs
  }
  
                                /* radeon_cp.c */
 -extern int radeon_cp_init(DRM_IOCTL_ARGS);
 -extern int radeon_cp_start(DRM_IOCTL_ARGS);
 -extern int radeon_cp_stop(DRM_IOCTL_ARGS);
 -extern int radeon_cp_reset(DRM_IOCTL_ARGS);
 -extern int radeon_cp_idle(DRM_IOCTL_ARGS);
 -extern int radeon_cp_resume(DRM_IOCTL_ARGS);
 -extern int radeon_engine_reset(DRM_IOCTL_ARGS);
 -extern int radeon_fullscreen(DRM_IOCTL_ARGS);
 -extern int radeon_cp_buffers(DRM_IOCTL_ARGS);
 +extern int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv);
+ extern void radeon_gart_flush(struct drm_device *dev);
  
 -extern void radeon_freelist_reset(drm_device_t * dev);
 -extern drm_buf_t *radeon_freelist_get(drm_device_t * dev);
 +extern void radeon_freelist_reset(struct drm_device * dev);
 +extern struct drm_buf *radeon_freelist_get(struct drm_device * dev);
  
  extern int radeon_wait_ring(drm_radeon_private_t * dev_priv, int n);
  
  extern int radeon_do_cp_idle(drm_radeon_private_t * dev_priv);
  
 -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 int radeon_mem_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_mem_init_heap(struct drm_device *dev, void *data, struct drm_file *file_priv);
  extern void radeon_mem_takedown(struct mem_block **heap);
 -extern void radeon_mem_release(DRMFILE filp, struct mem_block *heap);
 +extern void radeon_mem_release(struct drm_file *file_priv,
 +                             struct mem_block *heap);
  
                                /* radeon_irq.c */
 -extern int radeon_irq_emit(DRM_IOCTL_ARGS);
 -extern int radeon_irq_wait(DRM_IOCTL_ARGS);
 -extern int radeon_emit_irq(drm_device_t * dev);
 +extern int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_priv);
 +extern int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_priv);
++extern int radeon_emit_irq(struct drm_device * dev);
  
 -extern void radeon_do_release(drm_device_t * dev);
 -extern int radeon_driver_vblank_wait(drm_device_t * dev,
 +extern void radeon_do_release(struct drm_device * dev);
 +extern int radeon_driver_vblank_wait(struct drm_device * dev,
                                     unsigned int *sequence);
 -extern int radeon_driver_vblank_wait2(drm_device_t * dev,
 +extern int radeon_driver_vblank_wait2(struct drm_device * dev,
                                      unsigned int *sequence);
  extern irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS);
 -extern void radeon_driver_irq_preinstall(drm_device_t * dev);
 -extern void radeon_driver_irq_postinstall(drm_device_t * dev);
 -extern void radeon_driver_irq_uninstall(drm_device_t * dev);
 -extern int radeon_vblank_crtc_get(drm_device_t *dev);
 -extern int radeon_vblank_crtc_set(drm_device_t *dev, int64_t value);
 +extern void radeon_driver_irq_preinstall(struct drm_device * dev);
 +extern void radeon_driver_irq_postinstall(struct drm_device * dev);
 +extern void radeon_driver_irq_uninstall(struct drm_device * dev);
 +extern int radeon_vblank_crtc_get(struct drm_device *dev);
 +extern int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value);
  
  extern int radeon_driver_load(struct drm_device *dev, unsigned long flags);
  extern int radeon_driver_unload(struct drm_device *dev);
  extern int radeon_driver_firstopen(struct drm_device *dev);
 -extern void radeon_driver_preclose(drm_device_t * dev, DRMFILE filp);
 -extern void radeon_driver_postclose(drm_device_t * dev, drm_file_t * filp);
 -extern void radeon_driver_lastclose(drm_device_t * dev);
 -extern int radeon_driver_open(drm_device_t * dev, drm_file_t * filp_priv);
 +extern void radeon_driver_preclose(struct drm_device * dev,
 +                                 struct drm_file *file_priv);
 +extern void radeon_driver_postclose(struct drm_device * dev,
 +                                  struct drm_file *file_priv);
 +extern void radeon_driver_lastclose(struct drm_device * dev);
 +extern int radeon_driver_open(struct drm_device * dev,
 +                            struct drm_file * file_priv);
  extern long radeon_compat_ioctl(struct file *filp, unsigned int cmd,
                                         unsigned long arg);
  
  /* r300_cmdbuf.c */
  extern void r300_init_reg_flags(void);
  
 -extern int r300_do_cp_cmdbuf(drm_device_t *dev, DRMFILE filp,
 -                           drm_file_t* filp_priv,
 +extern int r300_do_cp_cmdbuf(struct drm_device *dev,
 +                           struct drm_file *file_priv,
                             drm_radeon_kcmd_buffer_t* cmdbuf);
  
 -extern void radeon_fence_handler(drm_device_t *dev);
 -extern int radeon_fence_emit_sequence(drm_device_t *dev, uint32_t class,
+ #ifdef RADEON_HAVE_FENCE
+ /* i915_fence.c */
 -extern void radeon_poke_flush(drm_device_t *dev, uint32_t class);
 -extern int radeon_fence_has_irq(drm_device_t *dev, uint32_t class, uint32_t flags);
++extern void radeon_fence_handler(struct drm_device *dev);
++extern int radeon_fence_emit_sequence(struct drm_device *dev, uint32_t class,
+                                     uint32_t flags, uint32_t *sequence, 
+                                   uint32_t *native_type);
 -extern drm_ttm_backend_t *radeon_create_ttm_backend_entry(drm_device_t *dev);
++extern void radeon_poke_flush(struct drm_device *dev, uint32_t class);
++extern int radeon_fence_has_irq(struct drm_device *dev, uint32_t class, uint32_t flags);
+ #endif
+ #ifdef RADEON_HAVE_BUFFER
+ /* radeon_buffer.c */
 -extern int radeon_invalidate_caches(drm_device_t *dev, uint32_t buffer_flags);
 -extern uint32_t radeon_evict_mask(drm_buffer_object_t *bo);
 -extern int radeon_init_mem_type(drm_device_t * dev, uint32_t type,
 -                              drm_mem_type_manager_t * man);
 -extern int radeon_move(drm_buffer_object_t * bo,
 -                     int evict, int no_wait, drm_bo_mem_reg_t * new_mem);
++extern drm_ttm_backend_t *radeon_create_ttm_backend_entry(struct drm_device *dev);
+ extern int radeon_fence_types(struct drm_buffer_object *bo, uint32_t *class, uint32_t *type);
++extern int radeon_invalidate_caches(struct drm_device *dev, uint64_t buffer_flags);
++extern uint32_t radeon_evict_mask(struct drm_buffer_object *bo);
++extern int radeon_init_mem_type(struct drm_device * dev, uint32_t type,
++                              struct drm_mem_type_manager * man);
++extern int radeon_move(struct drm_buffer_object * bo,
++                     int evict, int no_wait, struct drm_bo_mem_reg * new_mem);
+ #endif
  /* Flags for stats.boxes
   */
  #define RADEON_BOX_DMA_IDLE      0x1
  #     define RADEON_SOFT_RESET_E2             (1 <<  5)
  #     define RADEON_SOFT_RESET_RB             (1 <<  6)
  #     define RADEON_SOFT_RESET_HDP            (1 <<  7)
 +/*
 + *   6:0  Available slots in the FIFO
 + *   8    Host Interface active
 + *   9    CP request active
 + *   10   FIFO request active
 + *   11   Host Interface retry active
 + *   12   CP retry active
 + *   13   FIFO retry active
 + *   14   FIFO pipeline busy
 + *   15   Event engine busy
 + *   16   CP command stream busy
 + *   17   2D engine busy
 + *   18   2D portion of render backend busy
 + *   20   3D setup engine busy
 + *   26   GA engine busy
 + *   27   CBA 2D engine busy
 + *   31   2D engine busy or 3D engine busy or FIFO not empty or CP busy or
 + *           command stream queue not empty or Ring Buffer not empty
 + */
  #define RADEON_RBBM_STATUS            0x0e40
 +/* Same as the previous RADEON_RBBM_STATUS; this is a mirror of that register.  */
 +/* #define RADEON_RBBM_STATUS                 0x1740 */
 +/* bits 6:0 are dword slots available in the cmd fifo */
  #     define RADEON_RBBM_FIFOCNT_MASK         0x007f
 -#     define RADEON_RBBM_ACTIVE               (1 << 31)
 +#     define RADEON_HIRQ_ON_RBB       (1 <<  8)
 +#     define RADEON_CPRQ_ON_RBB       (1 <<  9)
 +#     define RADEON_CFRQ_ON_RBB       (1 << 10)
 +#     define RADEON_HIRQ_IN_RTBUF     (1 << 11)
 +#     define RADEON_CPRQ_IN_RTBUF     (1 << 12)
 +#     define RADEON_CFRQ_IN_RTBUF     (1 << 13)
 +#     define RADEON_PIPE_BUSY         (1 << 14)
 +#     define RADEON_ENG_EV_BUSY       (1 << 15)
 +#     define RADEON_CP_CMDSTRM_BUSY   (1 << 16)
 +#     define RADEON_E2_BUSY           (1 << 17)
 +#     define RADEON_RB2D_BUSY         (1 << 18)
 +#     define RADEON_RB3D_BUSY         (1 << 19) /* not used on r300 */
 +#     define RADEON_VAP_BUSY          (1 << 20)
 +#     define RADEON_RE_BUSY           (1 << 21) /* not used on r300 */
 +#     define RADEON_TAM_BUSY          (1 << 22) /* not used on r300 */
 +#     define RADEON_TDM_BUSY          (1 << 23) /* not used on r300 */
 +#     define RADEON_PB_BUSY           (1 << 24) /* not used on r300 */
 +#     define RADEON_TIM_BUSY          (1 << 25) /* not used on r300 */
 +#     define RADEON_GA_BUSY           (1 << 26)
 +#     define RADEON_CBA2D_BUSY        (1 << 27)
 +#     define RADEON_RBBM_ACTIVE       (1 << 31)
  #define RADEON_RE_LINE_PATTERN                0x1cd0
  #define RADEON_RE_MISC                        0x26c4
  #define RADEON_RE_TOP_LEFT            0x26c0
@@@ -1266,4 -1246,19 +1298,19 @@@ do {                                                                  
        write &= mask;                                          \
  } while (0)
  
 -static inline int radeon_update_breadcrumb(drm_device_t *dev)
+ /* Breadcrumb - swi irq */
+ #define READ_BREADCRUMB(dev_priv) RADEON_READ(RADEON_LAST_SWI_REG)
++static inline int radeon_update_breadcrumb(struct drm_device *dev)
+ {
+       drm_radeon_private_t *dev_priv = dev->dev_private;
+       dev_priv->sarea_priv->last_fence = ++dev_priv->counter;
+       if (dev_priv->counter > 0x7FFFFFFFUL)
+               dev_priv->sarea_priv->last_fence = dev_priv->counter = 1;
+       return dev_priv->counter;
+ }
  #endif                                /* __RADEON_DRV_H__ */
diff --combined shared-core/radeon_irq.c
@@@ -64,7 -64,7 +64,7 @@@ static __inline__ u32 radeon_acknowledg
  
  irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)
  {
 -      drm_device_t *dev = (drm_device_t *) arg;
 +      struct drm_device *dev = (struct drm_device *) arg;
        drm_radeon_private_t *dev_priv =
            (drm_radeon_private_t *) dev->dev_private;
        u32 stat;
        /* Only consider the bits we're interested in - others could be used
         * outside the DRM
         */
 -      stat = radeon_acknowledge_irqs(dev_priv, dev_priv->irq_enable_reg);
 +      stat = radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK |
 +                                                RADEON_CRTC_VBLANK_STAT |
 +                                                RADEON_CRTC2_VBLANK_STAT));
        if (!stat)
                return IRQ_NONE;
  
 +      stat &= dev_priv->irq_enable_reg;
 +
        /* SW interrupt */
        if (stat & RADEON_SW_INT_TEST) {
-               DRM_WAKEUP(&dev_priv->swi_queue);
+               DRM_WAKEUP(&dev_priv->irq_queue);
+ #ifdef RADEON_HAVE_FENCE
+               radeon_fence_handler(dev);
+ #endif
        }
  
        /* VBLANK interrupt */
        return IRQ_HANDLED;
  }
  
- static int radeon_emit_irq(struct drm_device * dev)
 -int radeon_emit_irq(drm_device_t * dev)
++int radeon_emit_irq(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv = dev->dev_private;
        unsigned int ret;
        RING_LOCALS;
  
-       atomic_inc(&dev_priv->swi_emitted);
-       ret = atomic_read(&dev_priv->swi_emitted);
+       ret = radeon_update_breadcrumb(dev);
  
        BEGIN_RING(4);
        OUT_RING_REG(RADEON_LAST_SWI_REG, ret);
        return ret;
  }
  
 -static int radeon_wait_irq(drm_device_t * dev, int irq_nr)
 +static int radeon_wait_irq(struct drm_device * dev, int swi_nr)
  {
        drm_radeon_private_t *dev_priv =
            (drm_radeon_private_t *) dev->dev_private;
        int ret = 0;
  
-       if (RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr)
 -      if (READ_BREADCRUMB(dev_priv) >= irq_nr)
++      if (READ_BREADCRUMB(dev_priv) >= swi_nr)
                return 0;
  
        dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE;
  
-       DRM_WAIT_ON(ret, dev_priv->swi_queue, 3 * DRM_HZ,
-                   RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr);
+       DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,
 -                  READ_BREADCRUMB(dev_priv) >= irq_nr);
++                  READ_BREADCRUMB(dev_priv) >= swi_nr);
  
        return ret;
  }
  
 -int radeon_driver_vblank_do_wait(drm_device_t * dev, unsigned int *sequence,
 -                               int crtc)
 +static int radeon_driver_vblank_do_wait(struct drm_device * dev,
 +                                      unsigned int *sequence,
 +                                      int crtc)
  {
        drm_radeon_private_t *dev_priv =
            (drm_radeon_private_t *) dev->dev_private;
        atomic_t *counter;
        if (!dev_priv) {
                DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
        if (crtc == DRM_RADEON_VBLANK_CRTC1) {
                counter = &dev->vbl_received2;
                ack |= RADEON_CRTC2_VBLANK_STAT;
        } else
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
  
        radeon_acknowledge_irqs(dev_priv, ack);
  
        return ret;
  }
  
 -int radeon_driver_vblank_wait(drm_device_t *dev, unsigned int *sequence)
 +int radeon_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence)
  {
        return radeon_driver_vblank_do_wait(dev, sequence, DRM_RADEON_VBLANK_CRTC1);
  }
  
 -int radeon_driver_vblank_wait2(drm_device_t *dev, unsigned int *sequence)
 +int radeon_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
  {
        return radeon_driver_vblank_do_wait(dev, sequence, DRM_RADEON_VBLANK_CRTC2);
  }
  
  /* Needs the lock as it touches the ring.
   */
 -int radeon_irq_emit(DRM_IOCTL_ARGS)
 +int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        drm_radeon_private_t *dev_priv = dev->dev_private;
 -      drm_radeon_irq_emit_t emit;
 +      drm_radeon_irq_emit_t *emit = data;
        int result;
  
 -      LOCK_TEST_WITH_RETURN(dev, filp);
 +      LOCK_TEST_WITH_RETURN(dev, file_priv);
  
        if (!dev_priv) {
                DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
 -      DRM_COPY_FROM_USER_IOCTL(emit, (drm_radeon_irq_emit_t __user *) data,
 -                               sizeof(emit));
 -
        result = radeon_emit_irq(dev);
  
 -      if (DRM_COPY_TO_USER(emit.irq_seq, &result, sizeof(int))) {
 +      if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
                DRM_ERROR("copy_to_user\n");
 -              return DRM_ERR(EFAULT);
 +              return -EFAULT;
        }
  
        return 0;
  
  /* Doesn't need the hardware lock.
   */
 -int radeon_irq_wait(DRM_IOCTL_ARGS)
 +int radeon_irq_wait(struct drm_device *dev, void *data, struct drm_file *file_priv)
  {
 -      DRM_DEVICE;
        drm_radeon_private_t *dev_priv = dev->dev_private;
 -      drm_radeon_irq_wait_t irqwait;
 +      drm_radeon_irq_wait_t *irqwait = data;
  
        if (!dev_priv) {
                DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
  
 -      DRM_COPY_FROM_USER_IOCTL(irqwait, (drm_radeon_irq_wait_t __user *) data,
 -                               sizeof(irqwait));
 -
 -      return radeon_wait_irq(dev, irqwait.irq_seq);
 +      return radeon_wait_irq(dev, irqwait->irq_seq);
  }
  
 -static void radeon_enable_interrupt(drm_device_t *dev)
 +static void radeon_enable_interrupt(struct drm_device *dev)
  {
        drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
  
  
  /* drm_dma.h hooks
  */
 -void radeon_driver_irq_preinstall(drm_device_t * dev)
 +void radeon_driver_irq_preinstall(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv =
            (drm_radeon_private_t *) dev->dev_private;
  
        /* Clear bits if they're already high */
        radeon_acknowledge_irqs(dev_priv, (RADEON_SW_INT_TEST_ACK |
 -                                         RADEON_CRTC_VBLANK_STAT));
 +                                         RADEON_CRTC_VBLANK_STAT |
 +                                         RADEON_CRTC2_VBLANK_STAT));
  }
  
 -void radeon_driver_irq_postinstall(drm_device_t * dev)
 +void radeon_driver_irq_postinstall(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv =
            (drm_radeon_private_t *) dev->dev_private;
  
-       atomic_set(&dev_priv->swi_emitted, 0);
-       DRM_INIT_WAITQUEUE(&dev_priv->swi_queue);
+       dev_priv->counter = 0;
+       DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);
  
        radeon_enable_interrupt(dev);
  }
  
 -void radeon_driver_irq_uninstall(drm_device_t * dev)
 +void radeon_driver_irq_uninstall(struct drm_device * dev)
  {
        drm_radeon_private_t *dev_priv =
            (drm_radeon_private_t *) dev->dev_private;
  }
  
  
 -int radeon_vblank_crtc_get(drm_device_t *dev)
 +int radeon_vblank_crtc_get(struct drm_device *dev)
  {
        drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
        u32 flag;
        return value;
  }
  
 -int radeon_vblank_crtc_set(drm_device_t *dev, int64_t value)
 +int radeon_vblank_crtc_set(struct drm_device *dev, int64_t value)
  {
        drm_radeon_private_t *dev_priv = (drm_radeon_private_t *) dev->dev_private;
        if (value & ~(DRM_RADEON_VBLANK_CRTC1 | DRM_RADEON_VBLANK_CRTC2)) {
                DRM_ERROR("called with invalid crtc 0x%x\n", (unsigned int)value);
 -              return DRM_ERR(EINVAL);
 +              return -EINVAL;
        }
        dev_priv->vblank_crtc = (unsigned int)value;
        radeon_enable_interrupt(dev);