summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoonyoung Shim <jy0922.shim@samsung.com>2011-12-13 05:32:24 (GMT)
committerInki Dae <inki.dae@samsung.com>2011-12-29 02:21:41 (GMT)
commit2d91cf17b58b4d8228190103bef507bc73094bef (patch)
treeb11c4c2d3440331adc40fdd3b1b6d621788736bb
parentee5e770ef4eedf3abb12d05703d6a722b0e40779 (diff)
downloadlinux-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>
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.c38
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,