]> git.hungrycats.org Git - linux/commitdiff
remove DRIVER_FILE_FIELDS, replace with a private driver structure
authorDave Airlie <airlied@starflyer.(none)>
Sun, 5 Sep 2004 20:55:41 +0000 (06:55 +1000)
committerDave Airlie <airlied@starflyer.(none)>
Sun, 5 Sep 2004 20:55:41 +0000 (06:55 +1000)
allocated in open helper and freed in free_filp_priv.

Signed-off-by: Dave Airlie <airlied@linux.ie>
drivers/char/drm/drmP.h
drivers/char/drm/drm_drv.h
drivers/char/drm/drm_fops.h
drivers/char/drm/radeon.h
drivers/char/drm/radeon_drv.h
drivers/char/drm/radeon_state.c

index c93e73a8f06515bab1dbefad4d14b250e8fe3a8a..36a0f4d94b5c27f0f7b961901a03a1cb2209c6ca 100644 (file)
@@ -411,9 +411,7 @@ typedef struct drm_file {
        struct drm_device *dev;
        int               remove_auth_on_close;
        unsigned long     lock_count;
-#ifdef DRIVER_FILE_FIELDS
-       DRIVER_FILE_FIELDS;
-#endif
+       void              *driver_priv;
 } drm_file_t;
 
 /** Wait queue */
@@ -559,7 +557,8 @@ struct drm_driver_fn {
        int (*postcleanup)(struct drm_device *);
        int (*presetup)(struct drm_device *);
        int (*postsetup)(struct drm_device *);
-       void (*open_helper)(struct drm_device *, drm_file_t *);
+       int (*open_helper)(struct drm_device *, drm_file_t *);
+       void (*free_filp_priv)(struct drm_device *, drm_file_t *);
        void (*release)(struct drm_device *, struct file *filp);
        void (*dma_ready)(struct drm_device *);
        int (*dma_quiescent)(struct drm_device *);
index e16f575eed14dea65016b98ce9151a876a705731..772e73effa60d47a6262084d1355bc9797afcd60 100644 (file)
@@ -865,6 +865,9 @@ int DRM(release)( struct inode *inode, struct file *filp )
        }
        up( &dev->struct_sem );
        
+       if (dev->fn_tbl.free_filp_priv)
+               dev->fn_tbl.free_filp_priv(dev, priv);
+
        DRM(free)( priv, sizeof(*priv), DRM_MEM_FILES );
 
        /* ========================================================
index e8f173513f5d3938ea28a33c2ef70f42acbe64a7..0e91190a353bf9e70568b561451a7253fc12f89c 100644 (file)
@@ -53,6 +53,7 @@ int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev)
 {
        int          minor = iminor(inode);
        drm_file_t   *priv;
+       int ret;
 
        if (filp->f_flags & O_EXCL)   return -EBUSY; /* No exclusive opens */
        if (!DRM(cpu_valid)())        return -EINVAL;
@@ -72,8 +73,11 @@ int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev)
        priv->authenticated = capable(CAP_SYS_ADMIN);
        priv->lock_count    = 0;
 
-       if (dev->fn_tbl.open_helper)
-         dev->fn_tbl.open_helper(dev, priv);
+       if (dev->fn_tbl.open_helper) {
+               ret=dev->fn_tbl.open_helper(dev, priv);
+               if (ret < 0)
+                       goto out_free;
+       }
 
        down(&dev->struct_sem);
        if (!dev->file_last) {
@@ -105,6 +109,10 @@ int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev)
 #endif
 
        return 0;
+out_free:
+       DRM(free)(priv, sizeof(*priv), DRM_MEM_FILES);
+       filp->private_data=NULL;
+       return ret;
 }
 
 /** No-op. */
index 85faa0ebf3d284656da9767e4c646dd63d43db52..be1b4bf4b91259e8884ef2bf7c16a0000b64b571 100644 (file)
  [DRM_IOCTL_NR(DRM_IOCTL_RADEON_IRQ_WAIT)]   = { radeon_irq_wait,    1, 0 }, \
  [DRM_IOCTL_NR(DRM_IOCTL_RADEON_SETPARAM)]   = { radeon_cp_setparam, 1, 0 }, \
 
-#define DRIVER_FILE_FIELDS                                             \
-       int64_t radeon_fb_delta;                                        \
-
 /* DMA customization:
  */
 #define __HAVE_DMA             1
