From cb8d39c70e6e3245c00bf3c8d9adce447fff619d Mon Sep 17 00:00:00 2001 From: Joonyoung Shim Date: Thu, 11 Feb 2016 11:01:03 +0900 Subject: [PATCH] drm/sprd: fix always gem creation of imported dma-buf The sprd_prime_import() creates gem object always even though there is existing gem object that refers memory of imported dma-buf. This patch will make to reuse existing gem object on this case. Change-Id: I4aa31bd2a41a511774b9e1aaf150ddbf45728c22 Signed-off-by: Joonyoung Shim --- drivers/gpu/drm/sprd/sprd_drm_gem.c | 15 +++++++++++++++ drivers/staging/android/ion/ion.c | 13 ++++++++++++- drivers/staging/android/ion/ion.h | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/sprd/sprd_drm_gem.c b/drivers/gpu/drm/sprd/sprd_drm_gem.c index f92a3f1..1fe2363 100755 --- a/drivers/gpu/drm/sprd/sprd_drm_gem.c +++ b/drivers/gpu/drm/sprd/sprd_drm_gem.c @@ -537,6 +537,21 @@ struct drm_gem_object *sprd_prime_import(struct drm_device *dev, goto err; } + obj = ion_get_gem(ion_handle); + if (obj) { + sprd_gem_obj = to_sprd_gem_obj(obj); + if (sprd_gem_obj->buffer->ion_handle != ion_handle) { + DRM_ERROR("Unable get GEM object from ion\n"); + ret = -EINVAL; + goto err; + } + + drm_gem_object_reference(obj); + ion_free(private->sprd_drm_ion_client, ion_handle); + + return obj; + } + buf = sprd_drm_init_buf(dev, size); if (!buf) { DRM_ERROR("Unable to allocate the GEM buffer\n"); diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 7258486..4bbc600 100644 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -576,6 +576,15 @@ struct ion_handle *ion_alloc_with_gem(struct ion_client *client, size_t len, return handle; } EXPORT_SYMBOL(ion_alloc_with_gem); + +struct drm_gem_object *ion_get_gem(struct ion_handle *handle) +{ + if (handle && handle->buffer) + return handle->buffer->obj; + + return NULL; +} +EXPORT_SYMBOL(ion_get_gem); #endif void ion_free(struct ion_client *client, struct ion_handle *handle) @@ -1216,8 +1225,10 @@ static void ion_dma_buf_release(struct dma_buf *dmabuf) ion_buffer_put(buffer); #ifdef CONFIG_DRM_SPRD - if (buffer->obj) + if (buffer->obj) { drm_gem_object_unreference_unlocked(buffer->obj); + buffer->obj = NULL; + } #endif } diff --git a/drivers/staging/android/ion/ion.h b/drivers/staging/android/ion/ion.h index 6be45c2..b489564 100644 --- a/drivers/staging/android/ion/ion.h +++ b/drivers/staging/android/ion/ion.h @@ -127,6 +127,7 @@ struct ion_handle *ion_alloc_with_gem(struct ion_client *client, size_t len, size_t align, unsigned int heap_id_mask, unsigned int flags, struct drm_gem_object *obj); +struct drm_gem_object *ion_get_gem(struct ion_handle *handle); #endif /** * ion_free - free a handle -- 2.7.4