diff options
-rw-r--r-- | linux-core/drmP.h | 26 | ||||
-rw-r--r-- | linux-core/drm_gem.c | 45 | ||||
-rw-r--r-- | linux-core/i915_gem.c | 44 | ||||
-rw-r--r-- | shared-core/i915_drv.h | 4 |
4 files changed, 55 insertions, 64 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 0df9f19b..d2dc065a 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -740,10 +740,8 @@ struct drm_driver { * * Returns 0 on success. */ - int (*gem_init_object) (struct drm_device *dev, - struct drm_gem_object *obj); - void (*gem_free_object) (struct drm_device *dev, - struct drm_gem_object *obj); + int (*gem_init_object) (struct drm_gem_object *obj); + void (*gem_free_object) (struct drm_gem_object *obj); struct drm_fence_driver *fence_driver; struct drm_bo_driver *bo_driver; @@ -1307,11 +1305,23 @@ static inline struct drm_memrange *drm_get_mm(struct drm_memrange_node *block) return block->mm; } +void +drm_gem_object_free (struct kref *kref); + /* Graphics Execution Manager library functions (drm_gem.c) */ -void drm_gem_object_reference(struct drm_device *dev, - struct drm_gem_object *obj); -void drm_gem_object_unreference(struct drm_device *dev, - struct drm_gem_object *obj); +static inline void drm_gem_object_reference(struct drm_gem_object *obj) +{ + kref_get(&obj->refcount); +} + +static inline void drm_gem_object_unreference(struct drm_gem_object *obj) +{ + if (obj == NULL) + return; + + kref_put (&obj->refcount, drm_gem_object_free); +} + struct drm_gem_object * drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp, int handle); diff --git a/linux-core/drm_gem.c b/linux-core/drm_gem.c index 41976bc7..80e8657b 100644 --- a/linux-core/drm_gem.c +++ b/linux-core/drm_gem.c @@ -84,7 +84,7 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size) obj->size = size; if (dev->driver->gem_init_object != NULL && - dev->driver->gem_init_object(dev, obj) != 0) { + dev->driver->gem_init_object(obj) != 0) { fput(obj->filp); kfree(obj); return NULL; @@ -121,7 +121,7 @@ drm_gem_handle_delete(struct drm_device *dev, struct drm_file *filp, /* Release reference and decrement refcount. */ idr_remove(&filp->object_idr, handle); - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); spin_unlock(&filp->table_lock); @@ -144,7 +144,7 @@ drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp, return NULL; } - drm_gem_object_reference(dev, obj); + drm_gem_object_reference(obj); spin_unlock(&filp->table_lock); @@ -189,7 +189,7 @@ drm_gem_alloc_ioctl(struct drm_device *dev, void *data, } while (ret == -EAGAIN); if (ret != 0) { - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); return -EFAULT; } @@ -236,14 +236,14 @@ drm_gem_pread_ioctl(struct drm_device *dev, void *data, read = obj->filp->f_op->read(obj->filp, (char __user *)(uintptr_t)args->data_ptr, args->size, &offset); if (read != args->size) { - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); if (read < 0) return read; else return -EINVAL; } - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); return 0; } @@ -275,7 +275,7 @@ drm_gem_mmap_ioctl(struct drm_device *dev, void *data, args->offset); up_write(¤t->mm->mmap_sem); - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); return 0; } @@ -300,17 +300,17 @@ drm_gem_pwrite_ioctl(struct drm_device *dev, void *data, offset = args->offset; - written = obj->filp->f_op->write(obj->filp, (char __user *)args->data_ptr, + written = obj->filp->f_op->write(obj->filp, (char __user *)(uintptr_t) args->data_ptr, args->size, &offset); if (written != args->size) { - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); if (written < 0) return written; else return -EINVAL; } - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); return 0; } @@ -329,10 +329,9 @@ drm_gem_open(struct drm_device *dev, struct drm_file *file_private) static int drm_gem_object_release(int id, void *ptr, void *data) { - struct drm_device *dev = data; struct drm_gem_object *obj = ptr; - drm_gem_object_unreference(dev, obj); + drm_gem_object_unreference(obj); return 0; } @@ -345,37 +344,21 @@ drm_gem_object_release(int id, void *ptr, void *data) void drm_gem_release(struct drm_device *dev, struct drm_file *file_private) { - idr_for_each(&file_private->object_idr, &drm_gem_object_release, dev); + idr_for_each(&file_private->object_idr, &drm_gem_object_release, NULL); idr_destroy(&file_private->object_idr); } void -drm_gem_object_reference(struct drm_device *dev, struct drm_gem_object *obj) -{ - kref_get(&obj->refcount); -} -EXPORT_SYMBOL(drm_gem_object_reference); - -static void drm_gem_object_free (struct kref *kref) { struct drm_gem_object *obj = (struct drm_gem_object *) kref; struct drm_device *dev = obj->dev; if (dev->driver->gem_free_object != NULL) - dev->driver->gem_free_object(dev, obj); + dev->driver->gem_free_object(obj); fput(obj->filp); kfree(obj); } - -void -drm_gem_object_unreference(struct drm_device *dev, struct drm_gem_object *obj) -{ - if (obj == NULL) - return; - - kref_put (&obj->refcount, drm_gem_object_free); -} -EXPORT_SYMBOL(drm_gem_object_unreference); +EXPORT_SYMBOL(drm_gem_object_free); diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c index 30e67742..16bb3923 100644 --- a/linux-core/i915_gem.c +++ b/linux-core/i915_gem.c @@ -49,8 +49,7 @@ i915_gem_init_ioctl(struct drm_device *dev, void *data, } static void -i915_gem_object_free_page_list(struct drm_device *dev, - struct drm_gem_object *obj) +i915_gem_object_free_page_list(struct drm_gem_object *obj) { struct drm_i915_gem_object *obj_priv = obj->driver_private; int page_count = obj->size / PAGE_SIZE; @@ -74,7 +73,7 @@ i915_gem_object_free_page_list(struct drm_device *dev, * Unbinds an object from the GTT aperture. */ static void -i915_gem_object_unbind(struct drm_device *dev, struct drm_gem_object *obj) +i915_gem_object_unbind(struct drm_gem_object *obj) { struct drm_i915_gem_object *obj_priv = obj->driver_private; @@ -86,7 +85,7 @@ i915_gem_object_unbind(struct drm_device *dev, struct drm_gem_object *obj) drm_free_agp(obj_priv->agp_mem, obj->size / PAGE_SIZE); } - i915_gem_object_free_page_list(dev, obj); + i915_gem_object_free_page_list(obj); drm_memrange_put_block(obj_priv->gtt_space); obj_priv->gtt_space = NULL; @@ -96,8 +95,9 @@ i915_gem_object_unbind(struct drm_device *dev, struct drm_gem_object *obj) * Finds free space in the GTT aperture and binds the object there. */ static int -i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj, unsigned alignment) +i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment) { + struct drm_device *dev = obj->dev; drm_i915_private_t *dev_priv = dev->dev_private; struct drm_i915_gem_object *obj_priv = obj->driver_private; struct drm_memrange_node *free_space; @@ -141,7 +141,7 @@ i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj, find_or_create_page(obj->filp->f_mapping, i, GFP_HIGHUSER); if (obj_priv->page_list[i] == NULL) { - i915_gem_object_free_page_list(dev, obj); + i915_gem_object_free_page_list(obj); drm_memrange_put_block(obj_priv->gtt_space); obj_priv->gtt_space = NULL; return -ENOMEM; @@ -156,7 +156,7 @@ i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj, page_count, obj_priv->gtt_offset); if (obj_priv->agp_mem == NULL) { - i915_gem_object_free_page_list(dev, obj); + i915_gem_object_free_page_list(obj); drm_memrange_put_block(obj_priv->gtt_space); obj_priv->gtt_space = NULL; return -ENOMEM; @@ -166,11 +166,11 @@ i915_gem_object_bind_to_gtt(struct drm_device *dev, struct drm_gem_object *obj, } static int -i915_gem_reloc_and_validate_object(struct drm_device *dev, +i915_gem_reloc_and_validate_object(struct drm_gem_object *obj, struct drm_file *file_priv, - struct drm_i915_gem_validate_entry *entry, - struct drm_gem_object *obj) + struct drm_i915_gem_validate_entry *entry) { + struct drm_device *dev = obj->dev; struct drm_i915_gem_relocation_entry reloc; struct drm_i915_gem_relocation_entry __user *relocs; struct drm_i915_gem_object *obj_priv = obj->driver_private; @@ -178,7 +178,7 @@ i915_gem_reloc_and_validate_object(struct drm_device *dev, /* Choose the GTT offset for our buffer and put it there. */ if (obj_priv->gtt_space == NULL) { - i915_gem_object_bind_to_gtt(dev, obj, (unsigned) entry->alignment); + i915_gem_object_bind_to_gtt(obj, (unsigned) entry->alignment); if (obj_priv->gtt_space == NULL) return -ENOMEM; } @@ -198,7 +198,7 @@ i915_gem_reloc_and_validate_object(struct drm_device *dev, if (ret != 0) return ret; - target_obj = drm_gem_object_lookup(dev, file_priv, + target_obj = drm_gem_object_lookup(obj->dev, file_priv, reloc.target_handle); if (target_obj == NULL) return -EINVAL; @@ -248,12 +248,11 @@ i915_gem_reloc_and_validate_object(struct drm_device *dev, static int evict_callback(struct drm_memrange_node *node, void *data) { - struct drm_device *dev = data; struct drm_gem_object *obj = node->private; struct drm_i915_gem_object *obj_priv = obj->driver_private; if (obj_priv->pin_count == 0) - i915_gem_object_unbind(dev, obj); + i915_gem_object_unbind(obj); return 0; } @@ -274,7 +273,7 @@ i915_gem_sync_and_evict(struct drm_device *dev) return ret; /* Evict everything so we have space for sure. */ - drm_memrange_for_each(&dev_priv->mm.gtt_space, evict_callback, dev); + drm_memrange_for_each(&dev_priv->mm.gtt_space, evict_callback, NULL); return 0; } @@ -321,9 +320,8 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, goto err; } - i915_gem_reloc_and_validate_object(dev, file_priv, - &validate_list[i], - object_list[i]); + i915_gem_reloc_and_validate_object(object_list[i], file_priv, + &validate_list[i]); } /* Exec the batchbuffer */ @@ -346,7 +344,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, err: if (object_list != NULL) { for (i = 0; i < args->buffer_count; i++) - drm_gem_object_unreference(dev, object_list[i]); + drm_gem_object_unreference(object_list[i]); } drm_free(object_list, sizeof(*object_list) * args->buffer_count, DRM_MEM_DRIVER); @@ -372,7 +370,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data, return -EINVAL; } - ret = i915_gem_object_bind_to_gtt(dev, obj, (unsigned) args->alignment); + ret = i915_gem_object_bind_to_gtt(obj, (unsigned) args->alignment); if (ret != 0) { DRM_ERROR("Failure to bind in i915_gem_pin_ioctl(): %d\n", ret); @@ -407,7 +405,7 @@ i915_gem_unpin_ioctl(struct drm_device *dev, void *data, return 0; } -int i915_gem_init_object(struct drm_device *dev, struct drm_gem_object *obj) +int i915_gem_init_object(struct drm_gem_object *obj) { struct drm_i915_gem_object *obj_priv; @@ -420,9 +418,9 @@ int i915_gem_init_object(struct drm_device *dev, struct drm_gem_object *obj) return 0; } -void i915_gem_free_object(struct drm_device *dev, struct drm_gem_object *obj) +void i915_gem_free_object(struct drm_gem_object *obj) { - i915_gem_object_unbind(dev, obj); + i915_gem_object_unbind(obj); drm_free(obj->driver_private, 1, DRM_MEM_DRIVER); } diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index 801ac99e..0ebfedca 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -366,8 +366,8 @@ int i915_gem_pin_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); int i915_gem_unpin_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv); -int i915_gem_init_object(struct drm_device *dev, struct drm_gem_object *obj); -void i915_gem_free_object(struct drm_device *dev, struct drm_gem_object *obj); +int i915_gem_init_object(struct drm_gem_object *obj); +void i915_gem_free_object(struct drm_gem_object *obj); #endif |