index f0aa0dc237ad72e53d31e3871c5df28ab9b0dba9..46580adbe3988a09e29eadf8a8f83c6528a76dcd 100644 (file)
@@ -60,6 +60,9 @@ typedef struct drm_radeon_depth_clear_t {
        u32 se_cntl;
 } drm_radeon_depth_clear_t;
 
+struct drm_radeon_driver_file_fields {
+       int64_t radeon_fb_delta;
+};
 
 struct mem_block {
        struct mem_block *next;
index c3e861bc732f47dd0b4ce93949f51dceb01f26cf..95ca63668da072b15038669200795f665ac31c92 100644 (file)
@@ -43,12 +43,14 @@ static __inline__ int radeon_check_and_fixup_offset( drm_radeon_private_t *dev_p
                                                     drm_file_t *filp_priv,
                                                     u32 *offset ) {
        u32 off = *offset;
+       struct drm_radeon_driver_file_fields *radeon_priv;
 
        if ( off >= dev_priv->fb_location &&
             off < ( dev_priv->gart_vm_start + dev_priv->gart_size ) )
                return 0;
 
-       off += filp_priv->radeon_fb_delta;
+       radeon_priv = filp_priv->driver_priv;
+       off += radeon_priv->radeon_fb_delta;
 
        DRM_DEBUG( "offset fixed up to 0x%x\n", off );
 
@@ -2525,6 +2527,7 @@ int radeon_cp_setparam( DRM_IOCTL_ARGS ) {
        drm_radeon_private_t *dev_priv = dev->dev_private;
        drm_file_t *filp_priv;
        drm_radeon_setparam_t sp;
+       struct drm_radeon_driver_file_fields *radeon_priv;
 
        if ( !dev_priv ) {
                DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ );
@@ -2538,7 +2541,8 @@ int radeon_cp_setparam( DRM_IOCTL_ARGS ) {
 
        switch( sp.param ) {
        case RADEON_SETPARAM_FB_LOCATION:
-               filp_priv->radeon_fb_delta = dev_priv->fb_location - sp.value;
+               radeon_priv = filp_priv->driver_priv;
+               radeon_priv->radeon_fb_delta = dev_priv->fb_location - sp.value;
                break;
        default:
                DRM_DEBUG( "Invalid parameter %d\n", sp.param );
@@ -2571,13 +2575,30 @@ static void radeon_driver_pretakedown(drm_device_t *dev)
        radeon_do_release(dev);
 }
 
-static void radeon_driver_open_helper(drm_device_t *dev, drm_file_t *filp_priv)
+static int radeon_driver_open_helper(drm_device_t *dev, drm_file_t *filp_priv)
 {
        drm_radeon_private_t *dev_priv = dev->dev_private;
+       struct drm_radeon_driver_file_fields *radeon_priv;
+       
+       radeon_priv = (struct drm_radeon_driver_file_fields *)DRM(alloc)(sizeof(*radeon_priv), DRM_MEM_FILES);
+       
+       if (!radeon_priv)
+               return -ENOMEM;
+
+       filp_priv->driver_priv = radeon_priv;
        if ( dev_priv )
-               filp_priv->radeon_fb_delta = dev_priv->fb_location;
+               radeon_priv->radeon_fb_delta = dev_priv->fb_location;
        else
-               filp_priv->radeon_fb_delta = 0;
+               radeon_priv->radeon_fb_delta = 0;
+       return 0;
+}
+
+
+static void radeon_driver_free_filp_priv(drm_device_t *dev, drm_file_t *filp_priv)
+{
+        struct drm_radeon_driver_file_fields *radeon_priv = filp_priv->driver_priv;
+        
+        DRM(free)(radeon_priv, sizeof(*radeon_priv), DRM_MEM_FILES);
 }
 
 void radeon_driver_register_fns(struct drm_device *dev)
@@ -2587,4 +2608,5 @@ void radeon_driver_register_fns(struct drm_device *dev)
        dev->fn_tbl.prerelease = radeon_driver_prerelease;
        dev->fn_tbl.pretakedown = radeon_driver_pretakedown;
        dev->fn_tbl.open_helper = radeon_driver_open_helper;
+       dev->fn_tbl.free_filp_priv = radeon_driver_free_filp_priv;
 }