vserver 2.0 rc7
[linux-2.6.git] / drivers / char / drm / i810_dma.c
index 3d6200c..24857cc 100644 (file)
 #define up_write up
 #endif
 
-drm_ioctl_desc_t i810_ioctls[] = {
-       [DRM_IOCTL_NR(DRM_I810_INIT)]    = { i810_dma_init,    1, 1 },
-       [DRM_IOCTL_NR(DRM_I810_VERTEX)]  = { i810_dma_vertex,  1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_CLEAR)]   = { i810_clear_bufs,  1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_FLUSH)]   = { i810_flush_ioctl, 1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_GETAGE)]  = { i810_getage,      1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_GETBUF)]  = { i810_getbuf,      1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_SWAP)]    = { i810_swap_bufs,   1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_COPY)]    = { i810_copybuf,     1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_DOCOPY)]  = { i810_docopy,      1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_OV0INFO)] = { i810_ov0_info,    1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_FSTATUS)] = { i810_fstatus,     1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_OV0FLIP)] = { i810_ov0_flip,    1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_MC)]      = { i810_dma_mc,      1, 1 },
-       [DRM_IOCTL_NR(DRM_I810_RSTATUS)] = { i810_rstatus,     1, 0 },
-       [DRM_IOCTL_NR(DRM_I810_FLIP)]    = { i810_flip_bufs,   1, 0 }
-};
-
-int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls);
-
 static drm_buf_t *i810_freelist_get(drm_device_t *dev)
 {
        drm_device_dma_t *dma = dev->dma;
@@ -128,7 +108,7 @@ int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
        drm_i810_buf_priv_t *buf_priv;
 
        lock_kernel();
-       dev      = priv->dev;
+       dev      = priv->head->dev;
        dev_priv = dev->dev_private;
        buf      = dev_priv->mmap_buffer;
        buf_priv = buf->dev_private;
@@ -139,7 +119,7 @@ int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
        buf_priv->currently_mapped = I810_BUF_MAPPED;
        unlock_kernel();
 
-       if (remap_pfn_range(DRM_RPR_ARG(vma) vma->vm_start,
+       if (io_remap_pfn_range(vma, vma->vm_start,
                             VM_OFFSET(vma) >> PAGE_SHIFT,
                             vma->vm_end - vma->vm_start,
                             vma->vm_page_prot)) return -EAGAIN;
@@ -149,7 +129,7 @@ int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
 static int i810_map_buffer(drm_buf_t *buf, struct file *filp)
 {
        drm_file_t        *priv   = filp->private_data;
-       drm_device_t      *dev    = priv->dev;
+       drm_device_t      *dev    = priv->head->dev;
        drm_i810_buf_priv_t *buf_priv = buf->dev_private;
        drm_i810_private_t *dev_priv = dev->dev_private;
        struct file_operations *old_fops;
@@ -229,7 +209,7 @@ static int i810_dma_get_buffer(drm_device_t *dev, drm_i810_dma_t *d,
        return retcode;
 }
 
-int i810_dma_cleanup(drm_device_t *dev)
+static int i810_dma_cleanup(drm_device_t *dev)
 {
        drm_device_dma_t *dma = dev->dma;
 
@@ -455,7 +435,7 @@ static int i810_dma_initialize(drm_device_t *dev,
  *    If it isn't then we have a v1.1 client. Fix up params.
  *    If it is, then we have a 1.2 client... get the rest of the data.
  */
-int i810_dma_init_compat(drm_i810_init_t *init, unsigned long arg)
+static int i810_dma_init_compat(drm_i810_init_t *init, unsigned long arg)
 {
 
        /* Get v1.1 init data */
@@ -487,11 +467,11 @@ int i810_dma_init_compat(drm_i810_init_t *init, unsigned long arg)
        return 0;
 }
 
-int i810_dma_init(struct inode *inode, struct file *filp,
+static int i810_dma_init(struct inode *inode, struct file *filp,
                  unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_private_t *dev_priv;
        drm_i810_init_t init;
        int retcode = 0;
@@ -942,7 +922,7 @@ static void i810_dma_dispatch_flip( drm_device_t *dev )
 
 }
 
-void i810_dma_quiescent(drm_device_t *dev)
+static void i810_dma_quiescent(drm_device_t *dev)
 {
        drm_i810_private_t *dev_priv = dev->dev_private;
        RING_LOCALS;
@@ -1027,7 +1007,7 @@ int i810_flush_ioctl(struct inode *inode, struct file *filp,
                     unsigned int cmd, unsigned long arg)
 {
        drm_file_t        *priv   = filp->private_data;
-       drm_device_t      *dev    = priv->dev;
+       drm_device_t      *dev    = priv->head->dev;
 
        LOCK_TEST_WITH_RETURN(dev, filp);
 
@@ -1036,11 +1016,11 @@ int i810_flush_ioctl(struct inode *inode, struct file *filp,
 }
 
 
-int i810_dma_vertex(struct inode *inode, struct file *filp,
+static int i810_dma_vertex(struct inode *inode, struct file *filp,
               unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_device_dma_t *dma = dev->dma;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
        u32 *hw_status = dev_priv->hw_status_page;
@@ -1073,11 +1053,11 @@ int i810_dma_vertex(struct inode *inode, struct file *filp,
 
 
 
-int i810_clear_bufs(struct inode *inode, struct file *filp,
+static int i810_clear_bufs(struct inode *inode, struct file *filp,
                   unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_clear_t clear;
 
        if (copy_from_user(&clear, (drm_i810_clear_t __user *)arg, sizeof(clear)))
@@ -1096,11 +1076,11 @@ int i810_clear_bufs(struct inode *inode, struct file *filp,
        return 0;
 }
 
-int i810_swap_bufs(struct inode *inode, struct file *filp,
+static int i810_swap_bufs(struct inode *inode, struct file *filp,
                  unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
 
        DRM_DEBUG("i810_swap_bufs\n");
 
@@ -1110,11 +1090,11 @@ int i810_swap_bufs(struct inode *inode, struct file *filp,
        return 0;
 }
 
-int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd,
+static int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd,
                unsigned long arg)
 {
        drm_file_t        *priv     = filp->private_data;
-       drm_device_t      *dev      = priv->dev;
+       drm_device_t      *dev      = priv->head->dev;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
        u32 *hw_status = dev_priv->hw_status_page;
        drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
@@ -1124,11 +1104,11 @@ int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd,
        return 0;
 }
 
-int i810_getbuf(struct inode *inode, struct file *filp, unsigned int cmd,
+static int i810_getbuf(struct inode *inode, struct file *filp, unsigned int cmd,
                unsigned long arg)
 {
        drm_file_t        *priv     = filp->private_data;
-       drm_device_t      *dev      = priv->dev;
+       drm_device_t      *dev      = priv->head->dev;
        int               retcode   = 0;
        drm_i810_dma_t    d;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
@@ -1155,17 +1135,15 @@ int i810_getbuf(struct inode *inode, struct file *filp, unsigned int cmd,
        return retcode;
 }
 
-int i810_copybuf(struct inode *inode,
-                struct file *filp, 
-                unsigned int cmd,
-                unsigned long arg)
+static int i810_copybuf(struct inode *inode,
+                        struct file *filp, unsigned int cmd, unsigned long arg)
 {
        /* Never copy - 2.4.x doesn't need it */
        return 0;
 }
 
-int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd,
-               unsigned long arg)
+static int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd,
+                       unsigned long arg)
 {
        /* Never copy - 2.4.x doesn't need it */
        return 0;
@@ -1234,11 +1212,11 @@ static void i810_dma_dispatch_mc(drm_device_t *dev, drm_buf_t *buf, int used,
        ADVANCE_LP_RING();
 }
 
-int i810_dma_mc(struct inode *inode, struct file *filp,
+static int i810_dma_mc(struct inode *inode, struct file *filp,
        unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_device_dma_t *dma = dev->dma;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
        u32 *hw_status = dev_priv->hw_status_page;
@@ -1265,21 +1243,21 @@ int i810_dma_mc(struct inode *inode, struct file *filp,
        return 0;
 }
 
-int i810_rstatus(struct inode *inode, struct file *filp,
-               unsigned int cmd, unsigned long arg)
+static int i810_rstatus(struct inode *inode, struct file *filp,
+                       unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
 
        return (int)(((u32 *)(dev_priv->hw_status_page))[4]);
 }
 
-int i810_ov0_info(struct inode *inode, struct file *filp,
-               unsigned int cmd, unsigned long arg)
+static int i810_ov0_info(struct inode *inode, struct file *filp,
+                       unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
        drm_i810_overlay_t data;
 
@@ -1290,11 +1268,11 @@ int i810_ov0_info(struct inode *inode, struct file *filp,
        return 0;
 }
 
-int i810_fstatus(struct inode *inode, struct file *filp,
-               unsigned int cmd, unsigned long arg)
+static int i810_fstatus(struct inode *inode, struct file *filp,
+                       unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
 
        LOCK_TEST_WITH_RETURN(dev, filp);
@@ -1302,11 +1280,11 @@ int i810_fstatus(struct inode *inode, struct file *filp,
        return I810_READ(0x30008);
 }
 
-int i810_ov0_flip(struct inode *inode, struct file *filp,
-               unsigned int cmd, unsigned long arg)
+static int i810_ov0_flip(struct inode *inode, struct file *filp,
+                       unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
 
        LOCK_TEST_WITH_RETURN(dev, filp);
@@ -1330,7 +1308,7 @@ static void i810_do_init_pageflip( drm_device_t *dev )
        dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
 }
 
-int i810_do_cleanup_pageflip( drm_device_t *dev )
+static int i810_do_cleanup_pageflip( drm_device_t *dev )
 {
        drm_i810_private_t *dev_priv = dev->dev_private;
 
@@ -1342,11 +1320,11 @@ int i810_do_cleanup_pageflip( drm_device_t *dev )
        return 0;
 }
 
-int i810_flip_bufs(struct inode *inode, struct file *filp,
-                  unsigned int cmd, unsigned long arg)
+static int i810_flip_bufs(struct inode *inode, struct file *filp,
+                       unsigned int cmd, unsigned long arg)
 {
        drm_file_t *priv = filp->private_data;
-       drm_device_t *dev = priv->dev;
+       drm_device_t *dev = priv->head->dev;
        drm_i810_private_t *dev_priv = dev->dev_private;
 
        DRM_DEBUG("%s\n", __FUNCTION__);
@@ -1365,6 +1343,16 @@ void i810_driver_pretakedown(drm_device_t *dev)
        i810_dma_cleanup( dev );
 }
 
+void i810_driver_prerelease(drm_device_t *dev, DRMFILE filp)
+{
+       if (dev->dev_private) {
+               drm_i810_private_t *dev_priv = dev->dev_private;
+               if (dev_priv->page_flipping) {
+                       i810_do_cleanup_pageflip(dev);
+               }
+       }
+}
+
 void i810_driver_release(drm_device_t *dev, struct file *filp)
 {
        i810_reclaim_buffers(dev, filp);
@@ -1376,4 +1364,22 @@ int i810_driver_dma_quiescent(drm_device_t *dev)
        return 0;
 }
 
+drm_ioctl_desc_t i810_ioctls[] = {
+       [DRM_IOCTL_NR(DRM_I810_INIT)]    = { i810_dma_init,    1, 1 },
+       [DRM_IOCTL_NR(DRM_I810_VERTEX)]  = { i810_dma_vertex,  1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_CLEAR)]   = { i810_clear_bufs,  1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_FLUSH)]   = { i810_flush_ioctl, 1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_GETAGE)]  = { i810_getage,      1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_GETBUF)]  = { i810_getbuf,      1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_SWAP)]    = { i810_swap_bufs,   1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_COPY)]    = { i810_copybuf,     1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_DOCOPY)]  = { i810_docopy,      1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_OV0INFO)] = { i810_ov0_info,    1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_FSTATUS)] = { i810_fstatus,     1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_OV0FLIP)] = { i810_ov0_flip,    1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_MC)]      = { i810_dma_mc,      1, 1 },
+       [DRM_IOCTL_NR(DRM_I810_RSTATUS)] = { i810_rstatus,     1, 0 },
+       [DRM_IOCTL_NR(DRM_I810_FLIP)]    = { i810_flip_bufs,   1, 0 }
+};
 
+int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls);