drm/tgm: tbm: add get dma_buf interface.
authorJin-young Jeon <jy0.jeon@samsung.com>
Thu, 8 Jun 2017 02:05:25 +0000 (11:05 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 27 Feb 2019 02:13:03 +0000 (11:13 +0900)
This patch is from product kernel.

Change-Id: Id6c8221c75b2bd715968df8fdd49d4b86f26a599
Signed-off-by: Jin-young Jeon <jy0.jeon@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/tgm/tbm.h
drivers/gpu/drm/tgm/tbm_gem.c
drivers/gpu/drm/tgm/tbm_gem.h
drivers/gpu/drm/tgm/tbm_gem_ion.c

index c17e9a2..2c1deda 100644 (file)
@@ -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;
index f329a9b..b649d70 100644 (file)
@@ -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);
index db222b9..cb57961 100644 (file)
@@ -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_ */
index 3f71c15..01a3626 100644 (file)
@@ -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;
 }