From 1386346b8c05a984c50d1149f648a3ccf6a5bf89 Mon Sep 17 00:00:00 2001 From: Jin-young Jeon Date: Thu, 8 Jun 2017 13:16:07 +0900 Subject: [PATCH] drm/tgm: tdm/pp: add fence mechanism on TDM PP. This patch is from product kernel. Change-Id: Iae386e3a0a1984d9dec157153a280ac5886ba5e0 Signed-off-by: Jin-young Jeon Signed-off-by: Inki Dae --- drivers/gpu/drm/tgm/tdm_pp.c | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/tgm/tdm_pp.c b/drivers/gpu/drm/tgm/tdm_pp.c index 5cdd7ef78..8de9c66 100644 --- a/drivers/gpu/drm/tgm/tdm_pp.c +++ b/drivers/gpu/drm/tgm/tdm_pp.c @@ -63,6 +63,9 @@ struct tdm_pp_mem_node { u32 prop_id; u32 buf_id; struct tdm_pp_buf_info buf_info; +#ifdef CONFIG_DRM_DMA_SYNC + struct fence *fence; +#endif }; /* @@ -470,6 +473,13 @@ static int pp_put_mem_node(struct drm_device *drm_dev, DRM_DEBUG_KMS("ops_id[%d]\n", m_node->ops_id); +#ifdef CONFIG_DRM_DMA_SYNC + if (m_node->ops_id == TDM_OPS_SRC) { + if (!IS_ERR(m_node->fence)) + tdm_fence_signal(drm_dev, m_node->fence); + } +#endif + /* put gem buffer */ for_each_pp_planar(i) { unsigned long handle = m_node->buf_info.handles[i]; @@ -738,14 +748,29 @@ static int pp_set_mem_node(struct tdm_ppdrv *ppdrv, return -EFAULT; } + + if (!ops->set_addr) { + DRM_ERROR("not support set_addr.\n"); + return -EFAULT; + } + +#ifdef CONFIG_DRM_DMA_SYNC + if (m_node->ops_id == TDM_OPS_SRC) { + struct dma_buf *dma_buf; + + dma_buf = tbm_gem_get_dma_buf(ppdrv->drm_dev, ppdrv->dev, + m_node->buf_info.handles[0], c_node->filp); + if (!IS_ERR(dma_buf)) + m_node->fence = tdm_fence(ppdrv->drm_dev, dma_buf); + } +#endif + /* set address and enable irq */ - if (ops->set_addr) { - ret = ops->set_addr(ppdrv->dev, &m_node->buf_info, - m_node->buf_id, PP_BUF_ENQUEUE); - if (ret) { - DRM_ERROR("failed to set addr.\n"); - return ret; - } + ret = ops->set_addr(ppdrv->dev, &m_node->buf_info, + m_node->buf_id, PP_BUF_ENQUEUE); + if (ret) { + DRM_ERROR("failed to set addr.\n"); + return ret; } return ret; -- 2.7.4