From e3af227e09357efde53125775dd9af5d27741365 Mon Sep 17 00:00:00 2001 From: Jin-young Jeon Date: Thu, 8 Jun 2017 11:05:25 +0900 Subject: [PATCH] drm/tgm: tbm: add get dma_buf interface. This patch is from product kernel. Change-Id: Id6c8221c75b2bd715968df8fdd49d4b86f26a599 Signed-off-by: Jin-young Jeon Signed-off-by: Inki Dae --- drivers/gpu/drm/tgm/tbm.h | 3 +++ drivers/gpu/drm/tgm/tbm_gem.c | 17 +++++++++++++++++ drivers/gpu/drm/tgm/tbm_gem.h | 3 +++ drivers/gpu/drm/tgm/tbm_gem_ion.c | 22 ++++++++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/drivers/gpu/drm/tgm/tbm.h b/drivers/gpu/drm/tgm/tbm.h index c17e9a2..2c1deda 100644 --- a/drivers/gpu/drm/tgm/tbm.h +++ b/drivers/gpu/drm/tgm/tbm.h @@ -35,6 +35,9 @@ struct tbm_private { void (*gem_put_dma_addr)(struct drm_device *drm_dev, struct device *dev, unsigned int gem_handle, struct drm_file *filp); + void * (*gem_get_dma_buf)(struct drm_device *drm_dev, + struct device *dev, unsigned int gem_handle, + struct drm_file *filp); #ifdef CONFIG_DRM_DMA_SYNC unsigned gem_fence_context; atomic_t gem_fence_seqno; diff --git a/drivers/gpu/drm/tgm/tbm_gem.c b/drivers/gpu/drm/tgm/tbm_gem.c index f329a9b..b649d70 100644 --- a/drivers/gpu/drm/tgm/tbm_gem.c +++ b/drivers/gpu/drm/tgm/tbm_gem.c @@ -611,6 +611,23 @@ int tbm_gem_cpu_fini_ioctl(struct drm_device *dev, void *data, return 0; } +struct dma_buf *tbm_gem_get_dma_buf(struct drm_device *drm_dev, + struct device *dev, unsigned int gem_handle, + struct drm_file *filp) +{ + struct tgm_drv_private *dev_priv = drm_dev->dev_private; + struct tbm_private *tbm_priv = dev_priv->tbm_priv; + struct dma_buf *dma_buf = NULL; + + if (tbm_priv->gem_get_dma_buf) + dma_buf = tbm_priv->gem_get_dma_buf(drm_dev, dev, + gem_handle, filp); + + DRM_DEBUG("%s:h[%d]buf[%p]\n", __func__, gem_handle, dma_buf); + + return dma_buf; +} + int tbm_gem_object_unreference(struct drm_gem_object *obj) { DRM_DEBUG("%s:obj[%p]\n", __func__, obj); diff --git a/drivers/gpu/drm/tgm/tbm_gem.h b/drivers/gpu/drm/tgm/tbm_gem.h index db222b9..cb57961 100644 --- a/drivers/gpu/drm/tgm/tbm_gem.h +++ b/drivers/gpu/drm/tgm/tbm_gem.h @@ -69,5 +69,8 @@ int tbm_gem_cpu_prep_ioctl(struct drm_device *dev, void *data, struct drm_file *file); int tbm_gem_cpu_fini_ioctl(struct drm_device *dev, void *data, struct drm_file *file); +struct dma_buf *tbm_gem_get_dma_buf(struct drm_device *drm_dev, + struct device *dev, unsigned int gem_handle, + struct drm_file *filp); int tbm_gem_object_unreference(struct drm_gem_object *obj); #endif /* _TBM_GEM_H_ */ diff --git a/drivers/gpu/drm/tgm/tbm_gem_ion.c b/drivers/gpu/drm/tgm/tbm_gem_ion.c index 3f71c15..01a3626 100644 --- a/drivers/gpu/drm/tgm/tbm_gem_ion.c +++ b/drivers/gpu/drm/tgm/tbm_gem_ion.c @@ -181,6 +181,25 @@ void tbm_gem_ion_put_dma_addr(struct drm_device *drm_dev, drm_gem_object_unreference_unlocked(obj); } +void *tbm_gem_ion_get_dma_buf(struct drm_device *drm_dev, + struct device *dev, unsigned int gem_handle, + struct drm_file *filp) +{ + struct drm_gem_object *obj; + + obj = drm_gem_object_lookup(drm_dev, filp, gem_handle); + if (!obj) { + DRM_ERROR("failed to lookup gem object.\n"); + return ERR_PTR(-EINVAL); + } + + DRM_DEBUG("%s:h[%d]obj[%p]buf[%p]\n", __func__, gem_handle, + obj, obj->dma_buf); + drm_gem_object_unreference_unlocked(obj); + + return obj->dma_buf; +} + struct dma_buf *tbm_gem_ion_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags) { @@ -373,6 +392,9 @@ err: tbm_priv->gem_bufer_dealloc = tbm_gem_ion_buffer_dealloc; tbm_priv->gem_get_dma_addr = tbm_gem_ion_get_dma_addr; tbm_priv->gem_put_dma_addr = tbm_gem_ion_put_dma_addr; +#ifdef CONFIG_DRM_DMA_SYNC + tbm_priv->gem_get_dma_buf = tbm_gem_ion_get_dma_buf; +#endif return 0; } -- 2.7.4