this patch adds drm_wait_vblank support to Virtual Display module
so user can use DRM_IOCT_WAIT_VBLANK ioctl with this patch.
for this, you should set _DRM_VBLANK_EXYNOS_VIDI flags to
vblwait->request.type

Signed-off-by: Inki Dae <inki....@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_vidi.c |   22 +++++++++++++++++++++-
 include/drm/exynos_drm.h                 |   10 ++++++++++
 2 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c 
b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index c95f7de..54b4415 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -56,6 +56,7 @@ struct vidi_context {
        unsigned int                    connected;
        bool                            vblank_on;
        bool                            suspended;
+       bool                            direct_vblank;
        struct work_struct              work;
        struct mutex                    lock;
 };
@@ -224,6 +225,15 @@ static int vidi_enable_vblank(struct device *dev)
        if (!test_and_set_bit(0, &ctx->irq_flags))
                ctx->vblank_on = true;
 
+       ctx->direct_vblank = true;
+
+       /*
+        * in case of page flip request, vidi_finish_pageflip function
+        * will not be called because direct_vblank is true and then
+        * that function will be called by overlay_ops->commit callback
+        */
+       schedule_work(&ctx->work);
+
        return 0;
 }
 
@@ -425,7 +435,17 @@ static void vidi_fake_vblank_handler(struct work_struct 
*work)
        /* refresh rate is about 50Hz. */
        usleep_range(16000, 20000);
 
-       drm_handle_vblank(subdrv->drm_dev, manager->pipe);
+       mutex_lock(&ctx->lock);
+
+       if (ctx->direct_vblank) {
+               drm_handle_vblank(subdrv->drm_dev, manager->pipe);
+               ctx->direct_vblank = false;
+               mutex_unlock(&ctx->lock);
+               return;
+       }
+
+       mutex_unlock(&ctx->lock);
+
        vidi_finish_pageflip(subdrv->drm_dev, manager->pipe);
 }
 
diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
index c20b001..10f91ea 100644
--- a/include/drm/exynos_drm.h
+++ b/include/drm/exynos_drm.h
@@ -107,6 +107,16 @@ struct drm_exynos_vidi_connection {
        uint64_t edid;
 };
 
+/* Indicate Exynos specific vblank flags */
+enum e_drm_exynos_vblank {
+       /*
+        * this flags is used for Virtual Display module
+        * to use DRM_IOCTL_WAIT_VBLANK feature. for this,
+        * user should set this flag to vblwait->request.type
+        */
+       _DRM_VBLANK_EXYNOS_VIDI = 2,
+};
+
 /* memory type definitions. */
 enum e_drm_exynos_gem_mem_type {
        /* Physically Continuous memory and used as default. */
-- 
1.7.4.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to