diff options
author | Joonyoung Shim <jy0922.shim@samsung.com> | 2011-12-13 05:32:24 (GMT) |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2011-12-29 02:21:41 (GMT) |
commit | 2d91cf17b58b4d8228190103bef507bc73094bef (patch) | |
tree | b11c4c2d3440331adc40fdd3b1b6d621788736bb /drivers/gpu | |
parent | ee5e770ef4eedf3abb12d05703d6a722b0e40779 (diff) | |
download | linux-2d91cf17b58b4d8228190103bef507bc73094bef.tar.xz |
drm/exynos: Fix a fake mmap offset creation
Make a fake mmap offset only when it needs.
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gem.c | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 44ce07c..90aa630 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -55,13 +55,6 @@ static unsigned int convert_to_vm_err_msg(int msg) return out_msg; } -static unsigned int get_gem_mmap_offset(struct drm_gem_object *obj) -{ - DRM_DEBUG_KMS("%s\n", __FILE__); - - return (unsigned int)obj->map_list.hash.key << PAGE_SHIFT; -} - static struct exynos_drm_gem_obj * exynos_drm_gem_init(struct drm_device *drm_dev, struct drm_file *file_priv, unsigned int *handle, unsigned int size) @@ -87,19 +80,13 @@ exynos_drm_gem_init(struct drm_device *drm_dev, struct drm_file *file_priv, DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp); - ret = drm_gem_create_mmap_offset(obj); - if (ret < 0) { - DRM_ERROR("failed to allocate mmap offset.\n"); - goto err_release; - } - /* * allocate a id of idr table where the obj is registered * and handle has the id what user can see. */ ret = drm_gem_handle_create(file_priv, obj, handle); if (ret) - goto err_free_mmap_offset; + goto err_release; DRM_DEBUG_KMS("gem handle = 0x%x\n", *handle); @@ -108,9 +95,6 @@ exynos_drm_gem_init(struct drm_device *drm_dev, struct drm_file *file_priv, return exynos_gem_obj; -err_free_mmap_offset: - drm_gem_free_mmap_offset(obj); - err_release: drm_gem_object_release(obj); @@ -328,6 +312,7 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, { struct exynos_drm_gem_obj *exynos_gem_obj; struct drm_gem_object *obj; + int ret = 0; DRM_DEBUG_KMS("%s\n", __FILE__); @@ -342,21 +327,26 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, obj = drm_gem_object_lookup(dev, file_priv, handle); if (!obj) { DRM_ERROR("failed to lookup gem object.\n"); - mutex_unlock(&dev->struct_mutex); - return -EINVAL; + ret = -EINVAL; + goto unlock; } exynos_gem_obj = to_exynos_gem_obj(obj); - *offset = get_gem_mmap_offset(&exynos_gem_obj->base); - - drm_gem_object_unreference(obj); + if (!exynos_gem_obj->base.map_list.map) { + ret = drm_gem_create_mmap_offset(&exynos_gem_obj->base); + if (ret) + goto out; + } + *offset = (u64)exynos_gem_obj->base.map_list.hash.key << PAGE_SHIFT; DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); +out: + drm_gem_object_unreference(obj); +unlock: mutex_unlock(&dev->struct_mutex); - - return 0; + return ret; } int exynos_drm_gem_dumb_destroy(struct drm_file *file_priv, |