diff options
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
-rw-r--r-- | drivers/gpu/drm/drm_gem.c | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index cdaac37907b1..88c6d78ee2d5 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c | |||
@@ -311,6 +311,41 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle) | |||
311 | EXPORT_SYMBOL(drm_gem_handle_delete); | 311 | EXPORT_SYMBOL(drm_gem_handle_delete); |
312 | 312 | ||
313 | /** | 313 | /** |
314 | * drm_gem_dumb_map_offset - return the fake mmap offset for a gem object | ||
315 | * @file: drm file-private structure containing the gem object | ||
316 | * @dev: corresponding drm_device | ||
317 | * @handle: gem object handle | ||
318 | * @offset: return location for the fake mmap offset | ||
319 | * | ||
320 | * This implements the &drm_driver.dumb_map_offset kms driver callback for | ||
321 | * drivers which use gem to manage their backing storage. | ||
322 | * | ||
323 | * Returns: | ||
324 | * 0 on success or a negative error code on failure. | ||
325 | */ | ||
326 | int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, | ||
327 | u32 handle, u64 *offset) | ||
328 | { | ||
329 | struct drm_gem_object *obj; | ||
330 | int ret; | ||
331 | |||
332 | obj = drm_gem_object_lookup(file, handle); | ||
333 | if (!obj) | ||
334 | return -ENOENT; | ||
335 | |||
336 | ret = drm_gem_create_mmap_offset(obj); | ||
337 | if (ret) | ||
338 | goto out; | ||
339 | |||
340 | *offset = drm_vma_node_offset_addr(&obj->vma_node); | ||
341 | out: | ||
342 | drm_gem_object_put_unlocked(obj); | ||
343 | |||
344 | return ret; | ||
345 | } | ||
346 | EXPORT_SYMBOL_GPL(drm_gem_dumb_map_offset); | ||
347 | |||
348 | /** | ||
314 | * drm_gem_dumb_destroy - dumb fb callback helper for gem based drivers | 349 | * drm_gem_dumb_destroy - dumb fb callback helper for gem based drivers |
315 | * @file: drm file-private structure to remove the dumb handle from | 350 | * @file: drm file-private structure to remove the dumb handle from |
316 | * @dev: corresponding drm_device | 351 | * @dev: corresponding drm_device |
@@ -826,13 +861,15 @@ drm_gem_object_put_unlocked(struct drm_gem_object *obj) | |||
826 | return; | 861 | return; |
827 | 862 | ||
828 | dev = obj->dev; | 863 | dev = obj->dev; |
829 | might_lock(&dev->struct_mutex); | ||
830 | 864 | ||
831 | if (dev->driver->gem_free_object_unlocked) | 865 | if (dev->driver->gem_free_object_unlocked) { |
832 | kref_put(&obj->refcount, drm_gem_object_free); | 866 | kref_put(&obj->refcount, drm_gem_object_free); |
833 | else if (kref_put_mutex(&obj->refcount, drm_gem_object_free, | 867 | } else { |
868 | might_lock(&dev->struct_mutex); | ||
869 | if (kref_put_mutex(&obj->refcount, drm_gem_object_free, | ||
834 | &dev->struct_mutex)) | 870 | &dev->struct_mutex)) |
835 | mutex_unlock(&dev->struct_mutex); | 871 | mutex_unlock(&dev->struct_mutex); |
872 | } | ||
836 | } | 873 | } |
837 | EXPORT_SYMBOL(drm_gem_object_put_unlocked); | 874 | EXPORT_SYMBOL(drm_gem_object_put_unlocked); |
838 | 875 | ||
@@ -964,7 +1001,7 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) | |||
964 | struct drm_vma_offset_node *node; | 1001 | struct drm_vma_offset_node *node; |
965 | int ret; | 1002 | int ret; |
966 | 1003 | ||
967 | if (drm_device_is_unplugged(dev)) | 1004 | if (drm_dev_is_unplugged(dev)) |
968 | return -ENODEV; | 1005 | return -ENODEV; |
969 | 1006 | ||
970 | drm_vma_offset_lock_lookup(dev->vma_offset_manager); | 1007 | drm_vma_offset_lock_lookup(dev->vma_offset_manager); |