aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_gem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
-rw-r--r--drivers/gpu/drm/drm_gem.c47
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)
311EXPORT_SYMBOL(drm_gem_handle_delete); 311EXPORT_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 */
326int 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);
341out:
342 drm_gem_object_put_unlocked(obj);
343
344 return ret;
345}
346EXPORT_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}
837EXPORT_SYMBOL(drm_gem_object_put_unlocked); 874EXPORT_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);